neo.mjs 8.9.1 → 8.10.1

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.
Files changed (41) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/portal/index.html +1 -1
  3. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  4. package/examples/ServiceWorker.mjs +2 -2
  5. package/examples/grid/container/MainContainer.mjs +19 -15
  6. package/examples/table/cellEditing/MainContainer.mjs +30 -15
  7. package/examples/table/container/MainContainer.mjs +34 -19
  8. package/examples/tableFiltering/MainContainer.mjs +1 -1
  9. package/examples/tableStore/MainContainer.mjs +14 -13
  10. package/examples/tableStore/MainModel.mjs +3 -3
  11. package/package.json +1 -1
  12. package/resources/data/deck/learnneo/pages/benefits/Speed.md +3 -3
  13. package/resources/scss/src/button/Base.scss +1 -1
  14. package/resources/scss/src/table/View.scss +0 -2
  15. package/resources/scss/src/toolbar/Base.scss +1 -1
  16. package/resources/scss/theme-dark/button/Base.scss +1 -0
  17. package/resources/scss/theme-light/button/Base.scss +1 -0
  18. package/resources/scss/theme-neo-light/button/Base.scss +1 -0
  19. package/src/DefaultConfig.mjs +2 -2
  20. package/src/Main.mjs +1 -0
  21. package/src/component/Base.mjs +37 -37
  22. package/src/grid/Container.mjs +11 -11
  23. package/src/grid/View.mjs +9 -1
  24. package/src/selection/Model.mjs +5 -13
  25. package/src/selection/grid/BaseModel.mjs +4 -38
  26. package/src/selection/grid/CellColumnModel.mjs +29 -36
  27. package/src/selection/grid/CellColumnRowModel.mjs +27 -34
  28. package/src/selection/grid/CellModel.mjs +50 -44
  29. package/src/selection/grid/CellRowModel.mjs +18 -35
  30. package/src/selection/grid/ColumnModel.mjs +28 -62
  31. package/src/selection/grid/RowModel.mjs +2 -2
  32. package/src/selection/table/BaseModel.mjs +0 -42
  33. package/src/selection/table/CellColumnModel.mjs +9 -18
  34. package/src/selection/table/CellColumnRowModel.mjs +9 -18
  35. package/src/selection/table/CellModel.mjs +3 -3
  36. package/src/selection/table/CellRowModel.mjs +4 -19
  37. package/src/selection/table/ColumnModel.mjs +9 -9
  38. package/src/selection/table/RowModel.mjs +2 -2
  39. package/src/table/Container.mjs +11 -31
  40. package/src/table/View.mjs +46 -7
  41. package/src/table/plugin/CellEditing.mjs +2 -2
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.9.1'
23
+ * @member {String} version='8.10.1'
24
24
  */
25
- version: '8.9.1'
25
+ version: '8.10.1'
26
26
  }
27
27
 
28
28
  /**
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-01-25",
19
+ "datePublished": "2025-01-27",
20
20
  "publisher": {
21
21
  "@type": "Organization",
22
22
  "name": "Neo.mjs"
@@ -107,7 +107,7 @@ class FooterContainer extends Container {
107
107
  }, {
108
108
  module: Component,
109
109
  cls : ['neo-version'],
110
- html : 'v8.9.1'
110
+ html : 'v8.10.1'
111
111
  }]
112
112
  }],
113
113
  /**
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='8.9.1'
23
+ * @member {String} version='8.10.1'
24
24
  */
25
- version: '8.9.1'
25
+ version: '8.10.1'
26
26
  }
27
27
 
28
28
  /**
@@ -25,8 +25,8 @@ class MainContainer extends ConfigurationViewport {
25
25
  }
26
26
 
27
27
  createConfigurationComponents() {
28
- let me = this,
29
- {view} = me.exampleComponent;
28
+ let me = this,
29
+ {selectionModel} = me.exampleComponent.view;
30
30
 
31
31
  const selectionModelRadioDefaults = {
32
32
  module : Radio,
@@ -46,35 +46,35 @@ class MainContainer extends ConfigurationViewport {
46
46
  value : me.exampleComponent.height
47
47
  }, {
48
48
  ...selectionModelRadioDefaults,
49
- checked : view.selectionModel.ntype === 'selection-grid-cellmodel',
49
+ checked : selectionModel.ntype === 'selection-grid-cellmodel',
50
50
  labelText : 'selectionModel',
51
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellModel)},
51
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellModel)},
52
52
  style : {marginTop: '10px'},
53
53
  valueLabelText: 'Cell'
54
54
  }, {
55
55
  ...selectionModelRadioDefaults,
56
- checked : view.selectionModel.ntype === 'selection-grid-columnmodel',
57
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', ColumnModel)},
56
+ checked : selectionModel.ntype === 'selection-grid-columnmodel',
57
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', ColumnModel)},
58
58
  valueLabelText: 'Column'
59
59
  }, {
60
60
  ...selectionModelRadioDefaults,
61
- checked : view.selectionModel.ntype === 'selection-grid-rowmodel',
62
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', RowModel)},
61
+ checked : selectionModel.ntype === 'selection-grid-rowmodel',
62
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', RowModel)},
63
63
  valueLabelText: 'Row'
64
64
  }, {
65
65
  ...selectionModelRadioDefaults,
66
- checked : view.selectionModel.ntype === 'selection-grid-cellcolumnmodel',
67
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellColumnModel)},
66
+ checked : selectionModel.ntype === 'selection-grid-cellcolumnmodel',
67
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellColumnModel)},
68
68
  valueLabelText: 'Cell & Column'
69
69
  }, {
70
70
  ...selectionModelRadioDefaults,
71
- checked : view.selectionModel.ntype === 'selection-grid-cellrowmodel',
72
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellRowModel)},
71
+ checked : selectionModel.ntype === 'selection-grid-cellrowmodel',
72
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellRowModel)},
73
73
  valueLabelText: 'Cell & Row'
74
74
  }, {
75
75
  ...selectionModelRadioDefaults,
76
- checked : view.selectionModel.ntype === 'selection-grid-cellcolumnrowmodel',
77
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellColumnRowModel)},
76
+ checked : selectionModel.ntype === 'selection-grid-cellcolumnrowmodel',
77
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellColumnRowModel)},
78
78
  valueLabelText: 'Cell & Column & Row'
79
79
  }]
80
80
  }
@@ -97,6 +97,10 @@ class MainContainer extends ConfigurationViewport {
97
97
 
98
98
  viewConfig: {
99
99
  selectionModel: CellModel
100
+ },
101
+
102
+ wrapperStyle: {
103
+ height: '250px'
100
104
  }
101
105
  }
102
106
  }
@@ -106,7 +110,7 @@ class MainContainer extends ConfigurationViewport {
106
110
  * @param {String} value
107
111
  * @param {Object} opts
108
112
  */
109
- onRadioChange(config, value, opts) {
113
+ onRadioViewChange(config, value, opts) {
110
114
  if (opts.value === true) { // we only want to listen to check events, not uncheck
111
115
  this.exampleComponent.view[config] = value
112
116
  }
@@ -44,7 +44,8 @@ class MainContainer extends ConfigurationViewport {
44
44
  * @returns {Object[]}
45
45
  */
46
46
  createConfigurationComponents() {
47
- let me = this;
47
+ let me = this,
48
+ {selectionModel} = me.exampleComponent.view;
48
49
 
49
50
  const selectionModelRadioDefaults = {
50
51
  module : Radio,
@@ -64,25 +65,25 @@ class MainContainer extends ConfigurationViewport {
64
65
  value : me.exampleComponent.height
65
66
  }, {
66
67
  ...selectionModelRadioDefaults,
67
- checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellmodel',
68
+ checked : selectionModel.ntype === 'selection-table-cellmodel',
68
69
  labelText : 'selectionModel',
69
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellModel)},
70
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellModel)},
70
71
  style : {marginTop: '10px'},
71
72
  valueLabelText: 'Cell'
72
73
  }, {
73
74
  ...selectionModelRadioDefaults,
74
- checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellcolumnmodel',
75
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellColumnModel)},
75
+ checked : selectionModel.ntype === 'selection-table-cellcolumnmodel',
76
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellColumnModel)},
76
77
  valueLabelText: 'Cell & Column'
77
78
  }, {
78
79
  ...selectionModelRadioDefaults,
79
- checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellrowmodel',
80
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellRowModel)},
80
+ checked : selectionModel.ntype === 'selection-table-cellrowmodel',
81
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellRowModel)},
81
82
  valueLabelText: 'Cell & Row'
82
83
  }, {
83
84
  ...selectionModelRadioDefaults,
84
- checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellcolumnrowmodel',
85
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellColumnRowModel)},
85
+ checked : selectionModel.ntype === 'selection-table-cellcolumnrowmodel',
86
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellColumnRowModel)},
86
87
  valueLabelText: 'Cell & Column & Row'
87
88
  }, {
88
89
  module : CheckBox,
@@ -106,12 +107,15 @@ class MainContainer extends ConfigurationViewport {
106
107
  */
107
108
  createExampleComponent() {
108
109
  return {
109
- module : TableContainer,
110
- bind : {store : 'stores.mainStore'},
111
- cellEditing : true,
112
- parentId : this.id,
113
- selectionModel: CellModel,
114
- store : MainStore,
110
+ module : TableContainer,
111
+ bind : {store: 'stores.mainStore'},
112
+ cellEditing: true,
113
+ parentId : this.id,
114
+ store : MainStore,
115
+
116
+ viewConfig: {
117
+ selectionModel: CellModel
118
+ },
115
119
 
116
120
  columnDefaults: {
117
121
  editable: true
@@ -169,6 +173,17 @@ class MainContainer extends ConfigurationViewport {
169
173
  onPluginConfigChange(config, opts) {
170
174
  this.exampleComponent.getPlugin('table-cell-editing')[config] = opts.value
171
175
  }
176
+
177
+ /**
178
+ * @param {String} config
179
+ * @param {String} value
180
+ * @param {Object} opts
181
+ */
182
+ onRadioViewChange(config, value, opts) {
183
+ if (opts.value === true) { // we only want to listen to check events, not uncheck
184
+ this.exampleComponent.view[config] = value
185
+ }
186
+ }
172
187
  }
173
188
 
174
189
  export default Neo.setupClass(MainContainer);
@@ -27,7 +27,8 @@ class MainContainer extends ConfigurationViewport {
27
27
  }
28
28
 
29
29
  createConfigurationComponents() {
30
- let me = this;
30
+ let me = this,
31
+ {selectionModel} = me.exampleComponent.view;
31
32
 
32
33
  const selectionModelRadioDefaults = {
33
34
  module : Radio,
@@ -47,35 +48,35 @@ class MainContainer extends ConfigurationViewport {
47
48
  value : me.exampleComponent.height
48
49
  }, {
49
50
  ...selectionModelRadioDefaults,
50
- checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellmodel',
51
+ checked : selectionModel.ntype === 'selection-table-cellmodel',
51
52
  labelText : 'selectionModel',
52
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellModel)},
53
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellModel)},
53
54
  style : {marginTop: '10px'},
54
55
  valueLabelText: 'Cell'
55
56
  }, {
56
57
  ...selectionModelRadioDefaults,
57
- checked : me.exampleComponent.selectionModel.ntype === 'selection-table-columnmodel',
58
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', ColumnModel)},
58
+ checked : selectionModel.ntype === 'selection-table-columnmodel',
59
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', ColumnModel)},
59
60
  valueLabelText: 'Column'
60
61
  }, {
61
62
  ...selectionModelRadioDefaults,
62
- checked : me.exampleComponent.selectionModel.ntype === 'selection-table-rowmodel',
63
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', RowModel)},
63
+ checked : selectionModel.ntype === 'selection-table-rowmodel',
64
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', RowModel)},
64
65
  valueLabelText: 'Row'
65
66
  }, {
66
67
  ...selectionModelRadioDefaults,
67
- checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellcolumnmodel',
68
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellColumnModel)},
68
+ checked : selectionModel.ntype === 'selection-table-cellcolumnmodel',
69
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellColumnModel)},
69
70
  valueLabelText: 'Cell & Column'
70
71
  }, {
71
72
  ...selectionModelRadioDefaults,
72
- checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellrowmodel',
73
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellRowModel)},
73
+ checked : selectionModel.ntype === 'selection-table-cellrowmodel',
74
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellRowModel)},
74
75
  valueLabelText: 'Cell & Row'
75
76
  }, {
76
77
  ...selectionModelRadioDefaults,
77
- checked : me.exampleComponent.selectionModel.ntype === 'selection-table-cellcolumnrowmodel',
78
- listeners : {change: me.onRadioChange.bind(me, 'selectionModel', CellColumnRowModel)},
78
+ checked : selectionModel.ntype === 'selection-table-cellcolumnrowmodel',
79
+ listeners : {change: me.onRadioViewChange.bind(me, 'selectionModel', CellColumnRowModel)},
79
80
  valueLabelText: 'Cell & Column & Row'
80
81
  }, {
81
82
  module : Checkbox,
@@ -88,8 +89,8 @@ class MainContainer extends ConfigurationViewport {
88
89
  checked : false,
89
90
  labelText: 'Fit width',
90
91
  listeners: {
91
- change({ value }) {
92
- const { style } = me.exampleComponent;
92
+ change({value}) {
93
+ const {style} = me.exampleComponent;
93
94
 
94
95
  if (value) {
95
96
  style.width = '100%';
@@ -100,7 +101,7 @@ class MainContainer extends ConfigurationViewport {
100
101
  }
101
102
 
102
103
  me.exampleComponent.style = style;
103
- me.exampleComponent.update();
104
+ me.exampleComponent.update()
104
105
  }
105
106
  },
106
107
  style: {marginTop: '10px'}
@@ -112,9 +113,12 @@ class MainContainer extends ConfigurationViewport {
112
113
  */
113
114
  createExampleComponent() {
114
115
  return Neo.create(TableContainer, {
115
- id : 'myTableStoreContainer',
116
- selectionModel: CellModel,
117
- store : MainStore,
116
+ id : 'myTableStoreContainer',
117
+ store: MainStore,
118
+
119
+ viewConfig: {
120
+ selectionModel: CellModel
121
+ },
118
122
 
119
123
  columns: [
120
124
  {dataField: 'firstname', text: 'Firstname'},
@@ -180,6 +184,17 @@ class MainContainer extends ConfigurationViewport {
180
184
  editButtonHandler(data) {
181
185
  console.log(data)
182
186
  }
187
+
188
+ /**
189
+ * @param {String} config
190
+ * @param {String} value
191
+ * @param {Object} opts
192
+ */
193
+ onRadioViewChange(config, value, opts) {
194
+ if (opts.value === true) { // we only want to listen to check events, not uncheck
195
+ this.exampleComponent.view[config] = value
196
+ }
197
+ }
183
198
  }
184
199
 
185
200
  export default Neo.setupClass(MainContainer);
@@ -47,9 +47,9 @@ class MainContainer extends Viewport {
47
47
  }, {
48
48
  module : TableContainer,
49
49
  id : 'myTableFilterContainer',
50
- selectionModel : CellModel,
51
50
  showHeaderFilters: true,
52
51
  store : MainStore,
52
+ viewConfig : {selectionModel: CellModel},
53
53
  width : '100%',
54
54
  wrapperStyle : {height: '300px'},
55
55
 
@@ -60,7 +60,8 @@ class MainContainer extends Viewport {
60
60
  for (; j < repeats; j++) {
61
61
  for (i=0; i < countRecords; i++) {
62
62
  record = store.items[i];
63
- Object.entries(record).forEach(([field, value]) => {
63
+
64
+ Object.entries(record[Symbol.for('data')]).forEach(([field, value]) => {
64
65
  if (field !== 'githubId') {
65
66
  if (value.includes(string1)) {
66
67
  newValue = value.replace(string1, string2);
@@ -72,7 +73,7 @@ class MainContainer extends Viewport {
72
73
 
73
74
  record[field] = newValue; // triggers the change
74
75
  }
75
- });
76
+ })
76
77
  }
77
78
  }
78
79
  }
@@ -110,7 +111,7 @@ class MainContainer extends Viewport {
110
111
  listeners: {
111
112
  change: function(data) {
112
113
  if (data.value) {
113
- Neo.getComponent('myTableStoreContainer').selectionModel = {
114
+ Neo.getComponent('myTableStoreContainer').view.selectionModel = {
114
115
  ntype: this.value
115
116
  };
116
117
  }
@@ -127,7 +128,7 @@ class MainContainer extends Viewport {
127
128
  listeners: {
128
129
  change: function(data) {
129
130
  if (data.value) {
130
- Neo.getComponent('myTableStoreContainer').selectionModel = {
131
+ Neo.getComponent('myTableStoreContainer').view.selectionModel = {
131
132
  ntype: this.value
132
133
  };
133
134
  }
@@ -144,7 +145,7 @@ class MainContainer extends Viewport {
144
145
  listeners: {
145
146
  change: function(data) {
146
147
  if (data.value) {
147
- Neo.getComponent('myTableStoreContainer').selectionModel = {
148
+ Neo.getComponent('myTableStoreContainer').view.selectionModel = {
148
149
  ntype: this.value
149
150
  };
150
151
  }
@@ -161,7 +162,7 @@ class MainContainer extends Viewport {
161
162
  listeners: {
162
163
  change: function(data) {
163
164
  if (data.value) {
164
- Neo.getComponent('myTableStoreContainer').selectionModel = {
165
+ Neo.getComponent('myTableStoreContainer').view.selectionModel = {
165
166
  ntype: this.value
166
167
  };
167
168
  }
@@ -178,7 +179,7 @@ class MainContainer extends Viewport {
178
179
  listeners: {
179
180
  change: function(data) {
180
181
  if (data.value) {
181
- Neo.getComponent('myTableStoreContainer').selectionModel = {
182
+ Neo.getComponent('myTableStoreContainer').view.selectionModel = {
182
183
  ntype: this.value
183
184
  };
184
185
  }
@@ -186,12 +187,12 @@ class MainContainer extends Viewport {
186
187
  }
187
188
  }]
188
189
  }, {
189
- module : TableContainer,
190
- id : 'myTableStoreContainer',
191
- selectionModel: CellModel,
192
- store : MainStore,
193
- width : '100%',
194
- wrapperStyle : {height: '300px'},
190
+ module : TableContainer,
191
+ id : 'myTableStoreContainer',
192
+ store : MainStore,
193
+ viewConfig : {selectionModel: CellModel},
194
+ width : '100%',
195
+ wrapperStyle: {height: '300px'},
195
196
 
196
197
  columns: [{
197
198
  dataField: 'firstname',
@@ -10,16 +10,16 @@ class MainModel extends Model {
10
10
 
11
11
  fields: [{
12
12
  name: 'country',
13
- type: 'string'
13
+ type: 'html'
14
14
  }, {
15
15
  name: 'firstname',
16
- type: 'string'
16
+ type: 'html'
17
17
  }, {
18
18
  name: 'githubId',
19
19
  type: 'string'
20
20
  }, {
21
21
  name: 'lastname',
22
- type: 'string'
22
+ type: 'html'
23
23
  }]
24
24
  }
25
25
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "8.9.1",
3
+ "version": "8.10.1",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -21,10 +21,10 @@ If you move quickly, you might reach 20,000 or 30,000 delta updates per second.
21
21
  second &mdash; but we've never actually hit the limit.
22
22
 
23
23
  <pre data-neo>
24
- import Base from '../container/Base.mjs';
25
- import Helix from '../component/Helix.mjs';
24
+ import Container from '../container/Base.mjs';
25
+ import Helix from '../component/Helix.mjs';
26
26
 
27
- class MainView extends Base {
27
+ class MainView extends Container {
28
28
  static config = {
29
29
  className: 'Benefits.speed.MainView',
30
30
  layout : 'fit',
@@ -65,7 +65,7 @@
65
65
  .neo-button-glyph {
66
66
  color : var(--button-glyph-color);
67
67
  font-size : 12px;
68
- margin : 0 6px 0 0;
68
+ margin : var(--button-glyph-margin);
69
69
  pointer-events: none;
70
70
  z-index : 2;
71
71
  }
@@ -9,8 +9,6 @@
9
9
 
10
10
  .neo-table-row {
11
11
  .neo-table-cell {
12
- position: relative;
13
-
14
12
  &.neo-is-modified {
15
13
  &:after {
16
14
  border-color: transparent var(--table-cell-ismodified-color) transparent transparent;
@@ -147,7 +147,7 @@
147
147
  .neo-button {
148
148
  &.icon-left {
149
149
  .neo-button-glyph {
150
- margin: 0 6px 0 0;
150
+ margin: var(--button-glyph-margin);
151
151
  }
152
152
  }
153
153
  }
@@ -29,6 +29,7 @@ $text-color : #bbb;
29
29
  --button-glyph-color-active : #{$text-color};
30
30
  --button-glyph-color-disabled : #{$text-color};
31
31
  --button-glyph-color-hover : #{$text-color};
32
+ --button-glyph-margin : 1px 6px 0 0;
32
33
  --button-height : initial;
33
34
  --button-margin : 2px;
34
35
  --button-opacity-disabled : var(--neo-disabled-opacity);
@@ -28,6 +28,7 @@ $text-color : #1c60a0;
28
28
  --button-glyph-color-active : #{$text-color};
29
29
  --button-glyph-color-disabled : #{$text-color};
30
30
  --button-glyph-color-hover : #{$text-color};
31
+ --button-glyph-margin : 1px 6px 0 0;
31
32
  --button-height : initial;
32
33
  --button-margin : 2px;
33
34
  --button-opacity-disabled : var(--neo-disabled-opacity);
@@ -39,6 +39,7 @@
39
39
  --button-glyph-color-hover : var(--sem-color-text-neutral-reversed);
40
40
  --button-glyph-color-active : var(--sem-color-text-neutral-reversed);
41
41
  --button-glyph-color-disabled : var(--sem-color-text-neutral-disabled);
42
+ --button-glyph-margin : 1px 6px 0 0;
42
43
 
43
44
  --button-background-image : none;
44
45
  --button-background-gradient-end : #323536;
@@ -262,12 +262,12 @@ const DefaultConfig = {
262
262
  useVdomWorker: true,
263
263
  /**
264
264
  * buildScripts/injectPackageVersion.mjs will update this value
265
- * @default '8.9.1'
265
+ * @default '8.10.1'
266
266
  * @memberOf! module:Neo
267
267
  * @name config.version
268
268
  * @type String
269
269
  */
270
- version: '8.9.1'
270
+ version: '8.10.1'
271
271
  };
272
272
 
273
273
  Object.assign(DefaultConfig, {
package/src/Main.mjs CHANGED
@@ -213,6 +213,7 @@ class Main extends core.Base {
213
213
  }
214
214
 
215
215
  this.registerAddon(module.default);
216
+ await this.timeout(20); // Wait until remotes are registered
216
217
 
217
218
  return true
218
219
  }
@@ -1684,7 +1684,7 @@ class Component extends Base {
1684
1684
  * Convenience shortcut
1685
1685
  * @param {String[]|String} id=this.id
1686
1686
  * @param {String} appName=this.appName
1687
- * @returns {Promise<Neo.util.Rectangle||Neo.util.Rectangle[]>}
1687
+ * @returns {Promise<Neo.util.Rectangle|Neo.util.Rectangle[]>}
1688
1688
  */
1689
1689
  async getDomRect(id=this.id, appName=this.appName) {
1690
1690
  let result = await Neo.main.DomAccess.getBoundingClientRect({appName, id, windowId: this.windowId});
@@ -1696,42 +1696,6 @@ class Component extends Base {
1696
1696
  return Rectangle.clone(result)
1697
1697
  }
1698
1698
 
1699
- /**
1700
- * In case you are sure a DOMRect exists, use getDomRect()
1701
- * Otherwise you can wait for it using this method.
1702
- * @example:
1703
- * await this.render(true);
1704
- * await this.waitForDomRect();
1705
- * @param {Object} opts
1706
- * @param {String} opts.appName=this.appName
1707
- * @param {Number} opts.attempts=10 Reruns in case the rect height or width equals 0
1708
- * @param {Number} opts.delay=50 Time in ms before checking again
1709
- * @param {String[]|String} opts.id=this.id
1710
- * @returns {Promise<Neo.util.Rectangle||Neo.util.Rectangle[]>}
1711
- */
1712
- async waitForDomRect({appName=this.appName, attempts=10, delay=50, id=this.id}) {
1713
- let me = this,
1714
- result = await me.getDomRect(id, appName),
1715
- reRun = false;
1716
-
1717
- if (Array.isArray(result)) {
1718
- result.forEach(rect => {
1719
- if (rect.height < 1 || rect.width < 1) {
1720
- reRun = true
1721
- }
1722
- })
1723
- } else if (result.height < 1 || result.width < 1) {
1724
- reRun = true
1725
- }
1726
-
1727
- if (reRun && attempts > 0) {
1728
- await me.timeout(delay);
1729
- return await me.waitForDomRect({appName, attempts: attempts-1, delay, id})
1730
- }
1731
-
1732
- return result
1733
- }
1734
-
1735
1699
  /**
1736
1700
  * Honors different item roots for mount / render OPs
1737
1701
  * @returns {String}
@@ -2758,6 +2722,42 @@ class Component extends Base {
2758
2722
 
2759
2723
  me.hasUnmountedVdomChanges = !mounted && me.hasBeenMounted
2760
2724
  }
2725
+
2726
+ /**
2727
+ * In case you are sure a DOMRect exists, use getDomRect()
2728
+ * Otherwise you can wait for it using this method.
2729
+ * @example:
2730
+ * await this.render(true);
2731
+ * await this.waitForDomRect();
2732
+ * @param {Object} opts
2733
+ * @param {String} opts.appName=this.appName
2734
+ * @param {Number} opts.attempts=10 Reruns in case the rect height or width equals 0
2735
+ * @param {Number} opts.delay=50 Time in ms before checking again
2736
+ * @param {String[]|String} opts.id=this.id
2737
+ * @returns {Promise<Neo.util.Rectangle|Neo.util.Rectangle[]>}
2738
+ */
2739
+ async waitForDomRect({appName=this.appName, attempts=10, delay=50, id=this.id}) {
2740
+ let me = this,
2741
+ result = await me.getDomRect(id, appName),
2742
+ reRun = false;
2743
+
2744
+ if (Array.isArray(result)) {
2745
+ result.forEach(rect => {
2746
+ if (rect.height < 1 || rect.width < 1) {
2747
+ reRun = true
2748
+ }
2749
+ })
2750
+ } else if (result.height < 1 || result.width < 1) {
2751
+ reRun = true
2752
+ }
2753
+
2754
+ if (reRun && attempts > 0) {
2755
+ await me.timeout(delay);
2756
+ return await me.waitForDomRect({appName, attempts: attempts-1, delay, id})
2757
+ }
2758
+
2759
+ return result
2760
+ }
2761
2761
  }
2762
2762
 
2763
2763
  /**