ngx-view-builder 0.1.3 → 0.1.5

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.

Potentially problematic release.


This version of ngx-view-builder might be problematic. Click here for more details.

Files changed (23) hide show
  1. package/fesm2022/{ngx-view-builder-avatar-element-B8Nh4G0m.mjs → ngx-view-builder-avatar-element-Bnxr5pVE.mjs} +2 -2
  2. package/fesm2022/{ngx-view-builder-avatar-element-B8Nh4G0m.mjs.map → ngx-view-builder-avatar-element-Bnxr5pVE.mjs.map} +1 -1
  3. package/fesm2022/{ngx-view-builder-breadcrumbs-element-BaJoW3s7.mjs → ngx-view-builder-breadcrumbs-element-DUi8_qxY.mjs} +2 -2
  4. package/fesm2022/{ngx-view-builder-breadcrumbs-element-BaJoW3s7.mjs.map → ngx-view-builder-breadcrumbs-element-DUi8_qxY.mjs.map} +1 -1
  5. package/fesm2022/{ngx-view-builder-icon-element-Bu2EWVKX.mjs → ngx-view-builder-icon-element-BYreB3Ma.mjs} +2 -2
  6. package/fesm2022/{ngx-view-builder-icon-element-Bu2EWVKX.mjs.map → ngx-view-builder-icon-element-BYreB3Ma.mjs.map} +1 -1
  7. package/fesm2022/{ngx-view-builder-ngx-view-builder-_VdHLdIW.mjs → ngx-view-builder-ngx-view-builder-G2BnNzUY.mjs} +230 -39
  8. package/fesm2022/{ngx-view-builder-ngx-view-builder-_VdHLdIW.mjs.map → ngx-view-builder-ngx-view-builder-G2BnNzUY.mjs.map} +1 -1
  9. package/fesm2022/{ngx-view-builder-toast-element-B1DxJdDY.mjs → ngx-view-builder-toast-element-6FsyoWXA.mjs} +2 -2
  10. package/fesm2022/{ngx-view-builder-toast-element-DQ8mU1zc.mjs.map → ngx-view-builder-toast-element-6FsyoWXA.mjs.map} +1 -1
  11. package/fesm2022/ngx-view-builder.mjs +1 -1
  12. package/package.json +3 -1
  13. package/types/ngx-view-builder.d.ts +185 -136
  14. package/fesm2022/ngx-view-builder-avatar-element-B_Cx5xnx.mjs +0 -77
  15. package/fesm2022/ngx-view-builder-avatar-element-B_Cx5xnx.mjs.map +0 -1
  16. package/fesm2022/ngx-view-builder-breadcrumbs-element-DZmo2VAq.mjs +0 -249
  17. package/fesm2022/ngx-view-builder-breadcrumbs-element-DZmo2VAq.mjs.map +0 -1
  18. package/fesm2022/ngx-view-builder-icon-element-DFW1jVp8.mjs +0 -63
  19. package/fesm2022/ngx-view-builder-icon-element-DFW1jVp8.mjs.map +0 -1
  20. package/fesm2022/ngx-view-builder-ngx-view-builder-C9rZ5zQM.mjs +0 -90260
  21. package/fesm2022/ngx-view-builder-ngx-view-builder-C9rZ5zQM.mjs.map +0 -1
  22. package/fesm2022/ngx-view-builder-toast-element-B1DxJdDY.mjs.map +0 -1
  23. package/fesm2022/ngx-view-builder-toast-element-DQ8mU1zc.mjs +0 -188
@@ -13993,12 +13993,26 @@ function toNumber(value) {
13993
13993
  return null;
13994
13994
  }
13995
13995
 
13996
+ const BUILT_IN_VALIDATOR_TYPES = new Set([
13997
+ 'required',
13998
+ 'minlength',
13999
+ 'maxlength',
14000
+ 'min',
14001
+ 'max',
14002
+ 'pattern',
14003
+ 'email',
14004
+ 'strictoptions',
14005
+ 'custom',
14006
+ ]);
13996
14007
  class ValidatorService {
13997
14008
  validationDisplayEnabled = signal(false, ...(ngDevMode ? [{ debugName: "validationDisplayEnabled" }] : /* istanbul ignore next */ []));
13998
14009
  validationTouchedElements = signal({}, ...(ngDevMode ? [{ debugName: "validationTouchedElements" }] : /* istanbul ignore next */ []));
13999
14010
  validationRenderVersion = signal(0, ...(ngDevMode ? [{ debugName: "validationRenderVersion" }] : /* istanbul ignore next */ []));
14000
14011
  ruleValidationErrors = new Map();
14001
14012
  externalValidationErrors = new Map();
14013
+ registeredValidatorTypes = new Map();
14014
+ registeredValidatorTypeDescriptors = signal([], ...(ngDevMode ? [{ debugName: "registeredValidatorTypeDescriptors" }] : /* istanbul ignore next */ []));
14015
+ warnedUnknownValidatorTypes = new Set();
14002
14016
  structureService = inject(StructureService);
14003
14017
  dataService = inject(DataService);
14004
14018
  expressionService = inject(ExpressionService);
@@ -14021,6 +14035,52 @@ class ValidatorService {
14021
14035
  void this.evaluateAllValidators();
14022
14036
  });
14023
14037
  }
14038
+ registerValidatorTypes(definitions) {
14039
+ if (!Array.isArray(definitions)) {
14040
+ return;
14041
+ }
14042
+ definitions.forEach((definition) => this.registerValidatorType(definition));
14043
+ }
14044
+ registerValidatorType(definition) {
14045
+ const type = this.normalizeValidatorType(definition?.type);
14046
+ if (!type || typeof definition?.isValid !== 'function') {
14047
+ return;
14048
+ }
14049
+ if (BUILT_IN_VALIDATOR_TYPES.has(type)) {
14050
+ console.warn(`[NgxViewBuilder] Validator type "${type}" is built in and cannot be replaced. Use a different type name.`);
14051
+ return;
14052
+ }
14053
+ this.registeredValidatorTypes.set(type, {
14054
+ type,
14055
+ label: String(definition.label ?? '').trim() || String(definition.type ?? '').trim(),
14056
+ defaultMessage: String(definition.defaultMessage ?? '').trim(),
14057
+ hasValue: Boolean(definition.hasValue),
14058
+ valueLabel: String(definition.valueLabel ?? '').trim(),
14059
+ valuePlaceholder: String(definition.valuePlaceholder ?? '').trim(),
14060
+ appliesTo: this.normalizeValidatorAppliesTo(definition.appliesTo),
14061
+ validateEmpty: Boolean(definition.validateEmpty),
14062
+ isValid: definition.isValid,
14063
+ });
14064
+ this.warnedUnknownValidatorTypes.delete(type);
14065
+ this.publishRegisteredValidatorTypes();
14066
+ }
14067
+ getRegisteredValidatorTypes() {
14068
+ return this.registeredValidatorTypeDescriptors();
14069
+ }
14070
+ getRegisteredValidatorType(type) {
14071
+ return this.registeredValidatorTypes.get(this.normalizeValidatorType(type)) ?? null;
14072
+ }
14073
+ isBuiltInValidatorType(type) {
14074
+ return BUILT_IN_VALIDATOR_TYPES.has(this.normalizeValidatorType(type));
14075
+ }
14076
+ hasValidatorType(type) {
14077
+ const normalized = this.normalizeValidatorType(type);
14078
+ return (BUILT_IN_VALIDATOR_TYPES.has(normalized) || this.registeredValidatorTypes.has(normalized));
14079
+ }
14080
+ clearRegisteredValidatorTypes() {
14081
+ this.registeredValidatorTypes.clear();
14082
+ this.publishRegisteredValidatorTypes();
14083
+ }
14024
14084
  setValidationDisplayEnabled(enabled) {
14025
14085
  const isEnabled = Boolean(enabled);
14026
14086
  this.validationDisplayEnabled.set(isEnabled);
@@ -14252,8 +14312,30 @@ class ValidatorService {
14252
14312
  ? 'Some selected values are not in the available options list.'
14253
14313
  : 'Value must be one of the available options.'), element);
14254
14314
  }
14315
+ const registeredType = this.registeredValidatorTypes.get(type);
14316
+ if (registeredType) {
14317
+ if (!registeredType.validateEmpty && this.isEmptyValue(value)) {
14318
+ return { valid: true, message: '' };
14319
+ }
14320
+ const fallbackMessage = validator.message || registeredType.defaultMessage || 'Invalid value.';
14321
+ try {
14322
+ const isValid = await registeredType.isValid({
14323
+ value,
14324
+ validatorValue: validator?.value,
14325
+ validator,
14326
+ element,
14327
+ data: this.dataService.getData(),
14328
+ });
14329
+ return this.createValidationResult(Boolean(isValid), fallbackMessage, element);
14330
+ }
14331
+ catch (error) {
14332
+ console.error(`[NgxViewBuilder] Validator type "${registeredType.type}" threw an error.`, error);
14333
+ return this.createValidationResult(false, fallbackMessage, element);
14334
+ }
14335
+ }
14255
14336
  const customCondition = String(validator?.condition ?? '').trim();
14256
14337
  if (!customCondition) {
14338
+ this.warnUnknownValidatorType(type);
14257
14339
  return { valid: true, message: '' };
14258
14340
  }
14259
14341
  try {
@@ -14481,6 +14563,39 @@ class ValidatorService {
14481
14563
  .trim()
14482
14564
  .toLowerCase();
14483
14565
  }
14566
+ normalizeValidatorAppliesTo(appliesTo) {
14567
+ if (!Array.isArray(appliesTo)) {
14568
+ return [];
14569
+ }
14570
+ return appliesTo
14571
+ .map((item) => String(item ?? '')
14572
+ .trim()
14573
+ .toLowerCase())
14574
+ .filter((item) => item.length > 0);
14575
+ }
14576
+ publishRegisteredValidatorTypes() {
14577
+ const descriptors = Array.from(this.registeredValidatorTypes.values()).map((entry) => ({
14578
+ type: entry.type,
14579
+ label: entry.label,
14580
+ defaultMessage: entry.defaultMessage,
14581
+ hasValue: entry.hasValue,
14582
+ valueLabel: entry.valueLabel,
14583
+ valuePlaceholder: entry.valuePlaceholder,
14584
+ appliesTo: [...entry.appliesTo],
14585
+ validateEmpty: entry.validateEmpty,
14586
+ }));
14587
+ descriptors.sort((a, b) => a.label.localeCompare(b.label));
14588
+ this.registeredValidatorTypeDescriptors.set(descriptors);
14589
+ }
14590
+ warnUnknownValidatorType(type) {
14591
+ const normalized = this.normalizeValidatorType(type);
14592
+ if (BUILT_IN_VALIDATOR_TYPES.has(normalized) || this.warnedUnknownValidatorTypes.has(normalized)) {
14593
+ return;
14594
+ }
14595
+ this.warnedUnknownValidatorTypes.add(normalized);
14596
+ console.warn(`[NgxViewBuilder] Validator type "${normalized}" is not registered in this application, so the rule is skipped. ` +
14597
+ 'Register it with the API service (registerValidatorTypes) before rendering views that use it.');
14598
+ }
14484
14599
  resolveImplicitValidators(element, validators) {
14485
14600
  const implicit = [];
14486
14601
  const explicitTypes = new Set(validators
@@ -23841,6 +23956,21 @@ class NgxViewBuilderApiService {
23841
23956
  }
23842
23957
  this.expressionService.registerCustomFunctions([functionDefinition]);
23843
23958
  }
23959
+ registerValidatorTypes(definitions) {
23960
+ this.validatorService.registerValidatorTypes(definitions ?? []);
23961
+ }
23962
+ registerValidatorType(definition) {
23963
+ if (!definition) {
23964
+ return;
23965
+ }
23966
+ this.validatorService.registerValidatorType(definition);
23967
+ }
23968
+ getRegisteredValidatorTypes() {
23969
+ return this.validatorService.getRegisteredValidatorTypes();
23970
+ }
23971
+ clearRegisteredValidatorTypes() {
23972
+ this.validatorService.clearRegisteredValidatorTypes();
23973
+ }
23844
23974
  registerSvgIcon(name, svgMarkup, overwrite = true) {
23845
23975
  return this.iconSvgService.registerSvgIcon(name, svgMarkup, overwrite);
23846
23976
  }
@@ -23875,6 +24005,7 @@ class NgxViewBuilderApiService {
23875
24005
  this.registerConfiguredGlobalProperties(normalizedConfig);
23876
24006
  this.registerConfiguredElementProperties(normalizedConfig);
23877
24007
  this.registerConfiguredExpressionFunctions(normalizedConfig);
24008
+ this.registerConfiguredValidatorTypes(normalizedConfig);
23878
24009
  this.registerConfiguredRuntimeVariables(normalizedConfig);
23879
24010
  this.registerConfiguredBuilderTabs(normalizedConfig);
23880
24011
  this.registerConfiguredFeaturePacks(normalizedConfig);
@@ -23895,6 +24026,7 @@ class NgxViewBuilderApiService {
23895
24026
  this.registerConfiguredGlobalProperties(normalizedConfig);
23896
24027
  this.registerConfiguredElementProperties(normalizedConfig);
23897
24028
  this.registerConfiguredExpressionFunctions(normalizedConfig);
24029
+ this.registerConfiguredValidatorTypes(normalizedConfig);
23898
24030
  this.registerConfiguredRuntimeVariables(normalizedConfig);
23899
24031
  this.registerConfiguredBuilderTabs(normalizedConfig);
23900
24032
  this.registerConfiguredFeaturePacks(normalizedConfig);
@@ -23972,6 +24104,11 @@ class NgxViewBuilderApiService {
23972
24104
  this.registerExpressionFunctions(config.expressionFunctions);
23973
24105
  }
23974
24106
  }
24107
+ registerConfiguredValidatorTypes(config) {
24108
+ if (Array.isArray(config.validatorTypes) && config.validatorTypes.length > 0) {
24109
+ this.registerValidatorTypes(config.validatorTypes);
24110
+ }
24111
+ }
23975
24112
  registerConfiguredRuntimeVariables(config) {
23976
24113
  if (Array.isArray(config.runtimeVariables)) {
23977
24114
  this.setRuntimeVariableDefinitions(config.runtimeVariables, true);
@@ -24033,6 +24170,7 @@ class NgxViewBuilderApiService {
24033
24170
  rules: [...(normalized.rules ?? [])],
24034
24171
  fragments: [...(normalized.fragments ?? [])],
24035
24172
  expressionFunctions: [...(normalized.expressionFunctions ?? [])],
24173
+ validatorTypes: [...(normalized.validatorTypes ?? [])],
24036
24174
  runtimeVariables: [...(normalized.runtimeVariables ?? [])],
24037
24175
  uiDictionaries: { ...(normalized.uiDictionaries ?? {}) },
24038
24176
  svgIcons: { ...(normalized.svgIcons ?? {}) },
@@ -24048,6 +24186,7 @@ class NgxViewBuilderApiService {
24048
24186
  merged.rules?.push(...(pack.rules ?? []));
24049
24187
  merged.fragments?.push(...(pack.fragments ?? []));
24050
24188
  merged.expressionFunctions?.push(...(pack.expressionFunctions ?? []));
24189
+ merged.validatorTypes?.push(...(pack.validatorTypes ?? []));
24051
24190
  merged.runtimeVariables?.push(...(pack.runtimeVariables ?? []));
24052
24191
  if (pack.globalProperties && typeof pack.globalProperties === 'object') {
24053
24192
  merged.globalProperties = {
@@ -48529,7 +48668,7 @@ const BUILT_IN_RUNTIME_COMPONENT_LOADERS = {
48529
48668
  [ElementTypesEnum.AUTOCOMPLETE]: () => Promise.resolve().then(function () { return autocompleteElement; }).then((m) => m.AutocompleteElement),
48530
48669
  [ElementTypesEnum.MULTI_SELECT]: () => Promise.resolve().then(function () { return multiSelectElement; }).then((m) => m.MultiSelectElement),
48531
48670
  [ElementTypesEnum.MESSAGE_CARD]: () => Promise.resolve().then(function () { return messageCardElement; }).then((m) => m.MessageCardElement),
48532
- [ElementTypesEnum.TOAST]: () => import('./ngx-view-builder-toast-element-DQ8mU1zc.mjs').then((m) => m.ToastElement),
48671
+ [ElementTypesEnum.TOAST]: () => import('./ngx-view-builder-toast-element-6FsyoWXA.mjs').then((m) => m.ToastElement),
48533
48672
  [ElementTypesEnum.BADGE]: () => Promise.resolve().then(function () { return badgeElement; }).then((m) => m.BadgeElement),
48534
48673
  [ElementTypesEnum.STATS_CARD]: () => Promise.resolve().then(function () { return statsCardElement; }).then((m) => m.StatsCardElement),
48535
48674
  [ElementTypesEnum.CHART]: () => Promise.resolve().then(function () { return chartElement; }).then((m) => m.ChartElement),
@@ -48537,11 +48676,11 @@ const BUILT_IN_RUNTIME_COMPONENT_LOADERS = {
48537
48676
  [ElementTypesEnum.IMAGE]: () => Promise.resolve().then(function () { return imageElement; }).then((m) => m.ImageElement),
48538
48677
  [ElementTypesEnum.VIDEO]: () => Promise.resolve().then(function () { return videoElement; }).then((m) => m.VideoElement),
48539
48678
  [ElementTypesEnum.IFRAME]: () => Promise.resolve().then(function () { return iframeElement; }).then((m) => m.IframeElement),
48540
- [ElementTypesEnum.AVATAR]: () => import('./ngx-view-builder-avatar-element-B8Nh4G0m.mjs').then((m) => m.AvatarElement),
48541
- [ElementTypesEnum.ICON]: () => import('./ngx-view-builder-icon-element-DFW1jVp8.mjs').then((m) => m.IconElement),
48679
+ [ElementTypesEnum.AVATAR]: () => import('./ngx-view-builder-avatar-element-Bnxr5pVE.mjs').then((m) => m.AvatarElement),
48680
+ [ElementTypesEnum.ICON]: () => import('./ngx-view-builder-icon-element-BYreB3Ma.mjs').then((m) => m.IconElement),
48542
48681
  [ElementTypesEnum.DIVIDER]: () => Promise.resolve().then(function () { return dividerElement; }).then((m) => m.DividerElement),
48543
48682
  [ElementTypesEnum.SPACER]: () => Promise.resolve().then(function () { return spacerElement; }).then((m) => m.SpacerElement),
48544
- [ElementTypesEnum.BREADCRUMBS]: () => import('./ngx-view-builder-breadcrumbs-element-BaJoW3s7.mjs').then((m) => m.BreadcrumbsElement),
48683
+ [ElementTypesEnum.BREADCRUMBS]: () => import('./ngx-view-builder-breadcrumbs-element-DUi8_qxY.mjs').then((m) => m.BreadcrumbsElement),
48545
48684
  [ElementTypesEnum.PAGE_TITLE]: () => Promise.resolve().then(function () { return pageTitleElement; }).then((m) => m.PageTitleElement),
48546
48685
  [ElementTypesEnum.NUMBER_STEPPER]: () => Promise.resolve().then(function () { return numberStepperElement; }).then((m) => m.NumberStepperElement),
48547
48686
  [ElementTypesEnum.TIME_PICKER]: () => Promise.resolve().then(function () { return timePickerElement; }).then((m) => m.TimePickerElement),
@@ -48789,10 +48928,18 @@ class TableElement {
48789
48928
  .filter((column) => String(column?.key ?? '').trim().length > 0)
48790
48929
  .slice()
48791
48930
  .sort((left, right) => {
48931
+ const leftIndex = columns.indexOf(left);
48932
+ const rightIndex = columns.indexOf(right);
48933
+ // Builderyje autoritetas yra columnsConfig eiliskumas: perstumus stulpeli savybiu
48934
+ // skydelyje pakeitimas turi matytis is karto, o issaugoti vartotojo nustatymai
48935
+ // (columnSettingsState) neturi jo perrasyti — taip pat, kaip ir su visible zemiau.
48936
+ if (isEditorMode) {
48937
+ return leftIndex - rightIndex;
48938
+ }
48792
48939
  const leftKey = String(left?.key ?? '').trim();
48793
48940
  const rightKey = String(right?.key ?? '').trim();
48794
- const leftOrder = settingsMap.get(leftKey)?.order ?? columns.indexOf(left);
48795
- const rightOrder = settingsMap.get(rightKey)?.order ?? columns.indexOf(right);
48941
+ const leftOrder = settingsMap.get(leftKey)?.order ?? leftIndex;
48942
+ const rightOrder = settingsMap.get(rightKey)?.order ?? rightIndex;
48796
48943
  return leftOrder - rightOrder;
48797
48944
  })
48798
48945
  .filter((column, columnIndex) => {
@@ -73326,6 +73473,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
73326
73473
 
73327
73474
  class ValidatorsAttribute {
73328
73475
  property = input.required(...(ngDevMode ? [{ debugName: "property" }] : /* istanbul ignore next */ []));
73476
+ elementType = input('', ...(ngDevMode ? [{ debugName: "elementType" }] : /* istanbul ignore next */ []));
73329
73477
  onValueChange = output();
73330
73478
  validators = signal([], ...(ngDevMode ? [{ debugName: "validators" }] : /* istanbul ignore next */ []));
73331
73479
  editingValidatorIndex = signal(null, ...(ngDevMode ? [{ debugName: "editingValidatorIndex" }] : /* istanbul ignore next */ []));
@@ -73359,7 +73507,7 @@ class ValidatorsAttribute {
73359
73507
  { value: 'startsWith', label: 'starts with', kind: 'function', functionName: 'startsWithAny' },
73360
73508
  { value: 'endsWith', label: 'ends with', kind: 'function', functionName: 'endsWithAny' },
73361
73509
  ];
73362
- validatorTypeOptions = [
73510
+ builtInValidatorTypeOptions = [
73363
73511
  { value: 'required', label: 'required' },
73364
73512
  { value: 'minlength', label: 'minLength' },
73365
73513
  { value: 'maxlength', label: 'maxLength' },
@@ -73370,7 +73518,19 @@ class ValidatorsAttribute {
73370
73518
  { value: 'strictoptions', label: 'strictOptions' },
73371
73519
  { value: 'custom', label: 'custom' },
73372
73520
  ];
73521
+ validatorTypeOptions = computed(() => {
73522
+ const elementType = String(this.elementType() ?? '')
73523
+ .trim()
73524
+ .toLowerCase();
73525
+ const registered = this.validatorService
73526
+ .getRegisteredValidatorTypes()
73527
+ .filter((descriptor) => descriptor.appliesTo.length === 0 ||
73528
+ (!!elementType && descriptor.appliesTo.includes(elementType)))
73529
+ .map((descriptor) => ({ value: descriptor.type, label: descriptor.label }));
73530
+ return [...this.builtInValidatorTypeOptions, ...registered];
73531
+ }, ...(ngDevMode ? [{ debugName: "validatorTypeOptions" }] : /* istanbul ignore next */ []));
73373
73532
  structureService = inject(StructureService);
73533
+ validatorService = inject(ValidatorService);
73374
73534
  constructor() {
73375
73535
  effect(() => {
73376
73536
  this.loadValidators();
@@ -73413,37 +73573,64 @@ class ValidatorsAttribute {
73413
73573
  onValidatorTypeChange(validator) {
73414
73574
  const type = this.normalizeType(validator?.type);
73415
73575
  validator.type = type;
73416
- if (type !== 'custom') {
73417
- validator.condition = '';
73576
+ if (this.isCustomField(validator)) {
73577
+ this.resetBuilderState();
73418
73578
  }
73419
73579
  else {
73420
- this.resetBuilderState();
73580
+ validator.condition = '';
73421
73581
  }
73422
73582
  if (!this.hasValueField(validator)) {
73423
73583
  validator.value = '';
73424
73584
  }
73585
+ const registeredType = this.validatorService.getRegisteredValidatorType(type);
73586
+ if (registeredType?.defaultMessage && !String(validator.message ?? '').trim()) {
73587
+ validator.message = registeredType.defaultMessage;
73588
+ }
73425
73589
  this.emitChanges();
73426
73590
  }
73591
+ validatorTypeOptionsFor(validator) {
73592
+ const options = this.validatorTypeOptions();
73593
+ const type = this.normalizeType(validator?.type);
73594
+ if (options.some((option) => option.value === type)) {
73595
+ return options;
73596
+ }
73597
+ return [...options, { value: type, label: `${type} (not registered)` }];
73598
+ }
73427
73599
  onValidatorChanged() {
73428
73600
  this.emitChanges();
73429
73601
  }
73430
73602
  hasValueField(validator) {
73431
73603
  const type = this.normalizeType(validator?.type);
73432
- return (type === 'minlength' ||
73604
+ if (type === 'minlength' ||
73433
73605
  type === 'maxlength' ||
73434
73606
  type === 'min' ||
73435
73607
  type === 'max' ||
73436
- type === 'pattern');
73608
+ type === 'pattern') {
73609
+ return true;
73610
+ }
73611
+ return Boolean(this.validatorService.getRegisteredValidatorType(type)?.hasValue);
73437
73612
  }
73438
73613
  isPatternField(validator) {
73439
73614
  return this.normalizeType(validator?.type) === 'pattern';
73440
73615
  }
73441
73616
  isCustomField(validator) {
73442
- return this.normalizeType(validator?.type) === 'custom';
73617
+ const type = this.normalizeType(validator?.type);
73618
+ return type === 'custom' || !this.validatorService.hasValidatorType(type);
73619
+ }
73620
+ resolveValueLabel(validator) {
73621
+ const type = this.normalizeType(validator?.type);
73622
+ return this.validatorService.getRegisteredValidatorType(type)?.valueLabel ?? '';
73623
+ }
73624
+ resolveValuePlaceholder(validator) {
73625
+ if (this.isPatternField(validator)) {
73626
+ return '^[0-9]{4}$';
73627
+ }
73628
+ const type = this.normalizeType(validator?.type);
73629
+ return this.validatorService.getRegisteredValidatorType(type)?.valuePlaceholder || '10';
73443
73630
  }
73444
73631
  resolveValidatorTypeLabel(validator) {
73445
73632
  const type = this.normalizeType(validator?.type);
73446
- return this.validatorTypeOptions.find((option) => option.value === type)?.label ?? 'custom';
73633
+ return this.validatorTypeOptions().find((option) => option.value === type)?.label ?? type;
73447
73634
  }
73448
73635
  resolveValidatorSummary(validator) {
73449
73636
  if (this.isCustomField(validator)) {
@@ -73594,8 +73781,9 @@ class ValidatorsAttribute {
73594
73781
  const type = this.normalizeType(value?.['type']);
73595
73782
  const condition = String(value?.['condition'] ?? '').trim();
73596
73783
  const message = String(value?.['message'] ?? '').trim();
73784
+ const applyIf = String(value?.['applyIf'] ?? '').trim();
73597
73785
  const ruleValue = value?.['value'];
73598
- return {
73786
+ const normalized = {
73599
73787
  type,
73600
73788
  condition,
73601
73789
  message,
@@ -73605,27 +73793,17 @@ class ValidatorsAttribute {
73605
73793
  ? ruleValue
73606
73794
  : String(ruleValue),
73607
73795
  };
73796
+ if (applyIf) {
73797
+ normalized.applyIf = applyIf;
73798
+ }
73799
+ return normalized;
73608
73800
  });
73609
73801
  }
73610
73802
  normalizeType(raw) {
73611
73803
  const normalized = String(raw ?? '')
73612
73804
  .trim()
73613
73805
  .toLowerCase();
73614
- if (!normalized) {
73615
- return 'custom';
73616
- }
73617
- const allowed = new Set([
73618
- 'required',
73619
- 'minlength',
73620
- 'maxlength',
73621
- 'min',
73622
- 'max',
73623
- 'pattern',
73624
- 'email',
73625
- 'strictoptions',
73626
- 'custom',
73627
- ]);
73628
- return allowed.has(normalized) ? normalized : 'custom';
73806
+ return normalized || 'custom';
73629
73807
  }
73630
73808
  loadAllElementPaths() {
73631
73809
  const structureElements = Object.keys(this.structureService.getStructure()?.elements ?? {});
@@ -73790,7 +73968,7 @@ class ValidatorsAttribute {
73790
73968
  };
73791
73969
  }
73792
73970
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ValidatorsAttribute, deps: [], target: i0.ɵɵFactoryTarget.Component });
73793
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: ValidatorsAttribute, isStandalone: true, selector: "validators-attribute", inputs: { property: { classPropertyName: "property", publicName: "property", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onValueChange: "onValueChange" }, ngImport: i0, template: "<div class=\"validator-list\">\r\n @for (validator of validators(); track $index; let i = $index) {\r\n <article class=\"validator-item\" [attr.data-testid]=\"'validator-item-' + i\">\r\n <header class=\"validator-item__header\">\r\n <div class=\"validator-item__title-wrap\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__edit nvb-icon-button\"\r\n (click)=\"openValidatorEditor(i)\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n [attr.data-testid]=\"'validator-edit-' + i\"\r\n >\r\n <nvb-icon name=\"edit\"></nvb-icon>\r\n </button>\r\n <strong>#{{ i + 1 }}</strong>\r\n <span class=\"validator-item__summary\">{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__remove nvb-icon-button nvb-icon-button--danger\"\r\n (click)=\"removeValidator(i)\"\r\n [attr.aria-label]=\"'validator.remove' | uiT: 'Remove validator'\"\r\n [attr.data-testid]=\"'validator-remove-' + i\"\r\n >\r\n <nvb-icon name=\"delete\"></nvb-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"validator-item__meta\">\r\n <span class=\"validator-item__message\">{{ resolveValidatorMessage(validator) }}</span>\r\n </div>\r\n </article>\r\n\r\n @if (isValidatorExpanded(i)) {\r\n <div\r\n class=\"validator-dialog__backdrop\"\r\n data-testid=\"validator-dialog-backdrop\"\r\n >\r\n <div\r\n class=\"validator-dialog\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"validator-dialog-title\"\r\n aria-describedby=\"validator-dialog-description\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n data-testid=\"validator-dialog\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div class=\"validator-dialog__header\">\r\n <div class=\"validator-dialog__title-wrap\">\r\n <span id=\"validator-dialog-title\" class=\"nvb-sr-only\">\r\n {{ 'validator.edit' | uiT: 'Edit validator' }}\r\n </span>\r\n <span id=\"validator-dialog-description\" class=\"nvb-sr-only\">\r\n {{ resolveValidatorSummary(validator) }}\r\n </span>\r\n <strong>{{ 'validator.edit' | uiT: 'Edit validator' }}</strong>\r\n <span>{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__close nvb-icon-button nvb-icon-button--sx\"\r\n (click)=\"closeValidatorEditor()\"\r\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\r\n data-testid=\"validator-dialog-close\"\r\n >\r\n <nvb-icon name=\"close\"></nvb-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"validator-dialog__body\">\r\n <div class=\"validator-dialog__grid\">\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.type' | uiT: 'Type' }}\r\n <nvb-select\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.type\"\r\n (ngModelChange)=\"onValidatorTypeChange(validator)\"\r\n data-testid=\"validator-dialog-type\"\r\n >\r\n @for (option of validatorTypeOptions; track option.value) {\r\n <option [value]=\"option.value\">{{ option.label }}</option>\r\n }\r\n </nvb-select>\r\n </label>\r\n\r\n @if (hasValueField(validator)) {\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.value' | uiT: 'Value' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.value\"\r\n [spellcheck]=\"false\"\r\n [placeholder]=\"isPatternField(validator) ? '^[0-9]{4}$' : '10'\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n data-testid=\"validator-dialog-value\"\r\n />\r\n </label>\r\n }\r\n\r\n @if (isCustomField(validator)) {\r\n <div class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.condition' | uiT: 'Condition (error when true)' }}\r\n <div class=\"validator-dialog__mode-tabs\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'code'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'code'\"\r\n (click)=\"setConditionEditorMode('code')\"\r\n >\r\n {{ 'code.mode.code' | uiT: 'Code' }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'builder'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'builder'\"\r\n (click)=\"setConditionEditorMode('builder')\"\r\n >\r\n {{ 'logic.mode.builder' | uiT: 'Builder' }}\r\n </button>\r\n </div>\r\n\r\n @if (activeEditorMode() === 'builder') {\r\n <div class=\"validator-builder\" data-testid=\"validator-dialog-builder\">\r\n <datalist [id]=\"fieldSuggestionListId\">\r\n @for (field of fieldOptions(); track field.value) {\r\n <option [value]=\"field.value\">{{ field.label }}</option>\r\n }\r\n </datalist>\r\n\r\n <div class=\"validator-builder__rows\">\r\n @for (row of conditionRows; track trackByConditionRow($index, row); let rowIndex = $index) {\r\n <div class=\"validator-builder__line\">\r\n <div class=\"validator-builder__prefix\">\r\n @if (rowIndex === 0) {\r\n <span class=\"validator-builder__pill\">\r\n {{ 'code.builder.if' | uiT: 'If' }}\r\n </span>\r\n } @else {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--join\"\r\n [(ngModel)]=\"row.joinWith\"\r\n >\r\n <option value=\"&&\">{{ 'code.builder.and' | uiT: 'And' }}</option>\r\n <option value=\"||\">{{ 'code.builder.or' | uiT: 'Or' }}</option>\r\n </nvb-select>\r\n }\r\n </div>\r\n\r\n <input\r\n class=\"validator-builder__input validator-builder__input--field nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.left' | uiT: 'Left field'\"\r\n [(ngModel)]=\"row.leftField\"\r\n (ngModelChange)=\"onConditionFieldChanged(row)\"\r\n />\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--operator\"\r\n [(ngModel)]=\"row.operator\"\r\n >\r\n @for (operator of getRowOperators(row); track operator.value) {\r\n <option [value]=\"operator.value\">{{ operator.label }}</option>\r\n }\r\n </nvb-select>\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--source\"\r\n [(ngModel)]=\"row.valueSource\"\r\n (ngModelChange)=\"onConditionValueSourceChanged(row)\"\r\n >\r\n <option value=\"literal\">{{ 'code.builder.value' | uiT: 'Value' }}</option>\r\n <option value=\"field\">{{ 'code.builder.field' | uiT: 'Field' }}</option>\r\n </nvb-select>\r\n\r\n @if (row.valueSource === 'field') {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.rightField' | uiT: 'Right field'\"\r\n [(ngModel)]=\"row.fieldValue\"\r\n />\r\n } @else if (getRowFieldType(row) === 'boolean') {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--value\"\r\n [(ngModel)]=\"row.literalValue\"\r\n >\r\n <option value=\"true\">true</option>\r\n <option value=\"false\">false</option>\r\n </nvb-select>\r\n } @else {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n [type]=\"getInputType(row)\"\r\n [(ngModel)]=\"row.literalValue\"\r\n />\r\n }\r\n\r\n @if (rowIndex > 0) {\r\n <builder-icon-button\r\n class=\"validator-builder__remove\"\r\n className=\"validator-builder__remove\"\r\n icon=\"delete\"\r\n tone=\"danger\"\r\n size=\"sm\"\r\n [ariaLabel]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n [title]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n (clicked)=\"removeConditionRow(row.id)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"validator-builder__actions\">\r\n <builder-action-button\r\n tone=\"neutral\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.addCondition' | uiT: 'Add condition'\"\r\n (clicked)=\"addConditionRow()\"\r\n />\r\n <builder-action-button\r\n tone=\"subtle\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.clear' | uiT: 'Clear'\"\r\n (clicked)=\"clearConditions()\"\r\n />\r\n <builder-action-button\r\n tone=\"primary\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.apply' | uiT: 'Apply to code'\"\r\n (clicked)=\"applyBuilderToValidatorCondition(validator)\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"validator-dialog__editor\">\r\n <native-code-editor\r\n language=\"expression\"\r\n [value]=\"validator.condition || ''\"\r\n [completions]=\"getValidatorConditionCompletions()\"\r\n (valueChange)=\"setValidatorCondition(validator, $event)\"\r\n (editorBlur)=\"setValidatorCondition(validator, $event)\"\r\n data-testid=\"validator-dialog-condition\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <label class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.message' | uiT: 'Message' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.message\"\r\n [spellcheck]=\"false\"\r\n placeholder=\"Invalid value.\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n } @empty {\r\n <small class=\"validator-list__empty\">\r\n {{ 'validator.empty' | uiT: 'No validators yet.' }}\r\n </small>\r\n }\r\n</div>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"nvb-control__add-row-button\"\r\n (click)=\"addValidator()\"\r\n [attr.aria-label]=\"'validator.add' | uiT: 'Add validator'\"\r\n data-testid=\"validator-add\"\r\n>\r\n <nvb-icon name=\"add_circle\"></nvb-icon>\r\n {{ 'validator.add' | uiT: 'Add validator' }}\r\n</button>\r\n", styles: [":host{display:block}.validator-list{display:flex;flex-direction:column;gap:var(--space-2)}.validator-list__empty{display:block;padding:4px 0;color:var(--color-neutral-500);font-size:12px}.validator-item{border:1px solid var(--nvb-card-border-color, var(--color-neutral-200));border-radius:var(--nvb-control-radius, var(--radius-md));padding:7px;background:var(--nvb-card-bg, var(--color-neutral-000));box-shadow:none}.validator-item__header{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:var(--nvb-control-height);color:var(--color-neutral-700);font-size:12px}.validator-item__title-wrap{display:inline-flex;flex:1;min-width:0;align-items:center;gap:6px}.validator-item__summary,.validator-item__message{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.validator-item__summary{min-width:0;color:var(--color-neutral-800);font-weight:650}.validator-item__meta{display:flex;align-items:center;gap:6px;min-width:0;margin:4px 0 0 calc(var(--nvb-control-height) + 12px);color:var(--color-neutral-600);font-size:11px;line-height:1.35}.validator-item__message{min-width:0}.validator-dialog__backdrop{position:fixed;inset:0;z-index:2147483450;display:flex;align-items:center;justify-content:center;padding:20px;background:#0f172a5c;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.validator-dialog{display:grid;grid-template-rows:auto minmax(0,1fr);width:min(760px,100%);max-height:min(88vh,860px);overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-dialog-radius);background:var(--color-neutral-000);box-shadow:var(--nvb-shadow-16);outline:0}.validator-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 24px 12px;border-bottom:1px solid var(--color-neutral-200)}.validator-dialog__title-wrap{display:grid;gap:2px;min-width:0}.validator-dialog__title-wrap strong{color:var(--color-neutral-900);font-size:16px;line-height:22px;font-weight:600}.validator-dialog__title-wrap span{overflow:hidden;color:var(--color-neutral-500);font-size:13px;line-height:18px;text-overflow:ellipsis;white-space:nowrap}.validator-dialog__body{min-height:0;overflow:auto;padding:16px 24px 24px}.validator-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.validator-dialog__label{display:flex;flex-direction:column;gap:4px;color:var(--color-neutral-600);font-size:11px}.validator-dialog__label--full{grid-column:1/-1}.validator-dialog__editor{height:260px;min-height:260px}.validator-dialog__mode-tabs{display:inline-flex;align-self:flex-start;overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-050)}.validator-dialog__mode-tab{min-height:28px;border:0;border-right:1px solid var(--color-neutral-200);padding:0 10px;background:transparent;color:var(--color-neutral-600);cursor:pointer;font:inherit;font-size:12px}.validator-dialog__mode-tab:last-child{border-right:0}.validator-dialog__mode-tab--active{background:var(--color-neutral-000);color:var(--color-primary-700);font-weight:650}.validator-builder{display:grid;gap:12px;padding:12px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-025, var(--color-neutral-050))}.validator-builder__rows{display:grid;gap:8px}.validator-builder__line{display:grid;grid-template-columns:62px minmax(120px,1.15fr) minmax(92px,.55fr) minmax(92px,.55fr) minmax(120px,1fr) 34px;gap:8px;align-items:center}.validator-builder__prefix{display:flex;align-items:center}.validator-builder__pill{display:inline-flex;align-items:center;justify-content:center;min-height:26px;padding:0 10px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-000);color:var(--color-neutral-700);font-size:12px;font-weight:650}.validator-builder__input{width:100%;min-width:0}.validator-builder__actions{display:flex;flex-wrap:wrap;gap:8px}.validator-builder__remove{justify-self:end}.nvb-control__add-row-button{margin-top:var(--space-3)}@media(max-width:860px){.validator-builder__line{grid-template-columns:1fr}.validator-builder__remove{justify-self:start}}\n"], dependencies: [{ kind: "component", type: NvbSelect, selector: "nvb-select", inputs: ["value", "disabled", "required"], outputs: ["valueChange", "change", "focus", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NvbIcon, selector: "nvb-icon", inputs: ["name", "svg", "ariaLabel"] }, { kind: "component", type: NativeCodeEditor, selector: "native-code-editor", inputs: ["value", "language", "theme", "readOnly", "completions"], outputs: ["valueChange", "editorBlur"] }, { kind: "component", type: BuilderActionButton, selector: "builder-action-button", inputs: ["label", "ariaLabel", "testId", "title", "icon", "className", "tone", "size", "align", "active", "fullWidth", "disabled"], outputs: ["clicked"] }, { kind: "component", type: BuilderIconButton, selector: "builder-icon-button", inputs: ["icon", "ariaLabel", "title", "testId", "iconSet", "size", "tone", "ghost", "dragHandle", "active", "disabled", "className"], outputs: ["clicked"] }, { kind: "pipe", type: UiTranslatePipe, name: "uiT" }] });
73971
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: ValidatorsAttribute, isStandalone: true, selector: "validators-attribute", inputs: { property: { classPropertyName: "property", publicName: "property", isSignal: true, isRequired: true, transformFunction: null }, elementType: { classPropertyName: "elementType", publicName: "elementType", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onValueChange: "onValueChange" }, ngImport: i0, template: "<div class=\"validator-list\">\r\n @for (validator of validators(); track $index; let i = $index) {\r\n <article class=\"validator-item\" [attr.data-testid]=\"'validator-item-' + i\">\r\n <header class=\"validator-item__header\">\r\n <div class=\"validator-item__title-wrap\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__edit nvb-icon-button\"\r\n (click)=\"openValidatorEditor(i)\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n [attr.data-testid]=\"'validator-edit-' + i\"\r\n >\r\n <nvb-icon name=\"edit\"></nvb-icon>\r\n </button>\r\n <strong>#{{ i + 1 }}</strong>\r\n <span class=\"validator-item__summary\">{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__remove nvb-icon-button nvb-icon-button--danger\"\r\n (click)=\"removeValidator(i)\"\r\n [attr.aria-label]=\"'validator.remove' | uiT: 'Remove validator'\"\r\n [attr.data-testid]=\"'validator-remove-' + i\"\r\n >\r\n <nvb-icon name=\"delete\"></nvb-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"validator-item__meta\">\r\n <span class=\"validator-item__message\">{{ resolveValidatorMessage(validator) }}</span>\r\n </div>\r\n </article>\r\n\r\n @if (isValidatorExpanded(i)) {\r\n <div\r\n class=\"validator-dialog__backdrop\"\r\n data-testid=\"validator-dialog-backdrop\"\r\n >\r\n <div\r\n class=\"validator-dialog\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"validator-dialog-title\"\r\n aria-describedby=\"validator-dialog-description\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n data-testid=\"validator-dialog\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div class=\"validator-dialog__header\">\r\n <div class=\"validator-dialog__title-wrap\">\r\n <span id=\"validator-dialog-title\" class=\"nvb-sr-only\">\r\n {{ 'validator.edit' | uiT: 'Edit validator' }}\r\n </span>\r\n <span id=\"validator-dialog-description\" class=\"nvb-sr-only\">\r\n {{ resolveValidatorSummary(validator) }}\r\n </span>\r\n <strong>{{ 'validator.edit' | uiT: 'Edit validator' }}</strong>\r\n <span>{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__close nvb-icon-button nvb-icon-button--sx\"\r\n (click)=\"closeValidatorEditor()\"\r\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\r\n data-testid=\"validator-dialog-close\"\r\n >\r\n <nvb-icon name=\"close\"></nvb-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"validator-dialog__body\">\r\n <div class=\"validator-dialog__grid\">\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.type' | uiT: 'Type' }}\r\n <nvb-select\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.type\"\r\n (ngModelChange)=\"onValidatorTypeChange(validator)\"\r\n data-testid=\"validator-dialog-type\"\r\n >\r\n @for (option of validatorTypeOptionsFor(validator); track option.value) {\r\n <option [value]=\"option.value\">{{ option.label }}</option>\r\n }\r\n </nvb-select>\r\n </label>\r\n\r\n @if (hasValueField(validator)) {\r\n <label class=\"validator-dialog__label\">\r\n {{ resolveValueLabel(validator) || ('validator.value' | uiT: 'Value') }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.value\"\r\n [spellcheck]=\"false\"\r\n [placeholder]=\"resolveValuePlaceholder(validator)\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n data-testid=\"validator-dialog-value\"\r\n />\r\n </label>\r\n }\r\n\r\n @if (isCustomField(validator)) {\r\n <div class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.condition' | uiT: 'Condition (error when true)' }}\r\n <div class=\"validator-dialog__mode-tabs\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'code'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'code'\"\r\n (click)=\"setConditionEditorMode('code')\"\r\n >\r\n {{ 'code.mode.code' | uiT: 'Code' }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'builder'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'builder'\"\r\n (click)=\"setConditionEditorMode('builder')\"\r\n >\r\n {{ 'logic.mode.builder' | uiT: 'Builder' }}\r\n </button>\r\n </div>\r\n\r\n @if (activeEditorMode() === 'builder') {\r\n <div class=\"validator-builder\" data-testid=\"validator-dialog-builder\">\r\n <datalist [id]=\"fieldSuggestionListId\">\r\n @for (field of fieldOptions(); track field.value) {\r\n <option [value]=\"field.value\">{{ field.label }}</option>\r\n }\r\n </datalist>\r\n\r\n <div class=\"validator-builder__rows\">\r\n @for (row of conditionRows; track trackByConditionRow($index, row); let rowIndex = $index) {\r\n <div class=\"validator-builder__line\">\r\n <div class=\"validator-builder__prefix\">\r\n @if (rowIndex === 0) {\r\n <span class=\"validator-builder__pill\">\r\n {{ 'code.builder.if' | uiT: 'If' }}\r\n </span>\r\n } @else {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--join\"\r\n [(ngModel)]=\"row.joinWith\"\r\n >\r\n <option value=\"&&\">{{ 'code.builder.and' | uiT: 'And' }}</option>\r\n <option value=\"||\">{{ 'code.builder.or' | uiT: 'Or' }}</option>\r\n </nvb-select>\r\n }\r\n </div>\r\n\r\n <input\r\n class=\"validator-builder__input validator-builder__input--field nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.left' | uiT: 'Left field'\"\r\n [(ngModel)]=\"row.leftField\"\r\n (ngModelChange)=\"onConditionFieldChanged(row)\"\r\n />\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--operator\"\r\n [(ngModel)]=\"row.operator\"\r\n >\r\n @for (operator of getRowOperators(row); track operator.value) {\r\n <option [value]=\"operator.value\">{{ operator.label }}</option>\r\n }\r\n </nvb-select>\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--source\"\r\n [(ngModel)]=\"row.valueSource\"\r\n (ngModelChange)=\"onConditionValueSourceChanged(row)\"\r\n >\r\n <option value=\"literal\">{{ 'code.builder.value' | uiT: 'Value' }}</option>\r\n <option value=\"field\">{{ 'code.builder.field' | uiT: 'Field' }}</option>\r\n </nvb-select>\r\n\r\n @if (row.valueSource === 'field') {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.rightField' | uiT: 'Right field'\"\r\n [(ngModel)]=\"row.fieldValue\"\r\n />\r\n } @else if (getRowFieldType(row) === 'boolean') {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--value\"\r\n [(ngModel)]=\"row.literalValue\"\r\n >\r\n <option value=\"true\">true</option>\r\n <option value=\"false\">false</option>\r\n </nvb-select>\r\n } @else {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n [type]=\"getInputType(row)\"\r\n [(ngModel)]=\"row.literalValue\"\r\n />\r\n }\r\n\r\n @if (rowIndex > 0) {\r\n <builder-icon-button\r\n class=\"validator-builder__remove\"\r\n className=\"validator-builder__remove\"\r\n icon=\"delete\"\r\n tone=\"danger\"\r\n size=\"sm\"\r\n [ariaLabel]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n [title]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n (clicked)=\"removeConditionRow(row.id)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"validator-builder__actions\">\r\n <builder-action-button\r\n tone=\"neutral\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.addCondition' | uiT: 'Add condition'\"\r\n (clicked)=\"addConditionRow()\"\r\n />\r\n <builder-action-button\r\n tone=\"subtle\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.clear' | uiT: 'Clear'\"\r\n (clicked)=\"clearConditions()\"\r\n />\r\n <builder-action-button\r\n tone=\"primary\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.apply' | uiT: 'Apply to code'\"\r\n (clicked)=\"applyBuilderToValidatorCondition(validator)\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"validator-dialog__editor\">\r\n <native-code-editor\r\n language=\"expression\"\r\n [value]=\"validator.condition || ''\"\r\n [completions]=\"getValidatorConditionCompletions()\"\r\n (valueChange)=\"setValidatorCondition(validator, $event)\"\r\n (editorBlur)=\"setValidatorCondition(validator, $event)\"\r\n data-testid=\"validator-dialog-condition\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <label class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.message' | uiT: 'Message' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.message\"\r\n [spellcheck]=\"false\"\r\n placeholder=\"Invalid value.\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n } @empty {\r\n <small class=\"validator-list__empty\">\r\n {{ 'validator.empty' | uiT: 'No validators yet.' }}\r\n </small>\r\n }\r\n</div>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"nvb-control__add-row-button\"\r\n (click)=\"addValidator()\"\r\n [attr.aria-label]=\"'validator.add' | uiT: 'Add validator'\"\r\n data-testid=\"validator-add\"\r\n>\r\n <nvb-icon name=\"add_circle\"></nvb-icon>\r\n {{ 'validator.add' | uiT: 'Add validator' }}\r\n</button>\r\n", styles: [":host{display:block}.validator-list{display:flex;flex-direction:column;gap:var(--space-2)}.validator-list__empty{display:block;padding:4px 0;color:var(--color-neutral-500);font-size:12px}.validator-item{border:1px solid var(--nvb-card-border-color, var(--color-neutral-200));border-radius:var(--nvb-control-radius, var(--radius-md));padding:7px;background:var(--nvb-card-bg, var(--color-neutral-000));box-shadow:none}.validator-item__header{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:var(--nvb-control-height);color:var(--color-neutral-700);font-size:12px}.validator-item__title-wrap{display:inline-flex;flex:1;min-width:0;align-items:center;gap:6px}.validator-item__summary,.validator-item__message{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.validator-item__summary{min-width:0;color:var(--color-neutral-800);font-weight:650}.validator-item__meta{display:flex;align-items:center;gap:6px;min-width:0;margin:4px 0 0 calc(var(--nvb-control-height) + 12px);color:var(--color-neutral-600);font-size:11px;line-height:1.35}.validator-item__message{min-width:0}.validator-dialog__backdrop{position:fixed;inset:0;z-index:2147483450;display:flex;align-items:center;justify-content:center;padding:20px;background:#0f172a5c;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.validator-dialog{display:grid;grid-template-rows:auto minmax(0,1fr);width:min(760px,100%);max-height:min(88vh,860px);overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-dialog-radius);background:var(--color-neutral-000);box-shadow:var(--nvb-shadow-16);outline:0}.validator-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 24px 12px;border-bottom:1px solid var(--color-neutral-200)}.validator-dialog__title-wrap{display:grid;gap:2px;min-width:0}.validator-dialog__title-wrap strong{color:var(--color-neutral-900);font-size:16px;line-height:22px;font-weight:600}.validator-dialog__title-wrap span{overflow:hidden;color:var(--color-neutral-500);font-size:13px;line-height:18px;text-overflow:ellipsis;white-space:nowrap}.validator-dialog__body{min-height:0;overflow:auto;padding:16px 24px 24px}.validator-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.validator-dialog__label{display:flex;flex-direction:column;gap:4px;color:var(--color-neutral-600);font-size:11px}.validator-dialog__label--full{grid-column:1/-1}.validator-dialog__editor{height:260px;min-height:260px}.validator-dialog__mode-tabs{display:inline-flex;align-self:flex-start;overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-050)}.validator-dialog__mode-tab{min-height:28px;border:0;border-right:1px solid var(--color-neutral-200);padding:0 10px;background:transparent;color:var(--color-neutral-600);cursor:pointer;font:inherit;font-size:12px}.validator-dialog__mode-tab:last-child{border-right:0}.validator-dialog__mode-tab--active{background:var(--color-neutral-000);color:var(--color-primary-700);font-weight:650}.validator-builder{display:grid;gap:12px;padding:12px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-025, var(--color-neutral-050))}.validator-builder__rows{display:grid;gap:8px}.validator-builder__line{display:grid;grid-template-columns:62px minmax(120px,1.15fr) minmax(92px,.55fr) minmax(92px,.55fr) minmax(120px,1fr) 34px;gap:8px;align-items:center}.validator-builder__prefix{display:flex;align-items:center}.validator-builder__pill{display:inline-flex;align-items:center;justify-content:center;min-height:26px;padding:0 10px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-000);color:var(--color-neutral-700);font-size:12px;font-weight:650}.validator-builder__input{width:100%;min-width:0}.validator-builder__actions{display:flex;flex-wrap:wrap;gap:8px}.validator-builder__remove{justify-self:end}.nvb-control__add-row-button{margin-top:var(--space-3)}@media(max-width:860px){.validator-builder__line{grid-template-columns:1fr}.validator-builder__remove{justify-self:start}}\n"], dependencies: [{ kind: "component", type: NvbSelect, selector: "nvb-select", inputs: ["value", "disabled", "required"], outputs: ["valueChange", "change", "focus", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NvbIcon, selector: "nvb-icon", inputs: ["name", "svg", "ariaLabel"] }, { kind: "component", type: NativeCodeEditor, selector: "native-code-editor", inputs: ["value", "language", "theme", "readOnly", "completions"], outputs: ["valueChange", "editorBlur"] }, { kind: "component", type: BuilderActionButton, selector: "builder-action-button", inputs: ["label", "ariaLabel", "testId", "title", "icon", "className", "tone", "size", "align", "active", "fullWidth", "disabled"], outputs: ["clicked"] }, { kind: "component", type: BuilderIconButton, selector: "builder-icon-button", inputs: ["icon", "ariaLabel", "title", "testId", "iconSet", "size", "tone", "ghost", "dragHandle", "active", "disabled", "className"], outputs: ["clicked"] }, { kind: "pipe", type: UiTranslatePipe, name: "uiT" }] });
73794
73972
  }
73795
73973
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ValidatorsAttribute, decorators: [{
73796
73974
  type: Component,
@@ -73802,8 +73980,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
73802
73980
  NativeCodeEditor,
73803
73981
  BuilderActionButton,
73804
73982
  BuilderIconButton,
73805
- ], template: "<div class=\"validator-list\">\r\n @for (validator of validators(); track $index; let i = $index) {\r\n <article class=\"validator-item\" [attr.data-testid]=\"'validator-item-' + i\">\r\n <header class=\"validator-item__header\">\r\n <div class=\"validator-item__title-wrap\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__edit nvb-icon-button\"\r\n (click)=\"openValidatorEditor(i)\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n [attr.data-testid]=\"'validator-edit-' + i\"\r\n >\r\n <nvb-icon name=\"edit\"></nvb-icon>\r\n </button>\r\n <strong>#{{ i + 1 }}</strong>\r\n <span class=\"validator-item__summary\">{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__remove nvb-icon-button nvb-icon-button--danger\"\r\n (click)=\"removeValidator(i)\"\r\n [attr.aria-label]=\"'validator.remove' | uiT: 'Remove validator'\"\r\n [attr.data-testid]=\"'validator-remove-' + i\"\r\n >\r\n <nvb-icon name=\"delete\"></nvb-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"validator-item__meta\">\r\n <span class=\"validator-item__message\">{{ resolveValidatorMessage(validator) }}</span>\r\n </div>\r\n </article>\r\n\r\n @if (isValidatorExpanded(i)) {\r\n <div\r\n class=\"validator-dialog__backdrop\"\r\n data-testid=\"validator-dialog-backdrop\"\r\n >\r\n <div\r\n class=\"validator-dialog\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"validator-dialog-title\"\r\n aria-describedby=\"validator-dialog-description\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n data-testid=\"validator-dialog\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div class=\"validator-dialog__header\">\r\n <div class=\"validator-dialog__title-wrap\">\r\n <span id=\"validator-dialog-title\" class=\"nvb-sr-only\">\r\n {{ 'validator.edit' | uiT: 'Edit validator' }}\r\n </span>\r\n <span id=\"validator-dialog-description\" class=\"nvb-sr-only\">\r\n {{ resolveValidatorSummary(validator) }}\r\n </span>\r\n <strong>{{ 'validator.edit' | uiT: 'Edit validator' }}</strong>\r\n <span>{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__close nvb-icon-button nvb-icon-button--sx\"\r\n (click)=\"closeValidatorEditor()\"\r\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\r\n data-testid=\"validator-dialog-close\"\r\n >\r\n <nvb-icon name=\"close\"></nvb-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"validator-dialog__body\">\r\n <div class=\"validator-dialog__grid\">\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.type' | uiT: 'Type' }}\r\n <nvb-select\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.type\"\r\n (ngModelChange)=\"onValidatorTypeChange(validator)\"\r\n data-testid=\"validator-dialog-type\"\r\n >\r\n @for (option of validatorTypeOptions; track option.value) {\r\n <option [value]=\"option.value\">{{ option.label }}</option>\r\n }\r\n </nvb-select>\r\n </label>\r\n\r\n @if (hasValueField(validator)) {\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.value' | uiT: 'Value' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.value\"\r\n [spellcheck]=\"false\"\r\n [placeholder]=\"isPatternField(validator) ? '^[0-9]{4}$' : '10'\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n data-testid=\"validator-dialog-value\"\r\n />\r\n </label>\r\n }\r\n\r\n @if (isCustomField(validator)) {\r\n <div class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.condition' | uiT: 'Condition (error when true)' }}\r\n <div class=\"validator-dialog__mode-tabs\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'code'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'code'\"\r\n (click)=\"setConditionEditorMode('code')\"\r\n >\r\n {{ 'code.mode.code' | uiT: 'Code' }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'builder'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'builder'\"\r\n (click)=\"setConditionEditorMode('builder')\"\r\n >\r\n {{ 'logic.mode.builder' | uiT: 'Builder' }}\r\n </button>\r\n </div>\r\n\r\n @if (activeEditorMode() === 'builder') {\r\n <div class=\"validator-builder\" data-testid=\"validator-dialog-builder\">\r\n <datalist [id]=\"fieldSuggestionListId\">\r\n @for (field of fieldOptions(); track field.value) {\r\n <option [value]=\"field.value\">{{ field.label }}</option>\r\n }\r\n </datalist>\r\n\r\n <div class=\"validator-builder__rows\">\r\n @for (row of conditionRows; track trackByConditionRow($index, row); let rowIndex = $index) {\r\n <div class=\"validator-builder__line\">\r\n <div class=\"validator-builder__prefix\">\r\n @if (rowIndex === 0) {\r\n <span class=\"validator-builder__pill\">\r\n {{ 'code.builder.if' | uiT: 'If' }}\r\n </span>\r\n } @else {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--join\"\r\n [(ngModel)]=\"row.joinWith\"\r\n >\r\n <option value=\"&&\">{{ 'code.builder.and' | uiT: 'And' }}</option>\r\n <option value=\"||\">{{ 'code.builder.or' | uiT: 'Or' }}</option>\r\n </nvb-select>\r\n }\r\n </div>\r\n\r\n <input\r\n class=\"validator-builder__input validator-builder__input--field nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.left' | uiT: 'Left field'\"\r\n [(ngModel)]=\"row.leftField\"\r\n (ngModelChange)=\"onConditionFieldChanged(row)\"\r\n />\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--operator\"\r\n [(ngModel)]=\"row.operator\"\r\n >\r\n @for (operator of getRowOperators(row); track operator.value) {\r\n <option [value]=\"operator.value\">{{ operator.label }}</option>\r\n }\r\n </nvb-select>\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--source\"\r\n [(ngModel)]=\"row.valueSource\"\r\n (ngModelChange)=\"onConditionValueSourceChanged(row)\"\r\n >\r\n <option value=\"literal\">{{ 'code.builder.value' | uiT: 'Value' }}</option>\r\n <option value=\"field\">{{ 'code.builder.field' | uiT: 'Field' }}</option>\r\n </nvb-select>\r\n\r\n @if (row.valueSource === 'field') {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.rightField' | uiT: 'Right field'\"\r\n [(ngModel)]=\"row.fieldValue\"\r\n />\r\n } @else if (getRowFieldType(row) === 'boolean') {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--value\"\r\n [(ngModel)]=\"row.literalValue\"\r\n >\r\n <option value=\"true\">true</option>\r\n <option value=\"false\">false</option>\r\n </nvb-select>\r\n } @else {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n [type]=\"getInputType(row)\"\r\n [(ngModel)]=\"row.literalValue\"\r\n />\r\n }\r\n\r\n @if (rowIndex > 0) {\r\n <builder-icon-button\r\n class=\"validator-builder__remove\"\r\n className=\"validator-builder__remove\"\r\n icon=\"delete\"\r\n tone=\"danger\"\r\n size=\"sm\"\r\n [ariaLabel]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n [title]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n (clicked)=\"removeConditionRow(row.id)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"validator-builder__actions\">\r\n <builder-action-button\r\n tone=\"neutral\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.addCondition' | uiT: 'Add condition'\"\r\n (clicked)=\"addConditionRow()\"\r\n />\r\n <builder-action-button\r\n tone=\"subtle\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.clear' | uiT: 'Clear'\"\r\n (clicked)=\"clearConditions()\"\r\n />\r\n <builder-action-button\r\n tone=\"primary\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.apply' | uiT: 'Apply to code'\"\r\n (clicked)=\"applyBuilderToValidatorCondition(validator)\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"validator-dialog__editor\">\r\n <native-code-editor\r\n language=\"expression\"\r\n [value]=\"validator.condition || ''\"\r\n [completions]=\"getValidatorConditionCompletions()\"\r\n (valueChange)=\"setValidatorCondition(validator, $event)\"\r\n (editorBlur)=\"setValidatorCondition(validator, $event)\"\r\n data-testid=\"validator-dialog-condition\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <label class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.message' | uiT: 'Message' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.message\"\r\n [spellcheck]=\"false\"\r\n placeholder=\"Invalid value.\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n } @empty {\r\n <small class=\"validator-list__empty\">\r\n {{ 'validator.empty' | uiT: 'No validators yet.' }}\r\n </small>\r\n }\r\n</div>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"nvb-control__add-row-button\"\r\n (click)=\"addValidator()\"\r\n [attr.aria-label]=\"'validator.add' | uiT: 'Add validator'\"\r\n data-testid=\"validator-add\"\r\n>\r\n <nvb-icon name=\"add_circle\"></nvb-icon>\r\n {{ 'validator.add' | uiT: 'Add validator' }}\r\n</button>\r\n", styles: [":host{display:block}.validator-list{display:flex;flex-direction:column;gap:var(--space-2)}.validator-list__empty{display:block;padding:4px 0;color:var(--color-neutral-500);font-size:12px}.validator-item{border:1px solid var(--nvb-card-border-color, var(--color-neutral-200));border-radius:var(--nvb-control-radius, var(--radius-md));padding:7px;background:var(--nvb-card-bg, var(--color-neutral-000));box-shadow:none}.validator-item__header{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:var(--nvb-control-height);color:var(--color-neutral-700);font-size:12px}.validator-item__title-wrap{display:inline-flex;flex:1;min-width:0;align-items:center;gap:6px}.validator-item__summary,.validator-item__message{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.validator-item__summary{min-width:0;color:var(--color-neutral-800);font-weight:650}.validator-item__meta{display:flex;align-items:center;gap:6px;min-width:0;margin:4px 0 0 calc(var(--nvb-control-height) + 12px);color:var(--color-neutral-600);font-size:11px;line-height:1.35}.validator-item__message{min-width:0}.validator-dialog__backdrop{position:fixed;inset:0;z-index:2147483450;display:flex;align-items:center;justify-content:center;padding:20px;background:#0f172a5c;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.validator-dialog{display:grid;grid-template-rows:auto minmax(0,1fr);width:min(760px,100%);max-height:min(88vh,860px);overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-dialog-radius);background:var(--color-neutral-000);box-shadow:var(--nvb-shadow-16);outline:0}.validator-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 24px 12px;border-bottom:1px solid var(--color-neutral-200)}.validator-dialog__title-wrap{display:grid;gap:2px;min-width:0}.validator-dialog__title-wrap strong{color:var(--color-neutral-900);font-size:16px;line-height:22px;font-weight:600}.validator-dialog__title-wrap span{overflow:hidden;color:var(--color-neutral-500);font-size:13px;line-height:18px;text-overflow:ellipsis;white-space:nowrap}.validator-dialog__body{min-height:0;overflow:auto;padding:16px 24px 24px}.validator-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.validator-dialog__label{display:flex;flex-direction:column;gap:4px;color:var(--color-neutral-600);font-size:11px}.validator-dialog__label--full{grid-column:1/-1}.validator-dialog__editor{height:260px;min-height:260px}.validator-dialog__mode-tabs{display:inline-flex;align-self:flex-start;overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-050)}.validator-dialog__mode-tab{min-height:28px;border:0;border-right:1px solid var(--color-neutral-200);padding:0 10px;background:transparent;color:var(--color-neutral-600);cursor:pointer;font:inherit;font-size:12px}.validator-dialog__mode-tab:last-child{border-right:0}.validator-dialog__mode-tab--active{background:var(--color-neutral-000);color:var(--color-primary-700);font-weight:650}.validator-builder{display:grid;gap:12px;padding:12px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-025, var(--color-neutral-050))}.validator-builder__rows{display:grid;gap:8px}.validator-builder__line{display:grid;grid-template-columns:62px minmax(120px,1.15fr) minmax(92px,.55fr) minmax(92px,.55fr) minmax(120px,1fr) 34px;gap:8px;align-items:center}.validator-builder__prefix{display:flex;align-items:center}.validator-builder__pill{display:inline-flex;align-items:center;justify-content:center;min-height:26px;padding:0 10px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-000);color:var(--color-neutral-700);font-size:12px;font-weight:650}.validator-builder__input{width:100%;min-width:0}.validator-builder__actions{display:flex;flex-wrap:wrap;gap:8px}.validator-builder__remove{justify-self:end}.nvb-control__add-row-button{margin-top:var(--space-3)}@media(max-width:860px){.validator-builder__line{grid-template-columns:1fr}.validator-builder__remove{justify-self:start}}\n"] }]
73806
- }], ctorParameters: () => [], propDecorators: { property: [{ type: i0.Input, args: [{ isSignal: true, alias: "property", required: true }] }], onValueChange: [{ type: i0.Output, args: ["onValueChange"] }] } });
73983
+ ], template: "<div class=\"validator-list\">\r\n @for (validator of validators(); track $index; let i = $index) {\r\n <article class=\"validator-item\" [attr.data-testid]=\"'validator-item-' + i\">\r\n <header class=\"validator-item__header\">\r\n <div class=\"validator-item__title-wrap\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__edit nvb-icon-button\"\r\n (click)=\"openValidatorEditor(i)\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n [attr.data-testid]=\"'validator-edit-' + i\"\r\n >\r\n <nvb-icon name=\"edit\"></nvb-icon>\r\n </button>\r\n <strong>#{{ i + 1 }}</strong>\r\n <span class=\"validator-item__summary\">{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__remove nvb-icon-button nvb-icon-button--danger\"\r\n (click)=\"removeValidator(i)\"\r\n [attr.aria-label]=\"'validator.remove' | uiT: 'Remove validator'\"\r\n [attr.data-testid]=\"'validator-remove-' + i\"\r\n >\r\n <nvb-icon name=\"delete\"></nvb-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"validator-item__meta\">\r\n <span class=\"validator-item__message\">{{ resolveValidatorMessage(validator) }}</span>\r\n </div>\r\n </article>\r\n\r\n @if (isValidatorExpanded(i)) {\r\n <div\r\n class=\"validator-dialog__backdrop\"\r\n data-testid=\"validator-dialog-backdrop\"\r\n >\r\n <div\r\n class=\"validator-dialog\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"validator-dialog-title\"\r\n aria-describedby=\"validator-dialog-description\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n data-testid=\"validator-dialog\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div class=\"validator-dialog__header\">\r\n <div class=\"validator-dialog__title-wrap\">\r\n <span id=\"validator-dialog-title\" class=\"nvb-sr-only\">\r\n {{ 'validator.edit' | uiT: 'Edit validator' }}\r\n </span>\r\n <span id=\"validator-dialog-description\" class=\"nvb-sr-only\">\r\n {{ resolveValidatorSummary(validator) }}\r\n </span>\r\n <strong>{{ 'validator.edit' | uiT: 'Edit validator' }}</strong>\r\n <span>{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__close nvb-icon-button nvb-icon-button--sx\"\r\n (click)=\"closeValidatorEditor()\"\r\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\r\n data-testid=\"validator-dialog-close\"\r\n >\r\n <nvb-icon name=\"close\"></nvb-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"validator-dialog__body\">\r\n <div class=\"validator-dialog__grid\">\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.type' | uiT: 'Type' }}\r\n <nvb-select\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.type\"\r\n (ngModelChange)=\"onValidatorTypeChange(validator)\"\r\n data-testid=\"validator-dialog-type\"\r\n >\r\n @for (option of validatorTypeOptionsFor(validator); track option.value) {\r\n <option [value]=\"option.value\">{{ option.label }}</option>\r\n }\r\n </nvb-select>\r\n </label>\r\n\r\n @if (hasValueField(validator)) {\r\n <label class=\"validator-dialog__label\">\r\n {{ resolveValueLabel(validator) || ('validator.value' | uiT: 'Value') }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.value\"\r\n [spellcheck]=\"false\"\r\n [placeholder]=\"resolveValuePlaceholder(validator)\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n data-testid=\"validator-dialog-value\"\r\n />\r\n </label>\r\n }\r\n\r\n @if (isCustomField(validator)) {\r\n <div class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.condition' | uiT: 'Condition (error when true)' }}\r\n <div class=\"validator-dialog__mode-tabs\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'code'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'code'\"\r\n (click)=\"setConditionEditorMode('code')\"\r\n >\r\n {{ 'code.mode.code' | uiT: 'Code' }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'builder'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'builder'\"\r\n (click)=\"setConditionEditorMode('builder')\"\r\n >\r\n {{ 'logic.mode.builder' | uiT: 'Builder' }}\r\n </button>\r\n </div>\r\n\r\n @if (activeEditorMode() === 'builder') {\r\n <div class=\"validator-builder\" data-testid=\"validator-dialog-builder\">\r\n <datalist [id]=\"fieldSuggestionListId\">\r\n @for (field of fieldOptions(); track field.value) {\r\n <option [value]=\"field.value\">{{ field.label }}</option>\r\n }\r\n </datalist>\r\n\r\n <div class=\"validator-builder__rows\">\r\n @for (row of conditionRows; track trackByConditionRow($index, row); let rowIndex = $index) {\r\n <div class=\"validator-builder__line\">\r\n <div class=\"validator-builder__prefix\">\r\n @if (rowIndex === 0) {\r\n <span class=\"validator-builder__pill\">\r\n {{ 'code.builder.if' | uiT: 'If' }}\r\n </span>\r\n } @else {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--join\"\r\n [(ngModel)]=\"row.joinWith\"\r\n >\r\n <option value=\"&&\">{{ 'code.builder.and' | uiT: 'And' }}</option>\r\n <option value=\"||\">{{ 'code.builder.or' | uiT: 'Or' }}</option>\r\n </nvb-select>\r\n }\r\n </div>\r\n\r\n <input\r\n class=\"validator-builder__input validator-builder__input--field nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.left' | uiT: 'Left field'\"\r\n [(ngModel)]=\"row.leftField\"\r\n (ngModelChange)=\"onConditionFieldChanged(row)\"\r\n />\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--operator\"\r\n [(ngModel)]=\"row.operator\"\r\n >\r\n @for (operator of getRowOperators(row); track operator.value) {\r\n <option [value]=\"operator.value\">{{ operator.label }}</option>\r\n }\r\n </nvb-select>\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--source\"\r\n [(ngModel)]=\"row.valueSource\"\r\n (ngModelChange)=\"onConditionValueSourceChanged(row)\"\r\n >\r\n <option value=\"literal\">{{ 'code.builder.value' | uiT: 'Value' }}</option>\r\n <option value=\"field\">{{ 'code.builder.field' | uiT: 'Field' }}</option>\r\n </nvb-select>\r\n\r\n @if (row.valueSource === 'field') {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.rightField' | uiT: 'Right field'\"\r\n [(ngModel)]=\"row.fieldValue\"\r\n />\r\n } @else if (getRowFieldType(row) === 'boolean') {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--value\"\r\n [(ngModel)]=\"row.literalValue\"\r\n >\r\n <option value=\"true\">true</option>\r\n <option value=\"false\">false</option>\r\n </nvb-select>\r\n } @else {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n [type]=\"getInputType(row)\"\r\n [(ngModel)]=\"row.literalValue\"\r\n />\r\n }\r\n\r\n @if (rowIndex > 0) {\r\n <builder-icon-button\r\n class=\"validator-builder__remove\"\r\n className=\"validator-builder__remove\"\r\n icon=\"delete\"\r\n tone=\"danger\"\r\n size=\"sm\"\r\n [ariaLabel]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n [title]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n (clicked)=\"removeConditionRow(row.id)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"validator-builder__actions\">\r\n <builder-action-button\r\n tone=\"neutral\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.addCondition' | uiT: 'Add condition'\"\r\n (clicked)=\"addConditionRow()\"\r\n />\r\n <builder-action-button\r\n tone=\"subtle\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.clear' | uiT: 'Clear'\"\r\n (clicked)=\"clearConditions()\"\r\n />\r\n <builder-action-button\r\n tone=\"primary\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.apply' | uiT: 'Apply to code'\"\r\n (clicked)=\"applyBuilderToValidatorCondition(validator)\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"validator-dialog__editor\">\r\n <native-code-editor\r\n language=\"expression\"\r\n [value]=\"validator.condition || ''\"\r\n [completions]=\"getValidatorConditionCompletions()\"\r\n (valueChange)=\"setValidatorCondition(validator, $event)\"\r\n (editorBlur)=\"setValidatorCondition(validator, $event)\"\r\n data-testid=\"validator-dialog-condition\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <label class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.message' | uiT: 'Message' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.message\"\r\n [spellcheck]=\"false\"\r\n placeholder=\"Invalid value.\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n } @empty {\r\n <small class=\"validator-list__empty\">\r\n {{ 'validator.empty' | uiT: 'No validators yet.' }}\r\n </small>\r\n }\r\n</div>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"nvb-control__add-row-button\"\r\n (click)=\"addValidator()\"\r\n [attr.aria-label]=\"'validator.add' | uiT: 'Add validator'\"\r\n data-testid=\"validator-add\"\r\n>\r\n <nvb-icon name=\"add_circle\"></nvb-icon>\r\n {{ 'validator.add' | uiT: 'Add validator' }}\r\n</button>\r\n", styles: [":host{display:block}.validator-list{display:flex;flex-direction:column;gap:var(--space-2)}.validator-list__empty{display:block;padding:4px 0;color:var(--color-neutral-500);font-size:12px}.validator-item{border:1px solid var(--nvb-card-border-color, var(--color-neutral-200));border-radius:var(--nvb-control-radius, var(--radius-md));padding:7px;background:var(--nvb-card-bg, var(--color-neutral-000));box-shadow:none}.validator-item__header{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:var(--nvb-control-height);color:var(--color-neutral-700);font-size:12px}.validator-item__title-wrap{display:inline-flex;flex:1;min-width:0;align-items:center;gap:6px}.validator-item__summary,.validator-item__message{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.validator-item__summary{min-width:0;color:var(--color-neutral-800);font-weight:650}.validator-item__meta{display:flex;align-items:center;gap:6px;min-width:0;margin:4px 0 0 calc(var(--nvb-control-height) + 12px);color:var(--color-neutral-600);font-size:11px;line-height:1.35}.validator-item__message{min-width:0}.validator-dialog__backdrop{position:fixed;inset:0;z-index:2147483450;display:flex;align-items:center;justify-content:center;padding:20px;background:#0f172a5c;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.validator-dialog{display:grid;grid-template-rows:auto minmax(0,1fr);width:min(760px,100%);max-height:min(88vh,860px);overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-dialog-radius);background:var(--color-neutral-000);box-shadow:var(--nvb-shadow-16);outline:0}.validator-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 24px 12px;border-bottom:1px solid var(--color-neutral-200)}.validator-dialog__title-wrap{display:grid;gap:2px;min-width:0}.validator-dialog__title-wrap strong{color:var(--color-neutral-900);font-size:16px;line-height:22px;font-weight:600}.validator-dialog__title-wrap span{overflow:hidden;color:var(--color-neutral-500);font-size:13px;line-height:18px;text-overflow:ellipsis;white-space:nowrap}.validator-dialog__body{min-height:0;overflow:auto;padding:16px 24px 24px}.validator-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.validator-dialog__label{display:flex;flex-direction:column;gap:4px;color:var(--color-neutral-600);font-size:11px}.validator-dialog__label--full{grid-column:1/-1}.validator-dialog__editor{height:260px;min-height:260px}.validator-dialog__mode-tabs{display:inline-flex;align-self:flex-start;overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-050)}.validator-dialog__mode-tab{min-height:28px;border:0;border-right:1px solid var(--color-neutral-200);padding:0 10px;background:transparent;color:var(--color-neutral-600);cursor:pointer;font:inherit;font-size:12px}.validator-dialog__mode-tab:last-child{border-right:0}.validator-dialog__mode-tab--active{background:var(--color-neutral-000);color:var(--color-primary-700);font-weight:650}.validator-builder{display:grid;gap:12px;padding:12px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-025, var(--color-neutral-050))}.validator-builder__rows{display:grid;gap:8px}.validator-builder__line{display:grid;grid-template-columns:62px minmax(120px,1.15fr) minmax(92px,.55fr) minmax(92px,.55fr) minmax(120px,1fr) 34px;gap:8px;align-items:center}.validator-builder__prefix{display:flex;align-items:center}.validator-builder__pill{display:inline-flex;align-items:center;justify-content:center;min-height:26px;padding:0 10px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-000);color:var(--color-neutral-700);font-size:12px;font-weight:650}.validator-builder__input{width:100%;min-width:0}.validator-builder__actions{display:flex;flex-wrap:wrap;gap:8px}.validator-builder__remove{justify-self:end}.nvb-control__add-row-button{margin-top:var(--space-3)}@media(max-width:860px){.validator-builder__line{grid-template-columns:1fr}.validator-builder__remove{justify-self:start}}\n"] }]
73984
+ }], ctorParameters: () => [], propDecorators: { property: [{ type: i0.Input, args: [{ isSignal: true, alias: "property", required: true }] }], elementType: [{ type: i0.Input, args: [{ isSignal: true, alias: "elementType", required: false }] }], onValueChange: [{ type: i0.Output, args: ["onValueChange"] }] } });
73807
73985
 
73808
73986
  class TemplateNameAttribute {
73809
73987
  property = input.required(...(ngDevMode ? [{ debugName: "property" }] : /* istanbul ignore next */ []));
@@ -77644,7 +77822,7 @@ class PropertiesSidebar {
77644
77822
  this.propertyHighlightTimeoutId = null;
77645
77823
  }
77646
77824
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PropertiesSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
77647
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: PropertiesSidebar, isStandalone: true, selector: "properties-sidebar", ngImport: i0, template: "<div class=\"properties-sidebar\" data-testid=\"properties-sidebar-root\">\r\n <div class=\"properties-sidebar__context\">\r\n <div class=\"properties-sidebar__context-title\">\r\n {{ getFocusedElementDisplayLabel() }}\r\n </div>\r\n @if (getFocusedElementMetaLabel(); as focusedElementMeta) {\r\n <div class=\"properties-sidebar__context-meta\">\r\n {{ focusedElementMeta }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"properties-sidebar__search\">\r\n <builder-search-input\r\n class=\"properties-sidebar__search-input-wrap\"\r\n [value]=\"propertySearchTerm()\"\r\n [placeholder]=\"'properties.search' | uiT: 'Search properties'\"\r\n [ariaLabel]=\"'properties.search' | uiT: 'Search properties'\"\r\n [clearAriaLabel]=\"'common.clear' | uiT: 'Clear search'\"\r\n testId=\"property-search-input\"\r\n (valueChanged)=\"propertySearchTerm.set($event); syncSelectedCategoryWithVisibleProperties()\"\r\n (cleared)=\"clearPropertySearch()\"\r\n />\r\n\r\n @let propertyMatches = getPropertySearchMatches();\r\n @if (propertySearchTerm().trim()) {\r\n <div class=\"properties-sidebar__search-results\" data-testid=\"property-search-results\">\r\n @if (!propertyMatches.length) {\r\n <div class=\"properties-sidebar__search-empty\">\r\n {{ 'properties.searchEmpty' | uiT: 'No matches found.' }}\r\n </div>\r\n } @else {\r\n @for (match of propertyMatches; track match.key) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__search-result\"\r\n (click)=\"navigateToProperty(match)\"\r\n [attr.data-testid]=\"'property-search-result-' + match.key\"\r\n >\r\n <span class=\"properties-sidebar__search-result-label\">{{ match.label }}</span>\r\n <span class=\"properties-sidebar__search-result-meta\">\r\n {{ 'propertyCategory.' + match.categoryName | uiT: match.categoryLabel }}\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n <ul class=\"properties-sidebar__groups\">\r\n @for (propertyCategory of propertyCategories(); track propertyCategory.name) {\r\n @if (categoryHasVisibleProperties(propertyCategory.name)) {\r\n <li class=\"properties-sidebar__group\">\r\n @let isActive = propertyCategory.name === selectedCategory();\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__group-button nvb-button nvb-button--subtle nvb-button--full nvb-button--left nvb-button--ms\"\r\n [ngClass]=\"{ 'properties-sidebar__group-button--active': isActive }\"\r\n (click)=\"selectCategory(propertyCategory.name)\"\r\n [attr.data-testid]=\"'property-category-' + propertyCategory.name\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined properties-sidebar__group-arrow\"\r\n [ngClass]=\"{ 'properties-sidebar__group-arrow--active': isActive }\"\r\n >chevron_right</span\r\n >\r\n <span>\r\n {{ 'propertyCategory.' + propertyCategory.name | uiT: propertyCategory.label }}\r\n </span>\r\n </button>\r\n @if (propertyCategory.name === selectedCategory()) {\r\n @let sections = getSectionsForCategory(propertyCategory.name);\r\n @let renderVersion = propertyRenderVersion();\r\n <div class=\"properties-sidebar__table\" [attr.data-render-version]=\"renderVersion\">\r\n @for (section of sections; track section.name) {\r\n @if (hasVisibleProperties(section.propertyKeys)) {\r\n <section class=\"properties-sidebar__section\">\r\n <div class=\"properties-sidebar__section-body\">\r\n @for (key of section.propertyKeys; track key) {\r\n @let property = properties()[key];\r\n @if (!property.hidden && selectedCategory() === property.category) {\r\n <div\r\n class=\"properties-sidebar__property\"\r\n [attr.data-testid]=\"'property-row-' + key\"\r\n [attr.data-property-type]=\"property.type\"\r\n [attr.data-property-category]=\"property.category\"\r\n [class.properties-sidebar__property--highlighted]=\"\r\n highlightedPropertyKey() === key\r\n \"\r\n [attr.tabindex]=\"highlightedPropertyKey() === key ? 0 : -1\"\r\n >\r\n @switch (property.type) {\r\n @case ('logicExpressions') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <logic-attribute\r\n [properties]=\"properties()\"\r\n [logicKeys]=\"logicExpressionKeys()\"\r\n (onValueChange)=\"setLogicPropertyValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('text') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [ownerElement]=\"element()\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setTextPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('number') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <number-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('size') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <size-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('padding') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <padding-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('color') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <color-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('checkbox') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--checkbox\"\r\n >\r\n <div class=\"properties-sidebar__checkbox-row\">\r\n <label class=\"properties-sidebar__checkbox-option\">\r\n <checkbox-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </label>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"\r\n setPropertyHintVisible(true, hint, $event, key)\r\n \"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('checklist') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <checklist-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('textarea') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-area-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('htmlCode') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <html-code-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('file') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <file-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('select') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <select-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <source-name-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('templateName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <template-name-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [fieldMap]=\"getTemplateFieldMap(key)\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n (fieldMapChange)=\"setTemplateFieldMapValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('columnList') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('options') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <option-attribute\r\n [property]=\"property\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('progressFlowItems') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <progress-flow-items-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('selectButtonOptions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <select-button-options-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableRequestParams') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-request-params-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceMapper') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <source-mapper-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('eventActions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <event-actions-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('variantRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <variant-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('validators') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <validators-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableColumns') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableStatusRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-status-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('custom') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <custom-property-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </section>\r\n }\r\n }\r\n </div>\r\n }\r\n </li>\r\n }\r\n }\r\n </ul>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.properties-sidebar{--ps-bg: color-mix(in oklab, var(--color-neutral-050) 82%, var(--color-neutral-000));--ps-surface: var(--color-neutral-000);--ps-surface-muted: var(--nvb-surface-muted-bg);--ps-border: var(--color-neutral-200);--ps-border-strong: var(--color-neutral-300);--ps-text: var(--color-neutral-900);--ps-muted: var(--color-neutral-600);--ps-faint: var(--color-neutral-500);--ps-active: var(--color-primary-600);--ps-active-bg: color-mix(in oklab, var(--color-primary-050) 64%, var(--color-neutral-000));--nvb-input-height: 32px;--nvb-control-height: 32px;--nvb-input-padding-x: 10px;--nvb-control-padding-x: 10px;--nvb-input-radius: 4px;--nvb-control-radius: 4px;--nvb-button-radius: 4px;--nvb-input-font-size: 12px;--nvb-control-font-size: 12px;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden;color:var(--ps-text);background:var(--ps-bg)}.properties-sidebar__context{flex-shrink:0;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;min-height:48px;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__context-title{min-width:0;color:var(--ps-text);font-size:14px;font-weight:650;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__context-meta{max-width:110px;padding:2px 6px;border:1px solid var(--ps-border);border-radius:999px;background:color-mix(in oklab,var(--color-primary-050) 26%,var(--ps-surface));color:var(--ps-muted);font-size:10px;font-weight:600;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__notice{flex-shrink:0;margin:8px 10px 0;padding:8px 10px;border:1px solid color-mix(in oklab,var(--color-warning-500) 32%,var(--ps-border));border-radius:var(--nvb-control-radius);background:color-mix(in oklab,var(--color-warning-500) 7%,var(--ps-surface));color:var(--color-warning-800);font-size:11px;line-height:1.4}.properties-sidebar__search{flex-shrink:0;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__search-input-wrap{position:relative}.properties-sidebar__search-input{border-color:var(--ps-border-strong)}.properties-sidebar__search-clear{color:var(--ps-muted)}.properties-sidebar__search-results{display:grid;gap:2px;max-height:260px;overflow:auto;margin-top:6px;padding:4px;border:1px solid var(--ps-border);border-radius:var(--nvb-menu-radius, var(--nvb-control-radius));background:var(--ps-surface);box-shadow:var(--nvb-shadow-8)}.properties-sidebar__search-empty{padding:10px;color:var(--ps-muted);font-size:12px;text-align:center}.properties-sidebar__search-result{width:100%;display:grid;gap:2px;padding:7px 8px;border:0;border-radius:4px;background:transparent;text-align:left;cursor:pointer;transition:background-color .12s ease}.properties-sidebar__search-result:hover{background:var(--ps-surface-muted)}.properties-sidebar__search-result:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.properties-sidebar__search-result-label{color:var(--ps-text);font-size:12px;font-weight:600}.properties-sidebar__search-result-meta{color:var(--ps-muted);font-size:11px;line-height:1.35}.properties-sidebar__groups{flex:1;min-height:0;overflow-y:auto;padding:0;scrollbar-width:thin;scrollbar-color:var(--ps-border-strong) transparent}.properties-sidebar__group{list-style:none;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__group:last-child{border-bottom:0}.properties-sidebar__group-button{width:100%;min-height:36px;padding:0 12px;border:0;border-radius:0;background:var(--ps-surface);color:var(--ps-muted);display:flex;align-items:center;justify-content:flex-start;gap:7px;box-shadow:none;text-align:left;-webkit-user-select:none;user-select:none;font-size:12px;font-weight:650;letter-spacing:.02em;text-transform:none;transition:background-color .12s ease,color .12s ease}.properties-sidebar__group-button:hover{background:var(--ps-surface-muted);color:var(--ps-text)}.properties-sidebar__group-button:focus-visible{outline:0;box-shadow:inset 0 0 0 2px color-mix(in oklab,var(--ps-active) 60%,transparent)}.properties-sidebar__group-button--active{background:var(--ps-active-bg);color:var(--ps-text)}.properties-sidebar__group-button--active:before{content:\"\";width:2px;align-self:stretch;min-height:18px;margin:8px 1px 8px 0;border-radius:999px;background:var(--ps-active);flex-shrink:0}.properties-sidebar__group-arrow{color:var(--ps-faint);font-size:15px;flex-shrink:0;transition:transform .12s ease}.properties-sidebar__group-arrow--active{transform:rotate(90deg);color:var(--ps-active)}.properties-sidebar__list-items{display:flex;flex-direction:column;gap:0;padding:0}.properties-sidebar__table{min-height:0;display:grid;grid-template-columns:minmax(0,1fr);background:var(--ps-surface)}.properties-sidebar__section{display:grid;grid-template-columns:minmax(0,1fr);gap:0;margin:0;border-top:0;background:var(--ps-surface)}.properties-sidebar__section-body{display:grid;grid-template-columns:minmax(0,1fr);gap:0;padding:4px 0}.properties-sidebar__property{display:grid;grid-template-columns:minmax(0,1fr);gap:4px;padding:8px 12px;border-left:2px solid transparent;background:var(--ps-surface);transition:border-color .12s ease,background-color .12s ease}.properties-sidebar__property--highlighted{border-left-color:var(--ps-active);background:var(--ps-active-bg);outline:none}.properties-sidebar__label{width:100%;min-width:0;position:relative;z-index:1;justify-self:stretch;display:inline-flex;align-items:center;gap:4px;padding:0;color:var(--ps-muted);font-size:11px;font-weight:600;line-height:1.35}.properties-sidebar__label span{min-width:0;overflow:hidden;text-overflow:ellipsis}.properties-sidebar__label:hover,.properties-sidebar__label:focus-within{z-index:80}.properties-sidebar__attribute{width:100%;min-width:0;grid-column:1;margin-top:0}.properties-sidebar__field--full,.properties-sidebar__field--value{grid-column:1;display:grid;grid-template-columns:1fr}.properties-sidebar__field--checkbox{grid-column:1;margin-top:0}.properties-sidebar__hint{width:14px;height:14px;border:1px solid var(--color-neutral-200);border-radius:3px;background:var(--color-neutral-100);color:var(--color-neutral-500);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:help;position:relative;transition:background-color .12s ease,color .12s ease}.properties-sidebar__hint:before{content:\"?\";font-size:10px;font-weight:600;line-height:1}.properties-sidebar__hint:hover{background:var(--color-neutral-150, var(--color-neutral-100));border-color:var(--color-neutral-300);color:var(--color-neutral-700)}.properties-sidebar__hint .nvb-icon-svg{display:none}.properties-sidebar__checkbox-row{min-height:var(--nvb-control-height);display:flex;align-items:center;gap:7px}.properties-sidebar__checkbox-option{min-width:0;display:inline-flex;align-items:center;gap:7px;color:var(--ps-text);font-size:12px;font-weight:500;line-height:1.35;cursor:pointer}.properties-sidebar__checkbox-option checkbox-attribute{flex-shrink:0;display:inline-flex;align-items:center}.properties-sidebar__checkbox-option span{min-width:0}\n"], dependencies: [{ kind: "component", type: TextAttribute, selector: "text-attribute", inputs: ["property", "propertyKey", "ownerFocusKey", "ownerElement"], outputs: ["onValueChange"] }, { kind: "component", type: CheckboxAttribute, selector: "checkbox-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ChecklistAttribute, selector: "checklist-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: TextAreaAttribute, selector: "text-area-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SelectAttribute, selector: "select-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "component", type: ColumnsAttribute, selector: "columns-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: NumberAttribute, selector: "number-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: OptionAttribute, selector: "option-attribute", inputs: ["property", "ownerFocusKey"], outputs: ["onValueChange"] }, { kind: "component", type: ProgressFlowItemsAttribute, selector: "progress-flow-items-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SourceMapperAttribute, selector: "source-mapper-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SizeAttribute, selector: "size-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: PaddingAttribute, selector: "padding-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ColorAttribute, selector: "color-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: EventActionsAttribute, selector: "event-actions-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableColumnsAttribute, selector: "table-columns-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SourceNameAttribute, selector: "source-name-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableStatusRulesAttribute, selector: "table-status-rules-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ValidatorsAttribute, selector: "validators-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TemplateNameAttribute, selector: "template-name-attribute", inputs: ["property", "propertyKey", "fieldMap"], outputs: ["onValueChange", "fieldMapChange"] }, { kind: "component", type: HtmlCodeAttribute, selector: "html-code-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "component", type: FileAttribute, selector: "file-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SelectButtonOptionsAttribute, selector: "select-button-options-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableRequestParamsAttribute, selector: "table-request-params-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: VariantRulesAttribute, selector: "variant-rules-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: LogicAttribute, selector: "logic-attribute", inputs: ["properties", "logicKeys"], outputs: ["onValueChange"] }, { kind: "component", type: NvbIcon, selector: "nvb-icon", inputs: ["name", "svg", "ariaLabel"] }, { kind: "component", type: TooltipComponent, selector: "app-tooltip", inputs: ["text", "metaText", "top", "left", "interactive"], outputs: ["mouseEntered", "mouseLeft"] }, { kind: "component", type: BuilderSearchInput, selector: "builder-search-input", inputs: ["value", "placeholder", "ariaLabel", "testId", "clearAriaLabel", "showSearchIcon"], outputs: ["valueChanged", "cleared"] }, { kind: "component", type: CustomPropertyAttribute, selector: "custom-property-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "pipe", type: UiTranslatePipe, name: "uiT" }] });
77825
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: PropertiesSidebar, isStandalone: true, selector: "properties-sidebar", ngImport: i0, template: "<div class=\"properties-sidebar\" data-testid=\"properties-sidebar-root\">\r\n <div class=\"properties-sidebar__context\">\r\n <div class=\"properties-sidebar__context-title\">\r\n {{ getFocusedElementDisplayLabel() }}\r\n </div>\r\n @if (getFocusedElementMetaLabel(); as focusedElementMeta) {\r\n <div class=\"properties-sidebar__context-meta\">\r\n {{ focusedElementMeta }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"properties-sidebar__search\">\r\n <builder-search-input\r\n class=\"properties-sidebar__search-input-wrap\"\r\n [value]=\"propertySearchTerm()\"\r\n [placeholder]=\"'properties.search' | uiT: 'Search properties'\"\r\n [ariaLabel]=\"'properties.search' | uiT: 'Search properties'\"\r\n [clearAriaLabel]=\"'common.clear' | uiT: 'Clear search'\"\r\n testId=\"property-search-input\"\r\n (valueChanged)=\"propertySearchTerm.set($event); syncSelectedCategoryWithVisibleProperties()\"\r\n (cleared)=\"clearPropertySearch()\"\r\n />\r\n\r\n @let propertyMatches = getPropertySearchMatches();\r\n @if (propertySearchTerm().trim()) {\r\n <div class=\"properties-sidebar__search-results\" data-testid=\"property-search-results\">\r\n @if (!propertyMatches.length) {\r\n <div class=\"properties-sidebar__search-empty\">\r\n {{ 'properties.searchEmpty' | uiT: 'No matches found.' }}\r\n </div>\r\n } @else {\r\n @for (match of propertyMatches; track match.key) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__search-result\"\r\n (click)=\"navigateToProperty(match)\"\r\n [attr.data-testid]=\"'property-search-result-' + match.key\"\r\n >\r\n <span class=\"properties-sidebar__search-result-label\">{{ match.label }}</span>\r\n <span class=\"properties-sidebar__search-result-meta\">\r\n {{ 'propertyCategory.' + match.categoryName | uiT: match.categoryLabel }}\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n <ul class=\"properties-sidebar__groups\">\r\n @for (propertyCategory of propertyCategories(); track propertyCategory.name) {\r\n @if (categoryHasVisibleProperties(propertyCategory.name)) {\r\n <li class=\"properties-sidebar__group\">\r\n @let isActive = propertyCategory.name === selectedCategory();\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__group-button nvb-button nvb-button--subtle nvb-button--full nvb-button--left nvb-button--ms\"\r\n [ngClass]=\"{ 'properties-sidebar__group-button--active': isActive }\"\r\n (click)=\"selectCategory(propertyCategory.name)\"\r\n [attr.data-testid]=\"'property-category-' + propertyCategory.name\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined properties-sidebar__group-arrow\"\r\n [ngClass]=\"{ 'properties-sidebar__group-arrow--active': isActive }\"\r\n >chevron_right</span\r\n >\r\n <span>\r\n {{ 'propertyCategory.' + propertyCategory.name | uiT: propertyCategory.label }}\r\n </span>\r\n </button>\r\n @if (propertyCategory.name === selectedCategory()) {\r\n @let sections = getSectionsForCategory(propertyCategory.name);\r\n @let renderVersion = propertyRenderVersion();\r\n <div class=\"properties-sidebar__table\" [attr.data-render-version]=\"renderVersion\">\r\n @for (section of sections; track section.name) {\r\n @if (hasVisibleProperties(section.propertyKeys)) {\r\n <section class=\"properties-sidebar__section\">\r\n <div class=\"properties-sidebar__section-body\">\r\n @for (key of section.propertyKeys; track key) {\r\n @let property = properties()[key];\r\n @if (!property.hidden && selectedCategory() === property.category) {\r\n <div\r\n class=\"properties-sidebar__property\"\r\n [attr.data-testid]=\"'property-row-' + key\"\r\n [attr.data-property-type]=\"property.type\"\r\n [attr.data-property-category]=\"property.category\"\r\n [class.properties-sidebar__property--highlighted]=\"\r\n highlightedPropertyKey() === key\r\n \"\r\n [attr.tabindex]=\"highlightedPropertyKey() === key ? 0 : -1\"\r\n >\r\n @switch (property.type) {\r\n @case ('logicExpressions') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <logic-attribute\r\n [properties]=\"properties()\"\r\n [logicKeys]=\"logicExpressionKeys()\"\r\n (onValueChange)=\"setLogicPropertyValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('text') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [ownerElement]=\"element()\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setTextPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('number') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <number-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('size') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <size-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('padding') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <padding-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('color') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <color-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('checkbox') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--checkbox\"\r\n >\r\n <div class=\"properties-sidebar__checkbox-row\">\r\n <label class=\"properties-sidebar__checkbox-option\">\r\n <checkbox-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </label>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"\r\n setPropertyHintVisible(true, hint, $event, key)\r\n \"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('checklist') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <checklist-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('textarea') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-area-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('htmlCode') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <html-code-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('file') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <file-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('select') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <select-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <source-name-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('templateName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <template-name-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [fieldMap]=\"getTemplateFieldMap(key)\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n (fieldMapChange)=\"setTemplateFieldMapValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('columnList') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('options') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <option-attribute\r\n [property]=\"property\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('progressFlowItems') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <progress-flow-items-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('selectButtonOptions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <select-button-options-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableRequestParams') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-request-params-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceMapper') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <source-mapper-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('eventActions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <event-actions-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('variantRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <variant-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('validators') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <validators-attribute\r\n [property]=\"property\"\r\n [elementType]=\"element()?.type ?? ''\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableColumns') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableStatusRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-status-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('custom') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <custom-property-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </section>\r\n }\r\n }\r\n </div>\r\n }\r\n </li>\r\n }\r\n }\r\n </ul>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.properties-sidebar{--ps-bg: color-mix(in oklab, var(--color-neutral-050) 82%, var(--color-neutral-000));--ps-surface: var(--color-neutral-000);--ps-surface-muted: var(--nvb-surface-muted-bg);--ps-border: var(--color-neutral-200);--ps-border-strong: var(--color-neutral-300);--ps-text: var(--color-neutral-900);--ps-muted: var(--color-neutral-600);--ps-faint: var(--color-neutral-500);--ps-active: var(--color-primary-600);--ps-active-bg: color-mix(in oklab, var(--color-primary-050) 64%, var(--color-neutral-000));--nvb-input-height: 32px;--nvb-control-height: 32px;--nvb-input-padding-x: 10px;--nvb-control-padding-x: 10px;--nvb-input-radius: 4px;--nvb-control-radius: 4px;--nvb-button-radius: 4px;--nvb-input-font-size: 12px;--nvb-control-font-size: 12px;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden;color:var(--ps-text);background:var(--ps-bg)}.properties-sidebar__context{flex-shrink:0;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;min-height:48px;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__context-title{min-width:0;color:var(--ps-text);font-size:14px;font-weight:650;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__context-meta{max-width:110px;padding:2px 6px;border:1px solid var(--ps-border);border-radius:999px;background:color-mix(in oklab,var(--color-primary-050) 26%,var(--ps-surface));color:var(--ps-muted);font-size:10px;font-weight:600;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__notice{flex-shrink:0;margin:8px 10px 0;padding:8px 10px;border:1px solid color-mix(in oklab,var(--color-warning-500) 32%,var(--ps-border));border-radius:var(--nvb-control-radius);background:color-mix(in oklab,var(--color-warning-500) 7%,var(--ps-surface));color:var(--color-warning-800);font-size:11px;line-height:1.4}.properties-sidebar__search{flex-shrink:0;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__search-input-wrap{position:relative}.properties-sidebar__search-input{border-color:var(--ps-border-strong)}.properties-sidebar__search-clear{color:var(--ps-muted)}.properties-sidebar__search-results{display:grid;gap:2px;max-height:260px;overflow:auto;margin-top:6px;padding:4px;border:1px solid var(--ps-border);border-radius:var(--nvb-menu-radius, var(--nvb-control-radius));background:var(--ps-surface);box-shadow:var(--nvb-shadow-8)}.properties-sidebar__search-empty{padding:10px;color:var(--ps-muted);font-size:12px;text-align:center}.properties-sidebar__search-result{width:100%;display:grid;gap:2px;padding:7px 8px;border:0;border-radius:4px;background:transparent;text-align:left;cursor:pointer;transition:background-color .12s ease}.properties-sidebar__search-result:hover{background:var(--ps-surface-muted)}.properties-sidebar__search-result:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.properties-sidebar__search-result-label{color:var(--ps-text);font-size:12px;font-weight:600}.properties-sidebar__search-result-meta{color:var(--ps-muted);font-size:11px;line-height:1.35}.properties-sidebar__groups{flex:1;min-height:0;overflow-y:auto;padding:0;scrollbar-width:thin;scrollbar-color:var(--ps-border-strong) transparent}.properties-sidebar__group{list-style:none;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__group:last-child{border-bottom:0}.properties-sidebar__group-button{width:100%;min-height:36px;padding:0 12px;border:0;border-radius:0;background:var(--ps-surface);color:var(--ps-muted);display:flex;align-items:center;justify-content:flex-start;gap:7px;box-shadow:none;text-align:left;-webkit-user-select:none;user-select:none;font-size:12px;font-weight:650;letter-spacing:.02em;text-transform:none;transition:background-color .12s ease,color .12s ease}.properties-sidebar__group-button:hover{background:var(--ps-surface-muted);color:var(--ps-text)}.properties-sidebar__group-button:focus-visible{outline:0;box-shadow:inset 0 0 0 2px color-mix(in oklab,var(--ps-active) 60%,transparent)}.properties-sidebar__group-button--active{background:var(--ps-active-bg);color:var(--ps-text)}.properties-sidebar__group-button--active:before{content:\"\";width:2px;align-self:stretch;min-height:18px;margin:8px 1px 8px 0;border-radius:999px;background:var(--ps-active);flex-shrink:0}.properties-sidebar__group-arrow{color:var(--ps-faint);font-size:15px;flex-shrink:0;transition:transform .12s ease}.properties-sidebar__group-arrow--active{transform:rotate(90deg);color:var(--ps-active)}.properties-sidebar__list-items{display:flex;flex-direction:column;gap:0;padding:0}.properties-sidebar__table{min-height:0;display:grid;grid-template-columns:minmax(0,1fr);background:var(--ps-surface)}.properties-sidebar__section{display:grid;grid-template-columns:minmax(0,1fr);gap:0;margin:0;border-top:0;background:var(--ps-surface)}.properties-sidebar__section-body{display:grid;grid-template-columns:minmax(0,1fr);gap:0;padding:4px 0}.properties-sidebar__property{display:grid;grid-template-columns:minmax(0,1fr);gap:4px;padding:8px 12px;border-left:2px solid transparent;background:var(--ps-surface);transition:border-color .12s ease,background-color .12s ease}.properties-sidebar__property--highlighted{border-left-color:var(--ps-active);background:var(--ps-active-bg);outline:none}.properties-sidebar__label{width:100%;min-width:0;position:relative;z-index:1;justify-self:stretch;display:inline-flex;align-items:center;gap:4px;padding:0;color:var(--ps-muted);font-size:11px;font-weight:600;line-height:1.35}.properties-sidebar__label span{min-width:0;overflow:hidden;text-overflow:ellipsis}.properties-sidebar__label:hover,.properties-sidebar__label:focus-within{z-index:80}.properties-sidebar__attribute{width:100%;min-width:0;grid-column:1;margin-top:0}.properties-sidebar__field--full,.properties-sidebar__field--value{grid-column:1;display:grid;grid-template-columns:1fr}.properties-sidebar__field--checkbox{grid-column:1;margin-top:0}.properties-sidebar__hint{width:14px;height:14px;border:1px solid var(--color-neutral-200);border-radius:3px;background:var(--color-neutral-100);color:var(--color-neutral-500);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:help;position:relative;transition:background-color .12s ease,color .12s ease}.properties-sidebar__hint:before{content:\"?\";font-size:10px;font-weight:600;line-height:1}.properties-sidebar__hint:hover{background:var(--color-neutral-150, var(--color-neutral-100));border-color:var(--color-neutral-300);color:var(--color-neutral-700)}.properties-sidebar__hint .nvb-icon-svg{display:none}.properties-sidebar__checkbox-row{min-height:var(--nvb-control-height);display:flex;align-items:center;gap:7px}.properties-sidebar__checkbox-option{min-width:0;display:inline-flex;align-items:center;gap:7px;color:var(--ps-text);font-size:12px;font-weight:500;line-height:1.35;cursor:pointer}.properties-sidebar__checkbox-option checkbox-attribute{flex-shrink:0;display:inline-flex;align-items:center}.properties-sidebar__checkbox-option span{min-width:0}\n"], dependencies: [{ kind: "component", type: TextAttribute, selector: "text-attribute", inputs: ["property", "propertyKey", "ownerFocusKey", "ownerElement"], outputs: ["onValueChange"] }, { kind: "component", type: CheckboxAttribute, selector: "checkbox-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ChecklistAttribute, selector: "checklist-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: TextAreaAttribute, selector: "text-area-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SelectAttribute, selector: "select-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "component", type: ColumnsAttribute, selector: "columns-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: NumberAttribute, selector: "number-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: OptionAttribute, selector: "option-attribute", inputs: ["property", "ownerFocusKey"], outputs: ["onValueChange"] }, { kind: "component", type: ProgressFlowItemsAttribute, selector: "progress-flow-items-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SourceMapperAttribute, selector: "source-mapper-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SizeAttribute, selector: "size-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: PaddingAttribute, selector: "padding-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ColorAttribute, selector: "color-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: EventActionsAttribute, selector: "event-actions-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableColumnsAttribute, selector: "table-columns-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SourceNameAttribute, selector: "source-name-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableStatusRulesAttribute, selector: "table-status-rules-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ValidatorsAttribute, selector: "validators-attribute", inputs: ["property", "elementType"], outputs: ["onValueChange"] }, { kind: "component", type: TemplateNameAttribute, selector: "template-name-attribute", inputs: ["property", "propertyKey", "fieldMap"], outputs: ["onValueChange", "fieldMapChange"] }, { kind: "component", type: HtmlCodeAttribute, selector: "html-code-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "component", type: FileAttribute, selector: "file-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SelectButtonOptionsAttribute, selector: "select-button-options-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableRequestParamsAttribute, selector: "table-request-params-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: VariantRulesAttribute, selector: "variant-rules-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: LogicAttribute, selector: "logic-attribute", inputs: ["properties", "logicKeys"], outputs: ["onValueChange"] }, { kind: "component", type: NvbIcon, selector: "nvb-icon", inputs: ["name", "svg", "ariaLabel"] }, { kind: "component", type: TooltipComponent, selector: "app-tooltip", inputs: ["text", "metaText", "top", "left", "interactive"], outputs: ["mouseEntered", "mouseLeft"] }, { kind: "component", type: BuilderSearchInput, selector: "builder-search-input", inputs: ["value", "placeholder", "ariaLabel", "testId", "clearAriaLabel", "showSearchIcon"], outputs: ["valueChanged", "cleared"] }, { kind: "component", type: CustomPropertyAttribute, selector: "custom-property-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "pipe", type: UiTranslatePipe, name: "uiT" }] });
77648
77826
  }
77649
77827
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PropertiesSidebar, decorators: [{
77650
77828
  type: Component,
@@ -77681,7 +77859,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
77681
77859
  TooltipComponent,
77682
77860
  BuilderSearchInput,
77683
77861
  CustomPropertyAttribute,
77684
- ], template: "<div class=\"properties-sidebar\" data-testid=\"properties-sidebar-root\">\r\n <div class=\"properties-sidebar__context\">\r\n <div class=\"properties-sidebar__context-title\">\r\n {{ getFocusedElementDisplayLabel() }}\r\n </div>\r\n @if (getFocusedElementMetaLabel(); as focusedElementMeta) {\r\n <div class=\"properties-sidebar__context-meta\">\r\n {{ focusedElementMeta }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"properties-sidebar__search\">\r\n <builder-search-input\r\n class=\"properties-sidebar__search-input-wrap\"\r\n [value]=\"propertySearchTerm()\"\r\n [placeholder]=\"'properties.search' | uiT: 'Search properties'\"\r\n [ariaLabel]=\"'properties.search' | uiT: 'Search properties'\"\r\n [clearAriaLabel]=\"'common.clear' | uiT: 'Clear search'\"\r\n testId=\"property-search-input\"\r\n (valueChanged)=\"propertySearchTerm.set($event); syncSelectedCategoryWithVisibleProperties()\"\r\n (cleared)=\"clearPropertySearch()\"\r\n />\r\n\r\n @let propertyMatches = getPropertySearchMatches();\r\n @if (propertySearchTerm().trim()) {\r\n <div class=\"properties-sidebar__search-results\" data-testid=\"property-search-results\">\r\n @if (!propertyMatches.length) {\r\n <div class=\"properties-sidebar__search-empty\">\r\n {{ 'properties.searchEmpty' | uiT: 'No matches found.' }}\r\n </div>\r\n } @else {\r\n @for (match of propertyMatches; track match.key) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__search-result\"\r\n (click)=\"navigateToProperty(match)\"\r\n [attr.data-testid]=\"'property-search-result-' + match.key\"\r\n >\r\n <span class=\"properties-sidebar__search-result-label\">{{ match.label }}</span>\r\n <span class=\"properties-sidebar__search-result-meta\">\r\n {{ 'propertyCategory.' + match.categoryName | uiT: match.categoryLabel }}\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n <ul class=\"properties-sidebar__groups\">\r\n @for (propertyCategory of propertyCategories(); track propertyCategory.name) {\r\n @if (categoryHasVisibleProperties(propertyCategory.name)) {\r\n <li class=\"properties-sidebar__group\">\r\n @let isActive = propertyCategory.name === selectedCategory();\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__group-button nvb-button nvb-button--subtle nvb-button--full nvb-button--left nvb-button--ms\"\r\n [ngClass]=\"{ 'properties-sidebar__group-button--active': isActive }\"\r\n (click)=\"selectCategory(propertyCategory.name)\"\r\n [attr.data-testid]=\"'property-category-' + propertyCategory.name\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined properties-sidebar__group-arrow\"\r\n [ngClass]=\"{ 'properties-sidebar__group-arrow--active': isActive }\"\r\n >chevron_right</span\r\n >\r\n <span>\r\n {{ 'propertyCategory.' + propertyCategory.name | uiT: propertyCategory.label }}\r\n </span>\r\n </button>\r\n @if (propertyCategory.name === selectedCategory()) {\r\n @let sections = getSectionsForCategory(propertyCategory.name);\r\n @let renderVersion = propertyRenderVersion();\r\n <div class=\"properties-sidebar__table\" [attr.data-render-version]=\"renderVersion\">\r\n @for (section of sections; track section.name) {\r\n @if (hasVisibleProperties(section.propertyKeys)) {\r\n <section class=\"properties-sidebar__section\">\r\n <div class=\"properties-sidebar__section-body\">\r\n @for (key of section.propertyKeys; track key) {\r\n @let property = properties()[key];\r\n @if (!property.hidden && selectedCategory() === property.category) {\r\n <div\r\n class=\"properties-sidebar__property\"\r\n [attr.data-testid]=\"'property-row-' + key\"\r\n [attr.data-property-type]=\"property.type\"\r\n [attr.data-property-category]=\"property.category\"\r\n [class.properties-sidebar__property--highlighted]=\"\r\n highlightedPropertyKey() === key\r\n \"\r\n [attr.tabindex]=\"highlightedPropertyKey() === key ? 0 : -1\"\r\n >\r\n @switch (property.type) {\r\n @case ('logicExpressions') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <logic-attribute\r\n [properties]=\"properties()\"\r\n [logicKeys]=\"logicExpressionKeys()\"\r\n (onValueChange)=\"setLogicPropertyValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('text') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [ownerElement]=\"element()\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setTextPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('number') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <number-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('size') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <size-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('padding') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <padding-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('color') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <color-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('checkbox') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--checkbox\"\r\n >\r\n <div class=\"properties-sidebar__checkbox-row\">\r\n <label class=\"properties-sidebar__checkbox-option\">\r\n <checkbox-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </label>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"\r\n setPropertyHintVisible(true, hint, $event, key)\r\n \"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('checklist') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <checklist-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('textarea') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-area-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('htmlCode') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <html-code-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('file') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <file-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('select') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <select-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <source-name-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('templateName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <template-name-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [fieldMap]=\"getTemplateFieldMap(key)\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n (fieldMapChange)=\"setTemplateFieldMapValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('columnList') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('options') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <option-attribute\r\n [property]=\"property\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('progressFlowItems') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <progress-flow-items-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('selectButtonOptions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <select-button-options-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableRequestParams') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-request-params-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceMapper') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <source-mapper-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('eventActions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <event-actions-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('variantRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <variant-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('validators') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <validators-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableColumns') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableStatusRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-status-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('custom') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <custom-property-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </section>\r\n }\r\n }\r\n </div>\r\n }\r\n </li>\r\n }\r\n }\r\n </ul>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.properties-sidebar{--ps-bg: color-mix(in oklab, var(--color-neutral-050) 82%, var(--color-neutral-000));--ps-surface: var(--color-neutral-000);--ps-surface-muted: var(--nvb-surface-muted-bg);--ps-border: var(--color-neutral-200);--ps-border-strong: var(--color-neutral-300);--ps-text: var(--color-neutral-900);--ps-muted: var(--color-neutral-600);--ps-faint: var(--color-neutral-500);--ps-active: var(--color-primary-600);--ps-active-bg: color-mix(in oklab, var(--color-primary-050) 64%, var(--color-neutral-000));--nvb-input-height: 32px;--nvb-control-height: 32px;--nvb-input-padding-x: 10px;--nvb-control-padding-x: 10px;--nvb-input-radius: 4px;--nvb-control-radius: 4px;--nvb-button-radius: 4px;--nvb-input-font-size: 12px;--nvb-control-font-size: 12px;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden;color:var(--ps-text);background:var(--ps-bg)}.properties-sidebar__context{flex-shrink:0;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;min-height:48px;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__context-title{min-width:0;color:var(--ps-text);font-size:14px;font-weight:650;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__context-meta{max-width:110px;padding:2px 6px;border:1px solid var(--ps-border);border-radius:999px;background:color-mix(in oklab,var(--color-primary-050) 26%,var(--ps-surface));color:var(--ps-muted);font-size:10px;font-weight:600;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__notice{flex-shrink:0;margin:8px 10px 0;padding:8px 10px;border:1px solid color-mix(in oklab,var(--color-warning-500) 32%,var(--ps-border));border-radius:var(--nvb-control-radius);background:color-mix(in oklab,var(--color-warning-500) 7%,var(--ps-surface));color:var(--color-warning-800);font-size:11px;line-height:1.4}.properties-sidebar__search{flex-shrink:0;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__search-input-wrap{position:relative}.properties-sidebar__search-input{border-color:var(--ps-border-strong)}.properties-sidebar__search-clear{color:var(--ps-muted)}.properties-sidebar__search-results{display:grid;gap:2px;max-height:260px;overflow:auto;margin-top:6px;padding:4px;border:1px solid var(--ps-border);border-radius:var(--nvb-menu-radius, var(--nvb-control-radius));background:var(--ps-surface);box-shadow:var(--nvb-shadow-8)}.properties-sidebar__search-empty{padding:10px;color:var(--ps-muted);font-size:12px;text-align:center}.properties-sidebar__search-result{width:100%;display:grid;gap:2px;padding:7px 8px;border:0;border-radius:4px;background:transparent;text-align:left;cursor:pointer;transition:background-color .12s ease}.properties-sidebar__search-result:hover{background:var(--ps-surface-muted)}.properties-sidebar__search-result:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.properties-sidebar__search-result-label{color:var(--ps-text);font-size:12px;font-weight:600}.properties-sidebar__search-result-meta{color:var(--ps-muted);font-size:11px;line-height:1.35}.properties-sidebar__groups{flex:1;min-height:0;overflow-y:auto;padding:0;scrollbar-width:thin;scrollbar-color:var(--ps-border-strong) transparent}.properties-sidebar__group{list-style:none;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__group:last-child{border-bottom:0}.properties-sidebar__group-button{width:100%;min-height:36px;padding:0 12px;border:0;border-radius:0;background:var(--ps-surface);color:var(--ps-muted);display:flex;align-items:center;justify-content:flex-start;gap:7px;box-shadow:none;text-align:left;-webkit-user-select:none;user-select:none;font-size:12px;font-weight:650;letter-spacing:.02em;text-transform:none;transition:background-color .12s ease,color .12s ease}.properties-sidebar__group-button:hover{background:var(--ps-surface-muted);color:var(--ps-text)}.properties-sidebar__group-button:focus-visible{outline:0;box-shadow:inset 0 0 0 2px color-mix(in oklab,var(--ps-active) 60%,transparent)}.properties-sidebar__group-button--active{background:var(--ps-active-bg);color:var(--ps-text)}.properties-sidebar__group-button--active:before{content:\"\";width:2px;align-self:stretch;min-height:18px;margin:8px 1px 8px 0;border-radius:999px;background:var(--ps-active);flex-shrink:0}.properties-sidebar__group-arrow{color:var(--ps-faint);font-size:15px;flex-shrink:0;transition:transform .12s ease}.properties-sidebar__group-arrow--active{transform:rotate(90deg);color:var(--ps-active)}.properties-sidebar__list-items{display:flex;flex-direction:column;gap:0;padding:0}.properties-sidebar__table{min-height:0;display:grid;grid-template-columns:minmax(0,1fr);background:var(--ps-surface)}.properties-sidebar__section{display:grid;grid-template-columns:minmax(0,1fr);gap:0;margin:0;border-top:0;background:var(--ps-surface)}.properties-sidebar__section-body{display:grid;grid-template-columns:minmax(0,1fr);gap:0;padding:4px 0}.properties-sidebar__property{display:grid;grid-template-columns:minmax(0,1fr);gap:4px;padding:8px 12px;border-left:2px solid transparent;background:var(--ps-surface);transition:border-color .12s ease,background-color .12s ease}.properties-sidebar__property--highlighted{border-left-color:var(--ps-active);background:var(--ps-active-bg);outline:none}.properties-sidebar__label{width:100%;min-width:0;position:relative;z-index:1;justify-self:stretch;display:inline-flex;align-items:center;gap:4px;padding:0;color:var(--ps-muted);font-size:11px;font-weight:600;line-height:1.35}.properties-sidebar__label span{min-width:0;overflow:hidden;text-overflow:ellipsis}.properties-sidebar__label:hover,.properties-sidebar__label:focus-within{z-index:80}.properties-sidebar__attribute{width:100%;min-width:0;grid-column:1;margin-top:0}.properties-sidebar__field--full,.properties-sidebar__field--value{grid-column:1;display:grid;grid-template-columns:1fr}.properties-sidebar__field--checkbox{grid-column:1;margin-top:0}.properties-sidebar__hint{width:14px;height:14px;border:1px solid var(--color-neutral-200);border-radius:3px;background:var(--color-neutral-100);color:var(--color-neutral-500);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:help;position:relative;transition:background-color .12s ease,color .12s ease}.properties-sidebar__hint:before{content:\"?\";font-size:10px;font-weight:600;line-height:1}.properties-sidebar__hint:hover{background:var(--color-neutral-150, var(--color-neutral-100));border-color:var(--color-neutral-300);color:var(--color-neutral-700)}.properties-sidebar__hint .nvb-icon-svg{display:none}.properties-sidebar__checkbox-row{min-height:var(--nvb-control-height);display:flex;align-items:center;gap:7px}.properties-sidebar__checkbox-option{min-width:0;display:inline-flex;align-items:center;gap:7px;color:var(--ps-text);font-size:12px;font-weight:500;line-height:1.35;cursor:pointer}.properties-sidebar__checkbox-option checkbox-attribute{flex-shrink:0;display:inline-flex;align-items:center}.properties-sidebar__checkbox-option span{min-width:0}\n"] }]
77862
+ ], template: "<div class=\"properties-sidebar\" data-testid=\"properties-sidebar-root\">\r\n <div class=\"properties-sidebar__context\">\r\n <div class=\"properties-sidebar__context-title\">\r\n {{ getFocusedElementDisplayLabel() }}\r\n </div>\r\n @if (getFocusedElementMetaLabel(); as focusedElementMeta) {\r\n <div class=\"properties-sidebar__context-meta\">\r\n {{ focusedElementMeta }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"properties-sidebar__search\">\r\n <builder-search-input\r\n class=\"properties-sidebar__search-input-wrap\"\r\n [value]=\"propertySearchTerm()\"\r\n [placeholder]=\"'properties.search' | uiT: 'Search properties'\"\r\n [ariaLabel]=\"'properties.search' | uiT: 'Search properties'\"\r\n [clearAriaLabel]=\"'common.clear' | uiT: 'Clear search'\"\r\n testId=\"property-search-input\"\r\n (valueChanged)=\"propertySearchTerm.set($event); syncSelectedCategoryWithVisibleProperties()\"\r\n (cleared)=\"clearPropertySearch()\"\r\n />\r\n\r\n @let propertyMatches = getPropertySearchMatches();\r\n @if (propertySearchTerm().trim()) {\r\n <div class=\"properties-sidebar__search-results\" data-testid=\"property-search-results\">\r\n @if (!propertyMatches.length) {\r\n <div class=\"properties-sidebar__search-empty\">\r\n {{ 'properties.searchEmpty' | uiT: 'No matches found.' }}\r\n </div>\r\n } @else {\r\n @for (match of propertyMatches; track match.key) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__search-result\"\r\n (click)=\"navigateToProperty(match)\"\r\n [attr.data-testid]=\"'property-search-result-' + match.key\"\r\n >\r\n <span class=\"properties-sidebar__search-result-label\">{{ match.label }}</span>\r\n <span class=\"properties-sidebar__search-result-meta\">\r\n {{ 'propertyCategory.' + match.categoryName | uiT: match.categoryLabel }}\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n <ul class=\"properties-sidebar__groups\">\r\n @for (propertyCategory of propertyCategories(); track propertyCategory.name) {\r\n @if (categoryHasVisibleProperties(propertyCategory.name)) {\r\n <li class=\"properties-sidebar__group\">\r\n @let isActive = propertyCategory.name === selectedCategory();\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__group-button nvb-button nvb-button--subtle nvb-button--full nvb-button--left nvb-button--ms\"\r\n [ngClass]=\"{ 'properties-sidebar__group-button--active': isActive }\"\r\n (click)=\"selectCategory(propertyCategory.name)\"\r\n [attr.data-testid]=\"'property-category-' + propertyCategory.name\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined properties-sidebar__group-arrow\"\r\n [ngClass]=\"{ 'properties-sidebar__group-arrow--active': isActive }\"\r\n >chevron_right</span\r\n >\r\n <span>\r\n {{ 'propertyCategory.' + propertyCategory.name | uiT: propertyCategory.label }}\r\n </span>\r\n </button>\r\n @if (propertyCategory.name === selectedCategory()) {\r\n @let sections = getSectionsForCategory(propertyCategory.name);\r\n @let renderVersion = propertyRenderVersion();\r\n <div class=\"properties-sidebar__table\" [attr.data-render-version]=\"renderVersion\">\r\n @for (section of sections; track section.name) {\r\n @if (hasVisibleProperties(section.propertyKeys)) {\r\n <section class=\"properties-sidebar__section\">\r\n <div class=\"properties-sidebar__section-body\">\r\n @for (key of section.propertyKeys; track key) {\r\n @let property = properties()[key];\r\n @if (!property.hidden && selectedCategory() === property.category) {\r\n <div\r\n class=\"properties-sidebar__property\"\r\n [attr.data-testid]=\"'property-row-' + key\"\r\n [attr.data-property-type]=\"property.type\"\r\n [attr.data-property-category]=\"property.category\"\r\n [class.properties-sidebar__property--highlighted]=\"\r\n highlightedPropertyKey() === key\r\n \"\r\n [attr.tabindex]=\"highlightedPropertyKey() === key ? 0 : -1\"\r\n >\r\n @switch (property.type) {\r\n @case ('logicExpressions') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <logic-attribute\r\n [properties]=\"properties()\"\r\n [logicKeys]=\"logicExpressionKeys()\"\r\n (onValueChange)=\"setLogicPropertyValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('text') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [ownerElement]=\"element()\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setTextPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('number') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <number-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('size') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <size-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('padding') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <padding-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('color') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <color-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('checkbox') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--checkbox\"\r\n >\r\n <div class=\"properties-sidebar__checkbox-row\">\r\n <label class=\"properties-sidebar__checkbox-option\">\r\n <checkbox-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </label>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"\r\n setPropertyHintVisible(true, hint, $event, key)\r\n \"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('checklist') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <checklist-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('textarea') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-area-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('htmlCode') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <html-code-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('file') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <file-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('select') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <select-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <source-name-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('templateName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <template-name-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [fieldMap]=\"getTemplateFieldMap(key)\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n (fieldMapChange)=\"setTemplateFieldMapValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('columnList') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('options') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <option-attribute\r\n [property]=\"property\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('progressFlowItems') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <progress-flow-items-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('selectButtonOptions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <select-button-options-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableRequestParams') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-request-params-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceMapper') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <source-mapper-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('eventActions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <event-actions-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('variantRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <variant-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('validators') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <validators-attribute\r\n [property]=\"property\"\r\n [elementType]=\"element()?.type ?? ''\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableColumns') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableStatusRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-status-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('custom') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <custom-property-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </section>\r\n }\r\n }\r\n </div>\r\n }\r\n </li>\r\n }\r\n }\r\n </ul>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.properties-sidebar{--ps-bg: color-mix(in oklab, var(--color-neutral-050) 82%, var(--color-neutral-000));--ps-surface: var(--color-neutral-000);--ps-surface-muted: var(--nvb-surface-muted-bg);--ps-border: var(--color-neutral-200);--ps-border-strong: var(--color-neutral-300);--ps-text: var(--color-neutral-900);--ps-muted: var(--color-neutral-600);--ps-faint: var(--color-neutral-500);--ps-active: var(--color-primary-600);--ps-active-bg: color-mix(in oklab, var(--color-primary-050) 64%, var(--color-neutral-000));--nvb-input-height: 32px;--nvb-control-height: 32px;--nvb-input-padding-x: 10px;--nvb-control-padding-x: 10px;--nvb-input-radius: 4px;--nvb-control-radius: 4px;--nvb-button-radius: 4px;--nvb-input-font-size: 12px;--nvb-control-font-size: 12px;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden;color:var(--ps-text);background:var(--ps-bg)}.properties-sidebar__context{flex-shrink:0;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;min-height:48px;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__context-title{min-width:0;color:var(--ps-text);font-size:14px;font-weight:650;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__context-meta{max-width:110px;padding:2px 6px;border:1px solid var(--ps-border);border-radius:999px;background:color-mix(in oklab,var(--color-primary-050) 26%,var(--ps-surface));color:var(--ps-muted);font-size:10px;font-weight:600;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__notice{flex-shrink:0;margin:8px 10px 0;padding:8px 10px;border:1px solid color-mix(in oklab,var(--color-warning-500) 32%,var(--ps-border));border-radius:var(--nvb-control-radius);background:color-mix(in oklab,var(--color-warning-500) 7%,var(--ps-surface));color:var(--color-warning-800);font-size:11px;line-height:1.4}.properties-sidebar__search{flex-shrink:0;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__search-input-wrap{position:relative}.properties-sidebar__search-input{border-color:var(--ps-border-strong)}.properties-sidebar__search-clear{color:var(--ps-muted)}.properties-sidebar__search-results{display:grid;gap:2px;max-height:260px;overflow:auto;margin-top:6px;padding:4px;border:1px solid var(--ps-border);border-radius:var(--nvb-menu-radius, var(--nvb-control-radius));background:var(--ps-surface);box-shadow:var(--nvb-shadow-8)}.properties-sidebar__search-empty{padding:10px;color:var(--ps-muted);font-size:12px;text-align:center}.properties-sidebar__search-result{width:100%;display:grid;gap:2px;padding:7px 8px;border:0;border-radius:4px;background:transparent;text-align:left;cursor:pointer;transition:background-color .12s ease}.properties-sidebar__search-result:hover{background:var(--ps-surface-muted)}.properties-sidebar__search-result:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.properties-sidebar__search-result-label{color:var(--ps-text);font-size:12px;font-weight:600}.properties-sidebar__search-result-meta{color:var(--ps-muted);font-size:11px;line-height:1.35}.properties-sidebar__groups{flex:1;min-height:0;overflow-y:auto;padding:0;scrollbar-width:thin;scrollbar-color:var(--ps-border-strong) transparent}.properties-sidebar__group{list-style:none;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__group:last-child{border-bottom:0}.properties-sidebar__group-button{width:100%;min-height:36px;padding:0 12px;border:0;border-radius:0;background:var(--ps-surface);color:var(--ps-muted);display:flex;align-items:center;justify-content:flex-start;gap:7px;box-shadow:none;text-align:left;-webkit-user-select:none;user-select:none;font-size:12px;font-weight:650;letter-spacing:.02em;text-transform:none;transition:background-color .12s ease,color .12s ease}.properties-sidebar__group-button:hover{background:var(--ps-surface-muted);color:var(--ps-text)}.properties-sidebar__group-button:focus-visible{outline:0;box-shadow:inset 0 0 0 2px color-mix(in oklab,var(--ps-active) 60%,transparent)}.properties-sidebar__group-button--active{background:var(--ps-active-bg);color:var(--ps-text)}.properties-sidebar__group-button--active:before{content:\"\";width:2px;align-self:stretch;min-height:18px;margin:8px 1px 8px 0;border-radius:999px;background:var(--ps-active);flex-shrink:0}.properties-sidebar__group-arrow{color:var(--ps-faint);font-size:15px;flex-shrink:0;transition:transform .12s ease}.properties-sidebar__group-arrow--active{transform:rotate(90deg);color:var(--ps-active)}.properties-sidebar__list-items{display:flex;flex-direction:column;gap:0;padding:0}.properties-sidebar__table{min-height:0;display:grid;grid-template-columns:minmax(0,1fr);background:var(--ps-surface)}.properties-sidebar__section{display:grid;grid-template-columns:minmax(0,1fr);gap:0;margin:0;border-top:0;background:var(--ps-surface)}.properties-sidebar__section-body{display:grid;grid-template-columns:minmax(0,1fr);gap:0;padding:4px 0}.properties-sidebar__property{display:grid;grid-template-columns:minmax(0,1fr);gap:4px;padding:8px 12px;border-left:2px solid transparent;background:var(--ps-surface);transition:border-color .12s ease,background-color .12s ease}.properties-sidebar__property--highlighted{border-left-color:var(--ps-active);background:var(--ps-active-bg);outline:none}.properties-sidebar__label{width:100%;min-width:0;position:relative;z-index:1;justify-self:stretch;display:inline-flex;align-items:center;gap:4px;padding:0;color:var(--ps-muted);font-size:11px;font-weight:600;line-height:1.35}.properties-sidebar__label span{min-width:0;overflow:hidden;text-overflow:ellipsis}.properties-sidebar__label:hover,.properties-sidebar__label:focus-within{z-index:80}.properties-sidebar__attribute{width:100%;min-width:0;grid-column:1;margin-top:0}.properties-sidebar__field--full,.properties-sidebar__field--value{grid-column:1;display:grid;grid-template-columns:1fr}.properties-sidebar__field--checkbox{grid-column:1;margin-top:0}.properties-sidebar__hint{width:14px;height:14px;border:1px solid var(--color-neutral-200);border-radius:3px;background:var(--color-neutral-100);color:var(--color-neutral-500);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:help;position:relative;transition:background-color .12s ease,color .12s ease}.properties-sidebar__hint:before{content:\"?\";font-size:10px;font-weight:600;line-height:1}.properties-sidebar__hint:hover{background:var(--color-neutral-150, var(--color-neutral-100));border-color:var(--color-neutral-300);color:var(--color-neutral-700)}.properties-sidebar__hint .nvb-icon-svg{display:none}.properties-sidebar__checkbox-row{min-height:var(--nvb-control-height);display:flex;align-items:center;gap:7px}.properties-sidebar__checkbox-option{min-width:0;display:inline-flex;align-items:center;gap:7px;color:var(--ps-text);font-size:12px;font-weight:500;line-height:1.35;cursor:pointer}.properties-sidebar__checkbox-option checkbox-attribute{flex-shrink:0;display:inline-flex;align-items:center}.properties-sidebar__checkbox-option span{min-width:0}\n"] }]
77685
77863
  }] });
77686
77864
 
77687
77865
  class NvbJsonObjectCreator {
@@ -80649,13 +80827,22 @@ const LICENSE_VALIDATION_URL = 'https://api.ngxviewbuilder.io';
80649
80827
  // publish build'a. Perpetual fallback modelis: raktas dengia visas versijas,
80650
80828
  // isleistas iki jo expiresAt. Pasibaigus licencijai padengtos versijos veikia
80651
80829
  // amzinai be watermark; velesnes (parsisiustos is npm) — watermark, kol neatsinaujinta.
80652
- const RELEASE_DATE = new Date('2026-07-20T00:00:00Z');
80830
+ const RELEASE_DATE = new Date('2026-07-22T00:00:00Z');
80653
80831
  // Oficialus vieso demo puslapio hostname'ai — jiems watermark/license modalai
80654
80832
  // visada islaikomi isjungti, nepriklausomai nuo rakto/serverio busenos. SAUGU:
80655
80833
  // tai musu paciu valdomas domenas, tad integratorius savo produkcinei app'ai
80656
80834
  // negali "pasidaryti" siuo hostname — realus jo vartotojai visada matys jo
80657
80835
  // tikra domena naršykleje, ne demo.ngxviewbuilder.io.
80658
80836
  const OFFICIAL_DEMO_HOSTNAMES = new Set(['demo.ngxviewbuilder.io']);
80837
+ // PUBLIC BETA (iki 1.0.0): visas licencijos enforcement isjungtas — jokio
80838
+ // watermark, jokiu modalu, nesvarbu ar raktas paduotas, ar ne. Kol produktas
80839
+ // dar beta ir komercines licencijos apskritai neparduodamos, VISI vartotojai
80840
+ // yra "free", tad rodyti "NO LICENSE" watermark butu klaidinga (nera ka pirkti).
80841
+ // Docs pricing.md zada "completely free until 1.0.0" — sis flag'as ta uztikrina.
80842
+ // PRIE 1.0.0 RELEASE: perjungti i `false`, kad missing/invalid/outdated vel
80843
+ // rodytu watermark + modalus (ir apsvarstyti markMissing() modalo pridejima —
80844
+ // zr. licensing memory TODO).
80845
+ const BETA_FREE_NO_ENFORCEMENT = true;
80659
80846
  const CACHE_KEY = 'ngx_vb_license_validation_v2';
80660
80847
  const CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
80661
80848
  const MODAL_SHOWN_KEY = 'ngx_vb_license_modal_shown';
@@ -80689,7 +80876,7 @@ class LicenseService {
80689
80876
  }
80690
80877
  this.status.set({
80691
80878
  initialized: true,
80692
- missing: !this.isOfficialDemoHost(),
80879
+ missing: !this.isEnforcementSuppressed(),
80693
80880
  outdated: false,
80694
80881
  invalid: false,
80695
80882
  expiresAt: null,
@@ -80699,6 +80886,10 @@ class LicenseService {
80699
80886
  isOfficialDemoHost() {
80700
80887
  return typeof window !== 'undefined' && OFFICIAL_DEMO_HOSTNAMES.has(window.location.hostname);
80701
80888
  }
80889
+ /** true kai watermark/modalu enforcement isjungtas: beta metu arba oficialiame demo. */
80890
+ isEnforcementSuppressed() {
80891
+ return BETA_FREE_NO_ENFORCEMENT || this.isOfficialDemoHost();
80892
+ }
80702
80893
  saveModalTimestamp() {
80703
80894
  try {
80704
80895
  localStorage.setItem(MODAL_SHOWN_KEY, Date.now().toString());
@@ -80722,7 +80913,7 @@ class LicenseService {
80722
80913
  this.shouldShowInvalidModal.set(false);
80723
80914
  }
80724
80915
  initialize() {
80725
- if (this.isOfficialDemoHost()) {
80916
+ if (this.isEnforcementSuppressed()) {
80726
80917
  const payload = this.parseKey(this.licenseKey);
80727
80918
  this.status.set({
80728
80919
  initialized: true,
@@ -90257,4 +90448,4 @@ class ChoiceModel {
90257
90448
  */
90258
90449
 
90259
90450
  export { ForgeInitializerService as $, APPLICATION_LOCALE_VALUE as A, BadgeModel as B, ChartModel as C, DynamicTextPipe as D, ElementActionService as E, ElementActionButtonToneEnum as F, ElementActionButtonVariantEnum as G, ElementActionDialogOperationEnum as H, ElementActionResponseModeEnum as I, ElementActionSetValueModeEnum as J, ElementActionToastPositionEnum as K, ElementActionToastVariantEnum as L, MarkupSecurityService as M, NvbIcon as N, ElementActionTriggerEnum as O, ElementActionTypeEnum as P, ElementBaseModel as Q, ElementDataSourceUseForEnum as R, StateService as S, ElementExecutionModeEnum as T, UiTranslationService as U, ElementFocusService as V, ElementTypesEnum as W, EmptyBlockModel as X, EventService as Y, ExpressionService as Z, FileUploadModel as _, ElementWrapper as a, TableColumnAlignEnum as a$, HeaderTabEnum as a0, IconModel as a1, IframeModel as a2, ImageModel as a3, LOCALE_CHOICES as a4, ListBoxModel as a5, ListGridModel as a6, MessageCardModel as a7, MultiSelectInputModel as a8, NGX_VIEW_BUILDER_PROJECT_LAYER as a9, NgxViewBuilderRuntime as aA, NgxViewBuilderSaveRequestedSourceEnum as aB, NgxViewBuilderTableSettingsSourceEnum as aC, NgxViewBuilderThemeModeEnum as aD, NgxViewBuilderTriggerEngineService as aE, NgxViewBuilderTriggerEventEnum as aF, NgxViewBuilderValidator as aG, NgxViewBuilderWebsocketMessageModeEnum as aH, NumberInputModel as aI, NumberStepperModel as aJ, PageTitleModel as aK, PanelModel as aL, PhoneInputModel as aM, ProgressBarModel as aN, ProgressFlowModel as aO, PropertyModel as aP, RadioInputModel as aQ, RichTextModel as aR, RuntimeVariableSourceTypeEnum as aS, SelectButtonModel as aT, SelectInputModel as aU, SignaturePadModel as aV, SingleCheckboxModel as aW, SliderModel as aX, SpacerModel as aY, SplitterModel as aZ, StatsCardModel as a_, NGX_VIEW_BUILDER_TEMPLATES_CAPABILITY as aa, NGX_VIEW_BUILDER_TEMPLATES_FEATURE_PACK_ID as ab, NGX_VIEW_BUILDER_UI_TRANSLATIONS as ac, NgxViewBuilder as ad, NgxViewBuilderActionExecutorService as ae, NgxViewBuilderAlignEnum as af, NgxViewBuilderApiService as ag, NgxViewBuilderAutomationActionTypeEnum as ah, NgxViewBuilderAutomationService as ai, NgxViewBuilderBuilder as aj, NgxViewBuilderBuilderTabRenderModeEnum as ak, NgxViewBuilderChromePositionEnum as al, NgxViewBuilderDataSourceTypeEnum as am, NgxViewBuilderDialogCloseReasonEnum as an, NgxViewBuilderExecutionReasonEnum as ao, NgxViewBuilderHeadlessService as ap, NgxViewBuilderInteractionStatusEnum as aq, NgxViewBuilderPageNavigationModeEnum as ar, NgxViewBuilderPreviewModeEnum as as, NgxViewBuilderProcessService as at, NgxViewBuilderRenderModeEnum as au, NgxViewBuilderRenderPhaseEnum as av, NgxViewBuilderRenderer as aw, NgxViewBuilderRuleExecutedBranchEnum as ax, NgxViewBuilderRuleRunModeEnum as ay, NgxViewBuilderRulesEngineService as az, AUTOMATION_BUILDER_TAB_ID as b, TableColumnCellActionsDisplayModeEnum as b0, TableColumnTypeEnum as b1, TableFilterControlTypeEnum as b2, TableFilterOptionsSourceTypeEnum as b3, TableInlineEditStartModeEnum as b4, TableInlineEditorTypeEnum as b5, TableModel as b6, TableRowActionsDropdownButtonStyleEnum as b7, TableStatusToneEnum as b8, TabsModel as b9, TabsProModel as ba, TemplateEngineService as bb, TemplateStorageModeEnum as bc, TemplatesEditor as bd, TextAreaModel as be, TextInputModel as bf, TimePickerModel as bg, ToastModel as bh, ToggleSwitchModel as bi, UiTranslatePipe as bj, ValueChangeTriggerEnum as bk, VideoModel as bl, bridgeNgxViewBuilderApiEvents as bm, createTemplatesLibraryProperty as bn, provideNgxViewBuilderExtensions as bo, provideNgxViewBuilderProjectLayer as bp, provideNgxViewBuilderProjectLayers as bq, provideNgxViewBuilderRuntime as br, provideNgxViewBuilderUiTranslations as bs, AccordionModel as c, ApplicationLocaleService as d, AutocompleteModel as e, AutomationStudio as f, AvatarModel as g, BreadcrumbsModel as h, BuilderModel as i, BuilderPageDisplayModeEnum as j, ButtonModel as k, CheckboxInputModel as l, ChoiceModel as m, ColumnFragmentModeEnum as n, CreatorStructureService as o, CustomHtmlModel as p, DatePickerModel as q, DateRangeModel as r, DialogModel as s, DividerModel as t, DocumentationGenerator as u, DynamicPanelModel as v, DynamicTableColumnModel as w, DynamicTableModel as x, DynamicTableRowColumnModel as y, EN_UI_DICTIONARY as z };
90260
- //# sourceMappingURL=ngx-view-builder-ngx-view-builder-_VdHLdIW.mjs.map
90451
+ //# sourceMappingURL=ngx-view-builder-ngx-view-builder-G2BnNzUY.mjs.map