Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/landing/ui/field/color/dist/ |
Upload File : |
/* eslint-disable */ this.BX = this.BX || {}; this.BX.Landing = this.BX.Landing || {}; this.BX.Landing.UI = this.BX.Landing.UI || {}; (function (exports,landing_ui_field_basefield,landing_ui_field_textfield,main_popup,ui_fonts_opensans,ui_designTokens,main_core_events,landing_ui_field_image,landing_backend,landing_env,landing_pageobject,main_core) { 'use strict'; const matcher = /^rgba? ?\((\d{1,3})[, ]+(\d{1,3})[, ]+(\d{1,3})([, ]+([\d\.]{1,5}))?\)$/i; function isRgbString(rgbString) { return !!rgbString.match(matcher); } const matcherHex = /^#([\da-f]{3}){1,2}$/i; function isHex(hex) { return !!hex.trim().match(matcherHex); } const matcherHsl = /^hsla?\((\d{1,3}), ?(\d{1,3})%, ?(\d{1,3})%(, ?([\d .]+))?\)/i; function isHslString(hsla) { return !!hsla.trim().match(matcherHsl); } function hexToRgb(hex) { if (hex.length === 4) { const r = parseInt(`0x${hex[1]}${hex[1]}`, 16); const g = parseInt(`0x${hex[2]}${hex[2]}`, 16); const b = parseInt(`0x${hex[3]}${hex[3]}`, 16); return { r, g, b }; } if (hex.length === 7) { const r = parseInt(`0x${hex[1]}${hex[2]}`, 16); const g = parseInt(`0x${hex[3]}${hex[4]}`, 16); const b = parseInt(`0x${hex[5]}${hex[6]}`, 16); return { r, g, b }; } return { r: 255, g: 255, b: 255 }; } function rgbToHsla(rgb) { const r = rgb.r / 255; const g = rgb.g / 255; const b = rgb.b / 255; const max = Math.max(r, g, b); const min = Math.min(r, g, b); let h, s, l = (max + min) / 2; // let l = h; // let s; if (max === min) { h = s = 0; } else { const d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h *= 0.6; } return { h: Math.round(h * 100), s: Math.round(s * 100), l: Math.round(l * 100), a: 'a' in rgb ? rgb.a : 1 }; } // const v = Math.max(r, g, b); // const diff = v - Math.min(r, g, b); // const diffc = (c) => { // return (v - c) / 6 / diff + 1 / 2; // }; // // if (diff === 0) // { // h = 0; // s = 0; // } // else // { // s = diff / v; // rdif = diffc(r); // gdif = diffc(g); // bdif = diffc(b); // // if (r === v) // { // h = bdif - gdif; // } // else if (g === v) // { // h = (1 / 3) + rdif - bdif; // } // else if (b === v) // { // h = (2 / 3) + gdif - rdif; // } // // if (h < 0) // { // h += 1; // } // else if (h > 1) // { // h -= 1; // } // } // // return { // h: h * 360, // s: s * 100, // l: v * 100, // a: rgb.a || 1, // }; // } function hexToHsl(hex) { const rgb = hexToRgb(hex.trim()); return rgbToHsla(rgb); } function rgbToHex(rgb) { let r = rgb.r.toString(16); let g = rgb.g.toString(16); let b = rgb.b.toString(16); if (r.length === 1) { r = "0" + r; } if (g.length === 1) { g = "0" + g; } if (b.length === 1) { b = "0" + b; } return "#" + r + g + b; } function hslToRgb(hsl) { // todo: a little not equal with reverce conversion :-/ // todo: f.e. hsl(73.53.50) it 166,195,60 and #a5c33c, // todo: but in reverse #a5c33c => 165,195,60 // todo: because we save ColorValue in hsl can be some differences const h = hsl.h; const s = hsl.s / 100; const l = hsl.l / 100; let c = (1 - Math.abs(2 * l - 1)) * s; let x = c * (1 - Math.abs(h / 60 % 2 - 1)); let m = l - c / 2; let r = 0; let g = 0; let b = 0; if (0 <= h && h < 60) { r = c; g = x; b = 0; } else if (60 <= h && h < 120) { r = x; g = c; b = 0; } else if (120 <= h && h < 180) { r = 0; g = c; b = x; } else if (180 <= h && h < 240) { r = 0; g = x; b = c; } else if (240 <= h && h < 300) { r = x; g = 0; b = c; } else if (300 <= h && h < 360) { r = c; g = 0; b = x; } r = Math.round((r + m) * 255); g = Math.round((g + m) * 255); b = Math.round((b + m) * 255); return { r: r, g: g, b: b }; } function hslToHex(hsl) { const rgb = hslToRgb(hsl); return rgbToHex(rgb); } function rgbStringToHsla(rgbString) { let matches = rgbString.trim().match(matcher); if (matches.length > 0) { return rgbToHsla({ r: main_core.Text.toNumber(matches[1]), g: main_core.Text.toNumber(matches[2]), b: main_core.Text.toNumber(matches[3]), a: matches[5] ? main_core.Text.toNumber(matches[5]) : 1 }); } } function hslStringToHsl(hslString) { let matches = hslString.trim().match(matcherHsl); if (matches && matches.length > 0) { return { h: main_core.Text.toNumber(matches[1]), s: main_core.Text.toNumber(matches[2]), l: main_core.Text.toNumber(matches[3]), a: matches[5] ? main_core.Text.toNumber(matches[5]) : 1 }; } } const matcher$1 = /^(var\()?((--[\w\d-]*?)(-opacity_([\d_]+)?)?)\)?$/i; function isCssVar(css) { return !!css.trim().match(matcher$1); } function parseCssVar(css) { const matches = css.trim().match(matcher$1); if (!!matches) { const cssVar = { full: matches[2], name: matches[3] }; if (matches[3]) { const cssVarWithOpacity = '--primary-opacity-0_'; const cssVarWithOpacity0 = '--primary-opacity-0'; if (matches[3].startsWith(cssVarWithOpacity0) && !matches[3].startsWith(cssVarWithOpacity)) { cssVar.opacity = 0; } if (matches[3].startsWith(cssVarWithOpacity)) { let newOpacity = matches[3].substr(cssVarWithOpacity.length); if (newOpacity.length === 1 && newOpacity !== 0) { newOpacity = newOpacity / 10; } if (newOpacity.length === 2) { newOpacity = newOpacity / 100; } cssVar.opacity = newOpacity; } } if (matches[5]) { cssVar.opacity = +parseFloat(matches[5].replace('_', '.')).toFixed(1); } return cssVar; } return null; } const defaultColorValueOptions = { h: 205, s: 1, l: 50, a: 1 }; const defaultBgImageSize = 'cover'; const defaultBgImageAttachment = 'scroll'; const defaultOverlay = null; const defaultBgImageValueOptions = { url: null, size: defaultBgImageSize, attachment: defaultBgImageAttachment, overlay: defaultOverlay }; class ColorValue { /** * For preserve differences between hsl->rgb and rgb->hsl conversions we can save hex * @type {?string} */ /** * if set css variable value - save them in '--var-name' format * @type {?string} */ constructor(value) { this.value = defaultColorValueOptions; this.hex = null; this.cssVar = null; this.setValue(value); } getName() { if (this.hex) { return this.getHex() + '_' + this.getOpacity(); } const { h, s, l } = this.getHsl(); return `${h}-${s}-${l}-${this.getOpacity()}`; } setValue(value) { if (main_core.Type.isObject(value)) { if (value instanceof ColorValue) { this.value = value.getHsla(); this.cssVar = value.getCssVar(); this.hex = value.getHexOriginal(); } else { this.value = { ...this.value, ...value }; } } if (main_core.Type.isString(value)) { if (isHslString(value)) { this.value = hslStringToHsl(value); } else if (isHex(value)) { this.value = { ...hexToHsl(value), a: defaultColorValueOptions.a }; this.hex = value; } else if (isRgbString(value)) { this.value = rgbStringToHsla(value); } else if (isCssVar(value)) { const cssVar = parseCssVar(value); const cssPrimaryVarName = '--primary'; if (cssVar !== null) { this.cssVar = cssVar.name; if ('opacity' in cssVar) { this.cssVar = cssPrimaryVarName; this.setValue(main_core.Dom.style(document.documentElement, this.cssVar)); this.setOpacity(cssVar.opacity); } else { this.setValue(main_core.Dom.style(document.documentElement, this.cssVar)); } } } } this.value.h = Math.round(this.value.h); this.value.s = Math.round(this.value.s); this.value.l = Math.round(this.value.l); this.value.a = this.value.a.toFixed(2); const offsetFromCorrectValue = Math.round(this.value.a * 100 % 5); if (offsetFromCorrectValue < 3) { this.value.a = (this.value.a * 100 - offsetFromCorrectValue) / 100; } else { this.value.a = (this.value.a * 100 - offsetFromCorrectValue + 5) / 100; } return this; } setOpacity(opacity) { this.setValue({ a: opacity }); return this; } lighten(percent) { this.value.l = Math.min(this.value.l + percent, 100); this.hex = null; return this; } darken(percent) { this.value.l = Math.max(this.value.l - percent, 0); this.hex = null; return this; } saturate(percent) { this.value.s = Math.min(this.value.s + percent, 100); this.hex = null; return this; } desaturate(percent) { this.value.s = Math.max(this.value.s - percent, 0); this.hex = null; return this; } adjustHue(degree) { this.value.h = (this.value.h + degree) % 360; return this; } getHsl() { return { h: this.value.h, s: this.value.s, l: this.value.l }; } getHsla() { const a = this.value.a || 1; return { h: this.value.h, s: this.value.s, l: this.value.l, a }; } /** * Return original hex-string or convert value to hex (w.o. alpha) * @returns {string} */ getHex() { return this.hex || hslToHex(this.value); } /** * Return hex only if value created from hex-string */ getHexOriginal() { return this.hex; } getOpacity() { var _this$value$a; return (_this$value$a = this.value.a) != null ? _this$value$a : defaultColorValueOptions.a; } getCssVar() { return this.cssVar; } /** * Get style string for set inline css var. * Set hsla value or primary css var with opacity in format --var-name-opacity_12_3 * @returns {string} */ getStyleString() { if (this.cssVar === null) { if (this.hex && this.getOpacity() === defaultColorValueOptions.a) { return this.hex; } const { h, s, l, a } = this.value; return `hsla(${h}, ${s}%, ${l}%, ${a})`; } else { let fullCssVar = this.cssVar; if (this.value.a !== defaultColorValueOptions.a) { fullCssVar = fullCssVar + '-opacity-' + String(this.value.a).replace('.', '_'); } return `var(${fullCssVar})`; } } getStyleStringForOpacity() { const { h, s, l } = this.value; return `linear-gradient(to right, hsla(${h}, ${s}%, ${l}%, 0) 0%, hsla(${h}, ${s}%, ${l}%, 1) 100%)`; } static compare(color1, color2) { return color1.getHsla().h === color2.getHsla().h && color1.getHsla().s === color2.getHsla().s && color1.getHsla().l === color2.getHsla().l && color1.getHsla().a === color2.getHsla().a && color1.cssVar === color2.cssVar; } static getMedian(color1, color2) { return new ColorValue({ h: (color1.getHsla().h + color2.getHsla().h) / 2, s: (color1.getHsla().s + color2.getHsla().s) / 2, l: (color1.getHsla().l + color2.getHsla().l) / 2, a: (color1.getHsla().a + color2.getHsla().a) / 2 }); } /** * Special formula for contrast. Not only color invert! * @returns {string} */ getContrast() { let k = 60; // math h range to 0-2pi radian and add modifier by sinus let rad = this.getHsl().h * Math.PI / 180; k += Math.sin(rad) * 10 + 5; // 10 & 5 is approximate coefficients // lighten by started light let deltaL = k - 45 * this.getHsl().l / 100; return new ColorValue(this.value).setValue({ l: (this.getHsl().l + deltaL) % 100 }); } /** * Special formula for lighten, good for dark and light colors */ getLighten() { let { h, s, l } = this.getHsl(); if (s > 0) { s += (l - 50) / 100 * 60; s = Math.min(100, Math.max(0, l)); } l += 10 + 20 * l / 100; l = Math.min(100, l); return new ColorValue({ h, s, l }); } } let _ = t => t, _t; class BaseProcessor extends main_core_events.EventEmitter { constructor(options) { super(); this.cache = new main_core.Cache.MemoryCache(); this.property = 'color'; this.options = options; this.pseudoClass = null; this.setEventNamespace('BX.Landing.UI.Field.Processor.BaseProcessor'); } getProperty() { return main_core.Type.isArray(this.property) ? this.property : [this.property]; } getVariableName() { return main_core.Type.isArray(this.variableName) ? this.variableName : [this.variableName]; } isNullValue(value) { return main_core.Type.isNull(value); } getNullValue() { return new ColorValue(); } getPseudoClass() { return this.pseudoClass; } getLayout() { return this.cache.remember('layout', () => { return this.buildLayout(); }); } buildLayout() { return main_core.Tag.render(_t || (_t = _`<div>Base processor</div>`)); } getClassName() { return [this.className]; } getValue() {} getStyle() { if (main_core.Type.isNull(this.getValue())) { return { [this.getVariableName()]: null }; } return { [this.getVariableName()]: this.getValue().getStyleString() }; } /** * Set value by new format * @param value {string: string} */ setProcessorValue(value) { // Just get last css variable const processorProperty = this.getVariableName()[this.getVariableName().length - 1]; this.cache.delete('value'); this.setValue(value[processorProperty]); } /** * Set old-type value by computedStyle * @param value {string: string} | null */ setDefaultValue(value) { if (!main_core.Type.isNull(value)) { const inlineProperty = this.getProperty()[this.getProperty().length - 1]; if (inlineProperty in value) { this.setValue(value[inlineProperty]); this.cache.delete('value'); this.unsetActive(); return; } } this.setValue(null); this.cache.set('value', null); } setValue(value) {} onReset() { this.emit('onReset'); } unsetActive() {} onChange() { this.cache.delete('value'); this.emit('onChange'); } defineActiveControl(items, currentNode) {} setActiveControl(controlName) {} prepareProcessorValue(processorValue, defaultValue, data) { return processorValue; } } let _$1 = t => t, _t$1; class BaseControl extends main_core_events.EventEmitter { constructor(options) { super(); this.cache = new main_core.Cache.MemoryCache(); } getLayout() { return this.cache.remember('layout', () => { return this.buildLayout(); }); } buildLayout() { return main_core.Tag.render(_t$1 || (_t$1 = _$1` <div class="landing-ui-field-base-control"> Base control </div> `)); } getValue() { return this.cache.remember('value', () => { return new ColorValue(); }); } isNeedSetValue(value) { return value !== this.getValue(); } setValue(value) { this.cache.set('value', value); } onChange(event) { this.cache.delete('value'); this.emit('onChange', { color: this.getValue() }); } setActive() { main_core.Dom.addClass(this.getLayout(), BaseControl.ACTIVE_CLASS); } unsetActive() { main_core.Dom.removeClass(this.getLayout(), BaseControl.ACTIVE_CLASS); } isActive() { return main_core.Dom.hasClass(this.getLayout(), BaseControl.ACTIVE_CLASS); } } BaseControl.ACTIVE_CLASS = 'active'; let _$2 = t => t, _t$2, _t2, _t3, _t4, _t5; class Hex extends BaseControl { constructor() { super(); this.setEventNamespace('BX.Landing.UI.Field.Color.Hex'); this.previewMode = false; this.onInput = main_core.Runtime.debounce(this.onInput.bind(this), 300); this.onButtonClick = this.onButtonClick.bind(this); } setPreviewMode(preview) { this.previewMode = !!preview; } buildLayout() { if (!this.previewMode) { // todo: add Enter click handler main_core.Event.bind(this.getInput(), 'input', this.onInput); main_core.Event.bind(this.getButton(), 'click', this.onButtonClick); } this.adjustColors(Hex.DEFAULT_COLOR, Hex.DEFAULT_BG); return main_core.Tag.render(_t$2 || (_t$2 = _$2` <div class="landing-ui-field-color-hex"> ${0} ${0} </div> `), this.getInput(), this.getButton()); } getInput() { return this.cache.remember('input', () => { return this.previewMode ? main_core.Tag.render(_t2 || (_t2 = _$2`<div class="landing-ui-field-color-hex-preview">${0}</div>`), Hex.DEFAULT_TEXT) : main_core.Tag.render(_t3 || (_t3 = _$2`<input type="text" name="hexInput" value="${0}" class="landing-ui-field-color-hex-input">`), Hex.DEFAULT_TEXT); }); } getButton() { return this.cache.remember('editButton', () => { return this.previewMode ? main_core.Tag.render(_t4 || (_t4 = _$2` <svg class="landing-ui-field-color-hex-preview-btn" width="9" height="9" xmlns="http://www.w3.org/2000/svg"> <path d="M7.108 0l1.588 1.604L2.486 7.8.896 6.194 7.108 0zM.006 8.49a.166.166 0 00.041.158.161.161 0 00.16.042l1.774-.478L.484 6.715.006 8.49z" fill="#525C69" fill-rule="evenodd"/> </svg>`)) : main_core.Tag.render(_t5 || (_t5 = _$2` <svg class="landing-ui-field-color-hex-preview-btn" width="12" height="9" xmlns="http://www.w3.org/2000/svg"> <path d="M4.27 8.551L.763 5.304 2.2 3.902l2.07 1.846L9.836.533l1.439 1.402z" fill="#525C69" fill-rule="evenodd"/> </svg>`)); }); } onInput() { let value = this.getInput().value.replace(/[^\da-f]/gi, ''); value = value.substring(0, 6); this.getInput().value = '#' + value.toLowerCase(); this.onChange(); } onButtonClick() { this.onChange(); this.emit('onButtonClick', { color: this.getValue() }); } onChange(event) { const color = this.getInput().value.length === 7 && isHex(this.getInput().value) ? new ColorValue(this.getInput().value) : null; this.setValue(color); this.cache.delete('value'); this.emit('onChange', { color: color }); } adjustColors(textColor, bgColor) { main_core.Dom.style(this.getInput(), 'background-color', bgColor); main_core.Dom.style(this.getInput(), 'color', textColor); main_core.Dom.style(this.getButton().querySelector('path'), 'fill', textColor); } focus() { if (!this.previewMode) { if (this.getValue() === null) { this.getInput().value = '#'; } this.getInput().focus(); } } unFocus() { if (!this.previewMode) { this.getInput().blur(); } } getValue() { return this.cache.remember('value', () => { return this.getInput().value === Hex.DEFAULT_TEXT ? null : new ColorValue(this.getInput().value); }); } setValue(value) { // todo: set checking in always controls? if (this.isNeedSetValue(value)) { super.setValue(value); if (value !== null) { this.adjustColors(value.getContrast().getHex(), value.getHex()); this.setActive(); } else { this.adjustColors(Hex.DEFAULT_COLOR, Hex.DEFAULT_BG); this.unsetActive(); } if (this.previewMode) { this.getInput().innerText = value !== null ? value.getHex() : Hex.DEFAULT_TEXT; } else if (landing_pageobject.PageObject.getRootWindow().document.activeElement !== this.getInput()) { this.getInput().value = value !== null ? value.getHex() : Hex.DEFAULT_TEXT; } } } setActive() { main_core.Dom.addClass(this.getInput(), Hex.ACTIVE_CLASS); } unsetActive() { main_core.Dom.removeClass(this.getInput(), Hex.ACTIVE_CLASS); } isActive() { return main_core.Dom.hasClass(this.getInput(), Hex.ACTIVE_CLASS); } } Hex.DEFAULT_TEXT = '#HEX'; Hex.DEFAULT_COLOR = '#000000'; Hex.DEFAULT_BG = '#eeeeee'; let _$3 = t => t, _t$3, _t2$1; class Spectrum extends BaseControl { // todo: debug, del method, change calls, change css static getDefaultSaturation() { const global = window.top.document.location.saturation; const urlParam = new URL(window.top.document.location).searchParams.get('saturation'); const saturation = global || urlParam || Spectrum.DEFAULT_SATURATION; window.top.document.body.style.setProperty('--saturation', saturation + '%'); return parseInt(saturation); } constructor(options) { super(); this.setEventNamespace('BX.Landing.UI.Field.Color.Spectrum'); this.onPickerDragStart = this.onPickerDragStart.bind(this); this.onPickerDragMove = this.onPickerDragMove.bind(this); this.onPickerDragEnd = this.onPickerDragEnd.bind(this); this.onScroll = this.onScroll.bind(this); this.document = landing_pageobject.PageObject.getRootWindow().document; this.scrollContext = options.contentRoot; main_core.Event.bind(this.getLayout(), 'mousedown', this.onPickerDragStart); } buildLayout() { return main_core.Tag.render(_t$3 || (_t$3 = _$3` <div class="landing-ui-field-color-spectrum"> ${0} </div> `), this.getPicker()); } getPicker() { return this.cache.remember('picker', () => { return main_core.Tag.render(_t2$1 || (_t2$1 = _$3`<div class="landing-ui-field-color-spectrum-picker"></div>`)); }); } getPickerPos() { return { x: main_core.Text.toNumber(main_core.Dom.style(this.getPicker(), 'left')), y: main_core.Text.toNumber(main_core.Dom.style(this.getPicker(), 'top')) }; } onPickerDragStart(event) { if (event.ctrlKey || event.metaKey || event.button) { return; } main_core.Event.bind(this.scrollContext, 'scroll', this.onScroll); main_core.Event.bind(this.document, 'mousemove', this.onPickerDragMove); main_core.Event.bind(this.document, 'mouseup', this.onPickerDragEnd); main_core.Dom.addClass(this.document.body, 'landing-ui-field-color-draggable'); this.onScroll(); this.showPicker(); this.onPickerDragMove(event); } onPickerDragMove(event) { if (event.target === this.getPicker()) { return; } this.setPickerPos(event.pageX, event.pageY); this.onChange(); } onPickerDragEnd() { main_core.Event.unbind(this.scrollContext, 'scroll', this.onScroll); main_core.Event.unbind(this.document, 'mousemove', this.onPickerDragMove); main_core.Event.unbind(this.document, 'mouseup', this.onPickerDragEnd); main_core.Dom.removeClass(this.document.body, 'landing-ui-field-color-draggable'); } onScroll() { this.cache.delete('layoutSize'); } getLayoutRect() { return this.cache.remember('layoutSize', () => { const layoutRect = this.getLayout().getBoundingClientRect(); return { width: layoutRect.width, height: layoutRect.height, top: layoutRect.top, left: layoutRect.left }; }); } /** * Set picker by absolut page coords * @param x * @param y */ setPickerPos(x, y) { const { width, height, top, left } = this.getLayoutRect(); let leftToSet = Math.min(Math.max(x - left, 0), width); leftToSet = leftToSet > width / Spectrum.HUE_RANGE * Spectrum.HUE_RANGE_GRAY_THRESHOLD ? width / Spectrum.HUE_RANGE * Spectrum.HUE_RANGE_GRAY_MIDDLE : leftToSet; main_core.Dom.style(this.getPicker(), { left: `${leftToSet}px`, top: `${Math.min(Math.max(y - top, 0), height)}px` }); } getValue() { return this.cache.remember('value', () => { if (main_core.Dom.hasClass(this.getPicker(), Spectrum.HIDE_CLASS)) { return null; } const layoutWidth = this.getLayout().getBoundingClientRect().width; const h = this.getPickerPos().x / layoutWidth * Spectrum.HUE_RANGE; const layoutHeight = this.getLayout().getBoundingClientRect().height; const l = (1 - this.getPickerPos().y / layoutHeight) * 100; if (isNaN(h) || isNaN(l)) { return null; } return new ColorValue({ h: Math.min(h, Spectrum.HUE_RANGE_GRAY_THRESHOLD), s: h >= Spectrum.HUE_RANGE_GRAY_THRESHOLD ? 0 : Spectrum.getDefaultSaturation(), l: l }); }); } setValue(value) { super.setValue(value); if (value !== null && Spectrum.isSpectrumValue(value)) { // in first set value we can't match bounding client rect (layout not render). Then, use percents const { h, s, l } = value.getHsl(); const left = s === 0 ? Spectrum.HUE_RANGE_GRAY_MIDDLE / Spectrum.HUE_RANGE * 100 : h / Spectrum.HUE_RANGE * 100; main_core.Dom.style(this.getPicker(), 'left', `${left}%`); const top = 100 - l; main_core.Dom.style(this.getPicker(), 'top', `${top}%`); this.showPicker(); } else { this.hidePicker(); } } hidePicker() { main_core.Dom.addClass(this.getPicker(), Spectrum.HIDE_CLASS); } showPicker() { main_core.Dom.removeClass(this.getPicker(), Spectrum.HIDE_CLASS); } isActive() { return this.getValue() !== null && Spectrum.isSpectrumValue(this.getValue()); } static isSpectrumValue(value) { return value !== null && (value.getHsl().s === Spectrum.getDefaultSaturation() || value.getHsl().s === 0); } } Spectrum.DEFAULT_SATURATION = 100; Spectrum.HUE_RANGE = 375; Spectrum.HUE_RANGE_GRAY_THRESHOLD = 360; Spectrum.HUE_RANGE_GRAY_MIDDLE = 367; Spectrum.HIDE_CLASS = 'hidden'; let _$4 = t => t, _t$4, _t2$2; class Recent extends main_core_events.EventEmitter { constructor() { super(); this.cache = new main_core.Cache.MemoryCache(); this.setEventNamespace('BX.Landing.UI.Field.Color.Recent'); } getLayout() { this.initItems(); return this.getLayoutContainer(); } getLayoutContainer() { return this.cache.remember('layout', () => { return main_core.Tag.render(_t$4 || (_t$4 = _$4`<div class="landing-ui-field-color-recent"></div>`)); }); } initItems() { if (Recent.itemsLoaded) { this.buildItemsLayout(); } else { landing_backend.Backend.getInstance().action("Utils::getUserOption", { name: Recent.USER_OPTION_NAME }).then(result => { if (result && main_core.Type.isString(result.items)) { Recent.items = []; result.items.split(',').forEach(item => { if (isHex(item) && Recent.items.length < Recent.MAX_ITEMS) { Recent.items.push(item); } }); Recent.itemsLoaded = true; this.buildItemsLayout(); } }); // todo: what if ajax error? } } buildItemsLayout() { main_core.Dom.clean(this.getLayoutContainer()); Recent.items.forEach(item => { if (isHex(item)) { let itemLayout = main_core.Tag.render(_t2$2 || (_t2$2 = _$4`<div class="landing-ui-field-color-recent-item" style="background:${0}" data-value="${0}" ></div>`), item, item); main_core.Event.bind(itemLayout, 'click', () => this.onItemClick(event)); main_core.Dom.append(itemLayout, this.getLayoutContainer()); } }); return this; } onItemClick(event) { this.emit('onChange', { hex: event.currentTarget.dataset.value }); } addItem(hex) { if (isHex(hex)) { let pos = Recent.items.indexOf(hex); if (pos !== -1) { Recent.items.splice(pos, 1); } Recent.items.unshift(hex); if (Recent.items.length > Recent.MAX_ITEMS) { Recent.items.splice(Recent.MAX_ITEMS); } this.buildItemsLayout(); this.saveItems(); } return this; } saveItems() { if (Recent.items.length > 0) { BX.userOptions.save('landing', Recent.USER_OPTION_NAME, 'items', Recent.items); } return this; } } Recent.USER_OPTION_NAME = 'color_field_recent_colors'; Recent.MAX_ITEMS = 6; Recent.items = []; Recent.itemsLoaded = false; let _$5 = t => t, _t$5, _t2$3, _t3$1, _t4$1; class Colorpicker extends BaseControl { constructor(options) { super(); this.setEventNamespace('BX.Landing.UI.Field.Color.Colorpicker'); this.popupId = 'colorpicker_popup_' + main_core.Text.getRandom(); this.popupTargetContainer = options.contentRoot; this.hexPreview = new Hex(); this.hexPreview.setPreviewMode(true); main_core.Event.bind(this.hexPreview.getLayout(), 'click', this.onPopupOpenClick.bind(this)); // popup this.hex = new Hex(); this.hex.subscribe('onChange', this.onHexChange.bind(this)); this.hex.subscribe('onButtonClick', this.onSelectClick.bind(this)); this.spectrum = new Spectrum(options); this.spectrum.subscribe('onChange', this.onSpectrumChange.bind(this)); this.recent = new Recent(); this.recent.subscribe('onChange', this.onRecentChange.bind(this)); main_core.Event.bind(this.getCancelButton(), 'click', this.onCancelClick.bind(this)); main_core.Event.bind(this.getSelectButton(), 'click', this.onSelectClick.bind(this)); // end popup this.previously = this.getValue(); } onSelectClick(event) { const value = event instanceof main_core_events.BaseEvent ? event.getData().color : this.getValue(); if (value !== null) { this.recent.addItem(this.getValue().getHex()); } this.getPopup().close(); } buildLayout() { return main_core.Tag.render(_t$5 || (_t$5 = _$5` <div class="landing-ui-field-color-colorpicker"> ${0} </div> `), this.hexPreview.getLayout()); } getPopupContent() { return main_core.Tag.render(_t2$3 || (_t2$3 = _$5` <div class="landing-ui-field-color-popup-container"> <div class="landing-ui-field-color-popup-head"> ${0} ${0} </div> ${0} <div class="landing-ui-field-color-popup-footer"> ${0} ${0} </div> </div> `), this.recent.getLayout(), this.hex.getLayout(), this.spectrum.getLayout(), this.getSelectButton(), this.getCancelButton()); } getSelectButton() { return this.cache.remember('selectButton', () => { return main_core.Tag.render(_t3$1 || (_t3$1 = _$5` <button class="ui-btn ui-btn-xs ui-btn-primary"> ${0} </button> `), main_core.Loc.getMessage('LANDING_FIELD_COLOR-BUTTON_SELECT')); }); } getCancelButton() { return this.cache.remember('cancelButton', () => { return main_core.Tag.render(_t4$1 || (_t4$1 = _$5` <button class="ui-btn ui-btn-xs ui-btn-light-border"> ${0} </button> `), main_core.Loc.getMessage('LANDING_FIELD_COLOR-BUTTON_CANCEL')); }); } getHexPreviewObject() { return this.hexPreview; } getPopup() { return this.cache.remember('popup', () => { return main_popup.PopupManager.create({ id: this.popupId, className: 'landing-ui-field-color-spectrum-popup', autoHide: true, bindElement: this.hexPreview.getLayout(), bindOptions: { forceTop: true, forceLeft: true }, padding: 0, contentPadding: 14, width: 260, offsetTop: -37, offsetLeft: -180, content: this.getPopupContent(), closeByEsc: true, targetContainer: this.popupTargetContainer }); }); } getValue() { return this.cache.remember('value', () => { return this.spectrum.getValue(); }); } onHexChange(event) { this.setValue(event.getData().color); this.onChange(event); } onSpectrumChange(event) { this.hex.unFocus(); this.setValue(event.getData().color); this.onChange(event); } onRecentChange(event) { const recentColor = new ColorValue(event.getData().hex); this.setValue(recentColor); this.onChange(new main_core_events.BaseEvent({ data: { color: recentColor } })); } onCancelClick() { this.setValue(this.previously); this.getPopup().close(); this.onChange(new main_core_events.BaseEvent({ data: { color: this.getValue() } })); } onPopupOpenClick() { this.recent.buildItemsLayout(); this.previously = this.getValue(); this.getPopup().show(); if (this.getPopup().isShown()) { this.hex.focus(); } } setValue(value) { if (this.isNeedSetValue(value)) { super.setValue(value); this.spectrum.setValue(value); this.hex.setValue(value); this.hexPreview.setValue(value); } this.setActivity(value); } setActivity(value) { if (value !== null) { if (this.spectrum.isActive()) { this.hex.unsetActive(); } else { this.hex.setActive(); } this.hexPreview.setActive(); } } unsetActive() { this.hex.unsetActive(); this.hexPreview.unsetActive(); } isActive() { return this.hex.isActive() || this.hexPreview.isActive(); } } let _$6 = t => t, _t$6; class Primary extends main_core_events.EventEmitter { // todo: layout or control? constructor(options = {}) { super(); this.cache = new main_core.Cache.MemoryCache(); this.setEventNamespace('BX.Landing.UI.Field.Color.Primary'); main_core.Event.bind(this.getLayout(), 'click', () => this.onClick()); if (options.content && options.content === 'var(--primary)') { this.setActive(); } } getLayout() { return this.cache.remember('layout', () => { return main_core.Tag.render(_t$6 || (_t$6 = _$6` <div class="landing-ui-field-color-primary"> <i class="landing-ui-field-color-primary-preview"></i> <span class="landing-ui-field-color-primary-text"> ${0} </span> </div> `), main_core.Loc.getMessage('LANDING_FIELD_COLOR-PRIMARY_TITLE')); }); } getValue() { return this.cache.remember('value', () => { return new ColorValue(Primary.CSS_VAR); }); } onClick() { this.setActive(); this.emit('onChange', { color: this.getValue() }); } setActive() { main_core.Dom.addClass(this.getLayout(), Primary.ACTIVE_CLASS); } unsetActive() { main_core.Dom.removeClass(this.getLayout(), Primary.ACTIVE_CLASS); } isActive() { return main_core.Dom.hasClass(this.getLayout(), Primary.ACTIVE_CLASS); } isPrimaryValue(value) { return value !== null && this.getValue().getCssVar() === value.getCssVar(); } } Primary.ACTIVE_CLASS = 'active'; Primary.CSS_VAR = '--primary'; function regexpWoStartEnd(regexp) { return new RegExp(regexpToString(regexp)); } function regexpToString(regexp) { return regexp.source.replace(/(^\^)|(\$$)/g, ''); } const matcherGradient = /^(linear|radial)-gradient\(.*\)$/i; const matcherGradientAngle = /^(linear|radial)-gradient\(.*?((\d)+deg).*?\)$/ig; const hexMatcher = regexpToString(matcherHex); const matcherGradientColors = new RegExp('((rgba|hsla)?\\([\\d% .,]+\\)|transparent|' + hexMatcher + ')+', 'ig'); // todo: whooooouuuu, is so not-good // todo: add hex greaident match // todo: for tests // "linear-gradient(45deg, rgb(71, 155, 255) 0%, rgb(0, 207, 78) 100%)" // "linear-gradient(45deg, #123321 0%, #543asdbd 100%)" // "linear-gradient(rgb(71, 155, 255) 0%, rgb(0, 207, 78) 100%)" // "radial-gradient(circle farthest-side, rgb(34, 148, 215), rgb(39, 82, 150))" function isGradientString(rgbString) { return !!rgbString.trim().match(matcherGradient); } class GradientValue { constructor(value) { this.value = { from: new ColorValue('#ffffff'), to: new ColorValue(Primary.CSS_VAR), angle: GradientValue.DEFAULT_ANGLE, type: GradientValue.DEFAULT_TYPE }; this.setValue(value); } getName() { return this.value.from.getName() + '_' + this.value.to.getName() + '_' + this.getAngle() + '_' + this.getType(); } // todo: parse grad string? setValue(value) { if (main_core.Type.isObject(value)) { if (value instanceof GradientValue) { this.value.from = new ColorValue(value.getFrom()); this.value.to = new ColorValue(value.getTo()); this.value.angle = value.getAngle(); this.value.type = value.getType(); } else { if ('from' in value) { this.value.from = new ColorValue(value.from); } if ('to' in value) { this.value.to = new ColorValue(value.to); } if ('angle' in value) { this.value.angle = main_core.Text.toNumber(value.angle); } if ('type' in value) { this.value.type = value.type; } } } else if (main_core.Type.isString(value) && isGradientString(value)) { this.parseGradientString(value); } return this; } setOpacity(opacity) { this.value.from.setOpacity(opacity); this.value.to.setOpacity(opacity); return this; } parseGradientString(value) { const typeMatches = value.trim().match(matcherGradient); if (!!typeMatches) { this.setValue({ type: typeMatches[1] }); } const angleMatches = value.trim().match(matcherGradientAngle); if (!!angleMatches) { this.setValue({ angle: angleMatches[2] }); } const colorMatches = value.trim().match(matcherGradientColors); if (colorMatches && colorMatches.length > 0) { this.setValue({ from: new ColorValue(colorMatches[0]) }); this.setValue({ to: new ColorValue(colorMatches[colorMatches.length - 1]) }); } } getFrom() { return this.value.from; } getTo() { return this.value.to; } getAngle() { return this.value.angle; } setAngle(angle) { if (main_core.Type.isNumber(angle)) { this.value.angle = Math.min(Math.max(angle, 0), 360); } return this; } getType() { return this.value.type; } setType(type) { if (type === GradientValue.TYPE_RADIAL || type === GradientValue.TYPE_LINEAR) { this.value.type = type; } return this; } getOpacity() { var _ref; return (_ref = (this.value.from.getOpacity() + this.value.to.getOpacity()) / 2) != null ? _ref : defaultColorValueOptions.a; } getStyleString() { const angle = this.value.angle; const type = this.value.type; const fromString = this.value.from.getStyleString(); const toString = this.value.to.getStyleString(); return type === 'linear' ? `linear-gradient(${angle}deg, ${fromString} 0%, ${toString} 100%)` : `radial-gradient(circle farthest-side at 50% 50%, ${fromString} 0%, ${toString} 100%)`; } getStyleStringForOpacity() { return `radial-gradient(at top left, ${this.value.from.getHex()}, transparent)` + `, radial-gradient(at bottom left, ${this.value.to.getHex()}, transparent)`; } static compare(value1, value2, full = true) { const base = ColorValue.compare(value1.getFrom(), value2.getFrom()) && ColorValue.compare(value1.getTo(), value2.getTo()) || ColorValue.compare(value1.getTo(), value2.getFrom()) && ColorValue.compare(value1.getFrom(), value2.getTo()); const ext = full ? value1.getAngle() === value2.getAngle() && value1.getType() === value2.getType() : true; return base && ext; } } GradientValue.TYPE_RADIAL = 'radial'; GradientValue.TYPE_LINEAR = 'linear'; GradientValue.DEFAULT_ANGLE = 180; GradientValue.DEFAULT_TYPE = 'linear'; const defaultType = 'color'; const gradientType = 'gradient'; class Generator { static getDefaultPresets() { return Generator.cache.remember('default', () => { const presets = []; Generator.defaultPresets.forEach(preset => { presets.push({ id: preset.id, type: 'color', items: preset.items.map(item => new ColorValue(hexToHsl(item))) }); }); return presets; }); } static getPrimaryColorPreset() { return this.cache.remember('primary', () => { const preset = { id: 'defaultPrimary', items: [] }; const primary = new ColorValue(main_core.Dom.style(document.documentElement, '--primary').trim()); preset.items.push(new ColorValue(primary)); if (primary.getHsl().s <= 10) { const lBeforeCount = primary.getHsl().l > 50 ? Math.ceil(primary.getHsl().l / 100 * 5) : Math.floor(primary.getHsl().l / 100 * 5); const lAfterCount = 5 - lBeforeCount; const deltaLBefore = primary.getHsl().l / (lBeforeCount + 1); const deltaLAfter = (100 - primary.getHsl().l) / (lAfterCount + 1); for (let i = 1; i <= lBeforeCount; i++) { preset.items.push(new ColorValue(primary).darken(deltaLBefore * i)); } for (let ii = 1; ii <= lAfterCount; ii++) { preset.items.push(new ColorValue(primary).lighten(deltaLAfter * ii)); } const deltaBitrixL = 15; const deltaBitrixS = 15; const bitrixColor = new ColorValue(Generator.BITRIX_COLOR); preset.items[6] = new ColorValue(bitrixColor); preset.items[7] = new ColorValue(bitrixColor.darken(deltaBitrixL).saturate(deltaBitrixS)); preset.items[8] = new ColorValue(bitrixColor.darken(deltaBitrixL).saturate(deltaBitrixS)); bitrixColor.lighten(deltaBitrixL * 2).desaturate(deltaBitrixS * 2); preset.items[9] = new ColorValue(bitrixColor.lighten(deltaBitrixL).desaturate(deltaBitrixS)); preset.items[10] = new ColorValue(bitrixColor.lighten(deltaBitrixL).desaturate(deltaBitrixS)); bitrixColor.darken(deltaBitrixL * 2).saturate(deltaBitrixS * 2); preset.items[11] = new ColorValue(bitrixColor).adjustHue(180); } else { const deltaL = (90 - primary.getHsl().l) / 3; const deltaL2 = (primary.getHsl().l - 10) / 3; const deltaS = (90 - primary.getHsl().s) / 3; const deltaS2 = (primary.getHsl().s - 10) / 3; preset.items[1] = new ColorValue(primary.darken(deltaL2).saturate(deltaS)); preset.items[2] = new ColorValue(primary.darken(deltaL2).saturate(deltaS)); preset.items[3] = new ColorValue(primary.darken(deltaL2).saturate(deltaS)); primary.lighten(deltaL2 * 3).desaturate(deltaS * 3); preset.items[4] = new ColorValue(primary.desaturate(deltaS2).lighten(deltaL)); preset.items[5] = new ColorValue(primary.desaturate(deltaS2).lighten(deltaL)); preset.items[11] = new ColorValue(primary.desaturate(deltaS2).lighten(deltaL)); primary.saturate(deltaS2 * 3).darken(deltaL * 3); preset.items[7] = new ColorValue(primary.adjustHue(40)); preset.items[8] = new ColorValue(primary.adjustHue(-80)); preset.items[9] = new ColorValue(primary.adjustHue(180)); preset.items[6] = new ColorValue(primary.adjustHue(40)); preset.items[10] = new ColorValue(primary.adjustHue(40)); } return preset; }); } static getBlackAndWhitePreset() { return this.cache.remember('blackAndWhite', () => { const preset = { id: 'blackAndWhite', items: [] }; const start = new ColorValue('#ffffff'); preset.items.push(new ColorValue(start)); preset.items.push(new ColorValue(start.darken(14.28))); preset.items.push(new ColorValue(start.darken(14.28))); preset.items.push(new ColorValue(start.darken(14.28))); preset.items.push(new ColorValue(start.darken(14.28))); preset.items.push(new ColorValue(start.darken(14.28))); preset.items.push(new ColorValue(start.darken(14.28))); preset.items.push(new ColorValue(start.darken(14.32))); return preset; }); } static getGradientByColorOptions(options) { const items = []; const pairs = [[1, 2], [1, 4], [5, 12], [1, 8], [8, 9], [1, 9], [10, 7], [7, 11]]; pairs.forEach(pair => { items.push(new GradientValue({ from: new ColorValue(options.items[pair[0] - 1]), to: new ColorValue(options.items[pair[1] - 1]), angle: GradientValue.DEFAULT_ANGLE, type: GradientValue.DEFAULT_TYPE })); }); return { type: gradientType, items: items }; } } Generator.BITRIX_COLOR = '#2fc6f6'; Generator.cache = new main_core.Cache.MemoryCache(); Generator.defaultPresets = [{ id: 'agency', items: ['#ff6366', '#40191a', '#803233', '#bf4b4d', '#e65a5c', '#ffc1c2', '#363643', '#57dca3', '#ee76ba', '#ffa864', '#eaeaec', '#fadbdc'] }, { id: 'accounting', items: ['#a5c33c', '#384215', '#6f8228', '#8fa834', '#b0cf40', '#dae6ae', '#4c4c4c', '#5d84e6', '#cd506b', '#fe6466', '#dfdfdf', '#e9f0cf'] }, { id: 'app', items: ['#4fd2c2', '#1f524c', '#379187', '#46b8aa', '#54dece', '#c8f1ec', '#6639b6', '#e81c62', '#9a69ca', '#6279d8', '#ffc337', '#e9faf8'] }, { id: 'architecture', items: ['#c94645', '#4a1919', '#8a2f2f', '#b03c3c', '#d64949', '#eec3c3', '#363643', '#446d90', '#a13773', '#c98145', '#eaeaec', '#f9e8e7'] }, { id: 'business', items: ['#3949a0', '#232c61', '#313e87', '#3e4fad', '#556ced', '#d8d7dc', '#14122c', '#1d1937', '#a03949', '#2f295a', '#c87014', '#f4f4f5'] }, { id: 'charity', items: ['#f5f219', '#f58419', '#f5cc19', '#a8e32a', '#f9f76a', '#fcfbb6', '#000000', '#262e37', '#74797f', '#e569b1', '#edeef0', '#fefedf'] }, { id: 'construction', items: ['#f7b70b', '#382a02', '#785905', '#b88907', '#dea509', '#fdf1d1', '#111111', '#a3a3a3', '#f7410b', '#f70b4b', '#d6dde9', '#fef9ea'] }, { id: 'consulting', items: ['#21a79b', '#38afa5', '#14665f', '#1c8c83', '#30f2e2', '#a9ddd9', '#ec4672', '#58d400', '#f0ac00', '#2d6faf', '#2da721', '#e6f5f4'] }, { id: 'corporate', items: ['#6ab8ee', '#31556e', '#4e86ad', '#5fa3d4', '#70c1fa', '#d2e9f8', '#36e2c0', '#ffaa3c', '#ee6a76', '#ffa468', '#5feb99', '#ebf4fb'] }, { id: 'courses', items: ['#6bda95', '#2c593d', '#4b9969', '#5ebf83', '#70e69d', '#c2f0d3', '#31556e', '#ff947d', '#738ed3', '#f791ab', '#ffb67d', '#e2f8eb'] }, { id: 'event', items: ['#f73859', '#380d14', '#781c2b', '#b82a42', '#de334f', '#fdbbc6', '#151726', '#ffb553', '#30d59b', '#b265e0', '#edeef0', '#ffeaed'] }, { id: 'gym', items: ['#6b7de0', '#2f3661', '#4d5aa1', '#5f6fc7', '#7284ed', '#e4e8fa', '#333333', '#ffd367', '#a37fe8', '#e06b7d', '#6dc1e0', '#f4f6fd'] }, { id: 'lawyer', items: ['#e74c3c', '#69231b', '#a8382c', '#cf4536', '#f55240', '#f9d0cb', '#4e4353', '#5a505e', '#e7863c', '#38a27f', '#e2e1e3', '#fdeeec'] }, { id: 'photography', items: ['#f7a700', '#382600', '#785200', '#b87d00', '#de9800', '#fde8ba', '#333333', '#0b5aa0', '#e93d18', '#06c4ed', '#3672a8', '#fff6e3'] }, { id: 'restaurant', items: ['#e6125d', '#660829', '#a60d43', '#cc1052', '#f21361', '#facfde', '#0eb88e', '#00946f', '#e04292', '#9b12e6', '#bfde00', '#fef2f6'] }, { id: 'shipping', items: ['#ff0000', '#400000', '#800000', '#bf0000', '#e60000', '#ffb4b4', '#333333', '#ff822a', '#d63986', '#00ac6b', '#ffb800', '#fff3f3'] }, { id: 'spa', items: ['#9dba04', '#313b01', '#667a02', '#86a103', '#a6c704', '#e4ecb9', '#ba7c04', '#cf54bb', '#049dba', '#1d7094', '#eead2f', '#f2f6dd'] }, { id: 'travel', items: ['#ee4136', '#6e1f19', '#ad3128', '#d43c31', '#fa4639', '#fef1f0', '#31353e', '#3e434d', '#ee8036', '#428abc', '#eaebec', '#c3c4c7'] }, { id: 'wedding', items: ['#d65779', '#572431', '#963e55', '#bd4d6b', '#e35d81', '#f7dfe5', '#af58a7', '#6bc34b', '#ec8c60', '#50a098', '#57b9d6', '#fdf4f6'] }]; let _$7 = t => t, _t$7, _t2$4; class Preset extends main_core_events.EventEmitter { constructor(options) { super(); this.cache = new main_core.Cache.MemoryCache(); this.setEventNamespace('BX.Landing.UI.Field.Color.Preset'); this.id = options.id; this.type = options.type || defaultType; this.items = options.items; this.activeItem = null; } getId() { return this.id; } getGradientPreset() { const options = this.type === gradientType ? { type: gradientType, items: this.items } : Generator.getGradientByColorOptions({ items: this.items }); return new Preset(options); } getLayout() { return this.cache.remember('layout', () => { return main_core.Tag.render(_t$7 || (_t$7 = _$7` <div class="landing-ui-field-color-preset"> ${0} </div> `), this.items.map(item => { return this.getItemLayout(item.getName()); })); }); } getItemLayout(name) { return this.cache.remember(name, () => { const color = this.getItemByName(name); const style = main_core.Type.isString(color) ? color : color.getStyleString(); const item = main_core.Tag.render(_t2$4 || (_t2$4 = _$7` <div class="landing-ui-field-color-preset-item" style="background: ${0}" data-name="${0}" ></div> `), style, name); main_core.Event.bind(item, 'click', this.onItemClick.bind(this)); return item; }); } getItemByName(name) { return this.items.find(item => name === item.getName()) || null; } isPresetValue(value) { if (value === null) { return false; } return this.items.some(item => { if (item instanceof ColorValue && value instanceof ColorValue) { return ColorValue.compare(item, new ColorValue(value).setOpacity(1)); } else if (item instanceof GradientValue && value instanceof GradientValue) { return GradientValue.compare(item, value, false); } return false; }); } onItemClick(event) { this.setActiveItem(event.currentTarget.dataset.name); let value = null; if (this.activeItem !== null) { value = this.activeItem instanceof GradientValue ? new GradientValue(this.activeItem) : new ColorValue(this.activeItem); } this.emit('onChange', { color: value }); } setActiveItem(name) { this.activeItem = this.getItemByName(name); this.items.forEach(item => { const itemName = item.getName(); if (name === itemName) { main_core.Dom.addClass(this.getItemLayout(itemName), Preset.ACTIVE_CLASS); } else { main_core.Dom.removeClass(this.getItemLayout(itemName), Preset.ACTIVE_CLASS); } }); } setActiveValue(value) { if (value !== null) { if (value instanceof GradientValue) { this.setActiveItem(new GradientValue(value).setAngle(GradientValue.DEFAULT_ANGLE).setType(GradientValue.DEFAULT_TYPE).getName()); } else { this.setActiveItem(new ColorValue(value).setOpacity(1).getName()); } } } unsetActive() { this.items.forEach(item => { main_core.Dom.removeClass(this.getItemLayout(item.getName()), Preset.ACTIVE_CLASS); }); } isActive() { return this.items.some(item => { return main_core.Dom.hasClass(this.getItemLayout(item.getName()), Preset.ACTIVE_CLASS); }); } } Preset.ACTIVE_CLASS = 'active'; let _$8 = t => t, _t$8, _t2$5, _t3$2, _t4$2, _t5$1; class PresetCollection extends main_core_events.EventEmitter { constructor(options) { super(); this.presets = {}; this.activeId = null; this.cache = new main_core.Cache.MemoryCache(); this.setEventNamespace('BX.Landing.UI.Field.Color.PresetCollection'); this.popupId = 'presets-popup_' + main_core.Text.getRandom(); this.popupTargetContainer = options.contentRoot; this.onPresetClick = this.onPresetClick.bind(this); main_core.Event.bind(this.getOpenButton(), 'click', () => { this.getPopup().toggle(); }); this.onPresetChangeGlobal = this.onPresetChangeGlobal.bind(this); main_core_events.EventEmitter.subscribe('BX.Landing.UI.Field.Color.PresetCollection:onChange', this.onPresetChangeGlobal); } addDefaultPresets() { this.addPreset(Generator.getPrimaryColorPreset()); Generator.getDefaultPresets().map(item => { this.addPreset(item); }); } addPreset(options) { this.cache.delete('popupLayout'); if (!Object.keys(this.presets).length || !(options.id in this.presets)) { this.presets[options.id] = options; } } getGlobalActiveId() { return PresetCollection.globalActiveId; } getActiveId() { return this.getGlobalActiveId() || this.getDefaultPreset().getId(); } getActivePreset() { return this.getPresetById(this.getActiveId()); } getDefaultPreset() { return Object.keys(this.presets).length ? this.getPresetById(Object.keys(this.presets)[0]) : null; } getPresetById(id) { if (id in this.presets) { return this.cache.remember(id, () => new Preset(this.presets[id])); } else { return null; } } getPresetByItemValue(value) { if (value === null) { return null; } for (let id in this.presets) { const preset = this.getPresetById(id); if (preset && value instanceof ColorValue) { if (preset.isPresetValue(value)) { return preset; } } else if (preset && value instanceof GradientValue) { if (preset.getGradientPreset().isPresetValue(value)) { return preset; } } } return null; } getLayout() { return this.cache.remember('value', () => { return main_core.Tag.render(_t$8 || (_t$8 = _$8` <div class="landing-ui-field-color-presets"> <div class="landing-ui-field-color-presets-left"> <span class="landing-ui-field-color-presets-title"> ${0} </span> </div> <div class="landing-ui-field-color-presets-right">${0}</div> </div> `), main_core.Loc.getMessage('LANDING_FIELD_COLOR-PRESETS_TITLE'), this.getOpenButton()); }); } getOpenButton() { return this.cache.remember('openButton', () => { return main_core.Tag.render(_t2$5 || (_t2$5 = _$8`<span class="landing-ui-field-color-presets-open"> ${0} </span>`), main_core.Loc.getMessage('LANDING_FIELD_COLOR-PRESETS_MORE')); }); } getTitleContainer() { return this.cache.remember('titleContainer', () => { return this.getLayout().querySelector('.landing-ui-field-color-presets-left'); }); } getPopup() { // todo: bind to event target? or need button return this.cache.remember('popup', () => { return main_popup.PopupManager.create({ id: this.popupId, className: 'presets-popup', autoHide: true, bindElement: this.getOpenButton(), bindOptions: { forceTop: true, forceLeft: true }, width: 280, offsetLeft: -200, content: this.getPopupLayout(), closeByEsc: true, targetContainer: this.popupTargetContainer }); }); } getPopupLayout() { return this.cache.remember('popupLayout', () => { const layouts = main_core.Tag.render(_t3$2 || (_t3$2 = _$8`<div class="landing-ui-field-color-presets-popup"> <div class="landing-ui-field-color-presets-popup-title"> ${0} </div> <div class="landing-ui-field-color-presets-popup-inner"></div> </div>`), main_core.Loc.getMessage('LANDING_FIELD_COLOR-PRESETS_MORE_COLORS')); const innerLayouts = layouts.querySelector('.landing-ui-field-color-presets-popup-inner'); for (const presetId in this.presets) { const layout = this.getPresetLayout(presetId); if (presetId === this.getActiveId()) { main_core.Dom.addClass(layout, PresetCollection.ACTIVE_CLASS); this.activeId = presetId; } main_core.Event.bind(layout, 'click', this.onPresetClick); main_core.Dom.append(layout, innerLayouts); } return layouts; }); } getPresetLayout(presetId) { return this.cache.remember(presetId + 'layout', () => { return main_core.Tag.render(_t4$2 || (_t4$2 = _$8` <div class="landing-ui-field-color-presets-preset" data-id="${0}"> ${0} </div> `), presetId, this.presets[presetId].items.map(item => { return main_core.Tag.render(_t5$1 || (_t5$1 = _$8`<div class="landing-ui-field-color-presets-preset-item" style="background: ${0}" ></div>`), main_core.Type.isString(item) ? item : item.getStyleString()); })); }); } onPresetClick(event) { this.getPopup().close(); this.setActiveItem(event.currentTarget.dataset.id); this.emit('onChange', { presetId: this.getActiveId() }); } onPresetChangeGlobal(event) { if (event.getData().presetId !== this.activeId) { this.setActiveItem(event.getData().presetId); this.emit('onChange', event); } } setActiveItem(presetId) { if (presetId !== null && presetId !== this.activeId) { PresetCollection.globalActiveId = presetId; this.activeId = presetId; for (const id in this.presets) { main_core.Dom.removeClass(this.getPresetLayout(id), PresetCollection.ACTIVE_CLASS); if (id === presetId) { main_core.Dom.addClass(this.getPresetLayout(id), PresetCollection.ACTIVE_CLASS); } } } } unsetActive() { for (const presetId in this.presets) { main_core.Dom.removeClass(this.getPresetLayout(presetId), PresetCollection.ACTIVE_CLASS); } } } PresetCollection.globalActiveId = null; PresetCollection.ACTIVE_CLASS = 'active'; let _$9 = t => t, _t$9; class Reset extends main_core_events.EventEmitter { constructor(options) { super(); this.options = options; this.cache = new main_core.Cache.MemoryCache(); this.setEventNamespace('BX.Landing.UI.Field.Color.Reset'); main_core.Event.bind(this.getLayout(), 'click', () => this.onClick()); const hint = BX.UI.Hint.createInstance({ popupParameters: { targetContainer: options.contentRoot, padding: 0 } }); hint.init(this.getLayout()); } getLayout() { if (this.options && !this.options.styleNode) { return null; } return this.cache.remember('layout', () => { return main_core.Tag.render(_t$9 || (_t$9 = _$9` <div class="landing-ui-field-color-reset-container"> <div class="landing-ui-field-color-reset" data-hint="${0}" data-hint-no-icon > </div> </div> `), main_core.Loc.getMessage('LANDING_FIELD_COLOR-RESET_HINT_2')); }); } onClick() { this.emit('onReset'); } } let _$a = t => t, _t$a, _t2$6; class ColorSet extends BaseControl { constructor(options) { super(); this.options = options; this.setEventNamespace('BX.Landing.UI.Field.Color.ColorSet'); this.reset = new Reset(options); this.reset.subscribe('onReset', () => { this.emit('onReset'); }); this.blackAndWhitePreset = new Preset(Generator.getBlackAndWhitePreset()); this.blackAndWhitePreset.subscribe('onChange', event => { this.preset.unsetActive(); this.onPresetItemChange(event); }); this.colorpicker = new Colorpicker(options); this.colorpicker.subscribe('onChange', event => { this.preset.unsetActive(); this.blackAndWhitePreset.unsetActive(); const color = event.getData().color; if (this.preset.isPresetValue(color)) { this.preset.setActiveValue(color); this.colorpicker.unsetActive(); } else if (this.blackAndWhitePreset.isPresetValue(color)) { this.blackAndWhitePreset.setActiveValue(color); this.colorpicker.unsetActive(); } this.onChange(event); }); this.presets = new PresetCollection(options); this.presets.subscribe('onChange', event => { this.setPreset(this.presets.getPresetById(event.getData().presetId)); }); this.presets.addDefaultPresets(); const preset = this.presets.getActivePreset(); if (preset) { this.setPreset(preset); } } buildLayout() { main_core.Dom.append(this.reset.getLayout(), this.presets.getTitleContainer()); return main_core.Tag.render(_t$a || (_t$a = _$a` <div class="landing-ui-field-color-colorset"> <div class="landing-ui-field-color-colorset-top"> ${0} </div> ${0} <div class="landing-ui-field-color-colorset-bottom"> ${0} ${0} </div> </div> `), this.presets.getLayout(), this.getPresetContainer(), this.blackAndWhitePreset.getLayout(), this.colorpicker.getLayout()); } getTitleLayout() { return this.cache.remember('titleLayout', () => { return this.getLayout().querySelector('.landing-ui-field-color-colorset-title'); }); } getPresetContainer() { return this.cache.remember('presetContainer', () => { return main_core.Tag.render(_t2$6 || (_t2$6 = _$a`<div class="landing-ui-field-color-colorset-preset-container"></div>`)); }); } setPreset(preset) { this.preset = preset; this.preset.unsetActive(); if (this.getValue() !== null && this.preset.isPresetValue(this.getValue())) { this.unsetActive(); this.preset.setActiveValue(this.getValue()); } else { this.unsetActive(); this.colorpicker.setValue(this.getValue()); } if (this.getValue() === null && this.options.content) { this.setColorFromContent(); } this.preset.subscribe('onChange', event => { this.blackAndWhitePreset.unsetActive(); this.onPresetItemChange(event); }); main_core.Dom.clean(this.getPresetContainer()); main_core.Dom.append(preset.getLayout(), this.getPresetContainer()); this.emit('onPresetChange', { preset: preset }); } getPreset() { return this.preset; } getPresetsCollection() { return this.presets; } onPresetItemChange(event) { this.colorpicker.setValue(event.getData().color); this.colorpicker.unsetActive(); this.onChange(event); } onChange(event) { this.cache.set('value', event.getData().color); this.emit('onChange', event); } getValue() { return this.cache.remember('value', () => { return this.colorpicker.getValue(); }); } setValue(value) { if (this.isNeedSetValue(value)) { super.setValue(value); this.colorpicker.setValue(value); const activePreset = this.presets.getGlobalActiveId() ? this.presets.getPresetById(this.presets.getGlobalActiveId()) : this.presets.getPresetByItemValue(value); if (activePreset !== null) { this.setPreset(activePreset); this.presets.setActiveItem(activePreset.getId()); } if (value !== null && this.blackAndWhitePreset.isPresetValue(value)) { this.unsetActive(); this.blackAndWhitePreset.setActiveValue(value); } } } unsetActive() { this.preset.unsetActive(); this.blackAndWhitePreset.unsetActive(); this.colorpicker.unsetActive(); } isActive() { return this.preset.isActive() || this.blackAndWhitePreset.isActive() || this.colorpicker.isActive(); } setColorFromContent() { const contentValue = this.options.content; let contentHslColor = ''; if (contentValue.startsWith('#')) { contentHslColor = hexToHsl(contentValue); } if (contentValue.startsWith('hsl')) { contentHslColor = hslStringToHsl(contentValue); } if (main_core.Type.isObject(contentHslColor)) { const contentColorValue = new ColorValue({ h: contentHslColor.h, s: contentHslColor.s, l: contentHslColor.l, a: contentHslColor.a }); this.unsetActive(); this.colorpicker.setValue(contentColorValue); } } } let _$b = t => t, _t$b, _t2$7, _t3$3; class Opacity extends BaseControl { constructor(options) { super(); this.setEventNamespace('BX.Landing.UI.Field.Color.Opacity'); this.defaultOpacity = main_core.Type.isObject(options) && Reflect.has(options, 'defaultOpacity') ? options.defaultOpacity : Opacity.DEFAULT_OPACITY; this.document = landing_pageobject.PageObject.getRootWindow().document; this.onPickerDragStart = this.onPickerDragStart.bind(this); this.onPickerDragMove = this.onPickerDragMove.bind(this); this.onPickerDragEnd = this.onPickerDragEnd.bind(this); this.layout = this.getLayout(); this.pickerControl = this.layout.querySelector('.landing-ui-field-color-opacity'); this.rangeControl = this.layout.querySelector('.landing-ui-field-color-opacity-range-output'); this.arrowsUp = this.rangeControl.querySelector('.landing-ui-field-color-opacity-range-output-arrows-up'); this.arrowsDown = this.rangeControl.querySelector('.landing-ui-field-color-opacity-range-output-arrows-down'); this.rangeInput = this.rangeControl.querySelector('.landing-ui-field-color-opacity-range-output-input'); main_core.Event.bind(this.arrowsUp, 'click', this.onArrowClick.bind(this, 'up')); main_core.Event.bind(this.arrowsDown, 'click', this.onArrowClick.bind(this, 'down')); main_core.Event.bind(this.pickerControl, 'mousedown', this.onPickerDragStart); } buildLayout() { const defaultOpacityValue = this.defaultOpacity * 100; const layout = main_core.Tag.render(_t$b || (_t$b = _$b` <div class="landing-ui-field-color-opacity-container"> <div class="landing-ui-field-color-opacity"> ${0} ${0} </div> <div class="landing-ui-field-color-opacity-range-output"> <div class="landing-ui-field-color-opacity-range-output-input" title="${0}"> ${0} </div> <div class="landing-ui-field-color-opacity-range-output-arrows"> <div class="landing-ui-field-color-opacity-range-output-arrows-up"></div> <div class="landing-ui-field-color-opacity-range-output-arrows-down"></div> </div> </div> </div> `), this.getPicker(), this.getColorLayout(), defaultOpacityValue, defaultOpacityValue); this.setPickerPosByOpacity(this.defaultOpacity); return layout; } onPickerDragStart(event) { if (event.ctrlKey || event.metaKey || event.button) { return; } main_core.Event.bind(this.document, 'mousemove', this.onPickerDragMove); main_core.Event.bind(this.document, 'mouseup', this.onPickerDragEnd); main_core.Dom.addClass(this.document.body, 'landing-ui-field-color-draggable'); this.onPickerDragMove(event); } onPickerDragMove(event) { if (event.target === this.getPicker()) { return; } this.setPickerPos(event.pageX); this.onChange(); this.onRangeControlChange(); } onPickerDragEnd() { main_core.Event.unbind(this.document, 'mousemove', this.onPickerDragMove); main_core.Event.unbind(this.document, 'mouseup', this.onPickerDragEnd); main_core.Dom.removeClass(this.document.body, 'landing-ui-field-color-draggable'); } /** * Set picker by absolute page coords * @param x */ setPickerPos(x) { const leftPos = Math.max(Math.min(x - this.getLayoutRect().left, this.getLayoutRect().width), 0); main_core.Dom.style(this.getPicker(), { left: `${leftPos}px` }); } setPickerPosByOpacity(opacity) { opacity = Math.min(1, Math.max(0, opacity)); main_core.Dom.style(this.getPicker(), { left: `${opacity * 100}%` }); } getLayoutRect() { return this.cache.remember('layoutSize', () => { const layoutRect = this.pickerControl.getBoundingClientRect(); return { width: layoutRect.width, left: layoutRect.left }; }); } getColorLayout() { return this.cache.remember('colorLayout', () => { return main_core.Tag.render(_t2$7 || (_t2$7 = _$b` <div class="landing-ui-field-color-opacity-color"></div> `)); }); } getPicker() { return this.cache.remember('picker', () => { return main_core.Tag.render(_t3$3 || (_t3$3 = _$b` <div class="landing-ui-field-color-opacity-picker"> <div class="landing-ui-field-color-opacity-picker-item"> <div class="landing-ui-field-color-opacity-picker-item-circle"></div> </div> </div>`)); }); } getDefaultValue() { return this.cache.remember('default', () => { return new ColorValue(Opacity.DEFAULT_COLOR).setOpacity(this.defaultOpacity); }); } getValue() { return this.cache.remember('value', () => { const pickerLeft = main_core.Text.toNumber(main_core.Dom.style(this.getPicker(), 'left')); const layoutWidth = main_core.Text.toNumber(this.pickerControl.getBoundingClientRect().width); return this.getDefaultValue().setOpacity(pickerLeft / layoutWidth); }); } setValue(value) { const valueToSet = !main_core.Type.isNull(value) ? value : this.getDefaultValue(); super.setValue(valueToSet); if (!main_core.Type.isNull(value)) { main_core.Dom.style(this.getColorLayout(), { background: valueToSet.getStyleStringForOpacity() }); this.setPickerPosByOpacity(valueToSet.getOpacity()); this.onRangeControlChange(); } else { main_core.Dom.style(this.getColorLayout(), { background: 'none' }); } } onRangeControlChange() { const opacity = parseInt(this.getValue().getOpacity() * 100); this.rangeInput.title = opacity; this.rangeInput.innerHTML = opacity; } onArrowClick(arrowName) { let newOpacityInputValue; const opacity = this.getValue().getOpacity(); const opacityInputValue = parseInt(opacity * 100); if (arrowName === 'up') { if (opacityInputValue < 100) { newOpacityInputValue = (opacityInputValue + 5) / 100; } else { newOpacityInputValue = opacityInputValue / 100; } } if (arrowName === 'down') { if (opacityInputValue > 0) { newOpacityInputValue = (opacityInputValue - 5) / 100; } else { newOpacityInputValue = opacityInputValue / 100; } } this.rangeInput.title = parseInt(newOpacityInputValue * 100); this.rangeInput.innerHTML = parseInt(newOpacityInputValue * 100); const width = this.pickerControl.getBoundingClientRect().width; const leftPos = width - width * (1 - newOpacityInputValue); main_core.Dom.style(this.getPicker(), { left: `${leftPos}px` }); this.onChange(); } } Opacity.DEFAULT_COLOR = '#cccccc'; Opacity.DEFAULT_OPACITY = 1; let _$c = t => t, _t$c, _t2$8, _t3$4, _t4$3, _t5$2, _t6; class Tabs extends main_core_events.EventEmitter { constructor() { super(); this.setEventNamespace('BX.Landing.UI.Field.Color.Tabs'); this.tabs = []; this.cache = new main_core.Cache.MemoryCache(); this.multiple = true; this.isBig = false; this.onToggle = this.onToggle.bind(this); } setMultiple(multiple) { this.multiple = multiple; return this; } setBig(big) { this.isBig = big; this.multiple = false; return this; } appendTab(id, title, items) { const tab = new Tab({ id: id, title: title, items: main_core.Type.isArray(items) ? items : [items] }); this.tabs.push(tab); this.bindEvents(tab); this.cache.delete('layout'); return this; } prependTab(id, title, items) { const tab = new Tab({ id: id, title: title, items: main_core.Type.isArray(items) || [items] }); this.tabs.unshift(tab); this.bindEvents(tab); this.cache.delete('layout'); return this; } bindEvents(tab) { tab.subscribe('onToggle', this.onToggle); tab.subscribe('onShow', this.onToggle); tab.subscribe('onHide', this.onToggle); } onToggle(event) { this.emit('onToggle', event); } showTab(id) { if (!this.multiple) { this.tabs.forEach(tab => { tab.hide(); }); } const tab = this.getTabById(id); if (tab) { tab.show(); } return this; } getTabById(id) { return this.tabs.find(tab => { return tab.id === id; }); } getLayout() { return this.cache.remember('layout', () => { const additional = this.isBig ? ' landing-ui-field-color-tabs--big' : ''; const layout = main_core.Tag.render(_t$c || (_t$c = _$c`<div class="landing-ui-field-color-tabs${0}"></div>`), additional); if (this.isBig) { const head = main_core.Tag.render(_t2$8 || (_t2$8 = _$c` <div class="landing-ui-field-color-tabs-head landing-ui-field-color-tabs-head--big"></div> `)); const content = main_core.Tag.render(_t3$4 || (_t3$4 = _$c` <div class="landing-ui-field-color-tabs-content landing-ui-field-color-tabs-content--big"></div> `)); this.tabs.forEach(tab => { main_core.Dom.append(tab.getTitle(), head); main_core.Dom.append(tab.getLayout(), content); }); main_core.Dom.append(head, layout); main_core.Dom.append(content, layout); } else { this.tabs.forEach(tab => { const tabLayout = main_core.Tag.render(_t4$3 || (_t4$3 = _$c`<div class="landing-ui-field-color-tabs-tab"> ${0}${0} </div>`), tab.getTitle(), tab.getLayout()); main_core.Dom.append(tabLayout, layout); }); } // events this.tabs.forEach(tab => { main_core.Event.bind(tab.getTitle(), 'click', () => { if (!this.multiple) { this.tabs.forEach(tab => { tab.hide(); }); } tab.toggle(); }); }); return layout; }); } } class Tab extends main_core_events.EventEmitter { constructor(options) { super(); this.id = options.id; this.title = options.title; this.items = options.items; this.cache = new main_core.Cache.MemoryCache(); } getId() { return this.id; } getTitle() { return this.cache.remember('title', () => { return main_core.Tag.render(_t5$2 || (_t5$2 = _$c` <span class="landing-ui-field-color-tabs-tab-toggler"> <span class="landing-ui-field-color-tabs-tab-toggler-icon"></span> <span class="landing-ui-field-color-tabs-tab-toggler-name">${0}</span> </span> `), this.title); }); } getLayout() { return this.cache.remember('layout', () => { return main_core.Tag.render(_t6 || (_t6 = _$c` <div class="landing-ui-field-color-tabs-tab-content"> ${0} </div> `), this.items.map(item => item.getLayout())); }); } toggle() { main_core.Dom.toggleClass(this.getLayout(), Tab.SHOW_CLASS); main_core.Dom.toggleClass(this.getTitle(), Tab.SHOW_CLASS); this.emit('onToggle', { tab: this.title }); return this; } show() { main_core.Dom.addClass(this.getLayout(), Tab.SHOW_CLASS); main_core.Dom.addClass(this.getTitle(), Tab.SHOW_CLASS); this.emit('onShow', { tab: this.title }); return this; } hide() { main_core.Dom.removeClass(this.getLayout(), Tab.SHOW_CLASS); main_core.Dom.removeClass(this.getTitle(), Tab.SHOW_CLASS); this.emit('onHide', { tab: this.title }); return this; } } Tab.SHOW_CLASS = 'show'; let _$d = t => t, _t$d; class Zeroing extends main_core_events.EventEmitter { constructor(options) { super(); this.options = options; this.cache = new main_core.Cache.MemoryCache(); this.setEventNamespace('BX.Landing.UI.Field.Color.Zeroing'); main_core.Event.bind(this.getLayout(), 'click', () => this.onClick()); } getLayout() { let textCode = 'LANDING_FIELD_COLOR-ZEROING_TITLE_2'; if (this.options) { if (!this.options.styleNode) { return null; } if (this.options.textCode) { textCode = this.options.textCode; } } return this.cache.remember('layout', () => { return main_core.Tag.render(_t$d || (_t$d = _$d`<div class="landing-ui-field-color-zeroing"> <div class="landing-ui-field-color-zeroing-preview"> <div class="landing-ui-field-color-zeroing-state"></div> </div> <span class="landing-ui-field-color-primary-text"> ${0} </span> </div>`), main_core.Loc.getMessage(textCode)); }); } onClick() { this.emit('onChange', { color: null }); } setActive() { main_core.Dom.addClass(this.getLayout(), Zeroing.ACTIVE_CLASS); } unsetActive() { main_core.Dom.removeClass(this.getLayout(), Zeroing.ACTIVE_CLASS); } isActive() { return main_core.Dom.hasClass(this.getLayout(), Zeroing.ACTIVE_CLASS); } } Zeroing.ACTIVE_CLASS = 'active'; let _$e = t => t, _t$e; class Color extends BaseProcessor { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.Color'); this.property = 'color'; this.variableName = '--color'; this.className = 'g-color'; this.colorSet = new ColorSet(options); this.colorSet.subscribe('onChange', this.onColorSetChange.bind(this)); this.colorSet.subscribe('onReset', this.onReset.bind(this)); this.opacity = new Opacity(); this.opacity.subscribe('onChange', this.onOpacityChange.bind(this)); const zeroingOptions = { styleNode: options.styleNode }; this.zeroing = new Zeroing(zeroingOptions); this.zeroing.subscribe('onChange', this.onZeroingChange.bind(this)); this.primary = new Primary(options); this.primary.subscribe('onChange', this.onPrimaryChange.bind(this)); this.tabs = new Tabs().appendTab('Opacity', main_core.Loc.getMessage('LANDING_FIELD_COLOR-TAB_OPACITY'), this.opacity); } isNullValue(value) { return value === null || value === 'none' || value === 'rgba(0, 0, 0, 0)'; } getNullValue() { return new ColorValue('rgba(0, 0, 0, 0)'); } buildLayout() { return main_core.Tag.render(_t$e || (_t$e = _$e` <div class="landing-ui-field-color-color"> ${0} ${0} ${0} ${0} </div> `), this.colorSet.getLayout(), this.primary.getLayout(), this.zeroing.getLayout(), this.tabs.getLayout()); } onColorSetChange(event) { this.primary.unsetActive(); this.zeroing.unsetActive(); const color = event.getData().color; if (color !== null) { color.setOpacity(this.opacity.getValue().getOpacity()); } this.opacity.setValue(color); this.onChange(); } onOpacityChange() { this.onChange(); } onPrimaryChange(event) { this.colorSet.setValue(event.getData().color); this.onColorSetChange(event); this.colorSet.unsetActive(); this.zeroing.unsetActive(); this.primary.setActive(); } onZeroingChange(event) { this.colorSet.unsetActive(); this.primary.unsetActive(); this.zeroing.setActive(); this.setValue(event.getData().color); // todo: need reload computed props and reinit this.onChange(event); } unsetActive() { this.colorSet.unsetActive(); this.primary.unsetActive(); } setValue(value) { const valueObj = value !== null ? new ColorValue(value) : null; this.colorSet.setValue(valueObj); this.opacity.setValue(valueObj); // todo: what about opacity in primary? if (this.primary.isPrimaryValue(valueObj)) { this.primary.setActive(); this.colorSet.unsetActive(); } if (value !== null && valueObj.getOpacity() < 1) { this.tabs.showTab('Opacity'); } } getValue() { return this.cache.remember('value', () => { const value = this.primary.isActive() ? this.primary.getValue() : this.colorSet.getValue(); return value === null ? null : value.setOpacity(this.opacity.getValue().getOpacity()); }); } setDefaultValue(value) { this.zeroing.setActive(); if (!main_core.Type.isNull(value)) { this.colorSet.colorpicker.hex.setActive(); } super.setDefaultValue(value); } onReset() { this.zeroing.unsetActive(); super.onReset(); } setActiveControl(controlName) { if (controlName === 'primary') { this.primary.setActive(); } if (controlName === 'hex') { this.colorSet.colorpicker.hexPreview.setActive(); } } defineActiveControl(items, styleNode) { if (!main_core.Type.isUndefined(styleNode)) { let oldClass; let activeControl; const node = styleNode.getNode(); if (node.length > 0) { items.forEach(item => { if (main_core.Dom.hasClass(node[0], item.value)) { oldClass = item.value; } }); if (oldClass) { const reg = /g-[a-z]+-[a-z0-9-]+/i; const found = oldClass.match(reg); if (found) { const reg = /primary/i; const found = oldClass.match(reg); this.zeroing.unsetActive(); if (found) { activeControl = 'primary'; } else { activeControl = 'hex'; } } } if (activeControl) { this.setActiveControl(activeControl); } } } } } Color.PRIMARY_VAR = 'var(--primary)'; class ColorHover extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.ColorHover'); this.property = 'color'; this.variableName = '--color-hover'; this.className = 'g-color--hover'; this.pseudoClass = ':hover'; } } let _$f = t => t, _t$f, _t2$9, _t3$5, _t4$4, _t5$3, _t6$1, _t7; class Gradient extends BaseControl { constructor(options) { super(); this.ROTATE_STEP = 45; this.setEventNamespace('BX.Landing.UI.Field.Color.Gradient'); this.popupId = 'gradient_popup_' + main_core.Text.getRandom(); this.popupTargetContainer = options.contentRoot; this.colorpickerFrom = new Colorpicker(options); this.colorpickerFrom.subscribe('onChange', event => { this.onColorChange(event.getData().color, null); }); this.colorpickerTo = new Colorpicker(options); this.colorpickerTo.subscribe('onChange', event => { this.onColorChange(null, event.getData().color); }); main_core.Event.bind(this.getPopupButton(), 'click', this.onPopupOpen.bind(this)); main_core.Event.bind(this.getRotateButton(), 'click', this.onRotate.bind(this)); main_core.Event.bind(this.getSwitchTypeButton(), 'click', this.onSwitchType.bind(this)); main_core.Event.bind(this.getSwapButton(), 'click', this.onSwap.bind(this)); this.preset = null; } onColorChange(fromValue, toValue) { if (fromValue === null && toValue === null) { return; } const valueToSet = this.getValue() || new GradientValue(); const fromValueToSet = fromValue || valueToSet.getFrom() || new GradientValue().getFrom(); const toValueToSet = toValue || valueToSet.getTo() || new GradientValue().getTo(); valueToSet.setValue({ from: fromValueToSet, to: toValueToSet }); this.setValue(valueToSet); this.preset.unsetActive(); this.onChange(); } onPopupOpen() { this.getPopup().toggle(); } onRotate(event) { // todo: not set colorpicker active if (!Gradient.isButtonEnable(event.target)) { return; } const value = this.getValue(); if (value !== null) { value.setValue({ angle: (value.getAngle() + this.ROTATE_STEP) % 360 }); this.setValue(value); this.onChange(); } this.getPopup().close(); } onSwitchType(event) { // todo: not set colorpicker active if (!Gradient.isButtonEnable(event.target)) { return; } const value = this.getValue(); if (value !== null) { if (value.getType() === GradientValue.TYPE_LINEAR) { value.setValue({ type: GradientValue.TYPE_RADIAL }); Gradient.disableButton(this.getRotateButton()); } else { value.setValue({ type: GradientValue.TYPE_LINEAR }); Gradient.enableButton(this.getRotateButton()); } this.setValue(value); this.onChange(); } this.getPopup().close(); } onSwap(event) { // todo: not set colorpicker active if (!Gradient.isButtonEnable(event.target)) { return; } const value = this.getValue(); if (value !== null) { value.setValue({ to: value.getFrom(), from: value.getTo() }); this.setValue(value); this.onChange(); } this.getPopup().close(); } static disableButton(button) { main_core.Dom.addClass(button, Gradient.DISABLE_CLASS); } static enableButton(button) { main_core.Dom.removeClass(button, Gradient.DISABLE_CLASS); } static isButtonEnable(button) { return !main_core.Dom.hasClass(button, Gradient.DISABLE_CLASS); } correctColorpickerColors() { const value = this.getValue(); if (value !== null) { const angle = value.getAngle(); const hexFrom = this.colorpickerFrom.getHexPreviewObject(); const hexTo = this.colorpickerTo.getHexPreviewObject(); const colorFrom = value.getFrom(); const colorTo = value.getTo(); if (value.getType() === GradientValue.TYPE_LINEAR) { if (angle === 270 || angle === 90) { const median = ColorValue.getMedian(colorFrom, colorTo).getContrast().getHex(); hexFrom.adjustColors(median, 'transparent'); hexTo.adjustColors(median, 'transparent'); } else if (angle >= 135 && angle <= 225) { hexFrom.adjustColors(colorFrom.getContrast().getHex(), 'transparent'); hexTo.adjustColors(colorTo.getContrast().getHex(), 'transparent'); } else { hexFrom.adjustColors(colorTo.getContrast().getHex(), 'transparent'); hexTo.adjustColors(colorFrom.getContrast().getHex(), 'transparent'); } } else if (value.getType() === GradientValue.TYPE_RADIAL) { hexFrom.adjustColors(colorTo.getContrast().getHex(), 'transparent'); hexTo.adjustColors(colorTo.getContrast().getHex(), 'transparent'); } } } getPopup() { return this.cache.remember('popup', () => { return main_popup.PopupManager.create({ id: this.popupId, className: 'landing-ui-field-color-gradient-preset-popup', autoHide: true, bindElement: this.getPopupButton(), bindOptions: { forceTop: true, forceLeft: true }, offsetLeft: 15, angle: { offset: -5 }, padding: 0, contentPadding: 7, content: this.getPopupContent(), closeByEsc: true, targetContainer: this.popupTargetContainer }); }); } getPopupContent() { return this.cache.remember('popupContainer', () => { return main_core.Tag.render(_t$f || (_t$f = _$f` <div class="landing-ui-field-color-gradient-preset-popup-container"> ${0} ${0} </div> `), this.getRotateButton(), this.getSwapButton()); }); } buildLayout() { if (this.preset) { main_core.Dom.clean(this.getPresetContainer()); main_core.Dom.append(this.preset.getLayout(), this.getPresetContainer()); } return main_core.Tag.render(_t2$9 || (_t2$9 = _$f` <div class="landing-ui-field-color-gradient"> ${0} <div class="landing-ui-field-color-gradient-container"> <div class="landing-ui-field-color-gradient-from">${0}</div> ${0} <div class="landing-ui-field-color-gradient-to">${0}</div> </div> <div class="landing-ui-field-color-gradient-switch-type-container"> ${0} </div> </div> `), this.getPresetContainer(), this.colorpickerFrom.getLayout(), this.getPopupButton(), this.colorpickerTo.getLayout(), this.getSwitchTypeButton()); } getContainerLayout() { // todo: do better after change vyorstka return this.getLayout().querySelector('.landing-ui-field-color-gradient-container'); } getPresetContainer() { return this.cache.remember('presetContainer', () => { return main_core.Tag.render(_t3$5 || (_t3$5 = _$f`<div class="landing-ui-field-color-gradient-preset-container"></div>`)); }); } getPopupButton() { return this.cache.remember('popupButton', () => { return main_core.Tag.render(_t4$4 || (_t4$4 = _$f`<span class="landing-ui-field-color-gradient-open-popup"></span>`)); }); } getSwitchTypeButton() { return this.cache.remember('switchTypeButton', () => { return main_core.Tag.render(_t5$3 || (_t5$3 = _$f` <span class="landing-ui-field-color-gradient-switch-type" title="${0}" ></span>`), main_core.Loc.getMessage('LANDING_FIELD_COLOR-GRADIENT_SWITCH_TYPE')); }); } getRotateButton() { return this.cache.remember('rotateButton', () => { return main_core.Tag.render(_t6$1 || (_t6$1 = _$f` <span class="landing-ui-field-color-gradient-rotate" title="${0}" ></span>`), main_core.Loc.getMessage('LANDING_FIELD_COLOR-GRADIENT_ROTATE')); }); } getSwapButton() { return this.cache.remember('swapButton', () => { return main_core.Tag.render(_t7 || (_t7 = _$f` <span class="landing-ui-field-color-gradient-swap" title="${0}" ></span>`), main_core.Loc.getMessage('LANDING_FIELD_COLOR-GRADIENT_SWAP')); }); } setPreset(preset) { this.preset = preset; this.preset.unsetActive(); this.preset.subscribe('onChange', event => { this.setValue(event.getData().color); this.unsetColorpickerActive(); this.onChange(event); }); main_core.Dom.clean(this.getPresetContainer()); main_core.Dom.append(preset.getLayout(), this.getPresetContainer()); } getPreset() { return this.preset; } getValue() { return this.cache.remember('value', () => { if (this.colorpickerFrom.getValue() === null || this.colorpickerTo.getValue() === null) { return null; } let rotate = this.getRotateButton().dataset.rotate; rotate = rotate ? main_core.Text.toNumber(rotate) : 0; const type = this.getSwitchTypeButton().dataset.type || GradientValue.TYPE_LINEAR; return new GradientValue({ from: this.colorpickerFrom.getValue(), to: this.colorpickerTo.getValue(), angle: rotate, type: type }); }); } setValue(value) { super.setValue(value); if (value === null) { this.colorpickerFrom.setValue(null); this.colorpickerTo.setValue(null); this.unsetActive(); main_core.Dom.style(this.getContainerLayout(), 'background', new GradientValue().getStyleString()); Gradient.disableButton(this.getRotateButton()); Gradient.disableButton(this.getSwitchTypeButton()); Gradient.disableButton(this.getSwapButton()); } else { // todo: how set default type and rotation? this.colorpickerFrom.setValue(value.getFrom()); this.colorpickerTo.setValue(value.getTo()); this.correctColorpickerColors(); this.getRotateButton().dataset.rotate = value.getAngle(); this.getSwitchTypeButton().dataset.type = value.getType(); main_core.Dom.style(this.getRotateButton(), 'transform', `rotate(${value.getAngle()}deg)`); main_core.Dom.style(this.getContainerLayout(), 'background', this.getValue().getStyleString()); Gradient.enableButton(this.getSwitchTypeButton()); Gradient.enableButton(this.getSwapButton()); if (value.getType() === GradientValue.TYPE_RADIAL) { Gradient.disableButton(this.getRotateButton()); this.getSwitchTypeButton().innerText = main_core.Loc.getMessage('LANDING_FIELD_COLOR-GRADIENT_DO_LINEAR'); } else { Gradient.enableButton(this.getRotateButton()); this.getSwitchTypeButton().innerText = main_core.Loc.getMessage('LANDING_FIELD_COLOR-GRADIENT_DO_RADIAL'); } this.setActive(); } } onChange(event) { this.cache.delete('value'); this.emit('onChange', { gradient: this.getValue() }); } setActive() { const value = this.getValue(); if (this.preset.isPresetValue(value)) { this.preset.setActiveValue(value); this.unsetColorpickerActive(); } else { this.preset.unsetActive(); this.setColorpickerActive(); } } unsetActive() { this.preset.unsetActive(); this.unsetColorpickerActive(); } setColorpickerActive() { main_core.Dom.addClass(this.getContainerLayout(), Gradient.ACTIVE_CLASS); } unsetColorpickerActive() { this.colorpickerFrom.unsetActive(); this.colorpickerTo.unsetActive(); main_core.Dom.removeClass(this.getContainerLayout(), Gradient.ACTIVE_CLASS); } } Gradient.DISABLE_CLASS = 'disable'; class BgColor extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.BgColor'); this.property = ['background-image', 'background-color']; this.variableName = '--bg'; this.className = 'g-bg'; this.activeControl = null; this.gradient = new Gradient(options); this.gradient.subscribe('onChange', this.onGradientChange.bind(this)); this.tabs.prependTab('Gradient', main_core.Loc.getMessage('LANDING_FIELD_COLOR-TAB_GRADIENT'), this.gradient); this.setGradientPreset(this.colorSet.getPreset()); this.colorSet.subscribe('onPresetChange', event => { this.setGradientPreset(event.getData().preset); }); this.tabs.subscribe('onToggle', this.onTabsToggle.bind(this)); } setGradientPreset(preset) { const gradientPreset = preset.getGradientPreset(); this.gradient.setPreset(gradientPreset); gradientPreset.subscribe('onChange', () => { this.activeControl = this.gradient; this.onChange(); }); const value = this.getValue(); if (value !== null && value instanceof GradientValue) { if (this.gradient.getPreset().isPresetValue(value)) { this.colorSet.getPreset().unsetActive(); this.gradient.getPreset().setActiveValue(value); this.gradient.unsetColorpickerActive(); } } } onColorSetChange(event) { this.activeControl = this.colorSet; this.gradient.unsetActive(); super.onColorSetChange(event); } onGradientChange(event) { this.activeControl = this.gradient; this.colorSet.unsetActive(); const gradValue = event.getData().gradient; if (gradValue !== null) { this.opacity.setValue(gradValue.setOpacity(this.opacity.getValue().getOpacity())); } this.onChange(); } onOverlayOpacityChange() { this.onChange(); } onTabsToggle() { this.gradient.getPopup().close(); } unsetActive() { this.colorSet.unsetActive(); this.gradient.unsetActive(); this.primary.unsetActive(); } setValue(value) { this.colorSet.setValue(null); this.gradient.setValue(null); this.unsetActive(); this.activeControl = null; if (main_core.Type.isNil(value)) ; else if (isRgbString(value) || isHex(value) || isHslString(value) || isCssVar(value)) { super.setValue(value); this.activeControl = this.colorSet; } else if (isGradientString(value)) { this.activeControl = this.gradient; const gradientValue = new GradientValue(value); this.gradient.setValue(gradientValue); this.opacity.setValue(gradientValue); const presets = this.colorSet.getPresetsCollection(); const activePreset = presets.getGlobalActiveId() ? presets.getPresetById(presets.getGlobalActiveId()) : presets.getPresetByItemValue(gradientValue); if (activePreset !== null && activePreset !== this.colorSet.getPreset()) { this.colorSet.setPreset(activePreset); this.setGradientPreset(activePreset); } this.tabs.showTab('Gradient'); if (gradientValue.getOpacity() < 1) { this.tabs.showTab('Opacity'); } } } getValue() { return this.cache.remember('value', () => { if (this.activeControl === null) { return null; } else if (this.activeControl === this.gradient) { const gradValue = this.gradient.getValue(); return gradValue === null ? gradValue : gradValue.setOpacity(this.opacity.getValue().getOpacity()); } else { return super.getValue(); } }); } } const matcherBgImage = /url\(['"]?([^ '"]*)['"]?\)([\w \/]*)/i; function isBgImageString(bgImage) { if (!!bgImage.trim().match(matcherBgImage)) { return true; } return !!bgImage.trim().match(getMatcherWithOverlay()); } function getMatcherWithOverlay() { const matcherBgString = regexpToString(matcherBgImage); const matcherGradientString = regexpToString(matcherGradient); return new RegExp(`^${matcherGradientString},${matcherBgString}`); } class BgImageValue { constructor(value) { // todo: add 2x, file ids this.value = defaultBgImageValueOptions; this.setValue(value); } getName() { return ` ${this.value.url.replace(/[^\w\d]/g, '')}_${this.value.size}_${this.value.attachment} `; } setValue(value) { if (main_core.Type.isObject(value)) { if (value instanceof BgImageValue) { // todo: add 2x and file IDs this.value.url = value.getUrl(); this.value.url2x = value.getUrl2x(); this.value.fileId = value.getFileId(); this.value.fileId2x = value.getFileId2x(); this.value.size = value.getSize(); this.value.attachment = value.getAttachment(); } else { this.value = { ...this.value, ...value }; } } if (main_core.Type.isString(value) && isBgImageString(value)) { this.parseBgString(value); } return this; } parseBgString(string) { // todo: check matcher for 2x const options = defaultBgImageValueOptions; const matchesBg = string.trim().match(regexpWoStartEnd(matcherBgImage)); if (!!matchesBg) { options.url = matchesBg[1]; options.size = matchesBg[2].indexOf('auto') === -1 ? defaultBgImageSize : 'auto'; options.attachment = matchesBg[2].indexOf('fixed') === -1 ? defaultBgImageAttachment : 'fixed'; } const matchesOverlay = string.trim().match(regexpWoStartEnd(matcherGradientColors)); if (!!string.trim().match(regexpWoStartEnd(matcherGradient)) && !!matchesOverlay) { options.overlay = new ColorValue(matchesOverlay[0]); } this.setValue(options); } setOpacity(opacity) { // todo: what for image? return this; } setUrl(value) { this.setValue({ url: value }); return this; } setUrl2x(value) { this.setValue({ url2x: value }); return this; } setFileId(value) { this.setValue({ fileId: value }); return this; } setFileId2x(value) { this.setValue({ fileId2x: value }); return this; } setSize(value) { this.setValue({ size: value }); return this; } setAttachment(value) { this.setValue({ attachment: value }); return this; } setOverlay(value) { this.setValue({ overlay: value }); return this; } getUrl() { return this.value.url; } getUrl2x() { return this.value.url2x; } getFileId() { return this.value.fileId; } getFileId2x() { return this.value.fileId2x; } getSize() { return this.value.size; } getAttachment(needBool = false) { return needBool ? this.value.attachment === 'fixed' : this.value.attachment; } getOverlay() { return this.value.overlay; } getOpacity() { // todo: how image can have opacity? return 1; } getStyleString() { let style = ''; if (this.value.overlay !== null) { style = `linear-gradient(${this.value.overlay.getStyleString()},${this.value.overlay.getStyleString()})`; } // todo: what if url is null const { url, url2x, size, attachment } = this.value; const endString = `center / ${size} ${attachment}`; if (url !== null) { style = style.length ? style + ',' : ''; if (url2x !== null) { style += `-webkit-image-set(url('${url}') 1x, url('${url2x}') 2x) ${endString},`; style += `image-set(url('${url}') 1x, url('${url2x}') 2x) ${endString},`; } style += `url('${url}') ${endString}`; } return style; } getStyleStringForOpacity() { // todo: how image can have opacity? return ''; } static getSizeItemsForButtons() { return [{ name: main_core.Loc.getMessage('LANDING_FIELD_COLOR-BG_COVER'), value: 'cover' }, { name: main_core.Loc.getMessage('LANDING_FIELD_COLOR-BG_MOSAIC'), value: 'auto' }]; } static getAttachmentValueByBool(value) { return value ? 'fixed' : 'scroll'; } } let _$g = t => t, _t$g; class Image extends BaseControl { // todo: move to type constructor(options) { super(); this.setEventNamespace('BX.Landing.UI.Field.Color.Image'); this.options = options; this.imgField = new landing_ui_field_image.Image({ id: 'landing_ui_color_image_' + main_core.Text.getRandom().toLowerCase(), className: 'landing-ui-field-color-image-image', contextType: landing_ui_field_image.Image.CONTEXT_TYPE_STYLE, compactMode: true, disableLink: true, disableAltField: true, allowClear: true, isAiImageAvailable: landing_env.Env.getInstance().getOptions()['ai_image_available'], isAiImageActive: landing_env.Env.getInstance().getOptions()['ai_image_active'], aiUnactiveInfoCode: landing_env.Env.getInstance().getOptions()['ai_unactive_info_code'], dimensions: { width: 1920 }, uploadParams: { action: "Block::uploadFile", block: this.options.block.id }, contentRoot: this.options.contentRoot }); this.imgField.subscribe('change', this.onImageChange.bind(this)); this.sizeField = new BX.Landing.UI.Field.Dropdown({ id: 'landing_ui_color_image_size_' + main_core.Text.getRandom().toLowerCase(), title: main_core.Loc.getMessage('LANDING_FIELD_COLOR-BG_SIZE_TITLE'), className: 'landing-ui-field-color-image-size', items: BgImageValue.getSizeItemsForButtons(), onChange: this.onSizeChange.bind(this), contentRoot: this.options.contentRoot }); this.attachmentField = new BX.Landing.UI.Field.Checkbox({ id: 'landing_ui_color_image_attach_' + main_core.Text.getRandom().toLowerCase(), className: 'landing-ui-field-color-image-attachment', multiple: false, compact: true, items: [{ name: main_core.Loc.getMessage('LANDING_FIELD_COLOR-BG_FIXED'), value: 'fixed' }], onChange: this.onAttachmentChange.bind(this), value: [this.getAttachmentValue()] }); } buildLayout() { return main_core.Tag.render(_t$g || (_t$g = _$g` <div class="landing-ui-field-color-image"> ${0} ${0} ${0} </div> `), this.imgField.getLayout(), this.sizeField.getLayout(), this.attachmentField.getLayout()); } onImageChange(event) { const value = this.getValue() || new BgImageValue(); if (event.getData().value.src) { value.setUrl(event.getData().value.src); value.setFileId(event.getData().value.id); if (event.getData().value.src2x) { value.setUrl2x(event.getData().value.src2x); value.setFileId2x(event.getData().value.id2x); } } else { value.setUrl(null); value.setFileId(null); value.setUrl2x(null); value.setFileId2x(null); } this.setValue(value); this.onChange(); this.saveNode(value); } saveNode(value) { const style = this.options.styleNode; const block = this.options.block; let selector; if (style.selector === block.selector || style.selector === block.makeAbsoluteSelector(block.selector)) { selector = '#wrapper'; } else if (!style.isSelectGroup()) { selector = BX.Landing.Utils.join(style.selector.split("@")[0], "@", style.getElementIndex(style.getNode()[0])); } else { selector = style.selector.split("@")[0]; } const data = { [selector]: {} }; data[selector].id = value.getFileId() || -1; data[selector].id2x = value.getFileId2x() || -1; landing_backend.Backend.getInstance().action("Landing\\Block::updateNodes", { lid: this.options.block.lid, block: this.options.block.id, data: data }); } onSizeChange(size) { if (main_core.Type.isString(size)) { const value = this.getValue() || new BgImageValue(); value.setSize(size); this.setValue(value); this.onChange(); } } onAttachmentChange(event) { if (event instanceof main_core_events.BaseEvent) { const value = this.getValue() || new BgImageValue(); value.setAttachment(BgImageValue.getAttachmentValueByBool(this.attachmentField.getValue())); this.setValue(value); this.onChange(); } } onChange(event) { this.cache.delete('value'); this.emit('onChange', { data: { image: this.getValue() } }); } getValue() { // todo: get size and attachement from controls return this.cache.remember('value', () => { const imgValue = this.imgField.getValue(); const url = imgValue.src; if (url === null) { return null; } else { const value = new BgImageValue({ url: url, fileId: imgValue.id }); if (imgValue.src2x) { value.setUrl2x(imgValue.src2x); value.setFileId2x(imgValue.fileId2x); } const size = this.sizeField.getValue(); if (size !== null) { value.setSize(size); } value.setAttachment(BgImageValue.getAttachmentValueByBool(this.attachmentField.getValue())); // todo: set overlay return value; } }); } setValue(value) { if (this.isNeedSetValue(value)) { // todo: can delete prev image super.setValue(value); if (value === null) { this.imgField.setValue({ src: '' }, true); // todo: what set size and attachement? } else { if (value.getUrl() !== null) { this.setActive(); } const imgFieldValue = { type: 'image', src: value.getUrl(), id: value.getFileId() }; if (value.getUrl2x()) { imgFieldValue.src2x = value.getUrl2x(); imgFieldValue.id2x = value.getFileId2x(); } this.imgField.setValue(imgFieldValue, true); this.sizeField.setValue(this.getSizeValue(), true); this.attachmentField.setValue([this.getAttachmentValue()]); } } } setActive() { main_core.Dom.addClass(this.imgField.getLayout(), Image.ACTIVE_CLASS); } unsetActive() { main_core.Dom.removeClass(this.imgField.getLayout(), Image.ACTIVE_CLASS); } getAttachmentValue() { if (this.options && this.options.block && this.options.block.content && main_core.Dom.hasClass(this.options.block.content, 'g-bg-image')) { const blockContentStyle = window.getComputedStyle(this.options.block.content); const bgAttachmentValue = blockContentStyle.getPropertyValue('background-attachment'); return bgAttachmentValue.includes('fixed') ? 'fixed' : 'scroll'; } return 'scroll'; } getSizeValue() { if (this.options && this.options.block && this.options.block.content && main_core.Dom.hasClass(this.options.block.content, 'g-bg-image')) { const blockContentStyle = window.getComputedStyle(this.options.block.content); const bgSizeValue = blockContentStyle.getPropertyValue('background-size'); return bgSizeValue.includes('cover') ? 'cover' : 'auto'; } return 'cover'; } } function rgbaStringToRgbString(str) { const regRgba = /\d{1,3}(\.\d+)?/g; const rgba = str.match(regRgba); const r = rgba[0] ? rgba[0] : null; const g = rgba[1] ? rgba[1] : null; const b = rgba[2] ? rgba[2] : null; if (r === null || g === null || b === null) { return null; } return createRgbString(r, g, b); } function createRgbString(r, g, b) { return 'rgb(' + r + ',' + g + ',' + b + ')'; } let _$h = t => t, _t$h; class Bg extends BgColor { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.Bg'); this.styleNode = options.styleNode; this.parentVariableName = this.variableName; this.variableName = [this.parentVariableName, Bg.BG_URL_VAR, Bg.BG_URL_2X_VAR, Bg.BG_OVERLAY_VAR, Bg.BG_SIZE_VAR, Bg.BG_ATTACHMENT_VAR, Bg.BG_IMAGE]; this.parentClassName = this.className; this.className = 'g-bg-image'; this.image = new Image(options); this.image.subscribe('onChange', this.onImageChange.bind(this)); this.overlay = new ColorSet(options); this.overlay.subscribe('onChange', this.onOverlayColorChange.bind(this)); this.overlayOpacity = new Opacity({ defaultOpacity: 0.5 }); this.overlayOpacity.subscribe('onChange', this.onOverlayOpacityChange.bind(this)); this.overlayPrimary = new Primary(); this.overlayPrimary.subscribe('onChange', this.onOverlayPrimaryChange.bind(this)); const overlayZeroingOptions = { textCode: 'LANDING_FIELD_COLOR_OVERLAY_ZEROING_TITLE_2', styleNode: options.styleNode }; this.overlayZeroing = new Zeroing(overlayZeroingOptions); this.overlayZeroing.subscribe('onChange', this.overlayZeroingChange.bind(this)); this.imageTabs = new Tabs().appendTab('Overlay', main_core.Loc.getMessage('LANDING_FIELD_COLOR-BG_OVERLAY'), [this.overlay, this.overlayPrimary, this.overlayZeroing, this.overlayOpacity]); this.bigTabs = new Tabs().setBig(true).appendTab('Color', main_core.Loc.getMessage('LANDING_FIELD_COLOR-BG_COLOR'), [this.colorSet, this.primary, this.zeroing, this.tabs]).appendTab('Image', main_core.Loc.getMessage('LANDING_FIELD_COLOR-BG_IMAGE'), [this.image, this.imageTabs]); } buildLayout() { return main_core.Tag.render(_t$h || (_t$h = _$h` <div class="landing-ui-field-color-color"> ${0} </div> `), this.bigTabs.getLayout()); } onColorSetChange(event) { this.image.unsetActive(); this.overlay.unsetActive(); super.onColorSetChange(event); } onGradientChange(event) { this.image.unsetActive(); this.overlay.unsetActive(); super.onGradientChange(event); } onImageChange() { // todo: can drop image from b_landing_file after change this.unsetActive(); this.activeControl = this.image; this.image.setActive(); this.modifyStyleNode(this.styleNode); } onOverlayChange(event) { const overlayValue = event.getData().color; if (overlayValue !== null) { overlayValue.setOpacity(this.overlayOpacity.getValue().getOpacity()); } this.overlayOpacity.setValue(overlayValue); const imageValue = this.image.getValue(); if (imageValue !== null) { this.image.setValue(imageValue.setOverlay(overlayValue)); this.activeControl = this.image; this.image.setActive(); this.colorSet.unsetActive(); this.gradient.unsetActive(); } this.modifyStyleNode(this.styleNode); } onOverlayOpacityChange() { this.modifyStyleNode(this.styleNode); } onOverlayColorChange(event) { this.overlayPrimary.unsetActive(); this.overlayZeroing.unsetActive(); this.onOverlayChange(event); } onOverlayPrimaryChange(event) { this.overlay.unsetActive(); this.overlayZeroing.unsetActive(); this.onOverlayChange(event); } overlayZeroingChange(event) { this.overlay.unsetActive(); this.overlayPrimary.unsetActive(); this.overlayZeroing.setActive(); this.onOverlayChange(event); } unsetActive() { super.unsetActive(); this.image.unsetActive(); } /** * Set value by new format */ setProcessorValue(value) { this.cache.delete('value'); this.setValue(value); } setValue(value) { this.image.setValue(null); this.bigTabs.showTab('Color'); if (main_core.Type.isNull(value)) { super.setValue(value); } else if (main_core.Type.isString(value)) { super.setValue(value); } else if (this.parentVariableName in value && main_core.Type.isString(value[this.parentVariableName])) { super.setValue(value[this.parentVariableName]); } else if (main_core.Type.isObject(value)) { // todo: super.setValue null? const bgValue = new BgImageValue(); if (Bg.BG_URL_VAR in value) { bgValue.setUrl(value[Bg.BG_URL_VAR].replace(/url\(["']/i, '').replace(/['"]\)/i, '')); } if (Bg.BG_URL_2X_VAR in value) { bgValue.setUrl2x(value[Bg.BG_URL_2X_VAR].replace(/url\(["']/i, '').replace(/['"]\)/i, '')); } if (Bg.BG_SIZE_VAR in value) { bgValue.setSize(value[Bg.BG_SIZE_VAR]); } if (Bg.BG_ATTACHMENT_VAR in value) { bgValue.setAttachment(value[Bg.BG_ATTACHMENT_VAR]); } if (Bg.BG_OVERLAY_VAR in value) { bgValue.setOverlay(new ColorValue(value[Bg.BG_OVERLAY_VAR])); } this.image.setValue(bgValue); this.bigTabs.showTab('Image'); this.activeControl = this.image; this.imageTabs.showTab('Overlay'); if (Bg.BG_OVERLAY_VAR in value) { const overlayValue = new ColorValue(value[Bg.BG_OVERLAY_VAR]); this.overlay.setValue(overlayValue); this.overlayOpacity.setValue(overlayValue); if (value[Bg.BG_OVERLAY_VAR].startsWith('var(--primary') || value['isPrimaryBasedColor'] === true) { this.overlayPrimary.setActive(); this.overlay.unsetActive(); } } else { this.overlayZeroing.setActive(); } } } // todo: create base value instead interface. In this case can return ALL types, color, grad, bg getValue() { return this.cache.remember('value', () => { if (this.activeControl === this.image) { const imageValue = this.image.getValue(); let overlayValue; let isActive = false; if (this.overlay.isActive()) { overlayValue = this.overlay.getValue(); isActive = true; } if (this.overlayPrimary.isActive()) { overlayValue = this.overlayPrimary.getValue(); isActive = true; } if (this.overlayZeroing.isActive()) { overlayValue = null; } if (imageValue !== null && overlayValue !== null && isActive) { overlayValue.setOpacity(this.overlayOpacity.getValue().getOpacity()); imageValue.setOverlay(overlayValue); } return imageValue; } else { return super.getValue(); } }); } getClassName() { const value = this.getValue(); if (value === null || value instanceof ColorValue || value instanceof GradientValue) { return [this.parentClassName]; } return [this.className]; } // todo: what about fileid? getStyle() { if (this.getValue() === null) { // todo: not null, but what? return { [this.parentVariableName]: null, [Bg.BG_URL_VAR]: null, [Bg.BG_URL_2X_VAR]: null, [Bg.BG_OVERLAY_VAR]: null, [Bg.BG_SIZE_VAR]: null, [Bg.BG_ATTACHMENT_VAR]: null }; } const value = this.getValue(); let color = null; let image = null; let image2x = null; let overlay = null; let size = null; let attachment = null; const backgroundImage = ''; if (value instanceof ColorValue || value instanceof GradientValue) { // todo: need change class if not a image? color = value.getStyleString(); } else { image = value.getUrl() ? `url('${value.getUrl()}')` : ''; image2x = value.getUrl2x() ? `url('${value.getUrl2x()}')` : ''; overlay = value.getOverlay() ? value.getOverlay().getStyleString() : 'rgba(0, 0, 0, 0)'; size = value.getSize(); attachment = value.getAttachment(); } return { [this.parentVariableName]: color, [Bg.BG_URL_VAR]: image, [Bg.BG_URL_2X_VAR]: image2x ? image2x : image, [Bg.BG_OVERLAY_VAR]: overlay, [Bg.BG_SIZE_VAR]: size, [Bg.BG_ATTACHMENT_VAR]: attachment, [Bg.BG_IMAGE]: backgroundImage }; } modifyStyleNode(styleNode) { main_core.Dom.style(styleNode.getNode()[0], Bg.BG_IMAGE, ''); this.onChange(); } prepareProcessorValue(processorValue, defaultValue) { if (defaultValue && defaultValue.hasOwnProperty(Bg.BG_IMAGE)) { const regUrl = /url\(/i; const searchUrl = defaultValue[Bg.BG_IMAGE].match(regUrl); if (searchUrl !== null) { processorValue[Bg.BG_IMAGE] = ''; processorValue[Bg.BG_SIZE_VAR] = defaultBgImageSize; processorValue[Bg.BG_ATTACHMENT_VAR] = defaultBgImageAttachment; const regUrl = /image-set\(url\(/i; const searchUrl = defaultValue[Bg.BG_IMAGE].match(regUrl); if (searchUrl !== null) { const regSearchUrl = /["'](https?:\/)?\/[\S]*["']/gi; const search = defaultValue[Bg.BG_IMAGE].match(regSearchUrl); if (search) { const regReplace = /["']/g; processorValue[Bg.BG_URL_VAR] = search[0].replaceAll(regReplace, ''); if (search.length === 2) { processorValue[Bg.BG_URL_2X_VAR] = search[1].replaceAll(regReplace, ''); } else { processorValue[Bg.BG_URL_2X_VAR] = search[0].replaceAll(regReplace, ''); } } } else { processorValue[Bg.BG_URL_VAR] = defaultValue[Bg.BG_IMAGE]; processorValue[Bg.BG_URL_2X_VAR] = defaultValue[Bg.BG_IMAGE]; } const computedStyleNode = getComputedStyle(this.styleNode.getNode()[0], ':after'); if (!processorValue[Bg.BG_OVERLAY_VAR]) { processorValue[Bg.BG_OVERLAY_VAR] = computedStyleNode.backgroundColor; } const currentColorRgb = rgbaStringToRgbString(computedStyleNode.backgroundColor); const primaryColorRgb = rgbaStringToRgbString(computedStyleNode.getPropertyValue('--primary-opacity-0')); if (currentColorRgb !== null && primaryColorRgb !== null && currentColorRgb === primaryColorRgb) { processorValue['isPrimaryBasedColor'] = true; } } } return processorValue; } } Bg.BG_URL_VAR = '--bg-url'; Bg.BG_URL_2X_VAR = '--bg-url-2x'; Bg.BG_OVERLAY_VAR = '--bg-overlay'; Bg.BG_SIZE_VAR = '--bg-size'; Bg.BG_ATTACHMENT_VAR = '--bg-attachment'; Bg.BG_IMAGE = 'background-image'; class BorderColor extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.BorderColor'); this.property = 'border-color'; this.variableName = '--border-color'; this.className = 'g-border-color'; } } class BorderColorHover extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.BorderColorHover'); this.property = 'border-color'; this.variableName = '--border-color--hover'; this.className = 'g-border-color--hover'; this.pseudoClass = ':hover'; } } class BgColorHover extends BgColor { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.BgColorHover'); this.property = ['background-image', 'background-color']; this.variableName = '--bg-hover'; this.className = 'g-bg--hover'; this.pseudoClass = ':hover'; } } class BgColorAfter extends BgColor { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.BgColorAfter'); this.property = ['background-image', 'background-color']; this.variableName = '--bg--after'; this.className = 'g-bg--after'; this.pseudoClass = ':after'; const opacityValue = this.getValue() || new ColorValue(); this.opacity.setValue(opacityValue.setOpacity(0.5)); this.tabs.showTab('Opacity'); } } class BgColorBefore extends BgColor { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.BgColorBefore'); this.property = ['background-image', 'background-color']; this.variableName = '--bg--before'; this.className = 'g-bg--before'; this.pseudoClass = ':before'; const opacityValue = this.getValue() || new ColorValue(); this.opacity.setValue(opacityValue.setOpacity(0.5)); this.tabs.showTab('Opacity'); } } class NavbarColor extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.NavbarColor'); this.property = 'color'; this.variableName = '--navbar-color'; this.className = 'u-navbar-color'; } } class NavbarColorHover extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.NavbarColorHover'); this.property = 'color'; this.variableName = '--navbar-color--hover'; this.className = 'u-navbar-color--hover'; this.pseudoClass = ':hover'; } } class NavbarColorFixMoment extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.NavbarColorFixMoment'); this.property = 'color'; this.variableName = '--navbar-color--fix-moment'; this.className = 'u-navbar-color--fix-moment'; } } class NavbarColorFixMomentHover extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.NavbarColorFixMomentHover'); this.property = 'color'; this.variableName = '--navbar-color--fix-moment--hover'; this.className = 'u-navbar-color--fix-moment--hover'; this.pseudoClass = ':hover'; } } class NavbarBgColor extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.NavbarBgColor'); this.property = 'background-color'; this.variableName = '--navbar-bg-color'; this.className = 'u-navbar-bg'; } } class NavbarBgColorHover extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.NavbarBgColorHover'); this.property = 'background-color'; this.variableName = '--navbar-bg-color--hover'; this.className = 'u-navbar-bg--hover'; this.pseudoClass = ':hover'; } } class BorderColorTop extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.BorderColorTop'); this.property = 'border-top-color'; this.variableName = '--border-color-top'; this.className = 'g-border-color-top'; } } class FillColor extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.FillColor'); this.property = 'fill'; this.pseudoClass = ':before'; this.variableName = '--fill-first'; this.className = 'g-fill-first'; } } class FillColorSecond extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.FillColorSecond'); this.property = 'fill'; this.pseudoClass = ':after'; this.variableName = '--fill-second'; this.className = 'g-fill-second'; } } class ButtonColor extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.ButtonColor'); this.property = 'background-color'; // order is important! Base variable must be last. Hack :-/ this.variableName = [ButtonColor.COLOR_CONTRAST_VAR, ButtonColor.COLOR_HOVER_VAR, ButtonColor.COLOR_LIGHT_VAR, ButtonColor.COLOR_VAR]; this.className = 'g-button-color'; //todo: ? } getStyle() { if (this.getValue() === null) { return { [ButtonColor.COLOR_CONTRAST_VAR]: null, [ButtonColor.COLOR_HOVER_VAR]: null, [ButtonColor.COLOR_LIGHT_VAR]: null, [ButtonColor.COLOR_VAR]: null }; } const value = this.getValue(); const valueContrast = value.getContrast().lighten(10); const valueHover = new ColorValue(value).lighten(10); const valueLight = value.getLighten(); return { [ButtonColor.COLOR_CONTRAST_VAR]: valueContrast.getStyleString(), [ButtonColor.COLOR_HOVER_VAR]: valueHover.getStyleString(), [ButtonColor.COLOR_LIGHT_VAR]: valueLight.getStyleString(), [ButtonColor.COLOR_VAR]: value.getStyleString() }; } } ButtonColor.COLOR_CONTRAST_VAR = '--button-color-contrast'; ButtonColor.COLOR_HOVER_VAR = '--button-color-hover'; ButtonColor.COLOR_LIGHT_VAR = '--button-color-light'; ButtonColor.COLOR_VAR = '--button-color'; class NavbarCollapseBgColor extends Color { constructor(options) { super(options); this.setEventNamespace('BX.Landing.UI.Field.Processor.NavbarCollapseBgColor'); this.property = 'background-color'; this.variableName = '--navbar-collapse-bg-color'; this.className = 'u-navbar-collapse-bg'; } } class ColorField extends landing_ui_field_basefield.BaseField { constructor(options) { super(options); this.items = 'items' in options && options.items ? options.items : []; this.postfix = typeof options.postfix === 'string' ? options.postfix : ''; this.frame = typeof options.frame === 'object' ? options.frame : null; const processorOptions = { block: options.block, styleNode: options.styleNode, selector: options.selector, contentRoot: this.contentRoot, content: options.content }; this.changeHandler = typeof options.onChange === "function" ? options.onChange : () => {}; this.valueChangeHandler = typeof options.onValueChange === "function" ? options.onValueChange : () => {}; this.resetHandler = typeof options.onReset === "function" ? options.onReset : function () {}; // todo: rename "subtype" switch (options.subtype) { case 'color': this.processor = new Color(processorOptions); break; case 'color-hover': this.processor = new ColorHover(processorOptions); break; case 'bg': this.processor = new Bg(processorOptions); break; case 'bg-color': this.processor = new BgColor(processorOptions); break; case 'bg-color-hover': this.processor = new BgColorHover(processorOptions); break; case 'bg-color-after': this.processor = new BgColorAfter(processorOptions); break; case 'bg-color-before': this.processor = new BgColorBefore(processorOptions); break; case 'border-color': this.processor = new BorderColor(processorOptions); break; case 'border-color-hover': this.processor = new BorderColorHover(processorOptions); break; case 'border-color-top': this.processor = new BorderColorTop(processorOptions); break; case 'navbar-color': this.processor = new NavbarColor(processorOptions); break; case 'navbar-color-hover': this.processor = new NavbarColorHover(processorOptions); break; case 'navbar-color-fix-moment': this.processor = new NavbarColorFixMoment(processorOptions); break; case 'navbar-color-fix-moment-hover': this.processor = new NavbarColorFixMomentHover(processorOptions); break; case 'navbar-bg-color': this.processor = new NavbarBgColor(processorOptions); break; case 'navbar-bg-color-hover': this.processor = new NavbarBgColorHover(processorOptions); break; case 'navbar-collapse-bg-color': this.processor = new NavbarCollapseBgColor(processorOptions); break; case 'fill-color': this.processor = new FillColor(processorOptions); break; case 'fill-color-second': this.processor = new FillColorSecond(processorOptions); break; case 'button-color': this.processor = new ButtonColor(processorOptions); break; default: break; } this.property = this.processor.getProperty()[this.processor.getProperty().length - 1]; this.processor.getClassName().forEach(item => this.items.push({ name: item, value: item })); // todo: what a input? main_core.Dom.remove(this.input); this.layout.classList.add("landing-ui-field-color"); main_core.Dom.append(this.processor.getLayout(), this.layout); this.processor.subscribe('onChange', this.onChange.bind(this)); this.processor.subscribe('onReset', this.onReset.bind(this)); } getInlineProperties() { return this.processor.getVariableName(); } prepareInlineProperties(props) { props.push('background-image'); return props; } getComputedProperties() { return this.processor.getProperty(); } getPseudoElement() { return this.processor.getPseudoClass(); } onChange() { this.changeHandler({ className: this.processor.getClassName(), style: this.processor.getStyle() }, this.items, this.postfix, this.property); // add fake text field for correctly getValue() in handler const value = this.getValue(); let content = ''; if (value instanceof ColorValue) { content = value.getStyleString(); } else if (value instanceof BgImageValue) { content = value.getUrl(); } else if (value instanceof GradientValue) { content = value.getStyleString(); } this.valueChangeHandler(new landing_ui_field_textfield.TextField({ selector: this.selector, attribute: this.attribute, content: content, textOnly: true })); this.emit('onChange'); } onReset() { this.resetHandler(this.items, this.postfix, this.property); } getValue() { return this.processor.getValue() || this.processor.getNullValue(); } setValue(value) { let processorValue = null; // now for multiple properties get just last value. Maybe, need object-like values this.prepareInlineProperties(this.getInlineProperties()).forEach(prop => { if (prop in value && !this.processor.isNullValue(value[prop])) { if (!main_core.Type.isObject(processorValue)) { processorValue = {}; } processorValue[prop] = value[prop]; } }); let defaultValue = null; this.getComputedProperties().forEach(prop => { if (prop in value && !this.processor.isNullValue(value[prop])) { if (!main_core.Type.isObject(defaultValue)) { defaultValue = {}; } defaultValue[prop] = value[prop]; } }); processorValue = this.processor.prepareProcessorValue(processorValue, defaultValue); if (processorValue !== null) { this.processor.setProcessorValue(processorValue); } else { this.processor.setDefaultValue(defaultValue); this.processor.defineActiveControl(this.items, this.data.styleNode); } } onFrameLoad() { // todo: now not work with "group select", can use just any node from elements. If group - need forEach const value = this.data.styleNode.getValue(true); this.setValue(value.style); } } exports.ColorField = ColorField; }((this.BX.Landing.UI.Field = this.BX.Landing.UI.Field || {}),BX.Landing.UI.Field,BX.Landing.UI.Field,BX.Main,BX,BX,BX.Event,BX.Landing.UI.Field,BX.Landing,BX.Landing,BX.Landing,BX)); //# sourceMappingURL=color_field.bundle.js.map