ngx-view-builder 0.1.4 → 0.1.6

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.

@@ -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
@@ -19939,6 +20054,94 @@ class RendererService {
19939
20054
  }
19940
20055
  return obj;
19941
20056
  };
20057
+ // Element properties are omitted from the export when they still equal the type's
20058
+ // default (declared as field initialisers on the model classes). The runtime
20059
+ // re-applies those same defaults through createModel on load, so a slimmed element
20060
+ // reconstructs identically — as long as the code default is unchanged. Only values
20061
+ // the author actually changed away from the default are written out.
20062
+ const defaultBagCache = new Map();
20063
+ const buildDefaultBag = (type) => {
20064
+ const normalizedType = String(type ?? '').trim();
20065
+ if (!normalizedType) {
20066
+ return null;
20067
+ }
20068
+ if (defaultBagCache.has(normalizedType)) {
20069
+ return defaultBagCache.get(normalizedType) ?? null;
20070
+ }
20071
+ let bag = null;
20072
+ try {
20073
+ const defaultInstance = this.modelService.createModel(normalizedType, {});
20074
+ const ignored = new Set(getIgnoredKeys(defaultInstance));
20075
+ bag = {};
20076
+ Object.keys(defaultInstance).forEach((key) => {
20077
+ if (ignored.has(key) || runtimeIgnoredKeys.has(key)) {
20078
+ return;
20079
+ }
20080
+ bag[key] = defaultInstance[key];
20081
+ });
20082
+ }
20083
+ catch {
20084
+ bag = null;
20085
+ }
20086
+ defaultBagCache.set(normalizedType, bag);
20087
+ return bag;
20088
+ };
20089
+ const IDENTITY_KEYS = new Set(['name', 'type']);
20090
+ const CHILD_ELEMENT_KEYS = new Set(['template', 'columns']);
20091
+ const cleanElement = (element) => {
20092
+ if (!element || typeof element !== 'object' || Array.isArray(element)) {
20093
+ return clean(element);
20094
+ }
20095
+ const type = String(element.type ?? '').trim();
20096
+ const defaults = type ? buildDefaultBag(type) : null;
20097
+ if (!defaults) {
20098
+ // No defaults to diff against (unknown type / build failure) — keep everything.
20099
+ return clean(element);
20100
+ }
20101
+ const seen = new WeakSet();
20102
+ const ignored = getIgnoredKeys(element);
20103
+ const result = {};
20104
+ Object.keys(element).forEach((key) => {
20105
+ const rawValue = element[key];
20106
+ if (ignored.includes(key) ||
20107
+ runtimeIgnoredKeys.has(key) ||
20108
+ (key === 'listeners' && Array.isArray(rawValue))) {
20109
+ return;
20110
+ }
20111
+ if (CHILD_ELEMENT_KEYS.has(key) && rawValue && typeof rawValue === 'object') {
20112
+ if (Array.isArray(rawValue)) {
20113
+ const cleanedArray = rawValue
20114
+ .map((child) => cleanElement(child))
20115
+ .filter((child) => child !== undefined);
20116
+ if (cleanedArray.length > 0) {
20117
+ result[key] = cleanedArray;
20118
+ }
20119
+ }
20120
+ else {
20121
+ const cleanedChildren = {};
20122
+ Object.keys(rawValue).forEach((childKey) => {
20123
+ const cleanedChild = cleanElement(rawValue[childKey]);
20124
+ if (cleanedChild !== undefined) {
20125
+ cleanedChildren[childKey] = cleanedChild;
20126
+ }
20127
+ });
20128
+ if (Object.keys(cleanedChildren).length > 0) {
20129
+ result[key] = cleanedChildren;
20130
+ }
20131
+ }
20132
+ return;
20133
+ }
20134
+ const cleanedValue = clean(rawValue, seen);
20135
+ if (cleanedValue === undefined) {
20136
+ return;
20137
+ }
20138
+ if (!IDENTITY_KEYS.has(key) && key in defaults && isEqual(rawValue, defaults[key])) {
20139
+ return;
20140
+ }
20141
+ result[key] = cleanedValue;
20142
+ });
20143
+ return Object.keys(result).length > 0 ? result : undefined;
20144
+ };
19942
20145
  const processColumn = (column) => {
19943
20146
  if (!column)
19944
20147
  return undefined;
@@ -20000,7 +20203,15 @@ class RendererService {
20000
20203
  .filter((p) => p !== undefined);
20001
20204
  }
20002
20205
  if (structure.elements) {
20003
- jsonObject.elements = clean(structure.elements);
20206
+ const cleanedElements = {};
20207
+ Object.keys(structure.elements).forEach((elementKey) => {
20208
+ const cleanedElement = cleanElement(structure.elements[elementKey]);
20209
+ if (cleanedElement !== undefined) {
20210
+ cleanedElements[elementKey] = cleanedElement;
20211
+ }
20212
+ });
20213
+ jsonObject.elements =
20214
+ Object.keys(cleanedElements).length > 0 ? cleanedElements : undefined;
20004
20215
  }
20005
20216
  if (structure.dataSources &&
20006
20217
  Array.isArray(structure.dataSources) &&
@@ -23841,6 +24052,21 @@ class NgxViewBuilderApiService {
23841
24052
  }
23842
24053
  this.expressionService.registerCustomFunctions([functionDefinition]);
23843
24054
  }
24055
+ registerValidatorTypes(definitions) {
24056
+ this.validatorService.registerValidatorTypes(definitions ?? []);
24057
+ }
24058
+ registerValidatorType(definition) {
24059
+ if (!definition) {
24060
+ return;
24061
+ }
24062
+ this.validatorService.registerValidatorType(definition);
24063
+ }
24064
+ getRegisteredValidatorTypes() {
24065
+ return this.validatorService.getRegisteredValidatorTypes();
24066
+ }
24067
+ clearRegisteredValidatorTypes() {
24068
+ this.validatorService.clearRegisteredValidatorTypes();
24069
+ }
23844
24070
  registerSvgIcon(name, svgMarkup, overwrite = true) {
23845
24071
  return this.iconSvgService.registerSvgIcon(name, svgMarkup, overwrite);
23846
24072
  }
@@ -23875,6 +24101,7 @@ class NgxViewBuilderApiService {
23875
24101
  this.registerConfiguredGlobalProperties(normalizedConfig);
23876
24102
  this.registerConfiguredElementProperties(normalizedConfig);
23877
24103
  this.registerConfiguredExpressionFunctions(normalizedConfig);
24104
+ this.registerConfiguredValidatorTypes(normalizedConfig);
23878
24105
  this.registerConfiguredRuntimeVariables(normalizedConfig);
23879
24106
  this.registerConfiguredBuilderTabs(normalizedConfig);
23880
24107
  this.registerConfiguredFeaturePacks(normalizedConfig);
@@ -23895,6 +24122,7 @@ class NgxViewBuilderApiService {
23895
24122
  this.registerConfiguredGlobalProperties(normalizedConfig);
23896
24123
  this.registerConfiguredElementProperties(normalizedConfig);
23897
24124
  this.registerConfiguredExpressionFunctions(normalizedConfig);
24125
+ this.registerConfiguredValidatorTypes(normalizedConfig);
23898
24126
  this.registerConfiguredRuntimeVariables(normalizedConfig);
23899
24127
  this.registerConfiguredBuilderTabs(normalizedConfig);
23900
24128
  this.registerConfiguredFeaturePacks(normalizedConfig);
@@ -23972,6 +24200,11 @@ class NgxViewBuilderApiService {
23972
24200
  this.registerExpressionFunctions(config.expressionFunctions);
23973
24201
  }
23974
24202
  }
24203
+ registerConfiguredValidatorTypes(config) {
24204
+ if (Array.isArray(config.validatorTypes) && config.validatorTypes.length > 0) {
24205
+ this.registerValidatorTypes(config.validatorTypes);
24206
+ }
24207
+ }
23975
24208
  registerConfiguredRuntimeVariables(config) {
23976
24209
  if (Array.isArray(config.runtimeVariables)) {
23977
24210
  this.setRuntimeVariableDefinitions(config.runtimeVariables, true);
@@ -24033,6 +24266,7 @@ class NgxViewBuilderApiService {
24033
24266
  rules: [...(normalized.rules ?? [])],
24034
24267
  fragments: [...(normalized.fragments ?? [])],
24035
24268
  expressionFunctions: [...(normalized.expressionFunctions ?? [])],
24269
+ validatorTypes: [...(normalized.validatorTypes ?? [])],
24036
24270
  runtimeVariables: [...(normalized.runtimeVariables ?? [])],
24037
24271
  uiDictionaries: { ...(normalized.uiDictionaries ?? {}) },
24038
24272
  svgIcons: { ...(normalized.svgIcons ?? {}) },
@@ -24048,6 +24282,7 @@ class NgxViewBuilderApiService {
24048
24282
  merged.rules?.push(...(pack.rules ?? []));
24049
24283
  merged.fragments?.push(...(pack.fragments ?? []));
24050
24284
  merged.expressionFunctions?.push(...(pack.expressionFunctions ?? []));
24285
+ merged.validatorTypes?.push(...(pack.validatorTypes ?? []));
24051
24286
  merged.runtimeVariables?.push(...(pack.runtimeVariables ?? []));
24052
24287
  if (pack.globalProperties && typeof pack.globalProperties === 'object') {
24053
24288
  merged.globalProperties = {
@@ -48529,7 +48764,7 @@ const BUILT_IN_RUNTIME_COMPONENT_LOADERS = {
48529
48764
  [ElementTypesEnum.AUTOCOMPLETE]: () => Promise.resolve().then(function () { return autocompleteElement; }).then((m) => m.AutocompleteElement),
48530
48765
  [ElementTypesEnum.MULTI_SELECT]: () => Promise.resolve().then(function () { return multiSelectElement; }).then((m) => m.MultiSelectElement),
48531
48766
  [ElementTypesEnum.MESSAGE_CARD]: () => Promise.resolve().then(function () { return messageCardElement; }).then((m) => m.MessageCardElement),
48532
- [ElementTypesEnum.TOAST]: () => import('./ngx-view-builder-toast-element-CclIxegL.mjs').then((m) => m.ToastElement),
48767
+ [ElementTypesEnum.TOAST]: () => import('./ngx-view-builder-toast-element-Dt4fzOZt.mjs').then((m) => m.ToastElement),
48533
48768
  [ElementTypesEnum.BADGE]: () => Promise.resolve().then(function () { return badgeElement; }).then((m) => m.BadgeElement),
48534
48769
  [ElementTypesEnum.STATS_CARD]: () => Promise.resolve().then(function () { return statsCardElement; }).then((m) => m.StatsCardElement),
48535
48770
  [ElementTypesEnum.CHART]: () => Promise.resolve().then(function () { return chartElement; }).then((m) => m.ChartElement),
@@ -48537,11 +48772,11 @@ const BUILT_IN_RUNTIME_COMPONENT_LOADERS = {
48537
48772
  [ElementTypesEnum.IMAGE]: () => Promise.resolve().then(function () { return imageElement; }).then((m) => m.ImageElement),
48538
48773
  [ElementTypesEnum.VIDEO]: () => Promise.resolve().then(function () { return videoElement; }).then((m) => m.VideoElement),
48539
48774
  [ElementTypesEnum.IFRAME]: () => Promise.resolve().then(function () { return iframeElement; }).then((m) => m.IframeElement),
48540
- [ElementTypesEnum.AVATAR]: () => import('./ngx-view-builder-avatar-element-C0EXsHCI.mjs').then((m) => m.AvatarElement),
48541
- [ElementTypesEnum.ICON]: () => import('./ngx-view-builder-icon-element-CSKRNSAU.mjs').then((m) => m.IconElement),
48775
+ [ElementTypesEnum.AVATAR]: () => import('./ngx-view-builder-avatar-element-428U6hXs.mjs').then((m) => m.AvatarElement),
48776
+ [ElementTypesEnum.ICON]: () => import('./ngx-view-builder-icon-element-PMXy2zn8.mjs').then((m) => m.IconElement),
48542
48777
  [ElementTypesEnum.DIVIDER]: () => Promise.resolve().then(function () { return dividerElement; }).then((m) => m.DividerElement),
48543
48778
  [ElementTypesEnum.SPACER]: () => Promise.resolve().then(function () { return spacerElement; }).then((m) => m.SpacerElement),
48544
- [ElementTypesEnum.BREADCRUMBS]: () => import('./ngx-view-builder-breadcrumbs-element-BihMIpWr.mjs').then((m) => m.BreadcrumbsElement),
48779
+ [ElementTypesEnum.BREADCRUMBS]: () => import('./ngx-view-builder-breadcrumbs-element-B2FHOwU4.mjs').then((m) => m.BreadcrumbsElement),
48545
48780
  [ElementTypesEnum.PAGE_TITLE]: () => Promise.resolve().then(function () { return pageTitleElement; }).then((m) => m.PageTitleElement),
48546
48781
  [ElementTypesEnum.NUMBER_STEPPER]: () => Promise.resolve().then(function () { return numberStepperElement; }).then((m) => m.NumberStepperElement),
48547
48782
  [ElementTypesEnum.TIME_PICKER]: () => Promise.resolve().then(function () { return timePickerElement; }).then((m) => m.TimePickerElement),
@@ -48789,10 +49024,18 @@ class TableElement {
48789
49024
  .filter((column) => String(column?.key ?? '').trim().length > 0)
48790
49025
  .slice()
48791
49026
  .sort((left, right) => {
49027
+ const leftIndex = columns.indexOf(left);
49028
+ const rightIndex = columns.indexOf(right);
49029
+ // Builderyje autoritetas yra columnsConfig eiliskumas: perstumus stulpeli savybiu
49030
+ // skydelyje pakeitimas turi matytis is karto, o issaugoti vartotojo nustatymai
49031
+ // (columnSettingsState) neturi jo perrasyti — taip pat, kaip ir su visible zemiau.
49032
+ if (isEditorMode) {
49033
+ return leftIndex - rightIndex;
49034
+ }
48792
49035
  const leftKey = String(left?.key ?? '').trim();
48793
49036
  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);
49037
+ const leftOrder = settingsMap.get(leftKey)?.order ?? leftIndex;
49038
+ const rightOrder = settingsMap.get(rightKey)?.order ?? rightIndex;
48796
49039
  return leftOrder - rightOrder;
48797
49040
  })
48798
49041
  .filter((column, columnIndex) => {
@@ -73326,6 +73569,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
73326
73569
 
73327
73570
  class ValidatorsAttribute {
73328
73571
  property = input.required(...(ngDevMode ? [{ debugName: "property" }] : /* istanbul ignore next */ []));
73572
+ elementType = input('', ...(ngDevMode ? [{ debugName: "elementType" }] : /* istanbul ignore next */ []));
73329
73573
  onValueChange = output();
73330
73574
  validators = signal([], ...(ngDevMode ? [{ debugName: "validators" }] : /* istanbul ignore next */ []));
73331
73575
  editingValidatorIndex = signal(null, ...(ngDevMode ? [{ debugName: "editingValidatorIndex" }] : /* istanbul ignore next */ []));
@@ -73359,7 +73603,7 @@ class ValidatorsAttribute {
73359
73603
  { value: 'startsWith', label: 'starts with', kind: 'function', functionName: 'startsWithAny' },
73360
73604
  { value: 'endsWith', label: 'ends with', kind: 'function', functionName: 'endsWithAny' },
73361
73605
  ];
73362
- validatorTypeOptions = [
73606
+ builtInValidatorTypeOptions = [
73363
73607
  { value: 'required', label: 'required' },
73364
73608
  { value: 'minlength', label: 'minLength' },
73365
73609
  { value: 'maxlength', label: 'maxLength' },
@@ -73370,7 +73614,19 @@ class ValidatorsAttribute {
73370
73614
  { value: 'strictoptions', label: 'strictOptions' },
73371
73615
  { value: 'custom', label: 'custom' },
73372
73616
  ];
73617
+ validatorTypeOptions = computed(() => {
73618
+ const elementType = String(this.elementType() ?? '')
73619
+ .trim()
73620
+ .toLowerCase();
73621
+ const registered = this.validatorService
73622
+ .getRegisteredValidatorTypes()
73623
+ .filter((descriptor) => descriptor.appliesTo.length === 0 ||
73624
+ (!!elementType && descriptor.appliesTo.includes(elementType)))
73625
+ .map((descriptor) => ({ value: descriptor.type, label: descriptor.label }));
73626
+ return [...this.builtInValidatorTypeOptions, ...registered];
73627
+ }, ...(ngDevMode ? [{ debugName: "validatorTypeOptions" }] : /* istanbul ignore next */ []));
73373
73628
  structureService = inject(StructureService);
73629
+ validatorService = inject(ValidatorService);
73374
73630
  constructor() {
73375
73631
  effect(() => {
73376
73632
  this.loadValidators();
@@ -73413,37 +73669,64 @@ class ValidatorsAttribute {
73413
73669
  onValidatorTypeChange(validator) {
73414
73670
  const type = this.normalizeType(validator?.type);
73415
73671
  validator.type = type;
73416
- if (type !== 'custom') {
73417
- validator.condition = '';
73672
+ if (this.isCustomField(validator)) {
73673
+ this.resetBuilderState();
73418
73674
  }
73419
73675
  else {
73420
- this.resetBuilderState();
73676
+ validator.condition = '';
73421
73677
  }
73422
73678
  if (!this.hasValueField(validator)) {
73423
73679
  validator.value = '';
73424
73680
  }
73681
+ const registeredType = this.validatorService.getRegisteredValidatorType(type);
73682
+ if (registeredType?.defaultMessage && !String(validator.message ?? '').trim()) {
73683
+ validator.message = registeredType.defaultMessage;
73684
+ }
73425
73685
  this.emitChanges();
73426
73686
  }
73687
+ validatorTypeOptionsFor(validator) {
73688
+ const options = this.validatorTypeOptions();
73689
+ const type = this.normalizeType(validator?.type);
73690
+ if (options.some((option) => option.value === type)) {
73691
+ return options;
73692
+ }
73693
+ return [...options, { value: type, label: `${type} (not registered)` }];
73694
+ }
73427
73695
  onValidatorChanged() {
73428
73696
  this.emitChanges();
73429
73697
  }
73430
73698
  hasValueField(validator) {
73431
73699
  const type = this.normalizeType(validator?.type);
73432
- return (type === 'minlength' ||
73700
+ if (type === 'minlength' ||
73433
73701
  type === 'maxlength' ||
73434
73702
  type === 'min' ||
73435
73703
  type === 'max' ||
73436
- type === 'pattern');
73704
+ type === 'pattern') {
73705
+ return true;
73706
+ }
73707
+ return Boolean(this.validatorService.getRegisteredValidatorType(type)?.hasValue);
73437
73708
  }
73438
73709
  isPatternField(validator) {
73439
73710
  return this.normalizeType(validator?.type) === 'pattern';
73440
73711
  }
73441
73712
  isCustomField(validator) {
73442
- return this.normalizeType(validator?.type) === 'custom';
73713
+ const type = this.normalizeType(validator?.type);
73714
+ return type === 'custom' || !this.validatorService.hasValidatorType(type);
73715
+ }
73716
+ resolveValueLabel(validator) {
73717
+ const type = this.normalizeType(validator?.type);
73718
+ return this.validatorService.getRegisteredValidatorType(type)?.valueLabel ?? '';
73719
+ }
73720
+ resolveValuePlaceholder(validator) {
73721
+ if (this.isPatternField(validator)) {
73722
+ return '^[0-9]{4}$';
73723
+ }
73724
+ const type = this.normalizeType(validator?.type);
73725
+ return this.validatorService.getRegisteredValidatorType(type)?.valuePlaceholder || '10';
73443
73726
  }
73444
73727
  resolveValidatorTypeLabel(validator) {
73445
73728
  const type = this.normalizeType(validator?.type);
73446
- return this.validatorTypeOptions.find((option) => option.value === type)?.label ?? 'custom';
73729
+ return this.validatorTypeOptions().find((option) => option.value === type)?.label ?? type;
73447
73730
  }
73448
73731
  resolveValidatorSummary(validator) {
73449
73732
  if (this.isCustomField(validator)) {
@@ -73594,8 +73877,9 @@ class ValidatorsAttribute {
73594
73877
  const type = this.normalizeType(value?.['type']);
73595
73878
  const condition = String(value?.['condition'] ?? '').trim();
73596
73879
  const message = String(value?.['message'] ?? '').trim();
73880
+ const applyIf = String(value?.['applyIf'] ?? '').trim();
73597
73881
  const ruleValue = value?.['value'];
73598
- return {
73882
+ const normalized = {
73599
73883
  type,
73600
73884
  condition,
73601
73885
  message,
@@ -73605,27 +73889,17 @@ class ValidatorsAttribute {
73605
73889
  ? ruleValue
73606
73890
  : String(ruleValue),
73607
73891
  };
73892
+ if (applyIf) {
73893
+ normalized.applyIf = applyIf;
73894
+ }
73895
+ return normalized;
73608
73896
  });
73609
73897
  }
73610
73898
  normalizeType(raw) {
73611
73899
  const normalized = String(raw ?? '')
73612
73900
  .trim()
73613
73901
  .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';
73902
+ return normalized || 'custom';
73629
73903
  }
73630
73904
  loadAllElementPaths() {
73631
73905
  const structureElements = Object.keys(this.structureService.getStructure()?.elements ?? {});
@@ -73790,7 +74064,7 @@ class ValidatorsAttribute {
73790
74064
  };
73791
74065
  }
73792
74066
  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" }] });
74067
+ 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
74068
  }
73795
74069
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ValidatorsAttribute, decorators: [{
73796
74070
  type: Component,
@@ -73802,8 +74076,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
73802
74076
  NativeCodeEditor,
73803
74077
  BuilderActionButton,
73804
74078
  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"] }] } });
74079
+ ], 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"] }]
74080
+ }], 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
74081
 
73808
74082
  class TemplateNameAttribute {
73809
74083
  property = input.required(...(ngDevMode ? [{ debugName: "property" }] : /* istanbul ignore next */ []));
@@ -77644,7 +77918,7 @@ class PropertiesSidebar {
77644
77918
  this.propertyHighlightTimeoutId = null;
77645
77919
  }
77646
77920
  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" }] });
77921
+ 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
77922
  }
77649
77923
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PropertiesSidebar, decorators: [{
77650
77924
  type: Component,
@@ -77681,7 +77955,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
77681
77955
  TooltipComponent,
77682
77956
  BuilderSearchInput,
77683
77957
  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"] }]
77958
+ ], 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
77959
  }] });
77686
77960
 
77687
77961
  class NvbJsonObjectCreator {
@@ -80649,13 +80923,22 @@ const LICENSE_VALIDATION_URL = 'https://api.ngxviewbuilder.io';
80649
80923
  // publish build'a. Perpetual fallback modelis: raktas dengia visas versijas,
80650
80924
  // isleistas iki jo expiresAt. Pasibaigus licencijai padengtos versijos veikia
80651
80925
  // amzinai be watermark; velesnes (parsisiustos is npm) — watermark, kol neatsinaujinta.
80652
- const RELEASE_DATE = new Date('2026-07-21T00:00:00Z');
80926
+ const RELEASE_DATE = new Date('2026-07-23T00:00:00Z');
80653
80927
  // Oficialus vieso demo puslapio hostname'ai — jiems watermark/license modalai
80654
80928
  // visada islaikomi isjungti, nepriklausomai nuo rakto/serverio busenos. SAUGU:
80655
80929
  // tai musu paciu valdomas domenas, tad integratorius savo produkcinei app'ai
80656
80930
  // negali "pasidaryti" siuo hostname — realus jo vartotojai visada matys jo
80657
80931
  // tikra domena naršykleje, ne demo.ngxviewbuilder.io.
80658
80932
  const OFFICIAL_DEMO_HOSTNAMES = new Set(['demo.ngxviewbuilder.io']);
80933
+ // PUBLIC BETA (iki 1.0.0): visas licencijos enforcement isjungtas — jokio
80934
+ // watermark, jokiu modalu, nesvarbu ar raktas paduotas, ar ne. Kol produktas
80935
+ // dar beta ir komercines licencijos apskritai neparduodamos, VISI vartotojai
80936
+ // yra "free", tad rodyti "NO LICENSE" watermark butu klaidinga (nera ka pirkti).
80937
+ // Docs pricing.md zada "completely free until 1.0.0" — sis flag'as ta uztikrina.
80938
+ // PRIE 1.0.0 RELEASE: perjungti i `false`, kad missing/invalid/outdated vel
80939
+ // rodytu watermark + modalus (ir apsvarstyti markMissing() modalo pridejima —
80940
+ // zr. licensing memory TODO).
80941
+ const BETA_FREE_NO_ENFORCEMENT = true;
80659
80942
  const CACHE_KEY = 'ngx_vb_license_validation_v2';
80660
80943
  const CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
80661
80944
  const MODAL_SHOWN_KEY = 'ngx_vb_license_modal_shown';
@@ -80689,7 +80972,7 @@ class LicenseService {
80689
80972
  }
80690
80973
  this.status.set({
80691
80974
  initialized: true,
80692
- missing: !this.isOfficialDemoHost(),
80975
+ missing: !this.isEnforcementSuppressed(),
80693
80976
  outdated: false,
80694
80977
  invalid: false,
80695
80978
  expiresAt: null,
@@ -80699,6 +80982,10 @@ class LicenseService {
80699
80982
  isOfficialDemoHost() {
80700
80983
  return typeof window !== 'undefined' && OFFICIAL_DEMO_HOSTNAMES.has(window.location.hostname);
80701
80984
  }
80985
+ /** true kai watermark/modalu enforcement isjungtas: beta metu arba oficialiame demo. */
80986
+ isEnforcementSuppressed() {
80987
+ return BETA_FREE_NO_ENFORCEMENT || this.isOfficialDemoHost();
80988
+ }
80702
80989
  saveModalTimestamp() {
80703
80990
  try {
80704
80991
  localStorage.setItem(MODAL_SHOWN_KEY, Date.now().toString());
@@ -80722,7 +81009,7 @@ class LicenseService {
80722
81009
  this.shouldShowInvalidModal.set(false);
80723
81010
  }
80724
81011
  initialize() {
80725
- if (this.isOfficialDemoHost()) {
81012
+ if (this.isEnforcementSuppressed()) {
80726
81013
  const payload = this.parseKey(this.licenseKey);
80727
81014
  this.status.set({
80728
81015
  initialized: true,
@@ -81192,14 +81479,11 @@ class AiChatPanel {
81192
81479
  attachedFiles = signal([], ...(ngDevMode ? [{ debugName: "attachedFiles" }] : /* istanbul ignore next */ []));
81193
81480
  modelDropdownOpen = signal(false, ...(ngDevMode ? [{ debugName: "modelDropdownOpen" }] : /* istanbul ignore next */ []));
81194
81481
  copiedKey = signal(null, ...(ngDevMode ? [{ debugName: "copiedKey" }] : /* istanbul ignore next */ []));
81195
- static TEXT_EXTENSIONS = new Set([
81196
- 'txt', 'log', 'md', 'csv', 'json', 'xml', 'yaml', 'yml',
81197
- 'js', 'ts', 'jsx', 'tsx', 'py', 'sql', 'html', 'css', 'scss',
81198
- 'sh', 'bash', 'conf', 'env', 'ini', 'toml', 'lock',
81199
- ]);
81200
- static DOCX_EXTENSIONS = new Set(['docx', 'doc']);
81201
- static MAX_FILE_CHARS = 40_000;
81202
- static MAX_TOTAL_FILE_CHARS = 100_000;
81482
+ // Files are sent to the backend as raw bytes; the panel does not parse them.
81483
+ // These guards only keep a single WebSocket message from getting unreasonably
81484
+ // large, since the browser still has to encode and send it.
81485
+ static MAX_FILE_BYTES = 10 * 1024 * 1024; // 10 MB per file
81486
+ static MAX_TOTAL_FILE_BYTES = 25 * 1024 * 1024; // 25 MB total
81203
81487
  parsedMessages = computed(() => this.aiChatService.messages().map(msg => ({
81204
81488
  ...msg,
81205
81489
  segments: this.parseSegments(msg.text),
@@ -81253,10 +81537,16 @@ class AiChatPanel {
81253
81537
  this.fileInputRef?.nativeElement.click();
81254
81538
  }
81255
81539
  onFilesSelected(event) {
81256
- const files = event.target.files;
81540
+ const input = event.target;
81541
+ const files = input.files;
81257
81542
  if (!files?.length)
81258
81543
  return;
81259
81544
  Array.from(files).forEach((file) => {
81545
+ if (file.size > AiChatPanel.MAX_FILE_BYTES) {
81546
+ const mb = AiChatPanel.MAX_FILE_BYTES / (1024 * 1024);
81547
+ this.aiChatService.errorText.set(`"${file.name}" is larger than ${mb} MB and was not attached.`);
81548
+ return;
81549
+ }
81260
81550
  if (file.type.startsWith('image/')) {
81261
81551
  const reader = new FileReader();
81262
81552
  reader.onload = () => {
@@ -81267,59 +81557,23 @@ class AiChatPanel {
81267
81557
  };
81268
81558
  reader.readAsDataURL(file);
81269
81559
  }
81270
- else if (this.isTextFile(file)) {
81560
+ else {
81561
+ // Attach the raw file. Nothing is parsed here: the panel is only an
81562
+ // input/output surface, and the backend decides how to read each file.
81271
81563
  const reader = new FileReader();
81272
81564
  reader.onload = () => {
81273
- const raw = reader.result;
81274
- const content = raw.length > AiChatPanel.MAX_FILE_CHARS
81275
- ? raw.slice(0, AiChatPanel.MAX_FILE_CHARS) + '\n[...truncated]'
81276
- : raw;
81277
- this.attachedFiles.update((fs) => [...fs, { name: file.name, content, size: file.size }]);
81565
+ const result = reader.result; // "data:<mime>;base64,<data>"
81566
+ const comma = result.indexOf(',');
81567
+ const data = comma >= 0 ? result.slice(comma + 1) : result;
81568
+ this.attachedFiles.update((fs) => [
81569
+ ...fs,
81570
+ { name: file.name, mimeType: file.type || 'application/octet-stream', size: file.size, data },
81571
+ ]);
81278
81572
  };
81279
- reader.readAsText(file, 'utf-8');
81280
- }
81281
- else if (this.isWordFile(file)) {
81282
- void this.extractWordText(file);
81573
+ reader.readAsDataURL(file);
81283
81574
  }
81284
81575
  });
81285
- event.target.value = '';
81286
- }
81287
- isTextFile(file) {
81288
- if (file.type.startsWith('text/'))
81289
- return true;
81290
- const ext = file.name.split('.').pop()?.toLowerCase() ?? '';
81291
- return AiChatPanel.TEXT_EXTENSIONS.has(ext);
81292
- }
81293
- isWordFile(file) {
81294
- const ext = file.name.split('.').pop()?.toLowerCase() ?? '';
81295
- return AiChatPanel.DOCX_EXTENSIONS.has(ext);
81296
- }
81297
- async extractWordText(file) {
81298
- const ext = file.name.split('.').pop()?.toLowerCase() ?? '';
81299
- if (ext === 'doc') {
81300
- this.attachedFiles.update((fs) => [
81301
- ...fs,
81302
- { name: file.name, content: '[.doc (old Word format) is not supported. Please save the file as .docx or .txt and try again.]', size: file.size },
81303
- ]);
81304
- return;
81305
- }
81306
- try {
81307
- const arrayBuffer = await file.arrayBuffer();
81308
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
81309
- const mammoth = await import('mammoth');
81310
- const result = await mammoth.extractRawText({ arrayBuffer });
81311
- const raw = result.value ?? '';
81312
- const content = raw.length > AiChatPanel.MAX_FILE_CHARS
81313
- ? raw.slice(0, AiChatPanel.MAX_FILE_CHARS) + '\n[...truncated]'
81314
- : raw;
81315
- this.attachedFiles.update((fs) => [...fs, { name: file.name, content: content || '[Empty document]', size: file.size }]);
81316
- }
81317
- catch {
81318
- this.attachedFiles.update((fs) => [
81319
- ...fs,
81320
- { name: file.name, content: '[Could not extract text from this Word document]', size: file.size },
81321
- ]);
81322
- }
81576
+ input.value = '';
81323
81577
  }
81324
81578
  removeAttachment(index) {
81325
81579
  this.attachedImages.update((imgs) => imgs.filter((_, i) => i !== index));
@@ -81331,8 +81585,7 @@ class AiChatPanel {
81331
81585
  window.open(img.dataUrl, '_blank');
81332
81586
  }
81333
81587
  previewFile(file) {
81334
- const blob = new Blob([file.content], { type: 'text/plain;charset=utf-8' });
81335
- window.open(URL.createObjectURL(blob), '_blank');
81588
+ window.open(`data:${file.mimeType};base64,${file.data}`, '_blank');
81336
81589
  }
81337
81590
  copyCode(content, mi, si) {
81338
81591
  void navigator.clipboard.writeText(content.trim()).then(() => {
@@ -81396,15 +81649,15 @@ class AiChatPanel {
81396
81649
  payload['images'] = images.map((img) => ({ mediaType: img.mediaType, dataUrl: img.dataUrl }));
81397
81650
  }
81398
81651
  if (files.length > 0) {
81399
- let totalChars = 0;
81652
+ let totalBytes = 0;
81400
81653
  payload['files'] = files
81401
81654
  .filter((f) => {
81402
- if (totalChars >= AiChatPanel.MAX_TOTAL_FILE_CHARS)
81655
+ if (totalBytes + f.size > AiChatPanel.MAX_TOTAL_FILE_BYTES)
81403
81656
  return false;
81404
- totalChars += f.content.length;
81657
+ totalBytes += f.size;
81405
81658
  return true;
81406
81659
  })
81407
- .map((f) => ({ name: f.name, content: f.content }));
81660
+ .map((f) => ({ name: f.name, mimeType: f.mimeType, size: f.size, data: f.data }));
81408
81661
  }
81409
81662
  if (this.socket?.readyState === WebSocket.OPEN) {
81410
81663
  this.socket.send(JSON.stringify(payload));
@@ -90257,4 +90510,4 @@ class ChoiceModel {
90257
90510
  */
90258
90511
 
90259
90512
  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-CYvIsFw-.mjs.map
90513
+ //# sourceMappingURL=ngx-view-builder-ngx-view-builder-DUoF0Ief.mjs.map