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.
- package/README.md +88 -3
- package/fesm2022/{ngx-view-builder-avatar-element-C0EXsHCI.mjs → ngx-view-builder-avatar-element-428U6hXs.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-avatar-element-C0EXsHCI.mjs.map → ngx-view-builder-avatar-element-428U6hXs.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-breadcrumbs-element-BihMIpWr.mjs → ngx-view-builder-breadcrumbs-element-B2FHOwU4.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-breadcrumbs-element-BihMIpWr.mjs.map → ngx-view-builder-breadcrumbs-element-B2FHOwU4.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-icon-element-CSKRNSAU.mjs → ngx-view-builder-icon-element-PMXy2zn8.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-icon-element-CSKRNSAU.mjs.map → ngx-view-builder-icon-element-PMXy2zn8.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-ngx-view-builder-CYvIsFw-.mjs → ngx-view-builder-ngx-view-builder-DUoF0Ief.mjs} +356 -103
- package/fesm2022/{ngx-view-builder-ngx-view-builder-CYvIsFw-.mjs.map → ngx-view-builder-ngx-view-builder-DUoF0Ief.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-toast-element-CclIxegL.mjs → ngx-view-builder-toast-element-Dt4fzOZt.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-toast-element-CclIxegL.mjs.map → ngx-view-builder-toast-element-Dt4fzOZt.mjs.map} +1 -1
- package/fesm2022/ngx-view-builder.mjs +1 -1
- package/package.json +1 -2
- package/types/ngx-view-builder.d.ts +185 -136
|
@@ -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
|
-
|
|
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-
|
|
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-
|
|
48541
|
-
[ElementTypesEnum.ICON]: () => import('./ngx-view-builder-icon-element-
|
|
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-
|
|
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 ??
|
|
48795
|
-
const rightOrder = settingsMap.get(rightKey)?.order ??
|
|
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
|
-
|
|
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 (
|
|
73417
|
-
|
|
73672
|
+
if (this.isCustomField(validator)) {
|
|
73673
|
+
this.resetBuilderState();
|
|
73418
73674
|
}
|
|
73419
73675
|
else {
|
|
73420
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ??
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
81196
|
-
|
|
81197
|
-
|
|
81198
|
-
|
|
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
|
|
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
|
|
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
|
|
81274
|
-
const
|
|
81275
|
-
|
|
81276
|
-
|
|
81277
|
-
|
|
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.
|
|
81280
|
-
}
|
|
81281
|
-
else if (this.isWordFile(file)) {
|
|
81282
|
-
void this.extractWordText(file);
|
|
81573
|
+
reader.readAsDataURL(file);
|
|
81283
81574
|
}
|
|
81284
81575
|
});
|
|
81285
|
-
|
|
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
|
-
|
|
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
|
|
81652
|
+
let totalBytes = 0;
|
|
81400
81653
|
payload['files'] = files
|
|
81401
81654
|
.filter((f) => {
|
|
81402
|
-
if (
|
|
81655
|
+
if (totalBytes + f.size > AiChatPanel.MAX_TOTAL_FILE_BYTES)
|
|
81403
81656
|
return false;
|
|
81404
|
-
|
|
81657
|
+
totalBytes += f.size;
|
|
81405
81658
|
return true;
|
|
81406
81659
|
})
|
|
81407
|
-
.map((f) => ({ name: f.name,
|
|
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-
|
|
90513
|
+
//# sourceMappingURL=ngx-view-builder-ngx-view-builder-DUoF0Ief.mjs.map
|