x4js 1.4.33 → 1.4.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -90,6 +90,7 @@ export interface ColorPickerEditorProps extends ColorPickerProps {
90
90
  label?: string;
91
91
  labelWidth?: number;
92
92
  cust_colors?: Color[];
93
+ displayValue?: false;
93
94
  change: EventCallback<EvChange>;
94
95
  }
95
96
  export declare class ColorPickerEditor extends HLayout<ColorPickerEditorProps, ColorPickerEventMap> {
@@ -516,19 +516,30 @@ class ColorPickerEditor extends layout_1.HLayout {
516
516
  flex: props.labelWidth < 0 ? -props.labelWidth : undefined,
517
517
  width: props.labelWidth >= 0 ? props.labelWidth : undefined,
518
518
  }) : null,
519
- new label_1.Label({
520
- cls: 'value',
519
+ new component_1.Component({
521
520
  flex: 1,
522
- text: color.toHex(),
523
- style: {
524
- backgroundColor: color.toString(),
525
- color: tcolor
526
- },
527
- dom_events: {
528
- click: () => this._showPicker()
529
- }
521
+ content: [
522
+ new label_1.Label({
523
+ cls: 'alpha @fit',
524
+ text: ''
525
+ }),
526
+ new label_1.Label({
527
+ cls: 'value @fit',
528
+ text: props.displayValue === false ? '' : color.toHex(),
529
+ style: {
530
+ backgroundColor: color.toString(),
531
+ color: tcolor
532
+ },
533
+ dom_events: {
534
+ click: () => this._showPicker()
535
+ }
536
+ })
537
+ ],
530
538
  })
531
539
  ]);
540
+ if (props.displayValue === false) {
541
+ this.setStyleValue('background-image', "url( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAEsmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgdGlmZjpJbWFnZVdpZHRoPSIxMCIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJwcm9kdWNlZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWZmaW5pdHkgRGVzaWduZXIgMS45LjAiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/Pn8+b7YAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRy0tCQRSHv7Qwyh5gRIsWEtZKwwyiNi2UXlAt1CCrjV5fgdrlXiOibdBWKIja9FrUX1DboHUQFEUQ7YLWRW0qbueqoESe4cz55jdzDjNnwBLOKFm93gvZXF4LTvid85EFp+0FK5204sURVXR1JjQepqZ93lNnxluPWav2uX+tOZ7QFahrFB5VVC0vPCk8vZZXTd4R7lDS0bjwmbBbkwsK35l6rMSvJqdK/G2yFg4GwNIu7ExVcayKlbSWFZaX48pmVpXyfcyX2BO5uZDEHvFudIJM4MfJFGMEGGKAEZmH8OCjX1bUyPcW82dZkVxFZpV1NJZJkSaPW9RVqZ6QmBQ9ISPDutn/v33Vk4O+UnW7HxqeDeO9F2zb8FMwjK8jw/g5BusTXOYq+SuHMPwheqGiuQ6gbRPOrypabBcutqDrUY1q0aJkFbckk/B2Ci0RcNxA02KpZ+V9Th4gvCFfdQ17+9An59uWfgF7Hmfv4QYbGAAAAAlwSFlzAAALEwAACxMBAJqcGAAAACdJREFUGJVjbGhoYEAC9fX1yFwmBryAptKM////R+Y3NjbSzW4C0gAo9QeQBmhTIwAAAABJRU5ErkJggg=='");
542
+ }
532
543
  this._setTabIndex(props.tabIndex);
533
544
  }
534
545
  set value(color) {
@@ -44,6 +44,43 @@ export interface ICaptureInfo {
44
44
  handler: EventHandler<UIEvent>;
45
45
  iframes: NodeListOf<HTMLIFrameElement>;
46
46
  }
47
+ /** @ignore properties without 'px' unit */
48
+ export declare const _x4_unitless: {
49
+ animationIterationCount: number;
50
+ borderImageOutset: number;
51
+ borderImageSlice: number;
52
+ borderImageWidth: number;
53
+ boxFlex: number;
54
+ boxFlexGroup: number;
55
+ boxOrdinalGroup: number;
56
+ columnCount: number;
57
+ flex: number;
58
+ flexGrow: number;
59
+ flexPositive: number;
60
+ flexShrink: number;
61
+ flexNegative: number;
62
+ flexOrder: number;
63
+ gridRow: number;
64
+ gridColumn: number;
65
+ fontWeight: number;
66
+ lineClamp: number;
67
+ lineHeight: number;
68
+ opacity: number;
69
+ order: number;
70
+ orphans: number;
71
+ tabSize: number;
72
+ widows: number;
73
+ zIndex: number;
74
+ zoom: number;
75
+ fillOpacity: number;
76
+ floodOpacity: number;
77
+ stopOpacity: number;
78
+ strokeDasharray: number;
79
+ strokeDashoffset: number;
80
+ strokeMiterlimit: number;
81
+ strokeOpacity: number;
82
+ strokeWidth: number;
83
+ };
47
84
  /**
48
85
  *
49
86
  */
package/lib/component.js CHANGED
@@ -28,7 +28,7 @@
28
28
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
29
  */
30
30
  Object.defineProperty(exports, "__esModule", { value: true });
31
- exports.Container = exports.SizerOverlay = exports.EvOverlayResize = exports.Separator = exports.EvSize = exports.Space = exports.Flex = exports.flyWrap = exports.Component = exports.EvFocus = exports.EvDblClick = exports.html = exports.isHtmlString = exports.HtmlString = void 0;
31
+ exports.Container = exports.SizerOverlay = exports.EvOverlayResize = exports.Separator = exports.EvSize = exports.Space = exports.Flex = exports.flyWrap = exports.Component = exports.EvFocus = exports.EvDblClick = exports._x4_unitless = exports.html = exports.isHtmlString = exports.HtmlString = void 0;
32
32
  /**
33
33
  * @todo
34
34
  * create Container class
@@ -50,7 +50,7 @@ const _x4_el_store = Symbol();
50
50
  /** @ignore where Component is stored in dom */
51
51
  const _x4_el_sym = Symbol();
52
52
  /** @ignore properties without 'px' unit */
53
- const _x4_unitless = {
53
+ exports._x4_unitless = {
54
54
  animationIterationCount: 1, borderImageOutset: 1, borderImageSlice: 1, borderImageWidth: 1, boxFlex: 1, boxFlexGroup: 1,
55
55
  boxOrdinalGroup: 1, columnCount: 1, flex: 1, flexGrow: 1, flexPositive: 1, flexShrink: 1, flexNegative: 1, flexOrder: 1,
56
56
  gridRow: 1, gridColumn: 1, fontWeight: 1, lineClamp: 1, lineHeight: 1, opacity: 1, order: 1, orphans: 1, tabSize: 1, widows: 1,
@@ -273,7 +273,7 @@ class Component extends base_component_1.BaseComponent {
273
273
  if (value === undefined) {
274
274
  value = null;
275
275
  }
276
- else if (!_x4_unitless[name] && ((0, tools_1.isNumber)(value) || reNumber.test(value))) {
276
+ else if (!exports._x4_unitless[name] && ((0, tools_1.isNumber)(value) || reNumber.test(value))) {
277
277
  value = value + 'px';
278
278
  }
279
279
  this.m_dom.style[name] = value;
package/lib/formatters.js CHANGED
@@ -64,8 +64,9 @@ function money_formatter(input) {
64
64
  return '';
65
65
  }
66
66
  let val = (0, tools_1.roundTo)(typeof (input) == 'string' ? parseFloat(input) : input, 2);
67
- if (val === -0.00)
67
+ if (Object.is(val, -0.00)) {
68
68
  val = 0.00;
69
+ }
69
70
  let res = moneyFmt.format(val);
70
71
  return res;
71
72
  }
package/lib/panel.d.ts CHANGED
@@ -34,6 +34,7 @@ export interface PanelProps<E extends ContainerEventMap = ContainerEventMap> ext
34
34
  title: string;
35
35
  gadgets?: Component[];
36
36
  sens?: 'horizontal' | 'vertical';
37
+ bodyStyle?: any;
37
38
  }
38
39
  export declare class Panel<T extends PanelProps = PanelProps, E extends ContainerEventMap = ContainerEventMap> extends VLayout<T, E> {
39
40
  private m_ui_title;
package/lib/panel.js CHANGED
@@ -41,7 +41,7 @@ class Panel extends layout_1.VLayout {
41
41
  const sens = props?.sens == 'horizontal' ? '@hlayout' : '@vlayout';
42
42
  //todo: cannot be called twice do to content overload
43
43
  this.m_ui_title = new label_1.Label({ cls: 'title', text: this.m_props.title });
44
- this.m_ui_body = new component_1.Component({ cls: 'body ' + sens, content: this.m_props.content });
44
+ this.m_ui_body = new component_1.Component({ cls: 'body ' + sens, content: this.m_props.content, style: props.bodyStyle });
45
45
  }
46
46
  /** @ignore */
47
47
  render() {
@@ -33,6 +33,7 @@ import { Component, CProps } from './component';
33
33
  declare abstract class SVGItem {
34
34
  private m_tag;
35
35
  private m_attrs;
36
+ private m_style;
36
37
  constructor(tag: string);
37
38
  /**
38
39
  * render the item
@@ -61,6 +62,7 @@ declare abstract class SVGItem {
61
62
  * @returns this
62
63
  */
63
64
  attr(name: string, value: string): this;
65
+ style(name: string, value: string): this;
64
66
  /**
65
67
  * add a class
66
68
  * @param name class name to add
@@ -70,6 +72,10 @@ declare abstract class SVGItem {
70
72
  *
71
73
  */
72
74
  renderAttrs(): string;
75
+ /**
76
+ *
77
+ */
78
+ renderStyle(): string;
73
79
  renderContent(): string;
74
80
  }
75
81
  /**
@@ -30,6 +30,8 @@
30
30
  Object.defineProperty(exports, "__esModule", { value: true });
31
31
  exports.SVGComponent = exports.SVGPathBuilder = void 0;
32
32
  const component_1 = require("./component");
33
+ const tools_1 = require("./tools");
34
+ const reNumber = /^-?\d+(\.\d+)?$/;
33
35
  // degrees to radian
34
36
  function d2r(d) {
35
37
  return d * Math.PI / 180.0;
@@ -61,16 +63,18 @@ function clean(a, ...b) {
61
63
  class SVGItem {
62
64
  m_tag;
63
65
  m_attrs;
66
+ m_style;
64
67
  constructor(tag) {
65
68
  this.m_tag = tag;
66
69
  this.m_attrs = new Map();
70
+ this.m_style = new Map();
67
71
  }
68
72
  /**
69
73
  * render the item
70
74
  * @returns
71
75
  */
72
76
  render() {
73
- return `<${this.m_tag} ${this.renderAttrs()}>${this.renderContent()}</${this.m_tag}>`;
77
+ return `<${this.m_tag} ${this.renderAttrs()} ${this.renderStyle()}>${this.renderContent()}</${this.m_tag}>`;
74
78
  }
75
79
  /**
76
80
  * change the stroke color
@@ -109,6 +113,16 @@ class SVGItem {
109
113
  this.m_attrs.set(name, value);
110
114
  return this;
111
115
  }
116
+ style(name, value) {
117
+ if (value === undefined) {
118
+ value = null;
119
+ }
120
+ else if (!component_1._x4_unitless[name] && ((0, tools_1.isNumber)(value) || reNumber.test(value))) {
121
+ value = value + 'px';
122
+ }
123
+ this.m_style.set(name, value);
124
+ return this;
125
+ }
112
126
  /**
113
127
  * add a class
114
128
  * @param name class name to add
@@ -122,12 +136,28 @@ class SVGItem {
122
136
  *
123
137
  */
124
138
  renderAttrs() {
139
+ if (!this.m_attrs.size) {
140
+ return "";
141
+ }
125
142
  let result = '';
126
143
  this.m_attrs.forEach((v, k) => {
127
144
  result += ` ${k} = "${v}"`;
128
145
  });
129
146
  return result;
130
147
  }
148
+ /**
149
+ *
150
+ */
151
+ renderStyle() {
152
+ if (!this.m_style.size) {
153
+ return "";
154
+ }
155
+ let result = 'style="';
156
+ this.m_style.forEach((v, k) => {
157
+ result += `${k}:${v};`;
158
+ });
159
+ return result + '"';
160
+ }
131
161
  renderContent() {
132
162
  return '';
133
163
  }
package/lib/x4.css CHANGED
@@ -1042,6 +1042,8 @@ textarea::selection {
1042
1042
  .x-message-box .x-form .icon,
1043
1043
  .x-important .x-form .icon {
1044
1044
  font-size: 48px;
1045
+ width: 48px;
1046
+ height: 48px;
1045
1047
  color: var(--x4-error-color);
1046
1048
  margin-right: 8px;
1047
1049
  }
@@ -1433,6 +1435,10 @@ textarea::selection {
1433
1435
  height: 16px;
1434
1436
  border: 1px solid rgba(0, 0, 0, 0.4);
1435
1437
  }
1438
+ .x-color-picker-editor .alpha {
1439
+ background-image: url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QA6RXhpZgAATU0AKgAAAAgAA1EAAAQAAAABAAAAAFEBAAMAAAABAAEAAFEEAAEAAAAB/AAAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAQABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9iK90orwugD//2Q==');
1440
+ padding: 4px;
1441
+ }
1436
1442
  .x-color-picker .sel {
1437
1443
  position: absolute;
1438
1444
  left: 10px;
@@ -1504,7 +1510,7 @@ textarea::selection {
1504
1510
  min-height: unset;
1505
1511
  }
1506
1512
  .x-color-picker .alpha {
1507
- background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAEsmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgdGlmZjpJbWFnZVdpZHRoPSIxMCIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJwcm9kdWNlZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWZmaW5pdHkgRGVzaWduZXIgMS45LjAiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/Pn8+b7YAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRy0tCQRSHv7Qwyh5gRIsWEtZKwwyiNi2UXlAt1CCrjV5fgdrlXiOibdBWKIja9FrUX1DboHUQFEUQ7YLWRW0qbueqoESe4cz55jdzDjNnwBLOKFm93gvZXF4LTvid85EFp+0FK5204sURVXR1JjQepqZ93lNnxluPWav2uX+tOZ7QFahrFB5VVC0vPCk8vZZXTd4R7lDS0bjwmbBbkwsK35l6rMSvJqdK/G2yFg4GwNIu7ExVcayKlbSWFZaX48pmVpXyfcyX2BO5uZDEHvFudIJM4MfJFGMEGGKAEZmH8OCjX1bUyPcW82dZkVxFZpV1NJZJkSaPW9RVqZ6QmBQ9ISPDutn/v33Vk4O+UnW7HxqeDeO9F2zb8FMwjK8jw/g5BusTXOYq+SuHMPwheqGiuQ6gbRPOrypabBcutqDrUY1q0aJkFbckk/B2Ci0RcNxA02KpZ+V9Th4gvCFfdQ17+9An59uWfgF7Hmfv4QYbGAAAAAlwSFlzAAALEwAACxMBAJqcGAAAACdJREFUGJVjbGhoYEAC9fX1yFwmBryAptKM////R+Y3NjbSzW4C0gAo9QeQBmhTIwAAAABJRU5ErkJggg==');
1513
+ background-image: url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QA6RXhpZgAATU0AKgAAAAgAA1EAAAQAAAABAAAAAFEBAAMAAAABAAEAAFEEAAEAAAAB/AAAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAQABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9iK90orwugD//2Q==');
1508
1514
  }
1509
1515
  .x-color-picker .alpha .marker {
1510
1516
  position: absolute;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "x4js",
3
- "version": "1.4.33",
3
+ "version": "1.4.37",
4
4
  "description": "X4js core files",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
package/src/alpha.jpg ADDED
Binary file
@@ -630,6 +630,7 @@ export interface ColorPickerEditorProps extends ColorPickerProps {
630
630
  label?: string;
631
631
  labelWidth?: number;
632
632
  cust_colors?: Color[];
633
+ displayValue?: false,
633
634
 
634
635
  change: EventCallback<EvChange>;
635
636
  }
@@ -662,20 +663,32 @@ export class ColorPickerEditor extends HLayout<ColorPickerEditorProps, ColorPick
662
663
  flex: props.labelWidth < 0 ? -props.labelWidth : undefined,
663
664
  width: props.labelWidth >= 0 ? props.labelWidth : undefined,
664
665
  }) : null,
665
- new Label({
666
- cls: 'value',
666
+ new Component( {
667
667
  flex: 1,
668
- text: color.toHex(),
669
- style: {
670
- backgroundColor: color.toString(),
671
- color: tcolor
672
- },
673
- dom_events: {
674
- click: () => this._showPicker()
675
- }
676
- })
668
+ content: [
669
+ new Label({
670
+ cls: 'alpha @fit',
671
+ text: ''
672
+ }),
673
+ new Label({
674
+ cls: 'value @fit',
675
+ text: props.displayValue===false ? '' : color.toHex(),
676
+ style: {
677
+ backgroundColor: color.toString(),
678
+ color: tcolor
679
+ },
680
+ dom_events: {
681
+ click: () => this._showPicker()
682
+ }
683
+ })
684
+ ],
685
+ } )
677
686
  ]);
678
687
 
688
+ if( props.displayValue===false ) {
689
+ this.setStyleValue( 'background-image', "url( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAEsmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgdGlmZjpJbWFnZVdpZHRoPSIxMCIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJwcm9kdWNlZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWZmaW5pdHkgRGVzaWduZXIgMS45LjAiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/Pn8+b7YAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRy0tCQRSHv7Qwyh5gRIsWEtZKwwyiNi2UXlAt1CCrjV5fgdrlXiOibdBWKIja9FrUX1DboHUQFEUQ7YLWRW0qbueqoESe4cz55jdzDjNnwBLOKFm93gvZXF4LTvid85EFp+0FK5204sURVXR1JjQepqZ93lNnxluPWav2uX+tOZ7QFahrFB5VVC0vPCk8vZZXTd4R7lDS0bjwmbBbkwsK35l6rMSvJqdK/G2yFg4GwNIu7ExVcayKlbSWFZaX48pmVpXyfcyX2BO5uZDEHvFudIJM4MfJFGMEGGKAEZmH8OCjX1bUyPcW82dZkVxFZpV1NJZJkSaPW9RVqZ6QmBQ9ISPDutn/v33Vk4O+UnW7HxqeDeO9F2zb8FMwjK8jw/g5BusTXOYq+SuHMPwheqGiuQ6gbRPOrypabBcutqDrUY1q0aJkFbckk/B2Ci0RcNxA02KpZ+V9Th4gvCFfdQ17+9An59uWfgF7Hmfv4QYbGAAAAAlwSFlzAAALEwAACxMBAJqcGAAAACdJREFUGJVjbGhoYEAC9fX1yFwmBryAptKM////R+Y3NjbSzW4C0gAo9QeQBmhTIwAAAABJRU5ErkJggg=='" );
690
+ }
691
+
679
692
  this._setTabIndex(props.tabIndex);
680
693
  }
681
694
 
package/src/component.ts CHANGED
@@ -67,7 +67,7 @@ const _x4_el_store = Symbol();
67
67
  const _x4_el_sym = Symbol();
68
68
 
69
69
  /** @ignore properties without 'px' unit */
70
- const _x4_unitless = {
70
+ export const _x4_unitless = {
71
71
  animationIterationCount: 1, borderImageOutset: 1, borderImageSlice: 1, borderImageWidth: 1, boxFlex: 1, boxFlexGroup: 1,
72
72
  boxOrdinalGroup: 1, columnCount: 1, flex: 1, flexGrow: 1, flexPositive: 1, flexShrink: 1, flexNegative: 1, flexOrder: 1,
73
73
  gridRow: 1, gridColumn: 1, fontWeight: 1, lineClamp: 1, lineHeight: 1, opacity: 1, order: 1, orphans: 1, tabSize: 1, widows: 1,
package/src/formatters.ts CHANGED
@@ -74,7 +74,9 @@ export function money_formatter(input: any): string {
74
74
  }
75
75
 
76
76
  let val: number = roundTo(typeof (input) == 'string' ? parseFloat(input) : input, 2);
77
- if (val === -0.00) val = 0.00;
77
+ if (Object.is(val, -0.00)) {
78
+ val = 0.00;
79
+ }
78
80
 
79
81
  let res = moneyFmt.format(val);
80
82
  return res;
package/src/panel.ts CHANGED
@@ -41,6 +41,7 @@ export interface PanelProps<E extends ContainerEventMap = ContainerEventMap> ex
41
41
  title: string;
42
42
  gadgets?: Component[];
43
43
  sens?: 'horizontal' | 'vertical'; // vertical by default
44
+ bodyStyle?: any;
44
45
  }
45
46
 
46
47
  export class Panel<T extends PanelProps = PanelProps, E extends ContainerEventMap = ContainerEventMap> extends VLayout<T,E> {
@@ -54,7 +55,7 @@ export class Panel<T extends PanelProps = PanelProps, E extends ContainerEventMa
54
55
 
55
56
  //todo: cannot be called twice do to content overload
56
57
  this.m_ui_title = new Label({cls: 'title', text: this.m_props.title});
57
- this.m_ui_body = new Component( { cls: 'body '+sens, content: this.m_props.content } );
58
+ this.m_ui_body = new Component( { cls: 'body '+sens, content: this.m_props.content, style: props.bodyStyle } );
58
59
  }
59
60
 
60
61
  /** @ignore */
@@ -27,8 +27,10 @@
27
27
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
28
  **/
29
29
 
30
- import { Component, CProps } from './component'
30
+ import { Component, CProps, _x4_unitless } from './component'
31
+ import { isNumber } from "./tools"
31
32
 
33
+ const reNumber = /^-?\d+(\.\d+)?$/;
32
34
 
33
35
  // degrees to radian
34
36
  function d2r( d: number ): number {
@@ -69,10 +71,12 @@ function clean( a, ...b ) {
69
71
  abstract class SVGItem {
70
72
  private m_tag: string
71
73
  private m_attrs: Map<string,string>;
74
+ private m_style: Map<string,string>;
72
75
 
73
76
  constructor( tag: string ) {
74
77
  this.m_tag = tag;
75
78
  this.m_attrs = new Map( );
79
+ this.m_style = new Map( );
76
80
  }
77
81
 
78
82
  /**
@@ -80,7 +84,7 @@ abstract class SVGItem {
80
84
  * @returns
81
85
  */
82
86
  render( ) : string {
83
- return `<${this.m_tag} ${this.renderAttrs()}>${this.renderContent( )}</${this.m_tag}>`;
87
+ return `<${this.m_tag} ${this.renderAttrs()} ${this.renderStyle()}>${this.renderContent( )}</${this.m_tag}>`;
84
88
  }
85
89
 
86
90
  /**
@@ -127,6 +131,19 @@ abstract class SVGItem {
127
131
  return this;
128
132
  }
129
133
 
134
+ style( name: string, value: string ) : this {
135
+
136
+ if (value === undefined) {
137
+ value = null;
138
+ }
139
+ else if (!_x4_unitless[name] && (isNumber(value) || reNumber.test(value))) {
140
+ value = value + 'px';
141
+ }
142
+
143
+ this.m_style.set( name, value );
144
+ return this;
145
+ }
146
+
130
147
  /**
131
148
  * add a class
132
149
  * @param name class name to add
@@ -142,13 +159,36 @@ abstract class SVGItem {
142
159
  *
143
160
  */
144
161
 
145
- renderAttrs( ) {
162
+ renderAttrs( ): string {
163
+ if( !this.m_attrs.size ) {
164
+ return "";
165
+ }
166
+
146
167
  let result = '';
147
168
  this.m_attrs.forEach( (v,k) => {
148
169
  result += ` ${k} = "${v}"`
149
170
  });
171
+
150
172
  return result;
151
173
  }
174
+
175
+ /**
176
+ *
177
+ */
178
+
179
+ renderStyle( ): string {
180
+
181
+ if( !this.m_style.size ) {
182
+ return "";
183
+ }
184
+
185
+ let result = 'style="';
186
+ this.m_style.forEach( (v,k) => {
187
+ result += `${k}:${v};`
188
+ });
189
+
190
+ return result+'"';
191
+ }
152
192
 
153
193
  renderContent( ): string {
154
194
  return '';
package/src/x4.less CHANGED
@@ -1295,6 +1295,8 @@ textarea {
1295
1295
 
1296
1296
  .icon {
1297
1297
  font-size: 48px;
1298
+ width: 48px;
1299
+ height: 48px;
1298
1300
  color: var( --x4-error-color );
1299
1301
  margin-right: 8px;
1300
1302
  }
@@ -1793,6 +1795,13 @@ textarea {
1793
1795
  }
1794
1796
  }
1795
1797
 
1798
+ .x-color-picker-editor {
1799
+ .alpha {
1800
+ background-image: url( 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QA6RXhpZgAATU0AKgAAAAgAA1EAAAQAAAABAAAAAFEBAAMAAAABAAEAAFEEAAEAAAAB/AAAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAQABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9iK90orwugD//2Q==' );
1801
+ padding: 4px;
1802
+ }
1803
+ }
1804
+
1796
1805
  .x-color-picker {
1797
1806
 
1798
1807
  .sel {
@@ -1879,7 +1888,7 @@ textarea {
1879
1888
  }
1880
1889
 
1881
1890
  .alpha {
1882
- background-image: url( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAEsmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEwIgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iMTAiCiAgIGV4aWY6Q29sb3JTcGFjZT0iMSIKICAgdGlmZjpJbWFnZVdpZHRoPSIxMCIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMTAiCiAgIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiCiAgIHRpZmY6WFJlc29sdXRpb249IjcyLjAiCiAgIHRpZmY6WVJlc29sdXRpb249IjcyLjAiCiAgIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiCiAgIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIKICAgeG1wOk1vZGlmeURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJwcm9kdWNlZCIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWZmaW5pdHkgRGVzaWduZXIgMS45LjAiCiAgICAgIHN0RXZ0OndoZW49IjIwMjEtMDMtMjJUMTU6NTE6NDkrMDE6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0b3J5PgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KPD94cGFja2V0IGVuZD0iciI/Pn8+b7YAAAGCaUNDUHNSR0IgSUVDNjE5NjYtMi4xAAAokXWRy0tCQRSHv7Qwyh5gRIsWEtZKwwyiNi2UXlAt1CCrjV5fgdrlXiOibdBWKIja9FrUX1DboHUQFEUQ7YLWRW0qbueqoESe4cz55jdzDjNnwBLOKFm93gvZXF4LTvid85EFp+0FK5204sURVXR1JjQepqZ93lNnxluPWav2uX+tOZ7QFahrFB5VVC0vPCk8vZZXTd4R7lDS0bjwmbBbkwsK35l6rMSvJqdK/G2yFg4GwNIu7ExVcayKlbSWFZaX48pmVpXyfcyX2BO5uZDEHvFudIJM4MfJFGMEGGKAEZmH8OCjX1bUyPcW82dZkVxFZpV1NJZJkSaPW9RVqZ6QmBQ9ISPDutn/v33Vk4O+UnW7HxqeDeO9F2zb8FMwjK8jw/g5BusTXOYq+SuHMPwheqGiuQ6gbRPOrypabBcutqDrUY1q0aJkFbckk/B2Ci0RcNxA02KpZ+V9Th4gvCFfdQ17+9An59uWfgF7Hmfv4QYbGAAAAAlwSFlzAAALEwAACxMBAJqcGAAAACdJREFUGJVjbGhoYEAC9fX1yFwmBryAptKM////R+Y3NjbSzW4C0gAo9QeQBmhTIwAAAABJRU5ErkJggg==' );
1891
+ background-image: url( 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QA6RXhpZgAATU0AKgAAAAgAA1EAAAQAAAABAAAAAFEBAAMAAAABAAEAAFEEAAEAAAAB/AAAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAQABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9iK90orwugD//2Q==' );
1883
1892
 
1884
1893
  .marker {
1885
1894
  position: absolute;