ngx-view-builder 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ngx-view-builder might be problematic. Click here for more details.
- package/fesm2022/{ngx-view-builder-avatar-element-C0EXsHCI.mjs → ngx-view-builder-avatar-element-Bnxr5pVE.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-avatar-element-C0EXsHCI.mjs.map → ngx-view-builder-avatar-element-Bnxr5pVE.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-breadcrumbs-element-BihMIpWr.mjs → ngx-view-builder-breadcrumbs-element-DUi8_qxY.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-breadcrumbs-element-BihMIpWr.mjs.map → ngx-view-builder-breadcrumbs-element-DUi8_qxY.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-icon-element-CSKRNSAU.mjs → ngx-view-builder-icon-element-BYreB3Ma.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-icon-element-CSKRNSAU.mjs.map → ngx-view-builder-icon-element-BYreB3Ma.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-ngx-view-builder-CYvIsFw-.mjs → ngx-view-builder-ngx-view-builder-G2BnNzUY.mjs} +230 -39
- package/fesm2022/{ngx-view-builder-ngx-view-builder-CYvIsFw-.mjs.map → ngx-view-builder-ngx-view-builder-G2BnNzUY.mjs.map} +1 -1
- package/fesm2022/{ngx-view-builder-toast-element-CclIxegL.mjs → ngx-view-builder-toast-element-6FsyoWXA.mjs} +2 -2
- package/fesm2022/{ngx-view-builder-toast-element-CclIxegL.mjs.map → ngx-view-builder-toast-element-6FsyoWXA.mjs.map} +1 -1
- package/fesm2022/ngx-view-builder.mjs +1 -1
- package/package.json +1 -1
- 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
|
|
@@ -23841,6 +23956,21 @@ class NgxViewBuilderApiService {
|
|
|
23841
23956
|
}
|
|
23842
23957
|
this.expressionService.registerCustomFunctions([functionDefinition]);
|
|
23843
23958
|
}
|
|
23959
|
+
registerValidatorTypes(definitions) {
|
|
23960
|
+
this.validatorService.registerValidatorTypes(definitions ?? []);
|
|
23961
|
+
}
|
|
23962
|
+
registerValidatorType(definition) {
|
|
23963
|
+
if (!definition) {
|
|
23964
|
+
return;
|
|
23965
|
+
}
|
|
23966
|
+
this.validatorService.registerValidatorType(definition);
|
|
23967
|
+
}
|
|
23968
|
+
getRegisteredValidatorTypes() {
|
|
23969
|
+
return this.validatorService.getRegisteredValidatorTypes();
|
|
23970
|
+
}
|
|
23971
|
+
clearRegisteredValidatorTypes() {
|
|
23972
|
+
this.validatorService.clearRegisteredValidatorTypes();
|
|
23973
|
+
}
|
|
23844
23974
|
registerSvgIcon(name, svgMarkup, overwrite = true) {
|
|
23845
23975
|
return this.iconSvgService.registerSvgIcon(name, svgMarkup, overwrite);
|
|
23846
23976
|
}
|
|
@@ -23875,6 +24005,7 @@ class NgxViewBuilderApiService {
|
|
|
23875
24005
|
this.registerConfiguredGlobalProperties(normalizedConfig);
|
|
23876
24006
|
this.registerConfiguredElementProperties(normalizedConfig);
|
|
23877
24007
|
this.registerConfiguredExpressionFunctions(normalizedConfig);
|
|
24008
|
+
this.registerConfiguredValidatorTypes(normalizedConfig);
|
|
23878
24009
|
this.registerConfiguredRuntimeVariables(normalizedConfig);
|
|
23879
24010
|
this.registerConfiguredBuilderTabs(normalizedConfig);
|
|
23880
24011
|
this.registerConfiguredFeaturePacks(normalizedConfig);
|
|
@@ -23895,6 +24026,7 @@ class NgxViewBuilderApiService {
|
|
|
23895
24026
|
this.registerConfiguredGlobalProperties(normalizedConfig);
|
|
23896
24027
|
this.registerConfiguredElementProperties(normalizedConfig);
|
|
23897
24028
|
this.registerConfiguredExpressionFunctions(normalizedConfig);
|
|
24029
|
+
this.registerConfiguredValidatorTypes(normalizedConfig);
|
|
23898
24030
|
this.registerConfiguredRuntimeVariables(normalizedConfig);
|
|
23899
24031
|
this.registerConfiguredBuilderTabs(normalizedConfig);
|
|
23900
24032
|
this.registerConfiguredFeaturePacks(normalizedConfig);
|
|
@@ -23972,6 +24104,11 @@ class NgxViewBuilderApiService {
|
|
|
23972
24104
|
this.registerExpressionFunctions(config.expressionFunctions);
|
|
23973
24105
|
}
|
|
23974
24106
|
}
|
|
24107
|
+
registerConfiguredValidatorTypes(config) {
|
|
24108
|
+
if (Array.isArray(config.validatorTypes) && config.validatorTypes.length > 0) {
|
|
24109
|
+
this.registerValidatorTypes(config.validatorTypes);
|
|
24110
|
+
}
|
|
24111
|
+
}
|
|
23975
24112
|
registerConfiguredRuntimeVariables(config) {
|
|
23976
24113
|
if (Array.isArray(config.runtimeVariables)) {
|
|
23977
24114
|
this.setRuntimeVariableDefinitions(config.runtimeVariables, true);
|
|
@@ -24033,6 +24170,7 @@ class NgxViewBuilderApiService {
|
|
|
24033
24170
|
rules: [...(normalized.rules ?? [])],
|
|
24034
24171
|
fragments: [...(normalized.fragments ?? [])],
|
|
24035
24172
|
expressionFunctions: [...(normalized.expressionFunctions ?? [])],
|
|
24173
|
+
validatorTypes: [...(normalized.validatorTypes ?? [])],
|
|
24036
24174
|
runtimeVariables: [...(normalized.runtimeVariables ?? [])],
|
|
24037
24175
|
uiDictionaries: { ...(normalized.uiDictionaries ?? {}) },
|
|
24038
24176
|
svgIcons: { ...(normalized.svgIcons ?? {}) },
|
|
@@ -24048,6 +24186,7 @@ class NgxViewBuilderApiService {
|
|
|
24048
24186
|
merged.rules?.push(...(pack.rules ?? []));
|
|
24049
24187
|
merged.fragments?.push(...(pack.fragments ?? []));
|
|
24050
24188
|
merged.expressionFunctions?.push(...(pack.expressionFunctions ?? []));
|
|
24189
|
+
merged.validatorTypes?.push(...(pack.validatorTypes ?? []));
|
|
24051
24190
|
merged.runtimeVariables?.push(...(pack.runtimeVariables ?? []));
|
|
24052
24191
|
if (pack.globalProperties && typeof pack.globalProperties === 'object') {
|
|
24053
24192
|
merged.globalProperties = {
|
|
@@ -48529,7 +48668,7 @@ const BUILT_IN_RUNTIME_COMPONENT_LOADERS = {
|
|
|
48529
48668
|
[ElementTypesEnum.AUTOCOMPLETE]: () => Promise.resolve().then(function () { return autocompleteElement; }).then((m) => m.AutocompleteElement),
|
|
48530
48669
|
[ElementTypesEnum.MULTI_SELECT]: () => Promise.resolve().then(function () { return multiSelectElement; }).then((m) => m.MultiSelectElement),
|
|
48531
48670
|
[ElementTypesEnum.MESSAGE_CARD]: () => Promise.resolve().then(function () { return messageCardElement; }).then((m) => m.MessageCardElement),
|
|
48532
|
-
[ElementTypesEnum.TOAST]: () => import('./ngx-view-builder-toast-element-
|
|
48671
|
+
[ElementTypesEnum.TOAST]: () => import('./ngx-view-builder-toast-element-6FsyoWXA.mjs').then((m) => m.ToastElement),
|
|
48533
48672
|
[ElementTypesEnum.BADGE]: () => Promise.resolve().then(function () { return badgeElement; }).then((m) => m.BadgeElement),
|
|
48534
48673
|
[ElementTypesEnum.STATS_CARD]: () => Promise.resolve().then(function () { return statsCardElement; }).then((m) => m.StatsCardElement),
|
|
48535
48674
|
[ElementTypesEnum.CHART]: () => Promise.resolve().then(function () { return chartElement; }).then((m) => m.ChartElement),
|
|
@@ -48537,11 +48676,11 @@ const BUILT_IN_RUNTIME_COMPONENT_LOADERS = {
|
|
|
48537
48676
|
[ElementTypesEnum.IMAGE]: () => Promise.resolve().then(function () { return imageElement; }).then((m) => m.ImageElement),
|
|
48538
48677
|
[ElementTypesEnum.VIDEO]: () => Promise.resolve().then(function () { return videoElement; }).then((m) => m.VideoElement),
|
|
48539
48678
|
[ElementTypesEnum.IFRAME]: () => Promise.resolve().then(function () { return iframeElement; }).then((m) => m.IframeElement),
|
|
48540
|
-
[ElementTypesEnum.AVATAR]: () => import('./ngx-view-builder-avatar-element-
|
|
48541
|
-
[ElementTypesEnum.ICON]: () => import('./ngx-view-builder-icon-element-
|
|
48679
|
+
[ElementTypesEnum.AVATAR]: () => import('./ngx-view-builder-avatar-element-Bnxr5pVE.mjs').then((m) => m.AvatarElement),
|
|
48680
|
+
[ElementTypesEnum.ICON]: () => import('./ngx-view-builder-icon-element-BYreB3Ma.mjs').then((m) => m.IconElement),
|
|
48542
48681
|
[ElementTypesEnum.DIVIDER]: () => Promise.resolve().then(function () { return dividerElement; }).then((m) => m.DividerElement),
|
|
48543
48682
|
[ElementTypesEnum.SPACER]: () => Promise.resolve().then(function () { return spacerElement; }).then((m) => m.SpacerElement),
|
|
48544
|
-
[ElementTypesEnum.BREADCRUMBS]: () => import('./ngx-view-builder-breadcrumbs-element-
|
|
48683
|
+
[ElementTypesEnum.BREADCRUMBS]: () => import('./ngx-view-builder-breadcrumbs-element-DUi8_qxY.mjs').then((m) => m.BreadcrumbsElement),
|
|
48545
48684
|
[ElementTypesEnum.PAGE_TITLE]: () => Promise.resolve().then(function () { return pageTitleElement; }).then((m) => m.PageTitleElement),
|
|
48546
48685
|
[ElementTypesEnum.NUMBER_STEPPER]: () => Promise.resolve().then(function () { return numberStepperElement; }).then((m) => m.NumberStepperElement),
|
|
48547
48686
|
[ElementTypesEnum.TIME_PICKER]: () => Promise.resolve().then(function () { return timePickerElement; }).then((m) => m.TimePickerElement),
|
|
@@ -48789,10 +48928,18 @@ class TableElement {
|
|
|
48789
48928
|
.filter((column) => String(column?.key ?? '').trim().length > 0)
|
|
48790
48929
|
.slice()
|
|
48791
48930
|
.sort((left, right) => {
|
|
48931
|
+
const leftIndex = columns.indexOf(left);
|
|
48932
|
+
const rightIndex = columns.indexOf(right);
|
|
48933
|
+
// Builderyje autoritetas yra columnsConfig eiliskumas: perstumus stulpeli savybiu
|
|
48934
|
+
// skydelyje pakeitimas turi matytis is karto, o issaugoti vartotojo nustatymai
|
|
48935
|
+
// (columnSettingsState) neturi jo perrasyti — taip pat, kaip ir su visible zemiau.
|
|
48936
|
+
if (isEditorMode) {
|
|
48937
|
+
return leftIndex - rightIndex;
|
|
48938
|
+
}
|
|
48792
48939
|
const leftKey = String(left?.key ?? '').trim();
|
|
48793
48940
|
const rightKey = String(right?.key ?? '').trim();
|
|
48794
|
-
const leftOrder = settingsMap.get(leftKey)?.order ??
|
|
48795
|
-
const rightOrder = settingsMap.get(rightKey)?.order ??
|
|
48941
|
+
const leftOrder = settingsMap.get(leftKey)?.order ?? leftIndex;
|
|
48942
|
+
const rightOrder = settingsMap.get(rightKey)?.order ?? rightIndex;
|
|
48796
48943
|
return leftOrder - rightOrder;
|
|
48797
48944
|
})
|
|
48798
48945
|
.filter((column, columnIndex) => {
|
|
@@ -73326,6 +73473,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
73326
73473
|
|
|
73327
73474
|
class ValidatorsAttribute {
|
|
73328
73475
|
property = input.required(...(ngDevMode ? [{ debugName: "property" }] : /* istanbul ignore next */ []));
|
|
73476
|
+
elementType = input('', ...(ngDevMode ? [{ debugName: "elementType" }] : /* istanbul ignore next */ []));
|
|
73329
73477
|
onValueChange = output();
|
|
73330
73478
|
validators = signal([], ...(ngDevMode ? [{ debugName: "validators" }] : /* istanbul ignore next */ []));
|
|
73331
73479
|
editingValidatorIndex = signal(null, ...(ngDevMode ? [{ debugName: "editingValidatorIndex" }] : /* istanbul ignore next */ []));
|
|
@@ -73359,7 +73507,7 @@ class ValidatorsAttribute {
|
|
|
73359
73507
|
{ value: 'startsWith', label: 'starts with', kind: 'function', functionName: 'startsWithAny' },
|
|
73360
73508
|
{ value: 'endsWith', label: 'ends with', kind: 'function', functionName: 'endsWithAny' },
|
|
73361
73509
|
];
|
|
73362
|
-
|
|
73510
|
+
builtInValidatorTypeOptions = [
|
|
73363
73511
|
{ value: 'required', label: 'required' },
|
|
73364
73512
|
{ value: 'minlength', label: 'minLength' },
|
|
73365
73513
|
{ value: 'maxlength', label: 'maxLength' },
|
|
@@ -73370,7 +73518,19 @@ class ValidatorsAttribute {
|
|
|
73370
73518
|
{ value: 'strictoptions', label: 'strictOptions' },
|
|
73371
73519
|
{ value: 'custom', label: 'custom' },
|
|
73372
73520
|
];
|
|
73521
|
+
validatorTypeOptions = computed(() => {
|
|
73522
|
+
const elementType = String(this.elementType() ?? '')
|
|
73523
|
+
.trim()
|
|
73524
|
+
.toLowerCase();
|
|
73525
|
+
const registered = this.validatorService
|
|
73526
|
+
.getRegisteredValidatorTypes()
|
|
73527
|
+
.filter((descriptor) => descriptor.appliesTo.length === 0 ||
|
|
73528
|
+
(!!elementType && descriptor.appliesTo.includes(elementType)))
|
|
73529
|
+
.map((descriptor) => ({ value: descriptor.type, label: descriptor.label }));
|
|
73530
|
+
return [...this.builtInValidatorTypeOptions, ...registered];
|
|
73531
|
+
}, ...(ngDevMode ? [{ debugName: "validatorTypeOptions" }] : /* istanbul ignore next */ []));
|
|
73373
73532
|
structureService = inject(StructureService);
|
|
73533
|
+
validatorService = inject(ValidatorService);
|
|
73374
73534
|
constructor() {
|
|
73375
73535
|
effect(() => {
|
|
73376
73536
|
this.loadValidators();
|
|
@@ -73413,37 +73573,64 @@ class ValidatorsAttribute {
|
|
|
73413
73573
|
onValidatorTypeChange(validator) {
|
|
73414
73574
|
const type = this.normalizeType(validator?.type);
|
|
73415
73575
|
validator.type = type;
|
|
73416
|
-
if (
|
|
73417
|
-
|
|
73576
|
+
if (this.isCustomField(validator)) {
|
|
73577
|
+
this.resetBuilderState();
|
|
73418
73578
|
}
|
|
73419
73579
|
else {
|
|
73420
|
-
|
|
73580
|
+
validator.condition = '';
|
|
73421
73581
|
}
|
|
73422
73582
|
if (!this.hasValueField(validator)) {
|
|
73423
73583
|
validator.value = '';
|
|
73424
73584
|
}
|
|
73585
|
+
const registeredType = this.validatorService.getRegisteredValidatorType(type);
|
|
73586
|
+
if (registeredType?.defaultMessage && !String(validator.message ?? '').trim()) {
|
|
73587
|
+
validator.message = registeredType.defaultMessage;
|
|
73588
|
+
}
|
|
73425
73589
|
this.emitChanges();
|
|
73426
73590
|
}
|
|
73591
|
+
validatorTypeOptionsFor(validator) {
|
|
73592
|
+
const options = this.validatorTypeOptions();
|
|
73593
|
+
const type = this.normalizeType(validator?.type);
|
|
73594
|
+
if (options.some((option) => option.value === type)) {
|
|
73595
|
+
return options;
|
|
73596
|
+
}
|
|
73597
|
+
return [...options, { value: type, label: `${type} (not registered)` }];
|
|
73598
|
+
}
|
|
73427
73599
|
onValidatorChanged() {
|
|
73428
73600
|
this.emitChanges();
|
|
73429
73601
|
}
|
|
73430
73602
|
hasValueField(validator) {
|
|
73431
73603
|
const type = this.normalizeType(validator?.type);
|
|
73432
|
-
|
|
73604
|
+
if (type === 'minlength' ||
|
|
73433
73605
|
type === 'maxlength' ||
|
|
73434
73606
|
type === 'min' ||
|
|
73435
73607
|
type === 'max' ||
|
|
73436
|
-
type === 'pattern')
|
|
73608
|
+
type === 'pattern') {
|
|
73609
|
+
return true;
|
|
73610
|
+
}
|
|
73611
|
+
return Boolean(this.validatorService.getRegisteredValidatorType(type)?.hasValue);
|
|
73437
73612
|
}
|
|
73438
73613
|
isPatternField(validator) {
|
|
73439
73614
|
return this.normalizeType(validator?.type) === 'pattern';
|
|
73440
73615
|
}
|
|
73441
73616
|
isCustomField(validator) {
|
|
73442
|
-
|
|
73617
|
+
const type = this.normalizeType(validator?.type);
|
|
73618
|
+
return type === 'custom' || !this.validatorService.hasValidatorType(type);
|
|
73619
|
+
}
|
|
73620
|
+
resolveValueLabel(validator) {
|
|
73621
|
+
const type = this.normalizeType(validator?.type);
|
|
73622
|
+
return this.validatorService.getRegisteredValidatorType(type)?.valueLabel ?? '';
|
|
73623
|
+
}
|
|
73624
|
+
resolveValuePlaceholder(validator) {
|
|
73625
|
+
if (this.isPatternField(validator)) {
|
|
73626
|
+
return '^[0-9]{4}$';
|
|
73627
|
+
}
|
|
73628
|
+
const type = this.normalizeType(validator?.type);
|
|
73629
|
+
return this.validatorService.getRegisteredValidatorType(type)?.valuePlaceholder || '10';
|
|
73443
73630
|
}
|
|
73444
73631
|
resolveValidatorTypeLabel(validator) {
|
|
73445
73632
|
const type = this.normalizeType(validator?.type);
|
|
73446
|
-
return this.validatorTypeOptions.find((option) => option.value === type)?.label ??
|
|
73633
|
+
return this.validatorTypeOptions().find((option) => option.value === type)?.label ?? type;
|
|
73447
73634
|
}
|
|
73448
73635
|
resolveValidatorSummary(validator) {
|
|
73449
73636
|
if (this.isCustomField(validator)) {
|
|
@@ -73594,8 +73781,9 @@ class ValidatorsAttribute {
|
|
|
73594
73781
|
const type = this.normalizeType(value?.['type']);
|
|
73595
73782
|
const condition = String(value?.['condition'] ?? '').trim();
|
|
73596
73783
|
const message = String(value?.['message'] ?? '').trim();
|
|
73784
|
+
const applyIf = String(value?.['applyIf'] ?? '').trim();
|
|
73597
73785
|
const ruleValue = value?.['value'];
|
|
73598
|
-
|
|
73786
|
+
const normalized = {
|
|
73599
73787
|
type,
|
|
73600
73788
|
condition,
|
|
73601
73789
|
message,
|
|
@@ -73605,27 +73793,17 @@ class ValidatorsAttribute {
|
|
|
73605
73793
|
? ruleValue
|
|
73606
73794
|
: String(ruleValue),
|
|
73607
73795
|
};
|
|
73796
|
+
if (applyIf) {
|
|
73797
|
+
normalized.applyIf = applyIf;
|
|
73798
|
+
}
|
|
73799
|
+
return normalized;
|
|
73608
73800
|
});
|
|
73609
73801
|
}
|
|
73610
73802
|
normalizeType(raw) {
|
|
73611
73803
|
const normalized = String(raw ?? '')
|
|
73612
73804
|
.trim()
|
|
73613
73805
|
.toLowerCase();
|
|
73614
|
-
|
|
73615
|
-
return 'custom';
|
|
73616
|
-
}
|
|
73617
|
-
const allowed = new Set([
|
|
73618
|
-
'required',
|
|
73619
|
-
'minlength',
|
|
73620
|
-
'maxlength',
|
|
73621
|
-
'min',
|
|
73622
|
-
'max',
|
|
73623
|
-
'pattern',
|
|
73624
|
-
'email',
|
|
73625
|
-
'strictoptions',
|
|
73626
|
-
'custom',
|
|
73627
|
-
]);
|
|
73628
|
-
return allowed.has(normalized) ? normalized : 'custom';
|
|
73806
|
+
return normalized || 'custom';
|
|
73629
73807
|
}
|
|
73630
73808
|
loadAllElementPaths() {
|
|
73631
73809
|
const structureElements = Object.keys(this.structureService.getStructure()?.elements ?? {});
|
|
@@ -73790,7 +73968,7 @@ class ValidatorsAttribute {
|
|
|
73790
73968
|
};
|
|
73791
73969
|
}
|
|
73792
73970
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ValidatorsAttribute, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
73793
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: ValidatorsAttribute, isStandalone: true, selector: "validators-attribute", inputs: { property: { classPropertyName: "property", publicName: "property", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onValueChange: "onValueChange" }, ngImport: i0, template: "<div class=\"validator-list\">\r\n @for (validator of validators(); track $index; let i = $index) {\r\n <article class=\"validator-item\" [attr.data-testid]=\"'validator-item-' + i\">\r\n <header class=\"validator-item__header\">\r\n <div class=\"validator-item__title-wrap\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__edit nvb-icon-button\"\r\n (click)=\"openValidatorEditor(i)\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n [attr.data-testid]=\"'validator-edit-' + i\"\r\n >\r\n <nvb-icon name=\"edit\"></nvb-icon>\r\n </button>\r\n <strong>#{{ i + 1 }}</strong>\r\n <span class=\"validator-item__summary\">{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__remove nvb-icon-button nvb-icon-button--danger\"\r\n (click)=\"removeValidator(i)\"\r\n [attr.aria-label]=\"'validator.remove' | uiT: 'Remove validator'\"\r\n [attr.data-testid]=\"'validator-remove-' + i\"\r\n >\r\n <nvb-icon name=\"delete\"></nvb-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"validator-item__meta\">\r\n <span class=\"validator-item__message\">{{ resolveValidatorMessage(validator) }}</span>\r\n </div>\r\n </article>\r\n\r\n @if (isValidatorExpanded(i)) {\r\n <div\r\n class=\"validator-dialog__backdrop\"\r\n data-testid=\"validator-dialog-backdrop\"\r\n >\r\n <div\r\n class=\"validator-dialog\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"validator-dialog-title\"\r\n aria-describedby=\"validator-dialog-description\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n data-testid=\"validator-dialog\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div class=\"validator-dialog__header\">\r\n <div class=\"validator-dialog__title-wrap\">\r\n <span id=\"validator-dialog-title\" class=\"nvb-sr-only\">\r\n {{ 'validator.edit' | uiT: 'Edit validator' }}\r\n </span>\r\n <span id=\"validator-dialog-description\" class=\"nvb-sr-only\">\r\n {{ resolveValidatorSummary(validator) }}\r\n </span>\r\n <strong>{{ 'validator.edit' | uiT: 'Edit validator' }}</strong>\r\n <span>{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__close nvb-icon-button nvb-icon-button--sx\"\r\n (click)=\"closeValidatorEditor()\"\r\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\r\n data-testid=\"validator-dialog-close\"\r\n >\r\n <nvb-icon name=\"close\"></nvb-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"validator-dialog__body\">\r\n <div class=\"validator-dialog__grid\">\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.type' | uiT: 'Type' }}\r\n <nvb-select\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.type\"\r\n (ngModelChange)=\"onValidatorTypeChange(validator)\"\r\n data-testid=\"validator-dialog-type\"\r\n >\r\n @for (option of validatorTypeOptions; track option.value) {\r\n <option [value]=\"option.value\">{{ option.label }}</option>\r\n }\r\n </nvb-select>\r\n </label>\r\n\r\n @if (hasValueField(validator)) {\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.value' | uiT: 'Value' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.value\"\r\n [spellcheck]=\"false\"\r\n [placeholder]=\"isPatternField(validator) ? '^[0-9]{4}$' : '10'\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n data-testid=\"validator-dialog-value\"\r\n />\r\n </label>\r\n }\r\n\r\n @if (isCustomField(validator)) {\r\n <div class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.condition' | uiT: 'Condition (error when true)' }}\r\n <div class=\"validator-dialog__mode-tabs\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'code'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'code'\"\r\n (click)=\"setConditionEditorMode('code')\"\r\n >\r\n {{ 'code.mode.code' | uiT: 'Code' }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'builder'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'builder'\"\r\n (click)=\"setConditionEditorMode('builder')\"\r\n >\r\n {{ 'logic.mode.builder' | uiT: 'Builder' }}\r\n </button>\r\n </div>\r\n\r\n @if (activeEditorMode() === 'builder') {\r\n <div class=\"validator-builder\" data-testid=\"validator-dialog-builder\">\r\n <datalist [id]=\"fieldSuggestionListId\">\r\n @for (field of fieldOptions(); track field.value) {\r\n <option [value]=\"field.value\">{{ field.label }}</option>\r\n }\r\n </datalist>\r\n\r\n <div class=\"validator-builder__rows\">\r\n @for (row of conditionRows; track trackByConditionRow($index, row); let rowIndex = $index) {\r\n <div class=\"validator-builder__line\">\r\n <div class=\"validator-builder__prefix\">\r\n @if (rowIndex === 0) {\r\n <span class=\"validator-builder__pill\">\r\n {{ 'code.builder.if' | uiT: 'If' }}\r\n </span>\r\n } @else {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--join\"\r\n [(ngModel)]=\"row.joinWith\"\r\n >\r\n <option value=\"&&\">{{ 'code.builder.and' | uiT: 'And' }}</option>\r\n <option value=\"||\">{{ 'code.builder.or' | uiT: 'Or' }}</option>\r\n </nvb-select>\r\n }\r\n </div>\r\n\r\n <input\r\n class=\"validator-builder__input validator-builder__input--field nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.left' | uiT: 'Left field'\"\r\n [(ngModel)]=\"row.leftField\"\r\n (ngModelChange)=\"onConditionFieldChanged(row)\"\r\n />\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--operator\"\r\n [(ngModel)]=\"row.operator\"\r\n >\r\n @for (operator of getRowOperators(row); track operator.value) {\r\n <option [value]=\"operator.value\">{{ operator.label }}</option>\r\n }\r\n </nvb-select>\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--source\"\r\n [(ngModel)]=\"row.valueSource\"\r\n (ngModelChange)=\"onConditionValueSourceChanged(row)\"\r\n >\r\n <option value=\"literal\">{{ 'code.builder.value' | uiT: 'Value' }}</option>\r\n <option value=\"field\">{{ 'code.builder.field' | uiT: 'Field' }}</option>\r\n </nvb-select>\r\n\r\n @if (row.valueSource === 'field') {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.rightField' | uiT: 'Right field'\"\r\n [(ngModel)]=\"row.fieldValue\"\r\n />\r\n } @else if (getRowFieldType(row) === 'boolean') {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--value\"\r\n [(ngModel)]=\"row.literalValue\"\r\n >\r\n <option value=\"true\">true</option>\r\n <option value=\"false\">false</option>\r\n </nvb-select>\r\n } @else {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n [type]=\"getInputType(row)\"\r\n [(ngModel)]=\"row.literalValue\"\r\n />\r\n }\r\n\r\n @if (rowIndex > 0) {\r\n <builder-icon-button\r\n class=\"validator-builder__remove\"\r\n className=\"validator-builder__remove\"\r\n icon=\"delete\"\r\n tone=\"danger\"\r\n size=\"sm\"\r\n [ariaLabel]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n [title]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n (clicked)=\"removeConditionRow(row.id)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"validator-builder__actions\">\r\n <builder-action-button\r\n tone=\"neutral\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.addCondition' | uiT: 'Add condition'\"\r\n (clicked)=\"addConditionRow()\"\r\n />\r\n <builder-action-button\r\n tone=\"subtle\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.clear' | uiT: 'Clear'\"\r\n (clicked)=\"clearConditions()\"\r\n />\r\n <builder-action-button\r\n tone=\"primary\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.apply' | uiT: 'Apply to code'\"\r\n (clicked)=\"applyBuilderToValidatorCondition(validator)\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"validator-dialog__editor\">\r\n <native-code-editor\r\n language=\"expression\"\r\n [value]=\"validator.condition || ''\"\r\n [completions]=\"getValidatorConditionCompletions()\"\r\n (valueChange)=\"setValidatorCondition(validator, $event)\"\r\n (editorBlur)=\"setValidatorCondition(validator, $event)\"\r\n data-testid=\"validator-dialog-condition\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <label class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.message' | uiT: 'Message' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.message\"\r\n [spellcheck]=\"false\"\r\n placeholder=\"Invalid value.\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n } @empty {\r\n <small class=\"validator-list__empty\">\r\n {{ 'validator.empty' | uiT: 'No validators yet.' }}\r\n </small>\r\n }\r\n</div>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"nvb-control__add-row-button\"\r\n (click)=\"addValidator()\"\r\n [attr.aria-label]=\"'validator.add' | uiT: 'Add validator'\"\r\n data-testid=\"validator-add\"\r\n>\r\n <nvb-icon name=\"add_circle\"></nvb-icon>\r\n {{ 'validator.add' | uiT: 'Add validator' }}\r\n</button>\r\n", styles: [":host{display:block}.validator-list{display:flex;flex-direction:column;gap:var(--space-2)}.validator-list__empty{display:block;padding:4px 0;color:var(--color-neutral-500);font-size:12px}.validator-item{border:1px solid var(--nvb-card-border-color, var(--color-neutral-200));border-radius:var(--nvb-control-radius, var(--radius-md));padding:7px;background:var(--nvb-card-bg, var(--color-neutral-000));box-shadow:none}.validator-item__header{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:var(--nvb-control-height);color:var(--color-neutral-700);font-size:12px}.validator-item__title-wrap{display:inline-flex;flex:1;min-width:0;align-items:center;gap:6px}.validator-item__summary,.validator-item__message{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.validator-item__summary{min-width:0;color:var(--color-neutral-800);font-weight:650}.validator-item__meta{display:flex;align-items:center;gap:6px;min-width:0;margin:4px 0 0 calc(var(--nvb-control-height) + 12px);color:var(--color-neutral-600);font-size:11px;line-height:1.35}.validator-item__message{min-width:0}.validator-dialog__backdrop{position:fixed;inset:0;z-index:2147483450;display:flex;align-items:center;justify-content:center;padding:20px;background:#0f172a5c;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.validator-dialog{display:grid;grid-template-rows:auto minmax(0,1fr);width:min(760px,100%);max-height:min(88vh,860px);overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-dialog-radius);background:var(--color-neutral-000);box-shadow:var(--nvb-shadow-16);outline:0}.validator-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 24px 12px;border-bottom:1px solid var(--color-neutral-200)}.validator-dialog__title-wrap{display:grid;gap:2px;min-width:0}.validator-dialog__title-wrap strong{color:var(--color-neutral-900);font-size:16px;line-height:22px;font-weight:600}.validator-dialog__title-wrap span{overflow:hidden;color:var(--color-neutral-500);font-size:13px;line-height:18px;text-overflow:ellipsis;white-space:nowrap}.validator-dialog__body{min-height:0;overflow:auto;padding:16px 24px 24px}.validator-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.validator-dialog__label{display:flex;flex-direction:column;gap:4px;color:var(--color-neutral-600);font-size:11px}.validator-dialog__label--full{grid-column:1/-1}.validator-dialog__editor{height:260px;min-height:260px}.validator-dialog__mode-tabs{display:inline-flex;align-self:flex-start;overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-050)}.validator-dialog__mode-tab{min-height:28px;border:0;border-right:1px solid var(--color-neutral-200);padding:0 10px;background:transparent;color:var(--color-neutral-600);cursor:pointer;font:inherit;font-size:12px}.validator-dialog__mode-tab:last-child{border-right:0}.validator-dialog__mode-tab--active{background:var(--color-neutral-000);color:var(--color-primary-700);font-weight:650}.validator-builder{display:grid;gap:12px;padding:12px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-025, var(--color-neutral-050))}.validator-builder__rows{display:grid;gap:8px}.validator-builder__line{display:grid;grid-template-columns:62px minmax(120px,1.15fr) minmax(92px,.55fr) minmax(92px,.55fr) minmax(120px,1fr) 34px;gap:8px;align-items:center}.validator-builder__prefix{display:flex;align-items:center}.validator-builder__pill{display:inline-flex;align-items:center;justify-content:center;min-height:26px;padding:0 10px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-000);color:var(--color-neutral-700);font-size:12px;font-weight:650}.validator-builder__input{width:100%;min-width:0}.validator-builder__actions{display:flex;flex-wrap:wrap;gap:8px}.validator-builder__remove{justify-self:end}.nvb-control__add-row-button{margin-top:var(--space-3)}@media(max-width:860px){.validator-builder__line{grid-template-columns:1fr}.validator-builder__remove{justify-self:start}}\n"], dependencies: [{ kind: "component", type: NvbSelect, selector: "nvb-select", inputs: ["value", "disabled", "required"], outputs: ["valueChange", "change", "focus", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NvbIcon, selector: "nvb-icon", inputs: ["name", "svg", "ariaLabel"] }, { kind: "component", type: NativeCodeEditor, selector: "native-code-editor", inputs: ["value", "language", "theme", "readOnly", "completions"], outputs: ["valueChange", "editorBlur"] }, { kind: "component", type: BuilderActionButton, selector: "builder-action-button", inputs: ["label", "ariaLabel", "testId", "title", "icon", "className", "tone", "size", "align", "active", "fullWidth", "disabled"], outputs: ["clicked"] }, { kind: "component", type: BuilderIconButton, selector: "builder-icon-button", inputs: ["icon", "ariaLabel", "title", "testId", "iconSet", "size", "tone", "ghost", "dragHandle", "active", "disabled", "className"], outputs: ["clicked"] }, { kind: "pipe", type: UiTranslatePipe, name: "uiT" }] });
|
|
73971
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: ValidatorsAttribute, isStandalone: true, selector: "validators-attribute", inputs: { property: { classPropertyName: "property", publicName: "property", isSignal: true, isRequired: true, transformFunction: null }, elementType: { classPropertyName: "elementType", publicName: "elementType", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onValueChange: "onValueChange" }, ngImport: i0, template: "<div class=\"validator-list\">\r\n @for (validator of validators(); track $index; let i = $index) {\r\n <article class=\"validator-item\" [attr.data-testid]=\"'validator-item-' + i\">\r\n <header class=\"validator-item__header\">\r\n <div class=\"validator-item__title-wrap\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__edit nvb-icon-button\"\r\n (click)=\"openValidatorEditor(i)\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n [attr.data-testid]=\"'validator-edit-' + i\"\r\n >\r\n <nvb-icon name=\"edit\"></nvb-icon>\r\n </button>\r\n <strong>#{{ i + 1 }}</strong>\r\n <span class=\"validator-item__summary\">{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__remove nvb-icon-button nvb-icon-button--danger\"\r\n (click)=\"removeValidator(i)\"\r\n [attr.aria-label]=\"'validator.remove' | uiT: 'Remove validator'\"\r\n [attr.data-testid]=\"'validator-remove-' + i\"\r\n >\r\n <nvb-icon name=\"delete\"></nvb-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"validator-item__meta\">\r\n <span class=\"validator-item__message\">{{ resolveValidatorMessage(validator) }}</span>\r\n </div>\r\n </article>\r\n\r\n @if (isValidatorExpanded(i)) {\r\n <div\r\n class=\"validator-dialog__backdrop\"\r\n data-testid=\"validator-dialog-backdrop\"\r\n >\r\n <div\r\n class=\"validator-dialog\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"validator-dialog-title\"\r\n aria-describedby=\"validator-dialog-description\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n data-testid=\"validator-dialog\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div class=\"validator-dialog__header\">\r\n <div class=\"validator-dialog__title-wrap\">\r\n <span id=\"validator-dialog-title\" class=\"nvb-sr-only\">\r\n {{ 'validator.edit' | uiT: 'Edit validator' }}\r\n </span>\r\n <span id=\"validator-dialog-description\" class=\"nvb-sr-only\">\r\n {{ resolveValidatorSummary(validator) }}\r\n </span>\r\n <strong>{{ 'validator.edit' | uiT: 'Edit validator' }}</strong>\r\n <span>{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__close nvb-icon-button nvb-icon-button--sx\"\r\n (click)=\"closeValidatorEditor()\"\r\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\r\n data-testid=\"validator-dialog-close\"\r\n >\r\n <nvb-icon name=\"close\"></nvb-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"validator-dialog__body\">\r\n <div class=\"validator-dialog__grid\">\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.type' | uiT: 'Type' }}\r\n <nvb-select\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.type\"\r\n (ngModelChange)=\"onValidatorTypeChange(validator)\"\r\n data-testid=\"validator-dialog-type\"\r\n >\r\n @for (option of validatorTypeOptionsFor(validator); track option.value) {\r\n <option [value]=\"option.value\">{{ option.label }}</option>\r\n }\r\n </nvb-select>\r\n </label>\r\n\r\n @if (hasValueField(validator)) {\r\n <label class=\"validator-dialog__label\">\r\n {{ resolveValueLabel(validator) || ('validator.value' | uiT: 'Value') }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.value\"\r\n [spellcheck]=\"false\"\r\n [placeholder]=\"resolveValuePlaceholder(validator)\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n data-testid=\"validator-dialog-value\"\r\n />\r\n </label>\r\n }\r\n\r\n @if (isCustomField(validator)) {\r\n <div class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.condition' | uiT: 'Condition (error when true)' }}\r\n <div class=\"validator-dialog__mode-tabs\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'code'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'code'\"\r\n (click)=\"setConditionEditorMode('code')\"\r\n >\r\n {{ 'code.mode.code' | uiT: 'Code' }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'builder'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'builder'\"\r\n (click)=\"setConditionEditorMode('builder')\"\r\n >\r\n {{ 'logic.mode.builder' | uiT: 'Builder' }}\r\n </button>\r\n </div>\r\n\r\n @if (activeEditorMode() === 'builder') {\r\n <div class=\"validator-builder\" data-testid=\"validator-dialog-builder\">\r\n <datalist [id]=\"fieldSuggestionListId\">\r\n @for (field of fieldOptions(); track field.value) {\r\n <option [value]=\"field.value\">{{ field.label }}</option>\r\n }\r\n </datalist>\r\n\r\n <div class=\"validator-builder__rows\">\r\n @for (row of conditionRows; track trackByConditionRow($index, row); let rowIndex = $index) {\r\n <div class=\"validator-builder__line\">\r\n <div class=\"validator-builder__prefix\">\r\n @if (rowIndex === 0) {\r\n <span class=\"validator-builder__pill\">\r\n {{ 'code.builder.if' | uiT: 'If' }}\r\n </span>\r\n } @else {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--join\"\r\n [(ngModel)]=\"row.joinWith\"\r\n >\r\n <option value=\"&&\">{{ 'code.builder.and' | uiT: 'And' }}</option>\r\n <option value=\"||\">{{ 'code.builder.or' | uiT: 'Or' }}</option>\r\n </nvb-select>\r\n }\r\n </div>\r\n\r\n <input\r\n class=\"validator-builder__input validator-builder__input--field nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.left' | uiT: 'Left field'\"\r\n [(ngModel)]=\"row.leftField\"\r\n (ngModelChange)=\"onConditionFieldChanged(row)\"\r\n />\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--operator\"\r\n [(ngModel)]=\"row.operator\"\r\n >\r\n @for (operator of getRowOperators(row); track operator.value) {\r\n <option [value]=\"operator.value\">{{ operator.label }}</option>\r\n }\r\n </nvb-select>\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--source\"\r\n [(ngModel)]=\"row.valueSource\"\r\n (ngModelChange)=\"onConditionValueSourceChanged(row)\"\r\n >\r\n <option value=\"literal\">{{ 'code.builder.value' | uiT: 'Value' }}</option>\r\n <option value=\"field\">{{ 'code.builder.field' | uiT: 'Field' }}</option>\r\n </nvb-select>\r\n\r\n @if (row.valueSource === 'field') {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.rightField' | uiT: 'Right field'\"\r\n [(ngModel)]=\"row.fieldValue\"\r\n />\r\n } @else if (getRowFieldType(row) === 'boolean') {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--value\"\r\n [(ngModel)]=\"row.literalValue\"\r\n >\r\n <option value=\"true\">true</option>\r\n <option value=\"false\">false</option>\r\n </nvb-select>\r\n } @else {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n [type]=\"getInputType(row)\"\r\n [(ngModel)]=\"row.literalValue\"\r\n />\r\n }\r\n\r\n @if (rowIndex > 0) {\r\n <builder-icon-button\r\n class=\"validator-builder__remove\"\r\n className=\"validator-builder__remove\"\r\n icon=\"delete\"\r\n tone=\"danger\"\r\n size=\"sm\"\r\n [ariaLabel]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n [title]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n (clicked)=\"removeConditionRow(row.id)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"validator-builder__actions\">\r\n <builder-action-button\r\n tone=\"neutral\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.addCondition' | uiT: 'Add condition'\"\r\n (clicked)=\"addConditionRow()\"\r\n />\r\n <builder-action-button\r\n tone=\"subtle\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.clear' | uiT: 'Clear'\"\r\n (clicked)=\"clearConditions()\"\r\n />\r\n <builder-action-button\r\n tone=\"primary\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.apply' | uiT: 'Apply to code'\"\r\n (clicked)=\"applyBuilderToValidatorCondition(validator)\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"validator-dialog__editor\">\r\n <native-code-editor\r\n language=\"expression\"\r\n [value]=\"validator.condition || ''\"\r\n [completions]=\"getValidatorConditionCompletions()\"\r\n (valueChange)=\"setValidatorCondition(validator, $event)\"\r\n (editorBlur)=\"setValidatorCondition(validator, $event)\"\r\n data-testid=\"validator-dialog-condition\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <label class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.message' | uiT: 'Message' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.message\"\r\n [spellcheck]=\"false\"\r\n placeholder=\"Invalid value.\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n } @empty {\r\n <small class=\"validator-list__empty\">\r\n {{ 'validator.empty' | uiT: 'No validators yet.' }}\r\n </small>\r\n }\r\n</div>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"nvb-control__add-row-button\"\r\n (click)=\"addValidator()\"\r\n [attr.aria-label]=\"'validator.add' | uiT: 'Add validator'\"\r\n data-testid=\"validator-add\"\r\n>\r\n <nvb-icon name=\"add_circle\"></nvb-icon>\r\n {{ 'validator.add' | uiT: 'Add validator' }}\r\n</button>\r\n", styles: [":host{display:block}.validator-list{display:flex;flex-direction:column;gap:var(--space-2)}.validator-list__empty{display:block;padding:4px 0;color:var(--color-neutral-500);font-size:12px}.validator-item{border:1px solid var(--nvb-card-border-color, var(--color-neutral-200));border-radius:var(--nvb-control-radius, var(--radius-md));padding:7px;background:var(--nvb-card-bg, var(--color-neutral-000));box-shadow:none}.validator-item__header{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:var(--nvb-control-height);color:var(--color-neutral-700);font-size:12px}.validator-item__title-wrap{display:inline-flex;flex:1;min-width:0;align-items:center;gap:6px}.validator-item__summary,.validator-item__message{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.validator-item__summary{min-width:0;color:var(--color-neutral-800);font-weight:650}.validator-item__meta{display:flex;align-items:center;gap:6px;min-width:0;margin:4px 0 0 calc(var(--nvb-control-height) + 12px);color:var(--color-neutral-600);font-size:11px;line-height:1.35}.validator-item__message{min-width:0}.validator-dialog__backdrop{position:fixed;inset:0;z-index:2147483450;display:flex;align-items:center;justify-content:center;padding:20px;background:#0f172a5c;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.validator-dialog{display:grid;grid-template-rows:auto minmax(0,1fr);width:min(760px,100%);max-height:min(88vh,860px);overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-dialog-radius);background:var(--color-neutral-000);box-shadow:var(--nvb-shadow-16);outline:0}.validator-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 24px 12px;border-bottom:1px solid var(--color-neutral-200)}.validator-dialog__title-wrap{display:grid;gap:2px;min-width:0}.validator-dialog__title-wrap strong{color:var(--color-neutral-900);font-size:16px;line-height:22px;font-weight:600}.validator-dialog__title-wrap span{overflow:hidden;color:var(--color-neutral-500);font-size:13px;line-height:18px;text-overflow:ellipsis;white-space:nowrap}.validator-dialog__body{min-height:0;overflow:auto;padding:16px 24px 24px}.validator-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.validator-dialog__label{display:flex;flex-direction:column;gap:4px;color:var(--color-neutral-600);font-size:11px}.validator-dialog__label--full{grid-column:1/-1}.validator-dialog__editor{height:260px;min-height:260px}.validator-dialog__mode-tabs{display:inline-flex;align-self:flex-start;overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-050)}.validator-dialog__mode-tab{min-height:28px;border:0;border-right:1px solid var(--color-neutral-200);padding:0 10px;background:transparent;color:var(--color-neutral-600);cursor:pointer;font:inherit;font-size:12px}.validator-dialog__mode-tab:last-child{border-right:0}.validator-dialog__mode-tab--active{background:var(--color-neutral-000);color:var(--color-primary-700);font-weight:650}.validator-builder{display:grid;gap:12px;padding:12px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-025, var(--color-neutral-050))}.validator-builder__rows{display:grid;gap:8px}.validator-builder__line{display:grid;grid-template-columns:62px minmax(120px,1.15fr) minmax(92px,.55fr) minmax(92px,.55fr) minmax(120px,1fr) 34px;gap:8px;align-items:center}.validator-builder__prefix{display:flex;align-items:center}.validator-builder__pill{display:inline-flex;align-items:center;justify-content:center;min-height:26px;padding:0 10px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-000);color:var(--color-neutral-700);font-size:12px;font-weight:650}.validator-builder__input{width:100%;min-width:0}.validator-builder__actions{display:flex;flex-wrap:wrap;gap:8px}.validator-builder__remove{justify-self:end}.nvb-control__add-row-button{margin-top:var(--space-3)}@media(max-width:860px){.validator-builder__line{grid-template-columns:1fr}.validator-builder__remove{justify-self:start}}\n"], dependencies: [{ kind: "component", type: NvbSelect, selector: "nvb-select", inputs: ["value", "disabled", "required"], outputs: ["valueChange", "change", "focus", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NvbIcon, selector: "nvb-icon", inputs: ["name", "svg", "ariaLabel"] }, { kind: "component", type: NativeCodeEditor, selector: "native-code-editor", inputs: ["value", "language", "theme", "readOnly", "completions"], outputs: ["valueChange", "editorBlur"] }, { kind: "component", type: BuilderActionButton, selector: "builder-action-button", inputs: ["label", "ariaLabel", "testId", "title", "icon", "className", "tone", "size", "align", "active", "fullWidth", "disabled"], outputs: ["clicked"] }, { kind: "component", type: BuilderIconButton, selector: "builder-icon-button", inputs: ["icon", "ariaLabel", "title", "testId", "iconSet", "size", "tone", "ghost", "dragHandle", "active", "disabled", "className"], outputs: ["clicked"] }, { kind: "pipe", type: UiTranslatePipe, name: "uiT" }] });
|
|
73794
73972
|
}
|
|
73795
73973
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ValidatorsAttribute, decorators: [{
|
|
73796
73974
|
type: Component,
|
|
@@ -73802,8 +73980,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
73802
73980
|
NativeCodeEditor,
|
|
73803
73981
|
BuilderActionButton,
|
|
73804
73982
|
BuilderIconButton,
|
|
73805
|
-
], template: "<div class=\"validator-list\">\r\n @for (validator of validators(); track $index; let i = $index) {\r\n <article class=\"validator-item\" [attr.data-testid]=\"'validator-item-' + i\">\r\n <header class=\"validator-item__header\">\r\n <div class=\"validator-item__title-wrap\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__edit nvb-icon-button\"\r\n (click)=\"openValidatorEditor(i)\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n [attr.data-testid]=\"'validator-edit-' + i\"\r\n >\r\n <nvb-icon name=\"edit\"></nvb-icon>\r\n </button>\r\n <strong>#{{ i + 1 }}</strong>\r\n <span class=\"validator-item__summary\">{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__remove nvb-icon-button nvb-icon-button--danger\"\r\n (click)=\"removeValidator(i)\"\r\n [attr.aria-label]=\"'validator.remove' | uiT: 'Remove validator'\"\r\n [attr.data-testid]=\"'validator-remove-' + i\"\r\n >\r\n <nvb-icon name=\"delete\"></nvb-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"validator-item__meta\">\r\n <span class=\"validator-item__message\">{{ resolveValidatorMessage(validator) }}</span>\r\n </div>\r\n </article>\r\n\r\n @if (isValidatorExpanded(i)) {\r\n <div\r\n class=\"validator-dialog__backdrop\"\r\n data-testid=\"validator-dialog-backdrop\"\r\n >\r\n <div\r\n class=\"validator-dialog\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"validator-dialog-title\"\r\n aria-describedby=\"validator-dialog-description\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n data-testid=\"validator-dialog\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div class=\"validator-dialog__header\">\r\n <div class=\"validator-dialog__title-wrap\">\r\n <span id=\"validator-dialog-title\" class=\"nvb-sr-only\">\r\n {{ 'validator.edit' | uiT: 'Edit validator' }}\r\n </span>\r\n <span id=\"validator-dialog-description\" class=\"nvb-sr-only\">\r\n {{ resolveValidatorSummary(validator) }}\r\n </span>\r\n <strong>{{ 'validator.edit' | uiT: 'Edit validator' }}</strong>\r\n <span>{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__close nvb-icon-button nvb-icon-button--sx\"\r\n (click)=\"closeValidatorEditor()\"\r\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\r\n data-testid=\"validator-dialog-close\"\r\n >\r\n <nvb-icon name=\"close\"></nvb-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"validator-dialog__body\">\r\n <div class=\"validator-dialog__grid\">\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.type' | uiT: 'Type' }}\r\n <nvb-select\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.type\"\r\n (ngModelChange)=\"onValidatorTypeChange(validator)\"\r\n data-testid=\"validator-dialog-type\"\r\n >\r\n @for (option of validatorTypeOptions; track option.value) {\r\n <option [value]=\"option.value\">{{ option.label }}</option>\r\n }\r\n </nvb-select>\r\n </label>\r\n\r\n @if (hasValueField(validator)) {\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.value' | uiT: 'Value' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.value\"\r\n [spellcheck]=\"false\"\r\n [placeholder]=\"isPatternField(validator) ? '^[0-9]{4}$' : '10'\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n data-testid=\"validator-dialog-value\"\r\n />\r\n </label>\r\n }\r\n\r\n @if (isCustomField(validator)) {\r\n <div class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.condition' | uiT: 'Condition (error when true)' }}\r\n <div class=\"validator-dialog__mode-tabs\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'code'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'code'\"\r\n (click)=\"setConditionEditorMode('code')\"\r\n >\r\n {{ 'code.mode.code' | uiT: 'Code' }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'builder'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'builder'\"\r\n (click)=\"setConditionEditorMode('builder')\"\r\n >\r\n {{ 'logic.mode.builder' | uiT: 'Builder' }}\r\n </button>\r\n </div>\r\n\r\n @if (activeEditorMode() === 'builder') {\r\n <div class=\"validator-builder\" data-testid=\"validator-dialog-builder\">\r\n <datalist [id]=\"fieldSuggestionListId\">\r\n @for (field of fieldOptions(); track field.value) {\r\n <option [value]=\"field.value\">{{ field.label }}</option>\r\n }\r\n </datalist>\r\n\r\n <div class=\"validator-builder__rows\">\r\n @for (row of conditionRows; track trackByConditionRow($index, row); let rowIndex = $index) {\r\n <div class=\"validator-builder__line\">\r\n <div class=\"validator-builder__prefix\">\r\n @if (rowIndex === 0) {\r\n <span class=\"validator-builder__pill\">\r\n {{ 'code.builder.if' | uiT: 'If' }}\r\n </span>\r\n } @else {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--join\"\r\n [(ngModel)]=\"row.joinWith\"\r\n >\r\n <option value=\"&&\">{{ 'code.builder.and' | uiT: 'And' }}</option>\r\n <option value=\"||\">{{ 'code.builder.or' | uiT: 'Or' }}</option>\r\n </nvb-select>\r\n }\r\n </div>\r\n\r\n <input\r\n class=\"validator-builder__input validator-builder__input--field nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.left' | uiT: 'Left field'\"\r\n [(ngModel)]=\"row.leftField\"\r\n (ngModelChange)=\"onConditionFieldChanged(row)\"\r\n />\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--operator\"\r\n [(ngModel)]=\"row.operator\"\r\n >\r\n @for (operator of getRowOperators(row); track operator.value) {\r\n <option [value]=\"operator.value\">{{ operator.label }}</option>\r\n }\r\n </nvb-select>\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--source\"\r\n [(ngModel)]=\"row.valueSource\"\r\n (ngModelChange)=\"onConditionValueSourceChanged(row)\"\r\n >\r\n <option value=\"literal\">{{ 'code.builder.value' | uiT: 'Value' }}</option>\r\n <option value=\"field\">{{ 'code.builder.field' | uiT: 'Field' }}</option>\r\n </nvb-select>\r\n\r\n @if (row.valueSource === 'field') {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.rightField' | uiT: 'Right field'\"\r\n [(ngModel)]=\"row.fieldValue\"\r\n />\r\n } @else if (getRowFieldType(row) === 'boolean') {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--value\"\r\n [(ngModel)]=\"row.literalValue\"\r\n >\r\n <option value=\"true\">true</option>\r\n <option value=\"false\">false</option>\r\n </nvb-select>\r\n } @else {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n [type]=\"getInputType(row)\"\r\n [(ngModel)]=\"row.literalValue\"\r\n />\r\n }\r\n\r\n @if (rowIndex > 0) {\r\n <builder-icon-button\r\n class=\"validator-builder__remove\"\r\n className=\"validator-builder__remove\"\r\n icon=\"delete\"\r\n tone=\"danger\"\r\n size=\"sm\"\r\n [ariaLabel]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n [title]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n (clicked)=\"removeConditionRow(row.id)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"validator-builder__actions\">\r\n <builder-action-button\r\n tone=\"neutral\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.addCondition' | uiT: 'Add condition'\"\r\n (clicked)=\"addConditionRow()\"\r\n />\r\n <builder-action-button\r\n tone=\"subtle\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.clear' | uiT: 'Clear'\"\r\n (clicked)=\"clearConditions()\"\r\n />\r\n <builder-action-button\r\n tone=\"primary\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.apply' | uiT: 'Apply to code'\"\r\n (clicked)=\"applyBuilderToValidatorCondition(validator)\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"validator-dialog__editor\">\r\n <native-code-editor\r\n language=\"expression\"\r\n [value]=\"validator.condition || ''\"\r\n [completions]=\"getValidatorConditionCompletions()\"\r\n (valueChange)=\"setValidatorCondition(validator, $event)\"\r\n (editorBlur)=\"setValidatorCondition(validator, $event)\"\r\n data-testid=\"validator-dialog-condition\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <label class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.message' | uiT: 'Message' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.message\"\r\n [spellcheck]=\"false\"\r\n placeholder=\"Invalid value.\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n } @empty {\r\n <small class=\"validator-list__empty\">\r\n {{ 'validator.empty' | uiT: 'No validators yet.' }}\r\n </small>\r\n }\r\n</div>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"nvb-control__add-row-button\"\r\n (click)=\"addValidator()\"\r\n [attr.aria-label]=\"'validator.add' | uiT: 'Add validator'\"\r\n data-testid=\"validator-add\"\r\n>\r\n <nvb-icon name=\"add_circle\"></nvb-icon>\r\n {{ 'validator.add' | uiT: 'Add validator' }}\r\n</button>\r\n", styles: [":host{display:block}.validator-list{display:flex;flex-direction:column;gap:var(--space-2)}.validator-list__empty{display:block;padding:4px 0;color:var(--color-neutral-500);font-size:12px}.validator-item{border:1px solid var(--nvb-card-border-color, var(--color-neutral-200));border-radius:var(--nvb-control-radius, var(--radius-md));padding:7px;background:var(--nvb-card-bg, var(--color-neutral-000));box-shadow:none}.validator-item__header{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:var(--nvb-control-height);color:var(--color-neutral-700);font-size:12px}.validator-item__title-wrap{display:inline-flex;flex:1;min-width:0;align-items:center;gap:6px}.validator-item__summary,.validator-item__message{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.validator-item__summary{min-width:0;color:var(--color-neutral-800);font-weight:650}.validator-item__meta{display:flex;align-items:center;gap:6px;min-width:0;margin:4px 0 0 calc(var(--nvb-control-height) + 12px);color:var(--color-neutral-600);font-size:11px;line-height:1.35}.validator-item__message{min-width:0}.validator-dialog__backdrop{position:fixed;inset:0;z-index:2147483450;display:flex;align-items:center;justify-content:center;padding:20px;background:#0f172a5c;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.validator-dialog{display:grid;grid-template-rows:auto minmax(0,1fr);width:min(760px,100%);max-height:min(88vh,860px);overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-dialog-radius);background:var(--color-neutral-000);box-shadow:var(--nvb-shadow-16);outline:0}.validator-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 24px 12px;border-bottom:1px solid var(--color-neutral-200)}.validator-dialog__title-wrap{display:grid;gap:2px;min-width:0}.validator-dialog__title-wrap strong{color:var(--color-neutral-900);font-size:16px;line-height:22px;font-weight:600}.validator-dialog__title-wrap span{overflow:hidden;color:var(--color-neutral-500);font-size:13px;line-height:18px;text-overflow:ellipsis;white-space:nowrap}.validator-dialog__body{min-height:0;overflow:auto;padding:16px 24px 24px}.validator-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.validator-dialog__label{display:flex;flex-direction:column;gap:4px;color:var(--color-neutral-600);font-size:11px}.validator-dialog__label--full{grid-column:1/-1}.validator-dialog__editor{height:260px;min-height:260px}.validator-dialog__mode-tabs{display:inline-flex;align-self:flex-start;overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-050)}.validator-dialog__mode-tab{min-height:28px;border:0;border-right:1px solid var(--color-neutral-200);padding:0 10px;background:transparent;color:var(--color-neutral-600);cursor:pointer;font:inherit;font-size:12px}.validator-dialog__mode-tab:last-child{border-right:0}.validator-dialog__mode-tab--active{background:var(--color-neutral-000);color:var(--color-primary-700);font-weight:650}.validator-builder{display:grid;gap:12px;padding:12px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-025, var(--color-neutral-050))}.validator-builder__rows{display:grid;gap:8px}.validator-builder__line{display:grid;grid-template-columns:62px minmax(120px,1.15fr) minmax(92px,.55fr) minmax(92px,.55fr) minmax(120px,1fr) 34px;gap:8px;align-items:center}.validator-builder__prefix{display:flex;align-items:center}.validator-builder__pill{display:inline-flex;align-items:center;justify-content:center;min-height:26px;padding:0 10px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-000);color:var(--color-neutral-700);font-size:12px;font-weight:650}.validator-builder__input{width:100%;min-width:0}.validator-builder__actions{display:flex;flex-wrap:wrap;gap:8px}.validator-builder__remove{justify-self:end}.nvb-control__add-row-button{margin-top:var(--space-3)}@media(max-width:860px){.validator-builder__line{grid-template-columns:1fr}.validator-builder__remove{justify-self:start}}\n"] }]
|
|
73806
|
-
}], ctorParameters: () => [], propDecorators: { property: [{ type: i0.Input, args: [{ isSignal: true, alias: "property", required: true }] }], onValueChange: [{ type: i0.Output, args: ["onValueChange"] }] } });
|
|
73983
|
+
], template: "<div class=\"validator-list\">\r\n @for (validator of validators(); track $index; let i = $index) {\r\n <article class=\"validator-item\" [attr.data-testid]=\"'validator-item-' + i\">\r\n <header class=\"validator-item__header\">\r\n <div class=\"validator-item__title-wrap\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__edit nvb-icon-button\"\r\n (click)=\"openValidatorEditor(i)\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n [attr.data-testid]=\"'validator-edit-' + i\"\r\n >\r\n <nvb-icon name=\"edit\"></nvb-icon>\r\n </button>\r\n <strong>#{{ i + 1 }}</strong>\r\n <span class=\"validator-item__summary\">{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"validator-item__remove nvb-icon-button nvb-icon-button--danger\"\r\n (click)=\"removeValidator(i)\"\r\n [attr.aria-label]=\"'validator.remove' | uiT: 'Remove validator'\"\r\n [attr.data-testid]=\"'validator-remove-' + i\"\r\n >\r\n <nvb-icon name=\"delete\"></nvb-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"validator-item__meta\">\r\n <span class=\"validator-item__message\">{{ resolveValidatorMessage(validator) }}</span>\r\n </div>\r\n </article>\r\n\r\n @if (isValidatorExpanded(i)) {\r\n <div\r\n class=\"validator-dialog__backdrop\"\r\n data-testid=\"validator-dialog-backdrop\"\r\n >\r\n <div\r\n class=\"validator-dialog\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"validator-dialog-title\"\r\n aria-describedby=\"validator-dialog-description\"\r\n [attr.aria-label]=\"'validator.edit' | uiT: 'Edit validator'\"\r\n data-testid=\"validator-dialog\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div class=\"validator-dialog__header\">\r\n <div class=\"validator-dialog__title-wrap\">\r\n <span id=\"validator-dialog-title\" class=\"nvb-sr-only\">\r\n {{ 'validator.edit' | uiT: 'Edit validator' }}\r\n </span>\r\n <span id=\"validator-dialog-description\" class=\"nvb-sr-only\">\r\n {{ resolveValidatorSummary(validator) }}\r\n </span>\r\n <strong>{{ 'validator.edit' | uiT: 'Edit validator' }}</strong>\r\n <span>{{ resolveValidatorSummary(validator) }}</span>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__close nvb-icon-button nvb-icon-button--sx\"\r\n (click)=\"closeValidatorEditor()\"\r\n [attr.aria-label]=\"'common.close' | uiT: 'Close'\"\r\n data-testid=\"validator-dialog-close\"\r\n >\r\n <nvb-icon name=\"close\"></nvb-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"validator-dialog__body\">\r\n <div class=\"validator-dialog__grid\">\r\n <label class=\"validator-dialog__label\">\r\n {{ 'validator.type' | uiT: 'Type' }}\r\n <nvb-select\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.type\"\r\n (ngModelChange)=\"onValidatorTypeChange(validator)\"\r\n data-testid=\"validator-dialog-type\"\r\n >\r\n @for (option of validatorTypeOptionsFor(validator); track option.value) {\r\n <option [value]=\"option.value\">{{ option.label }}</option>\r\n }\r\n </nvb-select>\r\n </label>\r\n\r\n @if (hasValueField(validator)) {\r\n <label class=\"validator-dialog__label\">\r\n {{ resolveValueLabel(validator) || ('validator.value' | uiT: 'Value') }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.value\"\r\n [spellcheck]=\"false\"\r\n [placeholder]=\"resolveValuePlaceholder(validator)\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n data-testid=\"validator-dialog-value\"\r\n />\r\n </label>\r\n }\r\n\r\n @if (isCustomField(validator)) {\r\n <div class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.condition' | uiT: 'Condition (error when true)' }}\r\n <div class=\"validator-dialog__mode-tabs\" role=\"tablist\">\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'code'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'code'\"\r\n (click)=\"setConditionEditorMode('code')\"\r\n >\r\n {{ 'code.mode.code' | uiT: 'Code' }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"validator-dialog__mode-tab\"\r\n [class.validator-dialog__mode-tab--active]=\"activeEditorMode() === 'builder'\"\r\n [attr.aria-selected]=\"activeEditorMode() === 'builder'\"\r\n (click)=\"setConditionEditorMode('builder')\"\r\n >\r\n {{ 'logic.mode.builder' | uiT: 'Builder' }}\r\n </button>\r\n </div>\r\n\r\n @if (activeEditorMode() === 'builder') {\r\n <div class=\"validator-builder\" data-testid=\"validator-dialog-builder\">\r\n <datalist [id]=\"fieldSuggestionListId\">\r\n @for (field of fieldOptions(); track field.value) {\r\n <option [value]=\"field.value\">{{ field.label }}</option>\r\n }\r\n </datalist>\r\n\r\n <div class=\"validator-builder__rows\">\r\n @for (row of conditionRows; track trackByConditionRow($index, row); let rowIndex = $index) {\r\n <div class=\"validator-builder__line\">\r\n <div class=\"validator-builder__prefix\">\r\n @if (rowIndex === 0) {\r\n <span class=\"validator-builder__pill\">\r\n {{ 'code.builder.if' | uiT: 'If' }}\r\n </span>\r\n } @else {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--join\"\r\n [(ngModel)]=\"row.joinWith\"\r\n >\r\n <option value=\"&&\">{{ 'code.builder.and' | uiT: 'And' }}</option>\r\n <option value=\"||\">{{ 'code.builder.or' | uiT: 'Or' }}</option>\r\n </nvb-select>\r\n }\r\n </div>\r\n\r\n <input\r\n class=\"validator-builder__input validator-builder__input--field nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.left' | uiT: 'Left field'\"\r\n [(ngModel)]=\"row.leftField\"\r\n (ngModelChange)=\"onConditionFieldChanged(row)\"\r\n />\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--operator\"\r\n [(ngModel)]=\"row.operator\"\r\n >\r\n @for (operator of getRowOperators(row); track operator.value) {\r\n <option [value]=\"operator.value\">{{ operator.label }}</option>\r\n }\r\n </nvb-select>\r\n\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--source\"\r\n [(ngModel)]=\"row.valueSource\"\r\n (ngModelChange)=\"onConditionValueSourceChanged(row)\"\r\n >\r\n <option value=\"literal\">{{ 'code.builder.value' | uiT: 'Value' }}</option>\r\n <option value=\"field\">{{ 'code.builder.field' | uiT: 'Field' }}</option>\r\n </nvb-select>\r\n\r\n @if (row.valueSource === 'field') {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n type=\"text\"\r\n spellcheck=\"false\"\r\n autocomplete=\"off\"\r\n [attr.list]=\"fieldSuggestionListId\"\r\n [placeholder]=\"'code.builder.rightField' | uiT: 'Right field'\"\r\n [(ngModel)]=\"row.fieldValue\"\r\n />\r\n } @else if (getRowFieldType(row) === 'boolean') {\r\n <nvb-select\r\n class=\"validator-builder__input validator-builder__input--value\"\r\n [(ngModel)]=\"row.literalValue\"\r\n >\r\n <option value=\"true\">true</option>\r\n <option value=\"false\">false</option>\r\n </nvb-select>\r\n } @else {\r\n <input\r\n class=\"validator-builder__input validator-builder__input--value nvb-control__text-input\"\r\n [type]=\"getInputType(row)\"\r\n [(ngModel)]=\"row.literalValue\"\r\n />\r\n }\r\n\r\n @if (rowIndex > 0) {\r\n <builder-icon-button\r\n class=\"validator-builder__remove\"\r\n className=\"validator-builder__remove\"\r\n icon=\"delete\"\r\n tone=\"danger\"\r\n size=\"sm\"\r\n [ariaLabel]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n [title]=\"'code.builder.remove' | uiT: 'Remove condition'\"\r\n (clicked)=\"removeConditionRow(row.id)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"validator-builder__actions\">\r\n <builder-action-button\r\n tone=\"neutral\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.addCondition' | uiT: 'Add condition'\"\r\n (clicked)=\"addConditionRow()\"\r\n />\r\n <builder-action-button\r\n tone=\"subtle\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.clear' | uiT: 'Clear'\"\r\n (clicked)=\"clearConditions()\"\r\n />\r\n <builder-action-button\r\n tone=\"primary\"\r\n size=\"sm\"\r\n [label]=\"'code.builder.apply' | uiT: 'Apply to code'\"\r\n (clicked)=\"applyBuilderToValidatorCondition(validator)\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"validator-dialog__editor\">\r\n <native-code-editor\r\n language=\"expression\"\r\n [value]=\"validator.condition || ''\"\r\n [completions]=\"getValidatorConditionCompletions()\"\r\n (valueChange)=\"setValidatorCondition(validator, $event)\"\r\n (editorBlur)=\"setValidatorCondition(validator, $event)\"\r\n data-testid=\"validator-dialog-condition\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <label class=\"validator-dialog__label validator-dialog__label--full\">\r\n {{ 'validator.message' | uiT: 'Message' }}\r\n <input\r\n type=\"text\"\r\n class=\"nvb-control__attribute-input\"\r\n [(ngModel)]=\"validator.message\"\r\n [spellcheck]=\"false\"\r\n placeholder=\"Invalid value.\"\r\n (ngModelChange)=\"onValidatorChanged()\"\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n } @empty {\r\n <small class=\"validator-list__empty\">\r\n {{ 'validator.empty' | uiT: 'No validators yet.' }}\r\n </small>\r\n }\r\n</div>\r\n\r\n<button\r\n type=\"button\"\r\n class=\"nvb-control__add-row-button\"\r\n (click)=\"addValidator()\"\r\n [attr.aria-label]=\"'validator.add' | uiT: 'Add validator'\"\r\n data-testid=\"validator-add\"\r\n>\r\n <nvb-icon name=\"add_circle\"></nvb-icon>\r\n {{ 'validator.add' | uiT: 'Add validator' }}\r\n</button>\r\n", styles: [":host{display:block}.validator-list{display:flex;flex-direction:column;gap:var(--space-2)}.validator-list__empty{display:block;padding:4px 0;color:var(--color-neutral-500);font-size:12px}.validator-item{border:1px solid var(--nvb-card-border-color, var(--color-neutral-200));border-radius:var(--nvb-control-radius, var(--radius-md));padding:7px;background:var(--nvb-card-bg, var(--color-neutral-000));box-shadow:none}.validator-item__header{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:var(--nvb-control-height);color:var(--color-neutral-700);font-size:12px}.validator-item__title-wrap{display:inline-flex;flex:1;min-width:0;align-items:center;gap:6px}.validator-item__summary,.validator-item__message{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.validator-item__summary{min-width:0;color:var(--color-neutral-800);font-weight:650}.validator-item__meta{display:flex;align-items:center;gap:6px;min-width:0;margin:4px 0 0 calc(var(--nvb-control-height) + 12px);color:var(--color-neutral-600);font-size:11px;line-height:1.35}.validator-item__message{min-width:0}.validator-dialog__backdrop{position:fixed;inset:0;z-index:2147483450;display:flex;align-items:center;justify-content:center;padding:20px;background:#0f172a5c;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.validator-dialog{display:grid;grid-template-rows:auto minmax(0,1fr);width:min(760px,100%);max-height:min(88vh,860px);overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-dialog-radius);background:var(--color-neutral-000);box-shadow:var(--nvb-shadow-16);outline:0}.validator-dialog__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:20px 24px 12px;border-bottom:1px solid var(--color-neutral-200)}.validator-dialog__title-wrap{display:grid;gap:2px;min-width:0}.validator-dialog__title-wrap strong{color:var(--color-neutral-900);font-size:16px;line-height:22px;font-weight:600}.validator-dialog__title-wrap span{overflow:hidden;color:var(--color-neutral-500);font-size:13px;line-height:18px;text-overflow:ellipsis;white-space:nowrap}.validator-dialog__body{min-height:0;overflow:auto;padding:16px 24px 24px}.validator-dialog__grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.validator-dialog__label{display:flex;flex-direction:column;gap:4px;color:var(--color-neutral-600);font-size:11px}.validator-dialog__label--full{grid-column:1/-1}.validator-dialog__editor{height:260px;min-height:260px}.validator-dialog__mode-tabs{display:inline-flex;align-self:flex-start;overflow:hidden;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-050)}.validator-dialog__mode-tab{min-height:28px;border:0;border-right:1px solid var(--color-neutral-200);padding:0 10px;background:transparent;color:var(--color-neutral-600);cursor:pointer;font:inherit;font-size:12px}.validator-dialog__mode-tab:last-child{border-right:0}.validator-dialog__mode-tab--active{background:var(--color-neutral-000);color:var(--color-primary-700);font-weight:650}.validator-builder{display:grid;gap:12px;padding:12px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-025, var(--color-neutral-050))}.validator-builder__rows{display:grid;gap:8px}.validator-builder__line{display:grid;grid-template-columns:62px minmax(120px,1.15fr) minmax(92px,.55fr) minmax(92px,.55fr) minmax(120px,1fr) 34px;gap:8px;align-items:center}.validator-builder__prefix{display:flex;align-items:center}.validator-builder__pill{display:inline-flex;align-items:center;justify-content:center;min-height:26px;padding:0 10px;border:1px solid var(--color-neutral-200);border-radius:var(--nvb-control-radius, var(--radius-sm));background:var(--color-neutral-000);color:var(--color-neutral-700);font-size:12px;font-weight:650}.validator-builder__input{width:100%;min-width:0}.validator-builder__actions{display:flex;flex-wrap:wrap;gap:8px}.validator-builder__remove{justify-self:end}.nvb-control__add-row-button{margin-top:var(--space-3)}@media(max-width:860px){.validator-builder__line{grid-template-columns:1fr}.validator-builder__remove{justify-self:start}}\n"] }]
|
|
73984
|
+
}], ctorParameters: () => [], propDecorators: { property: [{ type: i0.Input, args: [{ isSignal: true, alias: "property", required: true }] }], elementType: [{ type: i0.Input, args: [{ isSignal: true, alias: "elementType", required: false }] }], onValueChange: [{ type: i0.Output, args: ["onValueChange"] }] } });
|
|
73807
73985
|
|
|
73808
73986
|
class TemplateNameAttribute {
|
|
73809
73987
|
property = input.required(...(ngDevMode ? [{ debugName: "property" }] : /* istanbul ignore next */ []));
|
|
@@ -77644,7 +77822,7 @@ class PropertiesSidebar {
|
|
|
77644
77822
|
this.propertyHighlightTimeoutId = null;
|
|
77645
77823
|
}
|
|
77646
77824
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PropertiesSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
77647
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: PropertiesSidebar, isStandalone: true, selector: "properties-sidebar", ngImport: i0, template: "<div class=\"properties-sidebar\" data-testid=\"properties-sidebar-root\">\r\n <div class=\"properties-sidebar__context\">\r\n <div class=\"properties-sidebar__context-title\">\r\n {{ getFocusedElementDisplayLabel() }}\r\n </div>\r\n @if (getFocusedElementMetaLabel(); as focusedElementMeta) {\r\n <div class=\"properties-sidebar__context-meta\">\r\n {{ focusedElementMeta }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"properties-sidebar__search\">\r\n <builder-search-input\r\n class=\"properties-sidebar__search-input-wrap\"\r\n [value]=\"propertySearchTerm()\"\r\n [placeholder]=\"'properties.search' | uiT: 'Search properties'\"\r\n [ariaLabel]=\"'properties.search' | uiT: 'Search properties'\"\r\n [clearAriaLabel]=\"'common.clear' | uiT: 'Clear search'\"\r\n testId=\"property-search-input\"\r\n (valueChanged)=\"propertySearchTerm.set($event); syncSelectedCategoryWithVisibleProperties()\"\r\n (cleared)=\"clearPropertySearch()\"\r\n />\r\n\r\n @let propertyMatches = getPropertySearchMatches();\r\n @if (propertySearchTerm().trim()) {\r\n <div class=\"properties-sidebar__search-results\" data-testid=\"property-search-results\">\r\n @if (!propertyMatches.length) {\r\n <div class=\"properties-sidebar__search-empty\">\r\n {{ 'properties.searchEmpty' | uiT: 'No matches found.' }}\r\n </div>\r\n } @else {\r\n @for (match of propertyMatches; track match.key) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__search-result\"\r\n (click)=\"navigateToProperty(match)\"\r\n [attr.data-testid]=\"'property-search-result-' + match.key\"\r\n >\r\n <span class=\"properties-sidebar__search-result-label\">{{ match.label }}</span>\r\n <span class=\"properties-sidebar__search-result-meta\">\r\n {{ 'propertyCategory.' + match.categoryName | uiT: match.categoryLabel }}\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n <ul class=\"properties-sidebar__groups\">\r\n @for (propertyCategory of propertyCategories(); track propertyCategory.name) {\r\n @if (categoryHasVisibleProperties(propertyCategory.name)) {\r\n <li class=\"properties-sidebar__group\">\r\n @let isActive = propertyCategory.name === selectedCategory();\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__group-button nvb-button nvb-button--subtle nvb-button--full nvb-button--left nvb-button--ms\"\r\n [ngClass]=\"{ 'properties-sidebar__group-button--active': isActive }\"\r\n (click)=\"selectCategory(propertyCategory.name)\"\r\n [attr.data-testid]=\"'property-category-' + propertyCategory.name\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined properties-sidebar__group-arrow\"\r\n [ngClass]=\"{ 'properties-sidebar__group-arrow--active': isActive }\"\r\n >chevron_right</span\r\n >\r\n <span>\r\n {{ 'propertyCategory.' + propertyCategory.name | uiT: propertyCategory.label }}\r\n </span>\r\n </button>\r\n @if (propertyCategory.name === selectedCategory()) {\r\n @let sections = getSectionsForCategory(propertyCategory.name);\r\n @let renderVersion = propertyRenderVersion();\r\n <div class=\"properties-sidebar__table\" [attr.data-render-version]=\"renderVersion\">\r\n @for (section of sections; track section.name) {\r\n @if (hasVisibleProperties(section.propertyKeys)) {\r\n <section class=\"properties-sidebar__section\">\r\n <div class=\"properties-sidebar__section-body\">\r\n @for (key of section.propertyKeys; track key) {\r\n @let property = properties()[key];\r\n @if (!property.hidden && selectedCategory() === property.category) {\r\n <div\r\n class=\"properties-sidebar__property\"\r\n [attr.data-testid]=\"'property-row-' + key\"\r\n [attr.data-property-type]=\"property.type\"\r\n [attr.data-property-category]=\"property.category\"\r\n [class.properties-sidebar__property--highlighted]=\"\r\n highlightedPropertyKey() === key\r\n \"\r\n [attr.tabindex]=\"highlightedPropertyKey() === key ? 0 : -1\"\r\n >\r\n @switch (property.type) {\r\n @case ('logicExpressions') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <logic-attribute\r\n [properties]=\"properties()\"\r\n [logicKeys]=\"logicExpressionKeys()\"\r\n (onValueChange)=\"setLogicPropertyValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('text') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [ownerElement]=\"element()\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setTextPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('number') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <number-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('size') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <size-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('padding') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <padding-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('color') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <color-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('checkbox') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--checkbox\"\r\n >\r\n <div class=\"properties-sidebar__checkbox-row\">\r\n <label class=\"properties-sidebar__checkbox-option\">\r\n <checkbox-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </label>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"\r\n setPropertyHintVisible(true, hint, $event, key)\r\n \"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('checklist') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <checklist-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('textarea') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-area-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('htmlCode') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <html-code-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('file') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <file-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('select') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <select-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <source-name-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('templateName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <template-name-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [fieldMap]=\"getTemplateFieldMap(key)\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n (fieldMapChange)=\"setTemplateFieldMapValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('columnList') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('options') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <option-attribute\r\n [property]=\"property\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('progressFlowItems') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <progress-flow-items-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('selectButtonOptions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <select-button-options-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableRequestParams') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-request-params-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceMapper') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <source-mapper-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('eventActions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <event-actions-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('variantRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <variant-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('validators') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <validators-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableColumns') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableStatusRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-status-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('custom') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <custom-property-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </section>\r\n }\r\n }\r\n </div>\r\n }\r\n </li>\r\n }\r\n }\r\n </ul>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.properties-sidebar{--ps-bg: color-mix(in oklab, var(--color-neutral-050) 82%, var(--color-neutral-000));--ps-surface: var(--color-neutral-000);--ps-surface-muted: var(--nvb-surface-muted-bg);--ps-border: var(--color-neutral-200);--ps-border-strong: var(--color-neutral-300);--ps-text: var(--color-neutral-900);--ps-muted: var(--color-neutral-600);--ps-faint: var(--color-neutral-500);--ps-active: var(--color-primary-600);--ps-active-bg: color-mix(in oklab, var(--color-primary-050) 64%, var(--color-neutral-000));--nvb-input-height: 32px;--nvb-control-height: 32px;--nvb-input-padding-x: 10px;--nvb-control-padding-x: 10px;--nvb-input-radius: 4px;--nvb-control-radius: 4px;--nvb-button-radius: 4px;--nvb-input-font-size: 12px;--nvb-control-font-size: 12px;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden;color:var(--ps-text);background:var(--ps-bg)}.properties-sidebar__context{flex-shrink:0;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;min-height:48px;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__context-title{min-width:0;color:var(--ps-text);font-size:14px;font-weight:650;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__context-meta{max-width:110px;padding:2px 6px;border:1px solid var(--ps-border);border-radius:999px;background:color-mix(in oklab,var(--color-primary-050) 26%,var(--ps-surface));color:var(--ps-muted);font-size:10px;font-weight:600;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__notice{flex-shrink:0;margin:8px 10px 0;padding:8px 10px;border:1px solid color-mix(in oklab,var(--color-warning-500) 32%,var(--ps-border));border-radius:var(--nvb-control-radius);background:color-mix(in oklab,var(--color-warning-500) 7%,var(--ps-surface));color:var(--color-warning-800);font-size:11px;line-height:1.4}.properties-sidebar__search{flex-shrink:0;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__search-input-wrap{position:relative}.properties-sidebar__search-input{border-color:var(--ps-border-strong)}.properties-sidebar__search-clear{color:var(--ps-muted)}.properties-sidebar__search-results{display:grid;gap:2px;max-height:260px;overflow:auto;margin-top:6px;padding:4px;border:1px solid var(--ps-border);border-radius:var(--nvb-menu-radius, var(--nvb-control-radius));background:var(--ps-surface);box-shadow:var(--nvb-shadow-8)}.properties-sidebar__search-empty{padding:10px;color:var(--ps-muted);font-size:12px;text-align:center}.properties-sidebar__search-result{width:100%;display:grid;gap:2px;padding:7px 8px;border:0;border-radius:4px;background:transparent;text-align:left;cursor:pointer;transition:background-color .12s ease}.properties-sidebar__search-result:hover{background:var(--ps-surface-muted)}.properties-sidebar__search-result:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.properties-sidebar__search-result-label{color:var(--ps-text);font-size:12px;font-weight:600}.properties-sidebar__search-result-meta{color:var(--ps-muted);font-size:11px;line-height:1.35}.properties-sidebar__groups{flex:1;min-height:0;overflow-y:auto;padding:0;scrollbar-width:thin;scrollbar-color:var(--ps-border-strong) transparent}.properties-sidebar__group{list-style:none;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__group:last-child{border-bottom:0}.properties-sidebar__group-button{width:100%;min-height:36px;padding:0 12px;border:0;border-radius:0;background:var(--ps-surface);color:var(--ps-muted);display:flex;align-items:center;justify-content:flex-start;gap:7px;box-shadow:none;text-align:left;-webkit-user-select:none;user-select:none;font-size:12px;font-weight:650;letter-spacing:.02em;text-transform:none;transition:background-color .12s ease,color .12s ease}.properties-sidebar__group-button:hover{background:var(--ps-surface-muted);color:var(--ps-text)}.properties-sidebar__group-button:focus-visible{outline:0;box-shadow:inset 0 0 0 2px color-mix(in oklab,var(--ps-active) 60%,transparent)}.properties-sidebar__group-button--active{background:var(--ps-active-bg);color:var(--ps-text)}.properties-sidebar__group-button--active:before{content:\"\";width:2px;align-self:stretch;min-height:18px;margin:8px 1px 8px 0;border-radius:999px;background:var(--ps-active);flex-shrink:0}.properties-sidebar__group-arrow{color:var(--ps-faint);font-size:15px;flex-shrink:0;transition:transform .12s ease}.properties-sidebar__group-arrow--active{transform:rotate(90deg);color:var(--ps-active)}.properties-sidebar__list-items{display:flex;flex-direction:column;gap:0;padding:0}.properties-sidebar__table{min-height:0;display:grid;grid-template-columns:minmax(0,1fr);background:var(--ps-surface)}.properties-sidebar__section{display:grid;grid-template-columns:minmax(0,1fr);gap:0;margin:0;border-top:0;background:var(--ps-surface)}.properties-sidebar__section-body{display:grid;grid-template-columns:minmax(0,1fr);gap:0;padding:4px 0}.properties-sidebar__property{display:grid;grid-template-columns:minmax(0,1fr);gap:4px;padding:8px 12px;border-left:2px solid transparent;background:var(--ps-surface);transition:border-color .12s ease,background-color .12s ease}.properties-sidebar__property--highlighted{border-left-color:var(--ps-active);background:var(--ps-active-bg);outline:none}.properties-sidebar__label{width:100%;min-width:0;position:relative;z-index:1;justify-self:stretch;display:inline-flex;align-items:center;gap:4px;padding:0;color:var(--ps-muted);font-size:11px;font-weight:600;line-height:1.35}.properties-sidebar__label span{min-width:0;overflow:hidden;text-overflow:ellipsis}.properties-sidebar__label:hover,.properties-sidebar__label:focus-within{z-index:80}.properties-sidebar__attribute{width:100%;min-width:0;grid-column:1;margin-top:0}.properties-sidebar__field--full,.properties-sidebar__field--value{grid-column:1;display:grid;grid-template-columns:1fr}.properties-sidebar__field--checkbox{grid-column:1;margin-top:0}.properties-sidebar__hint{width:14px;height:14px;border:1px solid var(--color-neutral-200);border-radius:3px;background:var(--color-neutral-100);color:var(--color-neutral-500);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:help;position:relative;transition:background-color .12s ease,color .12s ease}.properties-sidebar__hint:before{content:\"?\";font-size:10px;font-weight:600;line-height:1}.properties-sidebar__hint:hover{background:var(--color-neutral-150, var(--color-neutral-100));border-color:var(--color-neutral-300);color:var(--color-neutral-700)}.properties-sidebar__hint .nvb-icon-svg{display:none}.properties-sidebar__checkbox-row{min-height:var(--nvb-control-height);display:flex;align-items:center;gap:7px}.properties-sidebar__checkbox-option{min-width:0;display:inline-flex;align-items:center;gap:7px;color:var(--ps-text);font-size:12px;font-weight:500;line-height:1.35;cursor:pointer}.properties-sidebar__checkbox-option checkbox-attribute{flex-shrink:0;display:inline-flex;align-items:center}.properties-sidebar__checkbox-option span{min-width:0}\n"], dependencies: [{ kind: "component", type: TextAttribute, selector: "text-attribute", inputs: ["property", "propertyKey", "ownerFocusKey", "ownerElement"], outputs: ["onValueChange"] }, { kind: "component", type: CheckboxAttribute, selector: "checkbox-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ChecklistAttribute, selector: "checklist-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: TextAreaAttribute, selector: "text-area-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SelectAttribute, selector: "select-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "component", type: ColumnsAttribute, selector: "columns-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: NumberAttribute, selector: "number-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: OptionAttribute, selector: "option-attribute", inputs: ["property", "ownerFocusKey"], outputs: ["onValueChange"] }, { kind: "component", type: ProgressFlowItemsAttribute, selector: "progress-flow-items-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SourceMapperAttribute, selector: "source-mapper-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SizeAttribute, selector: "size-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: PaddingAttribute, selector: "padding-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ColorAttribute, selector: "color-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: EventActionsAttribute, selector: "event-actions-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableColumnsAttribute, selector: "table-columns-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SourceNameAttribute, selector: "source-name-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableStatusRulesAttribute, selector: "table-status-rules-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ValidatorsAttribute, selector: "validators-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TemplateNameAttribute, selector: "template-name-attribute", inputs: ["property", "propertyKey", "fieldMap"], outputs: ["onValueChange", "fieldMapChange"] }, { kind: "component", type: HtmlCodeAttribute, selector: "html-code-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "component", type: FileAttribute, selector: "file-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SelectButtonOptionsAttribute, selector: "select-button-options-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableRequestParamsAttribute, selector: "table-request-params-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: VariantRulesAttribute, selector: "variant-rules-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: LogicAttribute, selector: "logic-attribute", inputs: ["properties", "logicKeys"], outputs: ["onValueChange"] }, { kind: "component", type: NvbIcon, selector: "nvb-icon", inputs: ["name", "svg", "ariaLabel"] }, { kind: "component", type: TooltipComponent, selector: "app-tooltip", inputs: ["text", "metaText", "top", "left", "interactive"], outputs: ["mouseEntered", "mouseLeft"] }, { kind: "component", type: BuilderSearchInput, selector: "builder-search-input", inputs: ["value", "placeholder", "ariaLabel", "testId", "clearAriaLabel", "showSearchIcon"], outputs: ["valueChanged", "cleared"] }, { kind: "component", type: CustomPropertyAttribute, selector: "custom-property-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "pipe", type: UiTranslatePipe, name: "uiT" }] });
|
|
77825
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: PropertiesSidebar, isStandalone: true, selector: "properties-sidebar", ngImport: i0, template: "<div class=\"properties-sidebar\" data-testid=\"properties-sidebar-root\">\r\n <div class=\"properties-sidebar__context\">\r\n <div class=\"properties-sidebar__context-title\">\r\n {{ getFocusedElementDisplayLabel() }}\r\n </div>\r\n @if (getFocusedElementMetaLabel(); as focusedElementMeta) {\r\n <div class=\"properties-sidebar__context-meta\">\r\n {{ focusedElementMeta }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"properties-sidebar__search\">\r\n <builder-search-input\r\n class=\"properties-sidebar__search-input-wrap\"\r\n [value]=\"propertySearchTerm()\"\r\n [placeholder]=\"'properties.search' | uiT: 'Search properties'\"\r\n [ariaLabel]=\"'properties.search' | uiT: 'Search properties'\"\r\n [clearAriaLabel]=\"'common.clear' | uiT: 'Clear search'\"\r\n testId=\"property-search-input\"\r\n (valueChanged)=\"propertySearchTerm.set($event); syncSelectedCategoryWithVisibleProperties()\"\r\n (cleared)=\"clearPropertySearch()\"\r\n />\r\n\r\n @let propertyMatches = getPropertySearchMatches();\r\n @if (propertySearchTerm().trim()) {\r\n <div class=\"properties-sidebar__search-results\" data-testid=\"property-search-results\">\r\n @if (!propertyMatches.length) {\r\n <div class=\"properties-sidebar__search-empty\">\r\n {{ 'properties.searchEmpty' | uiT: 'No matches found.' }}\r\n </div>\r\n } @else {\r\n @for (match of propertyMatches; track match.key) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__search-result\"\r\n (click)=\"navigateToProperty(match)\"\r\n [attr.data-testid]=\"'property-search-result-' + match.key\"\r\n >\r\n <span class=\"properties-sidebar__search-result-label\">{{ match.label }}</span>\r\n <span class=\"properties-sidebar__search-result-meta\">\r\n {{ 'propertyCategory.' + match.categoryName | uiT: match.categoryLabel }}\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n <ul class=\"properties-sidebar__groups\">\r\n @for (propertyCategory of propertyCategories(); track propertyCategory.name) {\r\n @if (categoryHasVisibleProperties(propertyCategory.name)) {\r\n <li class=\"properties-sidebar__group\">\r\n @let isActive = propertyCategory.name === selectedCategory();\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__group-button nvb-button nvb-button--subtle nvb-button--full nvb-button--left nvb-button--ms\"\r\n [ngClass]=\"{ 'properties-sidebar__group-button--active': isActive }\"\r\n (click)=\"selectCategory(propertyCategory.name)\"\r\n [attr.data-testid]=\"'property-category-' + propertyCategory.name\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined properties-sidebar__group-arrow\"\r\n [ngClass]=\"{ 'properties-sidebar__group-arrow--active': isActive }\"\r\n >chevron_right</span\r\n >\r\n <span>\r\n {{ 'propertyCategory.' + propertyCategory.name | uiT: propertyCategory.label }}\r\n </span>\r\n </button>\r\n @if (propertyCategory.name === selectedCategory()) {\r\n @let sections = getSectionsForCategory(propertyCategory.name);\r\n @let renderVersion = propertyRenderVersion();\r\n <div class=\"properties-sidebar__table\" [attr.data-render-version]=\"renderVersion\">\r\n @for (section of sections; track section.name) {\r\n @if (hasVisibleProperties(section.propertyKeys)) {\r\n <section class=\"properties-sidebar__section\">\r\n <div class=\"properties-sidebar__section-body\">\r\n @for (key of section.propertyKeys; track key) {\r\n @let property = properties()[key];\r\n @if (!property.hidden && selectedCategory() === property.category) {\r\n <div\r\n class=\"properties-sidebar__property\"\r\n [attr.data-testid]=\"'property-row-' + key\"\r\n [attr.data-property-type]=\"property.type\"\r\n [attr.data-property-category]=\"property.category\"\r\n [class.properties-sidebar__property--highlighted]=\"\r\n highlightedPropertyKey() === key\r\n \"\r\n [attr.tabindex]=\"highlightedPropertyKey() === key ? 0 : -1\"\r\n >\r\n @switch (property.type) {\r\n @case ('logicExpressions') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <logic-attribute\r\n [properties]=\"properties()\"\r\n [logicKeys]=\"logicExpressionKeys()\"\r\n (onValueChange)=\"setLogicPropertyValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('text') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [ownerElement]=\"element()\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setTextPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('number') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <number-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('size') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <size-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('padding') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <padding-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('color') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <color-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('checkbox') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--checkbox\"\r\n >\r\n <div class=\"properties-sidebar__checkbox-row\">\r\n <label class=\"properties-sidebar__checkbox-option\">\r\n <checkbox-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </label>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"\r\n setPropertyHintVisible(true, hint, $event, key)\r\n \"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('checklist') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <checklist-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('textarea') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-area-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('htmlCode') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <html-code-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('file') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <file-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('select') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <select-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <source-name-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('templateName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <template-name-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [fieldMap]=\"getTemplateFieldMap(key)\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n (fieldMapChange)=\"setTemplateFieldMapValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('columnList') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('options') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <option-attribute\r\n [property]=\"property\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('progressFlowItems') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <progress-flow-items-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('selectButtonOptions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <select-button-options-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableRequestParams') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-request-params-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceMapper') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <source-mapper-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('eventActions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <event-actions-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('variantRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <variant-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('validators') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <validators-attribute\r\n [property]=\"property\"\r\n [elementType]=\"element()?.type ?? ''\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableColumns') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableStatusRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-status-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('custom') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <custom-property-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </section>\r\n }\r\n }\r\n </div>\r\n }\r\n </li>\r\n }\r\n }\r\n </ul>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.properties-sidebar{--ps-bg: color-mix(in oklab, var(--color-neutral-050) 82%, var(--color-neutral-000));--ps-surface: var(--color-neutral-000);--ps-surface-muted: var(--nvb-surface-muted-bg);--ps-border: var(--color-neutral-200);--ps-border-strong: var(--color-neutral-300);--ps-text: var(--color-neutral-900);--ps-muted: var(--color-neutral-600);--ps-faint: var(--color-neutral-500);--ps-active: var(--color-primary-600);--ps-active-bg: color-mix(in oklab, var(--color-primary-050) 64%, var(--color-neutral-000));--nvb-input-height: 32px;--nvb-control-height: 32px;--nvb-input-padding-x: 10px;--nvb-control-padding-x: 10px;--nvb-input-radius: 4px;--nvb-control-radius: 4px;--nvb-button-radius: 4px;--nvb-input-font-size: 12px;--nvb-control-font-size: 12px;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden;color:var(--ps-text);background:var(--ps-bg)}.properties-sidebar__context{flex-shrink:0;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;min-height:48px;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__context-title{min-width:0;color:var(--ps-text);font-size:14px;font-weight:650;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__context-meta{max-width:110px;padding:2px 6px;border:1px solid var(--ps-border);border-radius:999px;background:color-mix(in oklab,var(--color-primary-050) 26%,var(--ps-surface));color:var(--ps-muted);font-size:10px;font-weight:600;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__notice{flex-shrink:0;margin:8px 10px 0;padding:8px 10px;border:1px solid color-mix(in oklab,var(--color-warning-500) 32%,var(--ps-border));border-radius:var(--nvb-control-radius);background:color-mix(in oklab,var(--color-warning-500) 7%,var(--ps-surface));color:var(--color-warning-800);font-size:11px;line-height:1.4}.properties-sidebar__search{flex-shrink:0;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__search-input-wrap{position:relative}.properties-sidebar__search-input{border-color:var(--ps-border-strong)}.properties-sidebar__search-clear{color:var(--ps-muted)}.properties-sidebar__search-results{display:grid;gap:2px;max-height:260px;overflow:auto;margin-top:6px;padding:4px;border:1px solid var(--ps-border);border-radius:var(--nvb-menu-radius, var(--nvb-control-radius));background:var(--ps-surface);box-shadow:var(--nvb-shadow-8)}.properties-sidebar__search-empty{padding:10px;color:var(--ps-muted);font-size:12px;text-align:center}.properties-sidebar__search-result{width:100%;display:grid;gap:2px;padding:7px 8px;border:0;border-radius:4px;background:transparent;text-align:left;cursor:pointer;transition:background-color .12s ease}.properties-sidebar__search-result:hover{background:var(--ps-surface-muted)}.properties-sidebar__search-result:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.properties-sidebar__search-result-label{color:var(--ps-text);font-size:12px;font-weight:600}.properties-sidebar__search-result-meta{color:var(--ps-muted);font-size:11px;line-height:1.35}.properties-sidebar__groups{flex:1;min-height:0;overflow-y:auto;padding:0;scrollbar-width:thin;scrollbar-color:var(--ps-border-strong) transparent}.properties-sidebar__group{list-style:none;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__group:last-child{border-bottom:0}.properties-sidebar__group-button{width:100%;min-height:36px;padding:0 12px;border:0;border-radius:0;background:var(--ps-surface);color:var(--ps-muted);display:flex;align-items:center;justify-content:flex-start;gap:7px;box-shadow:none;text-align:left;-webkit-user-select:none;user-select:none;font-size:12px;font-weight:650;letter-spacing:.02em;text-transform:none;transition:background-color .12s ease,color .12s ease}.properties-sidebar__group-button:hover{background:var(--ps-surface-muted);color:var(--ps-text)}.properties-sidebar__group-button:focus-visible{outline:0;box-shadow:inset 0 0 0 2px color-mix(in oklab,var(--ps-active) 60%,transparent)}.properties-sidebar__group-button--active{background:var(--ps-active-bg);color:var(--ps-text)}.properties-sidebar__group-button--active:before{content:\"\";width:2px;align-self:stretch;min-height:18px;margin:8px 1px 8px 0;border-radius:999px;background:var(--ps-active);flex-shrink:0}.properties-sidebar__group-arrow{color:var(--ps-faint);font-size:15px;flex-shrink:0;transition:transform .12s ease}.properties-sidebar__group-arrow--active{transform:rotate(90deg);color:var(--ps-active)}.properties-sidebar__list-items{display:flex;flex-direction:column;gap:0;padding:0}.properties-sidebar__table{min-height:0;display:grid;grid-template-columns:minmax(0,1fr);background:var(--ps-surface)}.properties-sidebar__section{display:grid;grid-template-columns:minmax(0,1fr);gap:0;margin:0;border-top:0;background:var(--ps-surface)}.properties-sidebar__section-body{display:grid;grid-template-columns:minmax(0,1fr);gap:0;padding:4px 0}.properties-sidebar__property{display:grid;grid-template-columns:minmax(0,1fr);gap:4px;padding:8px 12px;border-left:2px solid transparent;background:var(--ps-surface);transition:border-color .12s ease,background-color .12s ease}.properties-sidebar__property--highlighted{border-left-color:var(--ps-active);background:var(--ps-active-bg);outline:none}.properties-sidebar__label{width:100%;min-width:0;position:relative;z-index:1;justify-self:stretch;display:inline-flex;align-items:center;gap:4px;padding:0;color:var(--ps-muted);font-size:11px;font-weight:600;line-height:1.35}.properties-sidebar__label span{min-width:0;overflow:hidden;text-overflow:ellipsis}.properties-sidebar__label:hover,.properties-sidebar__label:focus-within{z-index:80}.properties-sidebar__attribute{width:100%;min-width:0;grid-column:1;margin-top:0}.properties-sidebar__field--full,.properties-sidebar__field--value{grid-column:1;display:grid;grid-template-columns:1fr}.properties-sidebar__field--checkbox{grid-column:1;margin-top:0}.properties-sidebar__hint{width:14px;height:14px;border:1px solid var(--color-neutral-200);border-radius:3px;background:var(--color-neutral-100);color:var(--color-neutral-500);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:help;position:relative;transition:background-color .12s ease,color .12s ease}.properties-sidebar__hint:before{content:\"?\";font-size:10px;font-weight:600;line-height:1}.properties-sidebar__hint:hover{background:var(--color-neutral-150, var(--color-neutral-100));border-color:var(--color-neutral-300);color:var(--color-neutral-700)}.properties-sidebar__hint .nvb-icon-svg{display:none}.properties-sidebar__checkbox-row{min-height:var(--nvb-control-height);display:flex;align-items:center;gap:7px}.properties-sidebar__checkbox-option{min-width:0;display:inline-flex;align-items:center;gap:7px;color:var(--ps-text);font-size:12px;font-weight:500;line-height:1.35;cursor:pointer}.properties-sidebar__checkbox-option checkbox-attribute{flex-shrink:0;display:inline-flex;align-items:center}.properties-sidebar__checkbox-option span{min-width:0}\n"], dependencies: [{ kind: "component", type: TextAttribute, selector: "text-attribute", inputs: ["property", "propertyKey", "ownerFocusKey", "ownerElement"], outputs: ["onValueChange"] }, { kind: "component", type: CheckboxAttribute, selector: "checkbox-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ChecklistAttribute, selector: "checklist-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: TextAreaAttribute, selector: "text-area-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SelectAttribute, selector: "select-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "component", type: ColumnsAttribute, selector: "columns-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: NumberAttribute, selector: "number-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: OptionAttribute, selector: "option-attribute", inputs: ["property", "ownerFocusKey"], outputs: ["onValueChange"] }, { kind: "component", type: ProgressFlowItemsAttribute, selector: "progress-flow-items-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SourceMapperAttribute, selector: "source-mapper-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SizeAttribute, selector: "size-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: PaddingAttribute, selector: "padding-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ColorAttribute, selector: "color-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: EventActionsAttribute, selector: "event-actions-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableColumnsAttribute, selector: "table-columns-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SourceNameAttribute, selector: "source-name-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableStatusRulesAttribute, selector: "table-status-rules-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: ValidatorsAttribute, selector: "validators-attribute", inputs: ["property", "elementType"], outputs: ["onValueChange"] }, { kind: "component", type: TemplateNameAttribute, selector: "template-name-attribute", inputs: ["property", "propertyKey", "fieldMap"], outputs: ["onValueChange", "fieldMapChange"] }, { kind: "component", type: HtmlCodeAttribute, selector: "html-code-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "component", type: FileAttribute, selector: "file-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: SelectButtonOptionsAttribute, selector: "select-button-options-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: TableRequestParamsAttribute, selector: "table-request-params-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: VariantRulesAttribute, selector: "variant-rules-attribute", inputs: ["property"], outputs: ["onValueChange"] }, { kind: "component", type: LogicAttribute, selector: "logic-attribute", inputs: ["properties", "logicKeys"], outputs: ["onValueChange"] }, { kind: "component", type: NvbIcon, selector: "nvb-icon", inputs: ["name", "svg", "ariaLabel"] }, { kind: "component", type: TooltipComponent, selector: "app-tooltip", inputs: ["text", "metaText", "top", "left", "interactive"], outputs: ["mouseEntered", "mouseLeft"] }, { kind: "component", type: BuilderSearchInput, selector: "builder-search-input", inputs: ["value", "placeholder", "ariaLabel", "testId", "clearAriaLabel", "showSearchIcon"], outputs: ["valueChanged", "cleared"] }, { kind: "component", type: CustomPropertyAttribute, selector: "custom-property-attribute", inputs: ["property", "propertyKey"], outputs: ["onValueChange"] }, { kind: "pipe", type: UiTranslatePipe, name: "uiT" }] });
|
|
77648
77826
|
}
|
|
77649
77827
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: PropertiesSidebar, decorators: [{
|
|
77650
77828
|
type: Component,
|
|
@@ -77681,7 +77859,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
|
|
|
77681
77859
|
TooltipComponent,
|
|
77682
77860
|
BuilderSearchInput,
|
|
77683
77861
|
CustomPropertyAttribute,
|
|
77684
|
-
], template: "<div class=\"properties-sidebar\" data-testid=\"properties-sidebar-root\">\r\n <div class=\"properties-sidebar__context\">\r\n <div class=\"properties-sidebar__context-title\">\r\n {{ getFocusedElementDisplayLabel() }}\r\n </div>\r\n @if (getFocusedElementMetaLabel(); as focusedElementMeta) {\r\n <div class=\"properties-sidebar__context-meta\">\r\n {{ focusedElementMeta }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"properties-sidebar__search\">\r\n <builder-search-input\r\n class=\"properties-sidebar__search-input-wrap\"\r\n [value]=\"propertySearchTerm()\"\r\n [placeholder]=\"'properties.search' | uiT: 'Search properties'\"\r\n [ariaLabel]=\"'properties.search' | uiT: 'Search properties'\"\r\n [clearAriaLabel]=\"'common.clear' | uiT: 'Clear search'\"\r\n testId=\"property-search-input\"\r\n (valueChanged)=\"propertySearchTerm.set($event); syncSelectedCategoryWithVisibleProperties()\"\r\n (cleared)=\"clearPropertySearch()\"\r\n />\r\n\r\n @let propertyMatches = getPropertySearchMatches();\r\n @if (propertySearchTerm().trim()) {\r\n <div class=\"properties-sidebar__search-results\" data-testid=\"property-search-results\">\r\n @if (!propertyMatches.length) {\r\n <div class=\"properties-sidebar__search-empty\">\r\n {{ 'properties.searchEmpty' | uiT: 'No matches found.' }}\r\n </div>\r\n } @else {\r\n @for (match of propertyMatches; track match.key) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__search-result\"\r\n (click)=\"navigateToProperty(match)\"\r\n [attr.data-testid]=\"'property-search-result-' + match.key\"\r\n >\r\n <span class=\"properties-sidebar__search-result-label\">{{ match.label }}</span>\r\n <span class=\"properties-sidebar__search-result-meta\">\r\n {{ 'propertyCategory.' + match.categoryName | uiT: match.categoryLabel }}\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n <ul class=\"properties-sidebar__groups\">\r\n @for (propertyCategory of propertyCategories(); track propertyCategory.name) {\r\n @if (categoryHasVisibleProperties(propertyCategory.name)) {\r\n <li class=\"properties-sidebar__group\">\r\n @let isActive = propertyCategory.name === selectedCategory();\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__group-button nvb-button nvb-button--subtle nvb-button--full nvb-button--left nvb-button--ms\"\r\n [ngClass]=\"{ 'properties-sidebar__group-button--active': isActive }\"\r\n (click)=\"selectCategory(propertyCategory.name)\"\r\n [attr.data-testid]=\"'property-category-' + propertyCategory.name\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined properties-sidebar__group-arrow\"\r\n [ngClass]=\"{ 'properties-sidebar__group-arrow--active': isActive }\"\r\n >chevron_right</span\r\n >\r\n <span>\r\n {{ 'propertyCategory.' + propertyCategory.name | uiT: propertyCategory.label }}\r\n </span>\r\n </button>\r\n @if (propertyCategory.name === selectedCategory()) {\r\n @let sections = getSectionsForCategory(propertyCategory.name);\r\n @let renderVersion = propertyRenderVersion();\r\n <div class=\"properties-sidebar__table\" [attr.data-render-version]=\"renderVersion\">\r\n @for (section of sections; track section.name) {\r\n @if (hasVisibleProperties(section.propertyKeys)) {\r\n <section class=\"properties-sidebar__section\">\r\n <div class=\"properties-sidebar__section-body\">\r\n @for (key of section.propertyKeys; track key) {\r\n @let property = properties()[key];\r\n @if (!property.hidden && selectedCategory() === property.category) {\r\n <div\r\n class=\"properties-sidebar__property\"\r\n [attr.data-testid]=\"'property-row-' + key\"\r\n [attr.data-property-type]=\"property.type\"\r\n [attr.data-property-category]=\"property.category\"\r\n [class.properties-sidebar__property--highlighted]=\"\r\n highlightedPropertyKey() === key\r\n \"\r\n [attr.tabindex]=\"highlightedPropertyKey() === key ? 0 : -1\"\r\n >\r\n @switch (property.type) {\r\n @case ('logicExpressions') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <logic-attribute\r\n [properties]=\"properties()\"\r\n [logicKeys]=\"logicExpressionKeys()\"\r\n (onValueChange)=\"setLogicPropertyValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('text') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [ownerElement]=\"element()\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setTextPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('number') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <number-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('size') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <size-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('padding') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <padding-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('color') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <color-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('checkbox') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--checkbox\"\r\n >\r\n <div class=\"properties-sidebar__checkbox-row\">\r\n <label class=\"properties-sidebar__checkbox-option\">\r\n <checkbox-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </label>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"\r\n setPropertyHintVisible(true, hint, $event, key)\r\n \"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('checklist') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <checklist-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('textarea') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-area-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('htmlCode') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <html-code-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('file') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <file-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('select') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <select-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <source-name-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('templateName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <template-name-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [fieldMap]=\"getTemplateFieldMap(key)\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n (fieldMapChange)=\"setTemplateFieldMapValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('columnList') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('options') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <option-attribute\r\n [property]=\"property\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('progressFlowItems') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <progress-flow-items-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('selectButtonOptions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <select-button-options-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableRequestParams') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-request-params-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceMapper') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <source-mapper-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('eventActions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <event-actions-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('variantRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <variant-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('validators') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <validators-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableColumns') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableStatusRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-status-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('custom') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <custom-property-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </section>\r\n }\r\n }\r\n </div>\r\n }\r\n </li>\r\n }\r\n }\r\n </ul>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.properties-sidebar{--ps-bg: color-mix(in oklab, var(--color-neutral-050) 82%, var(--color-neutral-000));--ps-surface: var(--color-neutral-000);--ps-surface-muted: var(--nvb-surface-muted-bg);--ps-border: var(--color-neutral-200);--ps-border-strong: var(--color-neutral-300);--ps-text: var(--color-neutral-900);--ps-muted: var(--color-neutral-600);--ps-faint: var(--color-neutral-500);--ps-active: var(--color-primary-600);--ps-active-bg: color-mix(in oklab, var(--color-primary-050) 64%, var(--color-neutral-000));--nvb-input-height: 32px;--nvb-control-height: 32px;--nvb-input-padding-x: 10px;--nvb-control-padding-x: 10px;--nvb-input-radius: 4px;--nvb-control-radius: 4px;--nvb-button-radius: 4px;--nvb-input-font-size: 12px;--nvb-control-font-size: 12px;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden;color:var(--ps-text);background:var(--ps-bg)}.properties-sidebar__context{flex-shrink:0;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;min-height:48px;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__context-title{min-width:0;color:var(--ps-text);font-size:14px;font-weight:650;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__context-meta{max-width:110px;padding:2px 6px;border:1px solid var(--ps-border);border-radius:999px;background:color-mix(in oklab,var(--color-primary-050) 26%,var(--ps-surface));color:var(--ps-muted);font-size:10px;font-weight:600;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__notice{flex-shrink:0;margin:8px 10px 0;padding:8px 10px;border:1px solid color-mix(in oklab,var(--color-warning-500) 32%,var(--ps-border));border-radius:var(--nvb-control-radius);background:color-mix(in oklab,var(--color-warning-500) 7%,var(--ps-surface));color:var(--color-warning-800);font-size:11px;line-height:1.4}.properties-sidebar__search{flex-shrink:0;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__search-input-wrap{position:relative}.properties-sidebar__search-input{border-color:var(--ps-border-strong)}.properties-sidebar__search-clear{color:var(--ps-muted)}.properties-sidebar__search-results{display:grid;gap:2px;max-height:260px;overflow:auto;margin-top:6px;padding:4px;border:1px solid var(--ps-border);border-radius:var(--nvb-menu-radius, var(--nvb-control-radius));background:var(--ps-surface);box-shadow:var(--nvb-shadow-8)}.properties-sidebar__search-empty{padding:10px;color:var(--ps-muted);font-size:12px;text-align:center}.properties-sidebar__search-result{width:100%;display:grid;gap:2px;padding:7px 8px;border:0;border-radius:4px;background:transparent;text-align:left;cursor:pointer;transition:background-color .12s ease}.properties-sidebar__search-result:hover{background:var(--ps-surface-muted)}.properties-sidebar__search-result:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.properties-sidebar__search-result-label{color:var(--ps-text);font-size:12px;font-weight:600}.properties-sidebar__search-result-meta{color:var(--ps-muted);font-size:11px;line-height:1.35}.properties-sidebar__groups{flex:1;min-height:0;overflow-y:auto;padding:0;scrollbar-width:thin;scrollbar-color:var(--ps-border-strong) transparent}.properties-sidebar__group{list-style:none;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__group:last-child{border-bottom:0}.properties-sidebar__group-button{width:100%;min-height:36px;padding:0 12px;border:0;border-radius:0;background:var(--ps-surface);color:var(--ps-muted);display:flex;align-items:center;justify-content:flex-start;gap:7px;box-shadow:none;text-align:left;-webkit-user-select:none;user-select:none;font-size:12px;font-weight:650;letter-spacing:.02em;text-transform:none;transition:background-color .12s ease,color .12s ease}.properties-sidebar__group-button:hover{background:var(--ps-surface-muted);color:var(--ps-text)}.properties-sidebar__group-button:focus-visible{outline:0;box-shadow:inset 0 0 0 2px color-mix(in oklab,var(--ps-active) 60%,transparent)}.properties-sidebar__group-button--active{background:var(--ps-active-bg);color:var(--ps-text)}.properties-sidebar__group-button--active:before{content:\"\";width:2px;align-self:stretch;min-height:18px;margin:8px 1px 8px 0;border-radius:999px;background:var(--ps-active);flex-shrink:0}.properties-sidebar__group-arrow{color:var(--ps-faint);font-size:15px;flex-shrink:0;transition:transform .12s ease}.properties-sidebar__group-arrow--active{transform:rotate(90deg);color:var(--ps-active)}.properties-sidebar__list-items{display:flex;flex-direction:column;gap:0;padding:0}.properties-sidebar__table{min-height:0;display:grid;grid-template-columns:minmax(0,1fr);background:var(--ps-surface)}.properties-sidebar__section{display:grid;grid-template-columns:minmax(0,1fr);gap:0;margin:0;border-top:0;background:var(--ps-surface)}.properties-sidebar__section-body{display:grid;grid-template-columns:minmax(0,1fr);gap:0;padding:4px 0}.properties-sidebar__property{display:grid;grid-template-columns:minmax(0,1fr);gap:4px;padding:8px 12px;border-left:2px solid transparent;background:var(--ps-surface);transition:border-color .12s ease,background-color .12s ease}.properties-sidebar__property--highlighted{border-left-color:var(--ps-active);background:var(--ps-active-bg);outline:none}.properties-sidebar__label{width:100%;min-width:0;position:relative;z-index:1;justify-self:stretch;display:inline-flex;align-items:center;gap:4px;padding:0;color:var(--ps-muted);font-size:11px;font-weight:600;line-height:1.35}.properties-sidebar__label span{min-width:0;overflow:hidden;text-overflow:ellipsis}.properties-sidebar__label:hover,.properties-sidebar__label:focus-within{z-index:80}.properties-sidebar__attribute{width:100%;min-width:0;grid-column:1;margin-top:0}.properties-sidebar__field--full,.properties-sidebar__field--value{grid-column:1;display:grid;grid-template-columns:1fr}.properties-sidebar__field--checkbox{grid-column:1;margin-top:0}.properties-sidebar__hint{width:14px;height:14px;border:1px solid var(--color-neutral-200);border-radius:3px;background:var(--color-neutral-100);color:var(--color-neutral-500);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:help;position:relative;transition:background-color .12s ease,color .12s ease}.properties-sidebar__hint:before{content:\"?\";font-size:10px;font-weight:600;line-height:1}.properties-sidebar__hint:hover{background:var(--color-neutral-150, var(--color-neutral-100));border-color:var(--color-neutral-300);color:var(--color-neutral-700)}.properties-sidebar__hint .nvb-icon-svg{display:none}.properties-sidebar__checkbox-row{min-height:var(--nvb-control-height);display:flex;align-items:center;gap:7px}.properties-sidebar__checkbox-option{min-width:0;display:inline-flex;align-items:center;gap:7px;color:var(--ps-text);font-size:12px;font-weight:500;line-height:1.35;cursor:pointer}.properties-sidebar__checkbox-option checkbox-attribute{flex-shrink:0;display:inline-flex;align-items:center}.properties-sidebar__checkbox-option span{min-width:0}\n"] }]
|
|
77862
|
+
], template: "<div class=\"properties-sidebar\" data-testid=\"properties-sidebar-root\">\r\n <div class=\"properties-sidebar__context\">\r\n <div class=\"properties-sidebar__context-title\">\r\n {{ getFocusedElementDisplayLabel() }}\r\n </div>\r\n @if (getFocusedElementMetaLabel(); as focusedElementMeta) {\r\n <div class=\"properties-sidebar__context-meta\">\r\n {{ focusedElementMeta }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"properties-sidebar__search\">\r\n <builder-search-input\r\n class=\"properties-sidebar__search-input-wrap\"\r\n [value]=\"propertySearchTerm()\"\r\n [placeholder]=\"'properties.search' | uiT: 'Search properties'\"\r\n [ariaLabel]=\"'properties.search' | uiT: 'Search properties'\"\r\n [clearAriaLabel]=\"'common.clear' | uiT: 'Clear search'\"\r\n testId=\"property-search-input\"\r\n (valueChanged)=\"propertySearchTerm.set($event); syncSelectedCategoryWithVisibleProperties()\"\r\n (cleared)=\"clearPropertySearch()\"\r\n />\r\n\r\n @let propertyMatches = getPropertySearchMatches();\r\n @if (propertySearchTerm().trim()) {\r\n <div class=\"properties-sidebar__search-results\" data-testid=\"property-search-results\">\r\n @if (!propertyMatches.length) {\r\n <div class=\"properties-sidebar__search-empty\">\r\n {{ 'properties.searchEmpty' | uiT: 'No matches found.' }}\r\n </div>\r\n } @else {\r\n @for (match of propertyMatches; track match.key) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__search-result\"\r\n (click)=\"navigateToProperty(match)\"\r\n [attr.data-testid]=\"'property-search-result-' + match.key\"\r\n >\r\n <span class=\"properties-sidebar__search-result-label\">{{ match.label }}</span>\r\n <span class=\"properties-sidebar__search-result-meta\">\r\n {{ 'propertyCategory.' + match.categoryName | uiT: match.categoryLabel }}\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n <ul class=\"properties-sidebar__groups\">\r\n @for (propertyCategory of propertyCategories(); track propertyCategory.name) {\r\n @if (categoryHasVisibleProperties(propertyCategory.name)) {\r\n <li class=\"properties-sidebar__group\">\r\n @let isActive = propertyCategory.name === selectedCategory();\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__group-button nvb-button nvb-button--subtle nvb-button--full nvb-button--left nvb-button--ms\"\r\n [ngClass]=\"{ 'properties-sidebar__group-button--active': isActive }\"\r\n (click)=\"selectCategory(propertyCategory.name)\"\r\n [attr.data-testid]=\"'property-category-' + propertyCategory.name\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined properties-sidebar__group-arrow\"\r\n [ngClass]=\"{ 'properties-sidebar__group-arrow--active': isActive }\"\r\n >chevron_right</span\r\n >\r\n <span>\r\n {{ 'propertyCategory.' + propertyCategory.name | uiT: propertyCategory.label }}\r\n </span>\r\n </button>\r\n @if (propertyCategory.name === selectedCategory()) {\r\n @let sections = getSectionsForCategory(propertyCategory.name);\r\n @let renderVersion = propertyRenderVersion();\r\n <div class=\"properties-sidebar__table\" [attr.data-render-version]=\"renderVersion\">\r\n @for (section of sections; track section.name) {\r\n @if (hasVisibleProperties(section.propertyKeys)) {\r\n <section class=\"properties-sidebar__section\">\r\n <div class=\"properties-sidebar__section-body\">\r\n @for (key of section.propertyKeys; track key) {\r\n @let property = properties()[key];\r\n @if (!property.hidden && selectedCategory() === property.category) {\r\n <div\r\n class=\"properties-sidebar__property\"\r\n [attr.data-testid]=\"'property-row-' + key\"\r\n [attr.data-property-type]=\"property.type\"\r\n [attr.data-property-category]=\"property.category\"\r\n [class.properties-sidebar__property--highlighted]=\"\r\n highlightedPropertyKey() === key\r\n \"\r\n [attr.tabindex]=\"highlightedPropertyKey() === key ? 0 : -1\"\r\n >\r\n @switch (property.type) {\r\n @case ('logicExpressions') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <logic-attribute\r\n [properties]=\"properties()\"\r\n [logicKeys]=\"logicExpressionKeys()\"\r\n (onValueChange)=\"setLogicPropertyValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('text') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [ownerElement]=\"element()\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setTextPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('number') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <number-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('size') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <size-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('padding') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <padding-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('color') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <color-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('checkbox') {\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--checkbox\"\r\n >\r\n <div class=\"properties-sidebar__checkbox-row\">\r\n <label class=\"properties-sidebar__checkbox-option\">\r\n <checkbox-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </label>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"\r\n setPropertyHintVisible(true, hint, $event, key)\r\n \"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('checklist') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <checklist-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('textarea') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <text-area-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('htmlCode') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <html-code-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('file') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <file-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('select') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <select-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <source-name-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('templateName') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <template-name-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n [fieldMap]=\"getTemplateFieldMap(key)\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n (fieldMapChange)=\"setTemplateFieldMapValue($event)\"\r\n />\r\n </div>\r\n }\r\n @case ('columnList') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('options') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <option-attribute\r\n [property]=\"property\"\r\n [ownerFocusKey]=\"resolveFocusedElementOwnerFocusKey()\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('progressFlowItems') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <progress-flow-items-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('selectButtonOptions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <select-button-options-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableRequestParams') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-request-params-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('sourceMapper') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <source-mapper-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('eventActions') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <event-actions-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('variantRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <variant-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('validators') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <validators-attribute\r\n [property]=\"property\"\r\n [elementType]=\"element()?.type ?? ''\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableColumns') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-columns-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('tableStatusRules') {\r\n <div\r\n class=\"properties-sidebar__label properties-sidebar__label--full\"\r\n >\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n\r\n @if (getPropertyHint(key, property.type); as hint) {\r\n <button\r\n type=\"button\"\r\n class=\"properties-sidebar__hint\"\r\n [attr.aria-label]=\"'Hint: ' + property.label\"\r\n [attr.aria-expanded]=\"propertyHintVisible()\"\r\n (mouseenter)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (mouseleave)=\"setPropertyHintVisible(false)\"\r\n (focus)=\"setPropertyHintVisible(true, hint, $event, key)\"\r\n (blur)=\"setPropertyHintVisible(false)\"\r\n >\r\n <nvb-icon name=\"help\" ariaLabel=\"Hint\"></nvb-icon>\r\n @if (propertyHintVisible() && propertyHintText() === hint) {\r\n <app-tooltip\r\n [text]=\"propertyHintText()\"\r\n [metaText]=\"propertyHintMetaText()\"\r\n [top]=\"propertyHintTop()\"\r\n [left]=\"propertyHintLeft()\"\r\n [interactive]=\"true\"\r\n (mouseEntered)=\"keepPropertyHintVisible()\"\r\n (mouseLeft)=\"hidePropertyHint()\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--full\"\r\n >\r\n <table-status-rules-attribute\r\n [property]=\"property\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n @case ('custom') {\r\n <div class=\"properties-sidebar__label\">\r\n <span>{{ 'property.' + key | uiT: property.label }}</span>\r\n </div>\r\n <div\r\n class=\"properties-sidebar__attribute properties-sidebar__field--value\"\r\n >\r\n <custom-property-attribute\r\n [property]=\"property\"\r\n [propertyKey]=\"key\"\r\n (onValueChange)=\"setPropertyValue($event, key)\"\r\n />\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </section>\r\n }\r\n }\r\n </div>\r\n }\r\n </li>\r\n }\r\n }\r\n </ul>\r\n</div>\r\n", styles: [":host{display:block;height:100%;min-height:0}.properties-sidebar{--ps-bg: color-mix(in oklab, var(--color-neutral-050) 82%, var(--color-neutral-000));--ps-surface: var(--color-neutral-000);--ps-surface-muted: var(--nvb-surface-muted-bg);--ps-border: var(--color-neutral-200);--ps-border-strong: var(--color-neutral-300);--ps-text: var(--color-neutral-900);--ps-muted: var(--color-neutral-600);--ps-faint: var(--color-neutral-500);--ps-active: var(--color-primary-600);--ps-active-bg: color-mix(in oklab, var(--color-primary-050) 64%, var(--color-neutral-000));--nvb-input-height: 32px;--nvb-control-height: 32px;--nvb-input-padding-x: 10px;--nvb-control-padding-x: 10px;--nvb-input-radius: 4px;--nvb-control-radius: 4px;--nvb-button-radius: 4px;--nvb-input-font-size: 12px;--nvb-control-font-size: 12px;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden;color:var(--ps-text);background:var(--ps-bg)}.properties-sidebar__context{flex-shrink:0;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;min-height:48px;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__context-title{min-width:0;color:var(--ps-text);font-size:14px;font-weight:650;line-height:1.25;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__context-meta{max-width:110px;padding:2px 6px;border:1px solid var(--ps-border);border-radius:999px;background:color-mix(in oklab,var(--color-primary-050) 26%,var(--ps-surface));color:var(--ps-muted);font-size:10px;font-weight:600;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.properties-sidebar__notice{flex-shrink:0;margin:8px 10px 0;padding:8px 10px;border:1px solid color-mix(in oklab,var(--color-warning-500) 32%,var(--ps-border));border-radius:var(--nvb-control-radius);background:color-mix(in oklab,var(--color-warning-500) 7%,var(--ps-surface));color:var(--color-warning-800);font-size:11px;line-height:1.4}.properties-sidebar__search{flex-shrink:0;padding:10px 12px;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__search-input-wrap{position:relative}.properties-sidebar__search-input{border-color:var(--ps-border-strong)}.properties-sidebar__search-clear{color:var(--ps-muted)}.properties-sidebar__search-results{display:grid;gap:2px;max-height:260px;overflow:auto;margin-top:6px;padding:4px;border:1px solid var(--ps-border);border-radius:var(--nvb-menu-radius, var(--nvb-control-radius));background:var(--ps-surface);box-shadow:var(--nvb-shadow-8)}.properties-sidebar__search-empty{padding:10px;color:var(--ps-muted);font-size:12px;text-align:center}.properties-sidebar__search-result{width:100%;display:grid;gap:2px;padding:7px 8px;border:0;border-radius:4px;background:transparent;text-align:left;cursor:pointer;transition:background-color .12s ease}.properties-sidebar__search-result:hover{background:var(--ps-surface-muted)}.properties-sidebar__search-result:focus-visible{outline:0;box-shadow:var(--nvb-focus-ring)}.properties-sidebar__search-result-label{color:var(--ps-text);font-size:12px;font-weight:600}.properties-sidebar__search-result-meta{color:var(--ps-muted);font-size:11px;line-height:1.35}.properties-sidebar__groups{flex:1;min-height:0;overflow-y:auto;padding:0;scrollbar-width:thin;scrollbar-color:var(--ps-border-strong) transparent}.properties-sidebar__group{list-style:none;border-bottom:1px solid var(--ps-border);background:var(--ps-surface)}.properties-sidebar__group:last-child{border-bottom:0}.properties-sidebar__group-button{width:100%;min-height:36px;padding:0 12px;border:0;border-radius:0;background:var(--ps-surface);color:var(--ps-muted);display:flex;align-items:center;justify-content:flex-start;gap:7px;box-shadow:none;text-align:left;-webkit-user-select:none;user-select:none;font-size:12px;font-weight:650;letter-spacing:.02em;text-transform:none;transition:background-color .12s ease,color .12s ease}.properties-sidebar__group-button:hover{background:var(--ps-surface-muted);color:var(--ps-text)}.properties-sidebar__group-button:focus-visible{outline:0;box-shadow:inset 0 0 0 2px color-mix(in oklab,var(--ps-active) 60%,transparent)}.properties-sidebar__group-button--active{background:var(--ps-active-bg);color:var(--ps-text)}.properties-sidebar__group-button--active:before{content:\"\";width:2px;align-self:stretch;min-height:18px;margin:8px 1px 8px 0;border-radius:999px;background:var(--ps-active);flex-shrink:0}.properties-sidebar__group-arrow{color:var(--ps-faint);font-size:15px;flex-shrink:0;transition:transform .12s ease}.properties-sidebar__group-arrow--active{transform:rotate(90deg);color:var(--ps-active)}.properties-sidebar__list-items{display:flex;flex-direction:column;gap:0;padding:0}.properties-sidebar__table{min-height:0;display:grid;grid-template-columns:minmax(0,1fr);background:var(--ps-surface)}.properties-sidebar__section{display:grid;grid-template-columns:minmax(0,1fr);gap:0;margin:0;border-top:0;background:var(--ps-surface)}.properties-sidebar__section-body{display:grid;grid-template-columns:minmax(0,1fr);gap:0;padding:4px 0}.properties-sidebar__property{display:grid;grid-template-columns:minmax(0,1fr);gap:4px;padding:8px 12px;border-left:2px solid transparent;background:var(--ps-surface);transition:border-color .12s ease,background-color .12s ease}.properties-sidebar__property--highlighted{border-left-color:var(--ps-active);background:var(--ps-active-bg);outline:none}.properties-sidebar__label{width:100%;min-width:0;position:relative;z-index:1;justify-self:stretch;display:inline-flex;align-items:center;gap:4px;padding:0;color:var(--ps-muted);font-size:11px;font-weight:600;line-height:1.35}.properties-sidebar__label span{min-width:0;overflow:hidden;text-overflow:ellipsis}.properties-sidebar__label:hover,.properties-sidebar__label:focus-within{z-index:80}.properties-sidebar__attribute{width:100%;min-width:0;grid-column:1;margin-top:0}.properties-sidebar__field--full,.properties-sidebar__field--value{grid-column:1;display:grid;grid-template-columns:1fr}.properties-sidebar__field--checkbox{grid-column:1;margin-top:0}.properties-sidebar__hint{width:14px;height:14px;border:1px solid var(--color-neutral-200);border-radius:3px;background:var(--color-neutral-100);color:var(--color-neutral-500);display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:help;position:relative;transition:background-color .12s ease,color .12s ease}.properties-sidebar__hint:before{content:\"?\";font-size:10px;font-weight:600;line-height:1}.properties-sidebar__hint:hover{background:var(--color-neutral-150, var(--color-neutral-100));border-color:var(--color-neutral-300);color:var(--color-neutral-700)}.properties-sidebar__hint .nvb-icon-svg{display:none}.properties-sidebar__checkbox-row{min-height:var(--nvb-control-height);display:flex;align-items:center;gap:7px}.properties-sidebar__checkbox-option{min-width:0;display:inline-flex;align-items:center;gap:7px;color:var(--ps-text);font-size:12px;font-weight:500;line-height:1.35;cursor:pointer}.properties-sidebar__checkbox-option checkbox-attribute{flex-shrink:0;display:inline-flex;align-items:center}.properties-sidebar__checkbox-option span{min-width:0}\n"] }]
|
|
77685
77863
|
}] });
|
|
77686
77864
|
|
|
77687
77865
|
class NvbJsonObjectCreator {
|
|
@@ -80649,13 +80827,22 @@ const LICENSE_VALIDATION_URL = 'https://api.ngxviewbuilder.io';
|
|
|
80649
80827
|
// publish build'a. Perpetual fallback modelis: raktas dengia visas versijas,
|
|
80650
80828
|
// isleistas iki jo expiresAt. Pasibaigus licencijai padengtos versijos veikia
|
|
80651
80829
|
// amzinai be watermark; velesnes (parsisiustos is npm) — watermark, kol neatsinaujinta.
|
|
80652
|
-
const RELEASE_DATE = new Date('2026-07-
|
|
80830
|
+
const RELEASE_DATE = new Date('2026-07-22T00:00:00Z');
|
|
80653
80831
|
// Oficialus vieso demo puslapio hostname'ai — jiems watermark/license modalai
|
|
80654
80832
|
// visada islaikomi isjungti, nepriklausomai nuo rakto/serverio busenos. SAUGU:
|
|
80655
80833
|
// tai musu paciu valdomas domenas, tad integratorius savo produkcinei app'ai
|
|
80656
80834
|
// negali "pasidaryti" siuo hostname — realus jo vartotojai visada matys jo
|
|
80657
80835
|
// tikra domena naršykleje, ne demo.ngxviewbuilder.io.
|
|
80658
80836
|
const OFFICIAL_DEMO_HOSTNAMES = new Set(['demo.ngxviewbuilder.io']);
|
|
80837
|
+
// PUBLIC BETA (iki 1.0.0): visas licencijos enforcement isjungtas — jokio
|
|
80838
|
+
// watermark, jokiu modalu, nesvarbu ar raktas paduotas, ar ne. Kol produktas
|
|
80839
|
+
// dar beta ir komercines licencijos apskritai neparduodamos, VISI vartotojai
|
|
80840
|
+
// yra "free", tad rodyti "NO LICENSE" watermark butu klaidinga (nera ka pirkti).
|
|
80841
|
+
// Docs pricing.md zada "completely free until 1.0.0" — sis flag'as ta uztikrina.
|
|
80842
|
+
// PRIE 1.0.0 RELEASE: perjungti i `false`, kad missing/invalid/outdated vel
|
|
80843
|
+
// rodytu watermark + modalus (ir apsvarstyti markMissing() modalo pridejima —
|
|
80844
|
+
// zr. licensing memory TODO).
|
|
80845
|
+
const BETA_FREE_NO_ENFORCEMENT = true;
|
|
80659
80846
|
const CACHE_KEY = 'ngx_vb_license_validation_v2';
|
|
80660
80847
|
const CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
80661
80848
|
const MODAL_SHOWN_KEY = 'ngx_vb_license_modal_shown';
|
|
@@ -80689,7 +80876,7 @@ class LicenseService {
|
|
|
80689
80876
|
}
|
|
80690
80877
|
this.status.set({
|
|
80691
80878
|
initialized: true,
|
|
80692
|
-
missing: !this.
|
|
80879
|
+
missing: !this.isEnforcementSuppressed(),
|
|
80693
80880
|
outdated: false,
|
|
80694
80881
|
invalid: false,
|
|
80695
80882
|
expiresAt: null,
|
|
@@ -80699,6 +80886,10 @@ class LicenseService {
|
|
|
80699
80886
|
isOfficialDemoHost() {
|
|
80700
80887
|
return typeof window !== 'undefined' && OFFICIAL_DEMO_HOSTNAMES.has(window.location.hostname);
|
|
80701
80888
|
}
|
|
80889
|
+
/** true kai watermark/modalu enforcement isjungtas: beta metu arba oficialiame demo. */
|
|
80890
|
+
isEnforcementSuppressed() {
|
|
80891
|
+
return BETA_FREE_NO_ENFORCEMENT || this.isOfficialDemoHost();
|
|
80892
|
+
}
|
|
80702
80893
|
saveModalTimestamp() {
|
|
80703
80894
|
try {
|
|
80704
80895
|
localStorage.setItem(MODAL_SHOWN_KEY, Date.now().toString());
|
|
@@ -80722,7 +80913,7 @@ class LicenseService {
|
|
|
80722
80913
|
this.shouldShowInvalidModal.set(false);
|
|
80723
80914
|
}
|
|
80724
80915
|
initialize() {
|
|
80725
|
-
if (this.
|
|
80916
|
+
if (this.isEnforcementSuppressed()) {
|
|
80726
80917
|
const payload = this.parseKey(this.licenseKey);
|
|
80727
80918
|
this.status.set({
|
|
80728
80919
|
initialized: true,
|
|
@@ -90257,4 +90448,4 @@ class ChoiceModel {
|
|
|
90257
90448
|
*/
|
|
90258
90449
|
|
|
90259
90450
|
export { ForgeInitializerService as $, APPLICATION_LOCALE_VALUE as A, BadgeModel as B, ChartModel as C, DynamicTextPipe as D, ElementActionService as E, ElementActionButtonToneEnum as F, ElementActionButtonVariantEnum as G, ElementActionDialogOperationEnum as H, ElementActionResponseModeEnum as I, ElementActionSetValueModeEnum as J, ElementActionToastPositionEnum as K, ElementActionToastVariantEnum as L, MarkupSecurityService as M, NvbIcon as N, ElementActionTriggerEnum as O, ElementActionTypeEnum as P, ElementBaseModel as Q, ElementDataSourceUseForEnum as R, StateService as S, ElementExecutionModeEnum as T, UiTranslationService as U, ElementFocusService as V, ElementTypesEnum as W, EmptyBlockModel as X, EventService as Y, ExpressionService as Z, FileUploadModel as _, ElementWrapper as a, TableColumnAlignEnum as a$, HeaderTabEnum as a0, IconModel as a1, IframeModel as a2, ImageModel as a3, LOCALE_CHOICES as a4, ListBoxModel as a5, ListGridModel as a6, MessageCardModel as a7, MultiSelectInputModel as a8, NGX_VIEW_BUILDER_PROJECT_LAYER as a9, NgxViewBuilderRuntime as aA, NgxViewBuilderSaveRequestedSourceEnum as aB, NgxViewBuilderTableSettingsSourceEnum as aC, NgxViewBuilderThemeModeEnum as aD, NgxViewBuilderTriggerEngineService as aE, NgxViewBuilderTriggerEventEnum as aF, NgxViewBuilderValidator as aG, NgxViewBuilderWebsocketMessageModeEnum as aH, NumberInputModel as aI, NumberStepperModel as aJ, PageTitleModel as aK, PanelModel as aL, PhoneInputModel as aM, ProgressBarModel as aN, ProgressFlowModel as aO, PropertyModel as aP, RadioInputModel as aQ, RichTextModel as aR, RuntimeVariableSourceTypeEnum as aS, SelectButtonModel as aT, SelectInputModel as aU, SignaturePadModel as aV, SingleCheckboxModel as aW, SliderModel as aX, SpacerModel as aY, SplitterModel as aZ, StatsCardModel as a_, NGX_VIEW_BUILDER_TEMPLATES_CAPABILITY as aa, NGX_VIEW_BUILDER_TEMPLATES_FEATURE_PACK_ID as ab, NGX_VIEW_BUILDER_UI_TRANSLATIONS as ac, NgxViewBuilder as ad, NgxViewBuilderActionExecutorService as ae, NgxViewBuilderAlignEnum as af, NgxViewBuilderApiService as ag, NgxViewBuilderAutomationActionTypeEnum as ah, NgxViewBuilderAutomationService as ai, NgxViewBuilderBuilder as aj, NgxViewBuilderBuilderTabRenderModeEnum as ak, NgxViewBuilderChromePositionEnum as al, NgxViewBuilderDataSourceTypeEnum as am, NgxViewBuilderDialogCloseReasonEnum as an, NgxViewBuilderExecutionReasonEnum as ao, NgxViewBuilderHeadlessService as ap, NgxViewBuilderInteractionStatusEnum as aq, NgxViewBuilderPageNavigationModeEnum as ar, NgxViewBuilderPreviewModeEnum as as, NgxViewBuilderProcessService as at, NgxViewBuilderRenderModeEnum as au, NgxViewBuilderRenderPhaseEnum as av, NgxViewBuilderRenderer as aw, NgxViewBuilderRuleExecutedBranchEnum as ax, NgxViewBuilderRuleRunModeEnum as ay, NgxViewBuilderRulesEngineService as az, AUTOMATION_BUILDER_TAB_ID as b, TableColumnCellActionsDisplayModeEnum as b0, TableColumnTypeEnum as b1, TableFilterControlTypeEnum as b2, TableFilterOptionsSourceTypeEnum as b3, TableInlineEditStartModeEnum as b4, TableInlineEditorTypeEnum as b5, TableModel as b6, TableRowActionsDropdownButtonStyleEnum as b7, TableStatusToneEnum as b8, TabsModel as b9, TabsProModel as ba, TemplateEngineService as bb, TemplateStorageModeEnum as bc, TemplatesEditor as bd, TextAreaModel as be, TextInputModel as bf, TimePickerModel as bg, ToastModel as bh, ToggleSwitchModel as bi, UiTranslatePipe as bj, ValueChangeTriggerEnum as bk, VideoModel as bl, bridgeNgxViewBuilderApiEvents as bm, createTemplatesLibraryProperty as bn, provideNgxViewBuilderExtensions as bo, provideNgxViewBuilderProjectLayer as bp, provideNgxViewBuilderProjectLayers as bq, provideNgxViewBuilderRuntime as br, provideNgxViewBuilderUiTranslations as bs, AccordionModel as c, ApplicationLocaleService as d, AutocompleteModel as e, AutomationStudio as f, AvatarModel as g, BreadcrumbsModel as h, BuilderModel as i, BuilderPageDisplayModeEnum as j, ButtonModel as k, CheckboxInputModel as l, ChoiceModel as m, ColumnFragmentModeEnum as n, CreatorStructureService as o, CustomHtmlModel as p, DatePickerModel as q, DateRangeModel as r, DialogModel as s, DividerModel as t, DocumentationGenerator as u, DynamicPanelModel as v, DynamicTableColumnModel as w, DynamicTableModel as x, DynamicTableRowColumnModel as y, EN_UI_DICTIONARY as z };
|
|
90260
|
-
//# sourceMappingURL=ngx-view-builder-ngx-view-builder-
|
|
90451
|
+
//# sourceMappingURL=ngx-view-builder-ngx-view-builder-G2BnNzUY.mjs.map
|