x4js 1.4.10 → 1.4.11

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.
package/lib/formatters.js CHANGED
@@ -86,3 +86,4 @@ function bool_formatter(input) {
86
86
  return input ? 'oui' : '-';
87
87
  }
88
88
  exports.bool_formatter = bool_formatter;
89
+ setCurrencySymbol(null);
package/lib/layout.d.ts CHANGED
@@ -78,4 +78,10 @@ export declare class ScrollView extends Component<ScrollViewProps> {
78
78
  constructor(props: ScrollViewProps);
79
79
  setContent(content: ComponentContent): void;
80
80
  }
81
+ export declare class Masonry extends Container {
82
+ constructor(props: any);
83
+ resizeItem(item: Component): void;
84
+ resizeAllItems(): void;
85
+ addItem(itm: Component): void;
86
+ }
81
87
  export {};
package/lib/layout.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.ScrollView = exports.TableLayout = exports.GridLayout = exports.AutoLayout = exports.VLayout = exports.HLayout = exports.AbsLayout = void 0;
31
+ exports.Masonry = exports.ScrollView = exports.TableLayout = exports.GridLayout = exports.AutoLayout = exports.VLayout = exports.HLayout = exports.AbsLayout = void 0;
32
32
  const component_1 = require("./component");
33
33
  const tools_1 = require("./tools");
34
34
  // ============================================================================
@@ -273,3 +273,42 @@ class ScrollView extends component_1.Component {
273
273
  }
274
274
  }
275
275
  exports.ScrollView = ScrollView;
276
+ // :: MASONERY ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
277
+ // from a nice article of Andy Barefoot
278
+ // https://medium.com/@andybarefoot/a-masonry-style-layout-using-css-grid-8c663d355ebb
279
+ class Masonry extends component_1.Container {
280
+ constructor(props) {
281
+ super(props);
282
+ this.setDomEvent('sizechange', () => {
283
+ this.resizeAllItems();
284
+ });
285
+ }
286
+ resizeItem(item) {
287
+ const style = this.getComputedStyle();
288
+ const rowHeight = style.parse('grid-auto-rows');
289
+ const rowGap = style.parse('grid-row-gap');
290
+ let content = item.queryItem('.content');
291
+ if (!content) {
292
+ content = item;
293
+ }
294
+ if (content && (rowHeight + rowGap)) {
295
+ const rc = content.getBoundingRect();
296
+ const rowSpan = Math.ceil((rc.height + rowGap) / (rowHeight + rowGap));
297
+ item.setStyleValue('gridRowEnd', "span " + rowSpan);
298
+ }
299
+ }
300
+ resizeAllItems() {
301
+ this.queryAll(".item", (itm) => {
302
+ ;
303
+ this.resizeItem(itm);
304
+ });
305
+ }
306
+ addItem(itm) {
307
+ itm.addClass('content');
308
+ this.appendChild(new component_1.Container({
309
+ cls: 'item',
310
+ content: itm
311
+ }));
312
+ }
313
+ }
314
+ exports.Masonry = Masonry;
package/lib/listview.d.ts CHANGED
@@ -26,7 +26,7 @@
26
26
  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27
27
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
28
  **/
29
- import { Container, Component, CProps, ContainerEventMap, EvDblClick } from './component';
29
+ import { Container, Component, ContainerProps, ContainerEventMap, EvDblClick } from './component';
30
30
  import { IconID } from './icon';
31
31
  import { VLayout } from './layout';
32
32
  import { Popup, PopupEventMap, PopupProps } from './popup';
@@ -35,7 +35,7 @@ import { EvContextMenu, EvSelectionChange, EvClick, EventCallback, BasicEvent }
35
35
  /**
36
36
  * item definition
37
37
  */
38
- export declare class ListViewItem {
38
+ export interface ListViewItem {
39
39
  id: any;
40
40
  text?: string | HtmlString;
41
41
  html?: boolean;
@@ -67,7 +67,7 @@ export interface ListViewEventMap extends ContainerEventMap {
67
67
  /**
68
68
  * listview properties
69
69
  */
70
- export interface ListViewProps<E extends ListViewEventMap = ListViewEventMap> extends CProps<E> {
70
+ export interface ListViewProps<E extends ListViewEventMap = ListViewEventMap> extends ContainerProps<E> {
71
71
  items?: ListViewItem[];
72
72
  populate?: PopulateItems;
73
73
  gadgets?: Component[];
package/lib/listview.js CHANGED
@@ -28,24 +28,13 @@
28
28
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
29
  **/
30
30
  Object.defineProperty(exports, "__esModule", { value: true });
31
- exports.PopupListView = exports.EvCancel = exports.ListView = exports.ListViewItem = void 0;
31
+ exports.PopupListView = exports.EvCancel = exports.ListView = void 0;
32
32
  const component_1 = require("./component");
33
33
  const layout_1 = require("./layout");
34
34
  const popup_1 = require("./popup");
35
35
  const tools_1 = require("./tools");
36
36
  const menu_1 = require("./menu");
37
37
  const x4_events_1 = require("./x4_events");
38
- /**
39
- * item definition
40
- */
41
- class ListViewItem {
42
- id;
43
- text; // if you need pure text
44
- html; // if text is html
45
- icon;
46
- data;
47
- }
48
- exports.ListViewItem = ListViewItem;
49
38
  ;
50
39
  /**
51
40
  * Standard listview class
package/lib/tools.js CHANGED
@@ -455,9 +455,10 @@ function parseIntlDate(value, fmts = i18n_1._tr.global.date_input_formats) {
455
455
  let rematch = new RegExp('^' + smatch + '$', 'm');
456
456
  let match = rematch.exec(value);
457
457
  if (match) {
458
+ const now = new Date();
458
459
  let d = parseInt(match.groups.day ?? '1');
459
460
  let m = parseInt(match.groups.month ?? '1');
460
- let y = parseInt(match.groups.year ?? '1970');
461
+ let y = parseInt(match.groups.year ?? now.getFullYear() + '');
461
462
  let h = parseInt(match.groups.hour ?? '0');
462
463
  let i = parseInt(match.groups.min ?? '0');
463
464
  let s = parseInt(match.groups.sec ?? '0');
package/lib/tooltips.js CHANGED
@@ -47,7 +47,7 @@ class Tooltip extends component_1.Component {
47
47
  render() {
48
48
  this.setClass('@non-maskable', true);
49
49
  this.setContent([
50
- new icon_1.Icon({ icon: 'cls(far fa-circle-info)' }),
50
+ new icon_1.Icon({ icon: 'var( --x4-icon-tip' }),
51
51
  this.m_text = new label_1.Label({ text: 'help' })
52
52
  ]);
53
53
  }
package/lib/x4.css CHANGED
@@ -58,6 +58,7 @@
58
58
  --x4-icon-xmark: 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" fill="currentColor"><path d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>';
59
59
  --x4-icon-angle-down: 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" fill="currentColor"><path d="M192 384c-8.188 0-16.38-3.125-22.62-9.375l-160-160c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L192 306.8l137.4-137.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-160 160C208.4 380.9 200.2 384 192 384z"/></svg>';
60
60
  --x4-icon-calendar-days: 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" fill="currentColor"><path d="M160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32zM0 192H448V464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192zM64 304C64 312.8 71.16 320 80 320H112C120.8 320 128 312.8 128 304V272C128 263.2 120.8 256 112 256H80C71.16 256 64 263.2 64 272V304zM192 304C192 312.8 199.2 320 208 320H240C248.8 320 256 312.8 256 304V272C256 263.2 248.8 256 240 256H208C199.2 256 192 263.2 192 272V304zM336 256C327.2 256 320 263.2 320 272V304C320 312.8 327.2 320 336 320H368C376.8 320 384 312.8 384 304V272C384 263.2 376.8 256 368 256H336zM64 432C64 440.8 71.16 448 80 448H112C120.8 448 128 440.8 128 432V400C128 391.2 120.8 384 112 384H80C71.16 384 64 391.2 64 400V432zM208 384C199.2 384 192 391.2 192 400V432C192 440.8 199.2 448 208 448H240C248.8 448 256 440.8 256 432V400C256 391.2 248.8 384 240 384H208zM320 432C320 440.8 327.2 448 336 448H368C376.8 448 384 440.8 384 432V400C384 391.2 376.8 384 368 384H336C327.2 384 320 391.2 320 400V432z"/></svg>';
61
+ --x4-icon-tip: 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor"><path d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM296 336h-16V248C280 234.8 269.3 224 256 224H224C210.8 224 200 234.8 200 248S210.8 272 224 272h8v64h-16C202.8 336 192 346.8 192 360S202.8 384 216 384h80c13.25 0 24-10.75 24-24S309.3 336 296 336zM256 192c17.67 0 32-14.33 32-32c0-17.67-14.33-32-32-32S224 142.3 224 160C224 177.7 238.3 192 256 192z"/></svg>';
61
62
  }
62
63
  /* source: https://tailwindcss.com/docs/customizing-colors/#default-color-palette */
63
64
  :root {
@@ -291,10 +292,13 @@ textarea::selection {
291
292
  .x-icon:before {
292
293
  font-family: var(--x4-icon-font-family);
293
294
  }
294
- .x-icon.x-svg-icon,
295
- .x-icon svg {
296
- width: 1em;
297
- height: 1em;
295
+ .x-icon.x-svg-icon {
296
+ width: 1rem;
297
+ height: 1rem;
298
+ }
299
+ .x-icon.x-svg-icon > svg {
300
+ width: 100%;
301
+ height: 100%;
298
302
  }
299
303
  .x-base-button {
300
304
  display: flex;
@@ -946,13 +950,15 @@ textarea::selection {
946
950
  .x-form {
947
951
  background-color: var(--x4-form-color);
948
952
  margin-block-end: 0;
949
- padding: 8px;
953
+ padding: 8px 0;
950
954
  min-width: 250px;
951
955
  min-height: 50px;
952
- overflow: auto;
956
+ padding-right: 4px;
953
957
  }
954
958
  .x-form > .container {
955
959
  padding: 0px;
960
+ overflow: auto;
961
+ padding: 0 4px 0 8px;
956
962
  }
957
963
  .x-form > .footer {
958
964
  position: relative;
@@ -960,7 +966,7 @@ textarea::selection {
960
966
  bottom: 0;
961
967
  width: 100%;
962
968
  justify-content: flex-end;
963
- padding: 0px;
969
+ padding: 0px 4px 0 8px;
964
970
  margin-top: 8px;
965
971
  align-items: center;
966
972
  }
@@ -1090,10 +1096,19 @@ textarea::selection {
1090
1096
  .x-grid-view .x-footer .x-cell,
1091
1097
  .x-spreadsheet .x-header .x-cell,
1092
1098
  .x-grid-view .x-header .x-cell {
1093
- text-overflow: ellipsis;
1094
1099
  border-right: 1px solid rgba(0, 0, 0, 0.1);
1095
1100
  height: unset;
1096
1101
  }
1102
+ .x-spreadsheet .x-footer .x-cell span,
1103
+ .x-grid-view .x-footer .x-cell span,
1104
+ .x-spreadsheet .x-header .x-cell span,
1105
+ .x-grid-view .x-header .x-cell span {
1106
+ min-width: 0;
1107
+ text-transform: uppercase;
1108
+ text-overflow: ellipsis;
1109
+ overflow: hidden;
1110
+ font-weight: bold;
1111
+ }
1097
1112
  .x-spreadsheet .x-footer .x-cell.sort,
1098
1113
  .x-grid-view .x-footer .x-cell.sort,
1099
1114
  .x-spreadsheet .x-header .x-cell.sort,
@@ -1103,6 +1118,8 @@ textarea::selection {
1103
1118
  background-size: 1rem 1rem;
1104
1119
  background-position: right 0 top 6px;
1105
1120
  padding-right: calc(1rem + 4px);
1121
+ height: 0.7rem;
1122
+ opacity: 0.7;
1106
1123
  }
1107
1124
  .x-spreadsheet .x-footer .x-cell.sort.desc,
1108
1125
  .x-grid-view .x-footer .x-cell.sort.desc,
@@ -1235,14 +1252,14 @@ textarea::selection {
1235
1252
  background-color: white;
1236
1253
  color: white;
1237
1254
  padding-left: 24px;
1238
- font-size: 0.8rem;
1239
- font-weight: 300;
1255
+ font-family: var(--x4-font);
1256
+ font-size: var(--x4-font-size);
1240
1257
  }
1241
1258
  .x-tooltip .x-icon {
1242
1259
  position: absolute;
1243
- left: 6px;
1260
+ left: 5px;
1244
1261
  top: 7px;
1245
- color: var(--x4-tip-background);
1262
+ color: var(--x4-selection-color);
1246
1263
  }
1247
1264
  .x-tooltip .x-label {
1248
1265
  background-color: var(--x4-selection-color);
@@ -1277,6 +1294,7 @@ textarea::selection {
1277
1294
  overflow-y: auto;
1278
1295
  }
1279
1296
  .x-popup-list-view {
1297
+ box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.4);
1280
1298
  background-color: white;
1281
1299
  }
1282
1300
  .x-popup-list-view .x-combo-popup {
@@ -1678,3 +1696,9 @@ textarea::selection {
1678
1696
  left: 0;
1679
1697
  right: 0;
1680
1698
  }
1699
+ .x-masonry {
1700
+ display: grid;
1701
+ grid-gap: 10px;
1702
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
1703
+ grid-auto-rows: 10px;
1704
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "x4js",
3
- "version": "1.4.10",
3
+ "version": "1.4.11",
4
4
  "description": "X4js core files",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
package/src/formatters.ts CHANGED
@@ -97,4 +97,7 @@ export function money_formatter_nz(input: any): string {
97
97
 
98
98
  export function bool_formatter(input: any): string {
99
99
  return input ? 'oui' : '-';
100
- }
100
+ }
101
+
102
+
103
+ setCurrencySymbol( null );
package/src/layout.ts CHANGED
@@ -116,7 +116,7 @@ export class GridLayout<P extends GridLayoutProps = GridLayoutProps> extends Con
116
116
  constructor(props: GridLayoutProps) {
117
117
  /// @ts-ignore
118
118
  // Argument of type 'GridLayoutProps' is not assignable to parameter of type 'P'.
119
- // 'GridLayoutProps' is assignable to the constraint of type 'P', but 'P' could be instantiated with a different subtype of constraint 'GridLayoutProps'.
119
+ // 'GridLayoutProps' is assignable to the constraint of type 'P', but 'P' could be instantiated with a different subtype of constraint 'GridLayoutProps'.
120
120
  super(props);
121
121
  }
122
122
 
@@ -134,8 +134,8 @@ export class GridLayout<P extends GridLayoutProps = GridLayoutProps> extends Con
134
134
  this.setStyleValue('grid-gap', this.m_props.colGap);
135
135
  }
136
136
 
137
- if( this.m_props.template ) {
138
- this.setStyleValue('grid-template-areas', this.m_props.template.join('\n') );
137
+ if (this.m_props.template) {
138
+ this.setStyleValue('grid-template-areas', this.m_props.template.join('\n'));
139
139
  }
140
140
  }
141
141
  }
@@ -368,3 +368,54 @@ export class ScrollView extends Component<ScrollViewProps> {
368
368
  }
369
369
  }
370
370
  }
371
+
372
+
373
+ // :: MASONERY ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
374
+
375
+ // from a nice article of Andy Barefoot
376
+ // https://medium.com/@andybarefoot/a-masonry-style-layout-using-css-grid-8c663d355ebb
377
+
378
+ export class Masonry extends Container {
379
+
380
+ constructor(props) {
381
+ super(props);
382
+
383
+ this.setDomEvent('sizechange', () => {
384
+ this.resizeAllItems( );
385
+ });
386
+ }
387
+
388
+ resizeItem(item: Component) {
389
+
390
+ const style = this.getComputedStyle();
391
+
392
+ const rowHeight = style.parse('grid-auto-rows');
393
+ const rowGap = style.parse('grid-row-gap');
394
+
395
+ let content = item.queryItem('.content');
396
+ if( !content ) {
397
+ content = item;
398
+ }
399
+
400
+ if (content && (rowHeight + rowGap)) {
401
+ const rc = content.getBoundingRect();
402
+ const rowSpan = Math.ceil( (rc.height + rowGap) / (rowHeight + rowGap) );
403
+ item.setStyleValue('gridRowEnd', "span " + rowSpan);
404
+ }
405
+ }
406
+
407
+ resizeAllItems( ) {
408
+ this.queryAll( ".item", ( itm ) => {;
409
+ this.resizeItem( itm );
410
+ } );
411
+ }
412
+
413
+ addItem( itm: Component ) {
414
+ itm.addClass( 'content' );
415
+ this.appendChild( new Container( {
416
+ cls: 'item',
417
+ content: itm
418
+ }));
419
+ }
420
+ }
421
+
package/src/listview.ts CHANGED
@@ -27,7 +27,7 @@
27
27
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
28
  **/
29
29
 
30
- import { Container, Component, CProps, ContainerEventMap, EvDblClick } from './component'
30
+ import { Container, Component, ContainerProps, ContainerEventMap, EvDblClick } from './component'
31
31
  import { IconID } from './icon';
32
32
  import { HLayout, VLayout } from './layout'
33
33
  import { Popup, PopupEventMap, PopupProps } from './popup';
@@ -40,7 +40,7 @@ import { EvContextMenu, EvSelectionChange, EvClick, EventCallback, BasicEvent, E
40
40
  * item definition
41
41
  */
42
42
 
43
- export class ListViewItem {
43
+ export interface ListViewItem {
44
44
  id: any;
45
45
  text?: string | HtmlString; // if you need pure text
46
46
  html?: boolean; // if text is html
@@ -79,7 +79,7 @@ export interface ListViewEventMap extends ContainerEventMap {
79
79
  /**
80
80
  * listview properties
81
81
  */
82
- export interface ListViewProps<E extends ListViewEventMap = ListViewEventMap> extends CProps<E> {
82
+ export interface ListViewProps<E extends ListViewEventMap = ListViewEventMap> extends ContainerProps<E> {
83
83
  items?: ListViewItem[];
84
84
  populate?: PopulateItems;
85
85
  gadgets?: Component[]; // gadgets to instert at bottom
package/src/tools.ts CHANGED
@@ -551,9 +551,11 @@ export function parseIntlDate(value: string, fmts: string = _tr.global.date_inpu
551
551
  let match = rematch.exec(value);
552
552
 
553
553
  if (match) {
554
+ const now = new Date( );
555
+
554
556
  let d = parseInt(match.groups.day ?? '1');
555
557
  let m = parseInt(match.groups.month ?? '1');
556
- let y = parseInt(match.groups.year ?? '1970');
558
+ let y = parseInt(match.groups.year ?? now.getFullYear()+'');
557
559
  let h = parseInt(match.groups.hour ?? '0');
558
560
  let i = parseInt(match.groups.min ?? '0');
559
561
  let s = parseInt(match.groups.sec ?? '0');
package/src/tooltips.ts CHANGED
@@ -52,7 +52,7 @@ export class Tooltip extends Component {
52
52
  render() {
53
53
  this.setClass('@non-maskable', true);
54
54
  this.setContent([
55
- new Icon({ icon: 'cls(far fa-circle-info)' }),
55
+ new Icon({ icon: 'var( --x4-icon-tip' }),
56
56
  this.m_text = new Label({ text: 'help' })
57
57
  ]);
58
58
  }
package/src/x4.less CHANGED
@@ -70,6 +70,7 @@
70
70
  --x4-icon-xmark: 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" fill="currentColor"><path d="M310.6 361.4c12.5 12.5 12.5 32.75 0 45.25C304.4 412.9 296.2 416 288 416s-16.38-3.125-22.62-9.375L160 301.3L54.63 406.6C48.38 412.9 40.19 416 32 416S15.63 412.9 9.375 406.6c-12.5-12.5-12.5-32.75 0-45.25l105.4-105.4L9.375 150.6c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L160 210.8l105.4-105.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-105.4 105.4L310.6 361.4z"/></svg>';
71
71
  --x4-icon-angle-down: 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" fill="currentColor"><path d="M192 384c-8.188 0-16.38-3.125-22.62-9.375l-160-160c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0L192 306.8l137.4-137.4c12.5-12.5 32.75-12.5 45.25 0s12.5 32.75 0 45.25l-160 160C208.4 380.9 200.2 384 192 384z"/></svg>';
72
72
  --x4-icon-calendar-days: 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" fill="currentColor"><path d="M160 32V64H288V32C288 14.33 302.3 0 320 0C337.7 0 352 14.33 352 32V64H400C426.5 64 448 85.49 448 112V160H0V112C0 85.49 21.49 64 48 64H96V32C96 14.33 110.3 0 128 0C145.7 0 160 14.33 160 32zM0 192H448V464C448 490.5 426.5 512 400 512H48C21.49 512 0 490.5 0 464V192zM64 304C64 312.8 71.16 320 80 320H112C120.8 320 128 312.8 128 304V272C128 263.2 120.8 256 112 256H80C71.16 256 64 263.2 64 272V304zM192 304C192 312.8 199.2 320 208 320H240C248.8 320 256 312.8 256 304V272C256 263.2 248.8 256 240 256H208C199.2 256 192 263.2 192 272V304zM336 256C327.2 256 320 263.2 320 272V304C320 312.8 327.2 320 336 320H368C376.8 320 384 312.8 384 304V272C384 263.2 376.8 256 368 256H336zM64 432C64 440.8 71.16 448 80 448H112C120.8 448 128 440.8 128 432V400C128 391.2 120.8 384 112 384H80C71.16 384 64 391.2 64 400V432zM208 384C199.2 384 192 391.2 192 400V432C192 440.8 199.2 448 208 448H240C248.8 448 256 440.8 256 432V400C256 391.2 248.8 384 240 384H208zM320 432C320 440.8 327.2 448 336 448H368C376.8 448 384 440.8 384 432V400C384 391.2 376.8 384 368 384H336C327.2 384 320 391.2 320 400V432z"/></svg>';
73
+ --x4-icon-tip: 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor"><path d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 464c-114.7 0-208-93.31-208-208S141.3 48 256 48s208 93.31 208 208S370.7 464 256 464zM296 336h-16V248C280 234.8 269.3 224 256 224H224C210.8 224 200 234.8 200 248S210.8 272 224 272h8v64h-16C202.8 336 192 346.8 192 360S202.8 384 216 384h80c13.25 0 24-10.75 24-24S309.3 336 296 336zM256 192c17.67 0 32-14.33 32-32c0-17.67-14.33-32-32-32S224 142.3 224 160C224 177.7 238.3 192 256 192z"/></svg>';
73
74
  }
74
75
 
75
76
  @BLACK10: rgba(0,0,0,0.1);
@@ -368,9 +369,14 @@ textarea {
368
369
  text-align: center;
369
370
  flex-direction: column;
370
371
 
371
- &.x-svg-icon, svg {
372
- width: 1em;
373
- height: 1em;
372
+ &.x-svg-icon {
373
+ width: 1rem;
374
+ height: 1rem;
375
+
376
+ & > svg {
377
+ width: 100%;
378
+ height: 100%;
379
+ }
374
380
  }
375
381
  }
376
382
 
@@ -1184,13 +1190,15 @@ textarea {
1184
1190
  .x-form {
1185
1191
  background-color: var( --x4-form-color );
1186
1192
  margin-block-end: 0;
1187
- padding: 8px;
1193
+ padding: 8px 0;
1188
1194
  min-width: 250px;
1189
1195
  min-height: 50px;
1190
- overflow: auto;
1191
-
1196
+ padding-right: 4px;
1197
+
1192
1198
  &>.container {
1193
1199
  padding: 0px;
1200
+ overflow: auto;
1201
+ padding: 0 4px 0 8px;
1194
1202
  }
1195
1203
 
1196
1204
  &>.footer {
@@ -1199,7 +1207,7 @@ textarea {
1199
1207
  bottom: 0;
1200
1208
  width: 100%;
1201
1209
  justify-content: flex-end;
1202
- padding: 0px;
1210
+ padding: 0px 4px 0 8px;
1203
1211
  margin-top: 8px;
1204
1212
  align-items: center;
1205
1213
 
@@ -1335,17 +1343,25 @@ textarea {
1335
1343
  }
1336
1344
 
1337
1345
  .x-cell {
1338
- text-overflow: ellipsis;
1339
1346
  border-right: 1px solid rgba(0,0,0,0.1);
1340
- //text-transform: capitalize;
1341
1347
  height: unset;
1342
1348
 
1349
+ span {
1350
+ min-width: 0;
1351
+ text-transform: uppercase;
1352
+ text-overflow: ellipsis;
1353
+ overflow: hidden;
1354
+ font-weight: bold;
1355
+ }
1356
+
1343
1357
  &.sort {
1344
1358
  background-image: var( --x4-icon-arrow-down-long );
1345
1359
  background-repeat: no-repeat;
1346
1360
  background-size: 1rem 1rem;
1347
1361
  background-position: right 0 top 6px;
1348
1362
  padding-right: calc( 1rem + 4px );
1363
+ height: 0.7rem;
1364
+ opacity: 0.7;
1349
1365
  }
1350
1366
 
1351
1367
  &.sort.desc {
@@ -1525,19 +1541,17 @@ textarea {
1525
1541
  pointer-events: none;
1526
1542
 
1527
1543
  background-color: white;
1528
- //border: 1px solid fadeout(darken(#2e404f,5%),10%);
1529
1544
  color: white;
1530
- //padding: 4px 8px;
1531
1545
  padding-left: 24px;
1532
1546
 
1533
- font-size: 0.8rem;
1534
- font-weight: 300;
1535
-
1547
+ font-family: var( --x4-font );
1548
+ font-size: var( --x4-font-size );
1549
+
1536
1550
  .x-icon {
1537
1551
  position: absolute;
1538
- left: 6px;
1552
+ left: 5px;
1539
1553
  top: 7px;
1540
- color: var( --x4-tip-background );
1554
+ color: var( --x4-selection-color );
1541
1555
  }
1542
1556
 
1543
1557
  .x-label {
@@ -1589,6 +1603,7 @@ textarea {
1589
1603
 
1590
1604
 
1591
1605
  .x-popup-list-view {
1606
+ .z-float-4( );
1592
1607
  background-color: white;
1593
1608
 
1594
1609
  .x-combo-popup {
@@ -2120,4 +2135,11 @@ textarea {
2120
2135
  left: 0;
2121
2136
  right: 0;
2122
2137
  }
2138
+ }
2139
+
2140
+ .x-masonry {
2141
+ display: grid;
2142
+ grid-gap: 10px;
2143
+ grid-template-columns: repeat(auto-fill, minmax(250px,1fr));
2144
+ grid-auto-rows: 10px;
2123
2145
  }