neo.mjs 7.2.0 → 7.4.0

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 (52) hide show
  1. package/README.md +12 -6
  2. package/apps/ServiceWorker.mjs +2 -2
  3. package/apps/portal/index.html +1 -1
  4. package/apps/portal/model/Example.mjs +14 -4
  5. package/apps/portal/resources/data/examples_devmode.json +141 -173
  6. package/apps/portal/resources/data/examples_dist_dev.json +135 -164
  7. package/apps/portal/resources/data/examples_dist_prod.json +135 -164
  8. package/apps/portal/store/Examples.mjs +1 -8
  9. package/apps/portal/view/blog/List.mjs +12 -14
  10. package/apps/portal/view/examples/List.mjs +181 -37
  11. package/apps/portal/view/examples/TabContainer.mjs +6 -3
  12. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  13. package/apps/realworld/api/Article.mjs +7 -1
  14. package/apps/realworld/api/Favorite.mjs +7 -1
  15. package/apps/realworld/api/Profile.mjs +7 -1
  16. package/apps/realworld/api/Tag.mjs +7 -1
  17. package/apps/realworld/api/User.mjs +7 -1
  18. package/apps/realworld2/api/Article.mjs +7 -1
  19. package/apps/realworld2/api/Favorite.mjs +7 -1
  20. package/apps/realworld2/api/Profile.mjs +7 -1
  21. package/apps/realworld2/api/Tag.mjs +7 -1
  22. package/apps/realworld2/api/User.mjs +7 -1
  23. package/examples/ServiceWorker.mjs +2 -2
  24. package/examples/table/container/MainStore.mjs +0 -6
  25. package/package.json +5 -3
  26. package/resources/scss/src/apps/portal/examples/List.scss +16 -0
  27. package/resources/scss/src/apps/portal/examples/TabContainer.scss +2 -2
  28. package/src/DefaultConfig.mjs +2 -2
  29. package/src/Main.mjs +8 -0
  30. package/src/calendar/view/MainContainer.mjs +6 -5
  31. package/src/component/Base.mjs +4 -3
  32. package/src/component/DateSelector.mjs +4 -5
  33. package/src/dialog/Base.mjs +3 -1
  34. package/src/form/field/Time.mjs +3 -2
  35. package/src/list/Base.mjs +15 -2
  36. package/src/main/DomAccess.mjs +7 -5
  37. package/src/main/DomEvents.mjs +2 -1
  38. package/src/selection/grid/CellColumnModel.mjs +1 -1
  39. package/src/selection/grid/CellColumnRowModel.mjs +2 -2
  40. package/src/selection/grid/CellModel.mjs +16 -23
  41. package/src/selection/grid/CellRowModel.mjs +1 -1
  42. package/src/selection/grid/ColumnModel.mjs +14 -8
  43. package/src/selection/grid/RowModel.mjs +15 -10
  44. package/src/selection/table/CellColumnModel.mjs +1 -1
  45. package/src/selection/table/CellColumnRowModel.mjs +1 -1
  46. package/src/selection/table/CellModel.mjs +16 -25
  47. package/src/selection/table/CellRowModel.mjs +1 -1
  48. package/src/selection/table/ColumnModel.mjs +16 -10
  49. package/src/selection/table/RowModel.mjs +14 -9
  50. package/src/table/View.mjs +2 -2
  51. package/src/worker/App.mjs +11 -0
  52. package/src/worker/ServiceBase.mjs +14 -5
@@ -1,5 +1,5 @@
1
1
  import BaseList from '../../../../src/list/Base.mjs';
2
- import Examples from '../../store/Examples.mjs';
2
+ import VDomUtil from '../../../../src/util/VDom.mjs';
3
3
 
4
4
  /**
5
5
  * @class Portal.view.examples.List
@@ -25,13 +25,24 @@ class List extends BaseList {
25
25
  */
26
26
  baseCls: ['portal-examples-list', 'neo-list'],
27
27
  /**
28
- * @member {Neo.data.Store} store=Examples
28
+ * @member {String} baseUrl='https://neomjs.com/'
29
29
  */
30
- store: Examples,
30
+ baseUrl: 'https://neomjs.com/',
31
31
  /**
32
- * @member {String|null} storeUrl_=null
32
+ * The env of the example links.
33
+ * Valid values are 'development', 'dist/development', 'dist/production'
34
+ * @member {String} environment='development'
33
35
  */
34
- storeUrl_: null,
36
+ environment: 'development',
37
+ /**
38
+ * Specify how many example item images to preload when intersecting
39
+ * @member {Number} preloadImages=5
40
+ */
41
+ preloadImages: 5,
42
+ /**
43
+ * @member {String} sourceBaseUrl='https://github.com/neomjs/neo/tree/dev/'
44
+ */
45
+ sourceBaseUrl: 'https://github.com/neomjs/neo/tree/dev/',
35
46
  /**
36
47
  * @member {Boolean} useWrapperNode=true
37
48
  */
@@ -46,31 +57,9 @@ class List extends BaseList {
46
57
  }
47
58
 
48
59
  /**
49
- * Triggered before the store config gets changed.
50
- * @param {Object|Neo.data.Store} value
51
- * @param {Object|Neo.data.Store} oldValue
52
- * @returns {Neo.data.Store}
53
- * @protected
60
+ * @member {String} imageBasePath
54
61
  */
55
- beforeSetStore(value, oldValue) {
56
- if (value) {
57
- if (value.isClass) {
58
- value = {
59
- module: value,
60
- url : this.storeUrl
61
- };
62
- } else if (Neo.isObject(value)) {
63
- value.url = this.storeUrl;
64
- }
65
- }
66
-
67
- return super.beforeSetStore(value, oldValue);
68
- }
69
-
70
- /**
71
- * @param {Object} record
72
- */
73
- createItemContent(record) {
62
+ get imageBasePath() {
74
63
  let basePath;
75
64
 
76
65
  if (Neo.config.isGitHubPages) {
@@ -83,17 +72,50 @@ class List extends BaseList {
83
72
  basePath = 'https://raw.githubusercontent.com/neomjs/pages/main/resources_pub/website/examples'
84
73
  }
85
74
 
75
+ return basePath
76
+ }
77
+
78
+ /**
79
+ * @param {Object} config
80
+ */
81
+ construct(config) {
82
+ super.construct(config);
83
+
84
+ let me = this;
85
+
86
+ me.addDomListeners({
87
+ intersect: me.onIntersect,
88
+ scope : me
89
+ })
90
+ }
91
+
92
+ /**
93
+ * Triggered after the mounted config got changed
94
+ * @param {Boolean} value
95
+ * @param {Boolean} oldValue
96
+ * @protected
97
+ */
98
+ afterSetMounted(value, oldValue) {
99
+ super.afterSetMounted(value, oldValue);
100
+ value && this.registerIntersectionObserver()
101
+ }
102
+
103
+ /**
104
+ * @param {Object} record
105
+ */
106
+ createItemContent(record) {
107
+ let me = this;
108
+
86
109
  return [
87
- {cls: ['content', 'neo-relative'], cn: [
88
- {cls: ['neo-full-size', 'preview-image'], style: {
89
- backgroundImage: `url('${basePath}/${record.image}'), linear-gradient(#777, #333)`}
90
- },
110
+ {cls: ['content', 'neo-relative'], data: {recordId: record.id}, removeDom: me.isHiddenItem(record), cn: [
111
+ {cls: ['neo-multi-window'], data: {neoTooltip: 'Multi Window Demo'}, removeDom: !record.sharedWorkers, cn: [
112
+ {cls: ['far', 'fa-window-restore']}
113
+ ]},
114
+ {cls: ['neo-full-size', 'preview-image'], flag: `image-${record.id}`},
91
115
  {cls: ['neo-absolute', 'neo-item-bottom-position'], cn: [
92
- {tag: 'a', cls: ['neo-title'], href: record.url, target: '_blank', cn: [
93
- {html: record.name.replace(List.nameRegEx, "$1")}
94
- ]},
116
+ {...me.createLink(record)},
95
117
  {cls: ['neo-top-20'], cn: [
96
- {tag: 'a', cls: ['fab fa-github', 'neo-github-image'], href: record.sourceUrl, target: '_blank'},
118
+ {...me.createSourceLink(record)},
97
119
  {cls: ['neo-inner-content'], cn: [
98
120
  {cls: ['neo-inner-details'], html: record.browsers.join(', ')},
99
121
  {cls: ['neo-inner-details'], html: record.environments.join(', ')}
@@ -104,6 +126,56 @@ class List extends BaseList {
104
126
  ]
105
127
  }
106
128
 
129
+ /**
130
+ *
131
+ * @param {Object} record
132
+ * @returns {Object}
133
+ */
134
+ createLink(record) {
135
+ let externalLink = record.url.startsWith('http'),
136
+
137
+ vdom = {
138
+ tag : 'a',
139
+ cls : ['neo-title'],
140
+ cn : [{html: record.name.replace(List.nameRegEx, "$1")}],
141
+ href: record.url
142
+ };
143
+
144
+ // We can use a shorter syntax for pointing examples to neomjs.com, but not all examples have to be there.
145
+ if (!externalLink) {
146
+ vdom.href = this.baseUrl + record.url
147
+ }
148
+
149
+ // Do not open multi-window examples inside a new browser window, in case the environment is the same.
150
+ // E.g. opening the multi-window covid app & the portal app inside the same app worker is problematic.
151
+ if (!record.sharedWorkers || this.environment !== Neo.config.environment || externalLink) {
152
+ vdom.target = '_blank'
153
+ }
154
+
155
+ return vdom
156
+ }
157
+
158
+ /**
159
+ *
160
+ * @param {Object} record
161
+ * @returns {Object}
162
+ */
163
+ createSourceLink(record) {
164
+ let vdom = {
165
+ tag : 'a',
166
+ cls : ['fab fa-github', 'neo-github-image'],
167
+ href : record.sourceUrl,
168
+ target: '_blank'
169
+ };
170
+
171
+ // We can use a shorter syntax for pointing examples to neomjs/neo repo, but not all examples have to be there.
172
+ if (!record.sourceUrl.startsWith('http')) {
173
+ vdom.href = this.sourceBaseUrl + record.sourceUrl
174
+ }
175
+
176
+ return vdom
177
+ }
178
+
107
179
  /**
108
180
  * @returns {Object}
109
181
  */
@@ -117,6 +189,78 @@ class List extends BaseList {
117
189
  getVnodeRoot() {
118
190
  return this.vnode.childNodes[0]
119
191
  }
192
+
193
+ /**
194
+ * @param {Object} record
195
+ * @returns {Boolean}
196
+ */
197
+ isHiddenItem(record) {
198
+ if (record.hidden) {
199
+ return true
200
+ }
201
+
202
+ // We only want to show the portal app for the non-current environment.
203
+ // => A link to itself feels pointless
204
+ return record.sourceUrl === 'apps/portal' && this.environment === Neo.config.environment
205
+ }
206
+
207
+ /**
208
+ * @param {Object} data
209
+ */
210
+ onIntersect(data) {
211
+ let me = this,
212
+ {imageBasePath, store} = me,
213
+ record = store.get(parseInt(data.data.recordId)),
214
+ i = store.indexOf(record),
215
+ len = Math.min(i + me.preloadImages, store.getCount()),
216
+ needsUpdate = false,
217
+ node;
218
+
219
+ for (; i < len; i++) {
220
+ node = VDomUtil.getByFlag(me.vdom, `image-${record.id}`);
221
+
222
+ if (!node.style) {
223
+ needsUpdate = true;
224
+
225
+ node.style = {
226
+ backgroundImage: `url('${imageBasePath}/${record.image}'), linear-gradient(#777, #333)`
227
+ }
228
+ }
229
+ }
230
+
231
+ needsUpdate && me.update()
232
+ }
233
+
234
+ /**
235
+ *
236
+ */
237
+ async registerIntersectionObserver() {
238
+ let me = this,
239
+ opts = {id: me.id, observe: ['.content'], windowId: me.windowId},
240
+ i = 0,
241
+ len = me.intersectionObserverReconnects,
242
+ data;
243
+
244
+ await me.timeout(150);
245
+
246
+ data = await Neo.main.addon.IntersectionObserver.register({
247
+ ...opts,
248
+ callback: 'isVisible',
249
+ root : `#${me.parentId}`
250
+ });
251
+
252
+ if (data.countTargets < 1) {
253
+ for (; i < len; i++) {
254
+ await me.timeout(100);
255
+
256
+ data = await Neo.main.addon.IntersectionObserver.observe(opts);
257
+
258
+ if (data.countTargets > 0) {
259
+ break
260
+ }
261
+ }
262
+ }
263
+ }
120
264
  }
121
265
 
122
266
  export default Neo.setupClass(List);
@@ -1,4 +1,5 @@
1
1
  import Container from '../../../../src/tab/Container.mjs';
2
+ import ExampleStore from '../../store/Examples.mjs';
2
3
  import List from './List.mjs';
3
4
  import TabContainerController from './TabContainerController.mjs';
4
5
 
@@ -42,23 +43,25 @@ class TabContainer extends Container {
42
43
  */
43
44
  items: [{
44
45
  reference : 'examples-devmode-list',
45
- storeUrl : '../../apps/portal/resources/data/examples_devmode.json',
46
+ store : {module: ExampleStore, url: '../../apps/portal/resources/data/examples_devmode.json'},
46
47
  tabButtonConfig: {
47
48
  iconCls: 'fa fa-chess-knight',
48
49
  route : '/examples/devmode',
49
50
  text : 'DevMode'
50
51
  }
51
52
  }, {
53
+ environment : 'dist/development',
52
54
  reference : 'examples-dist-dev-list',
53
- storeUrl : '../../apps/portal/resources/data/examples_dist_dev.json',
55
+ store : {module: ExampleStore, url: '../../apps/portal/resources/data/examples_dist_dev.json'},
54
56
  tabButtonConfig: {
55
57
  iconCls: 'fa fa-chess-queen',
56
58
  route : '/examples/dist_dev',
57
59
  text : 'dist/dev'
58
60
  }
59
61
  }, {
62
+ environment : 'dist/production',
60
63
  reference : 'examples-dist-prod-list',
61
- storeUrl : '../../apps/portal/resources/data/examples_dist_prod.json',
64
+ store : {module: ExampleStore, url: '../../apps/portal/resources/data/examples_dist_prod.json'},
62
65
  tabButtonConfig: {
63
66
  iconCls: 'fa fa-chess-king',
64
67
  route : '/examples/dist_prod',
@@ -111,7 +111,7 @@ class FooterContainer extends Container {
111
111
  }, {
112
112
  module: Component,
113
113
  cls : ['neo-version'],
114
- html : 'v7.2.0'
114
+ html : 'v7.4.0'
115
115
  }]
116
116
  }],
117
117
  /**
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
3
3
  /**
4
4
  * @class RealWorld.api.Article
5
5
  * @extends RealWorld.api.Base
6
+ * @singleton
6
7
  */
7
8
  class Article extends Base {
8
9
  static config = {
@@ -14,7 +15,12 @@ class Article extends Base {
14
15
  /**
15
16
  * @member {String} resource='/articles'
16
17
  */
17
- resource: '/articles'
18
+ resource: '/articles',
19
+ /**
20
+ * @member {Boolean} singleton=true
21
+ * @protected
22
+ */
23
+ singleton: true
18
24
  }
19
25
 
20
26
  /**
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
3
3
  /**
4
4
  * @class RealWorld.api.Favorite
5
5
  * @extends RealWorld.api.Base
6
+ * @singleton
6
7
  */
7
8
  class Favorite extends Base {
8
9
  static config = {
@@ -10,7 +11,12 @@ class Favorite extends Base {
10
11
  * @member {String} className='RealWorld.api.Favorite'
11
12
  * @protected
12
13
  */
13
- className: 'RealWorld.api.Favorite'
14
+ className: 'RealWorld.api.Favorite',
15
+ /**
16
+ * @member {Boolean} singleton=true
17
+ * @protected
18
+ */
19
+ singleton: true
14
20
  }
15
21
 
16
22
  /**
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
3
3
  /**
4
4
  * @class RealWorld.api.Profile
5
5
  * @extends RealWorld.api.Base
6
+ * @singleton
6
7
  */
7
8
  class Profile extends Base {
8
9
  static config = {
@@ -14,7 +15,12 @@ class Profile extends Base {
14
15
  /**
15
16
  * @member {String} resource='/profiles'
16
17
  */
17
- resource: '/profiles'
18
+ resource: '/profiles',
19
+ /**
20
+ * @member {Boolean} singleton=true
21
+ * @protected
22
+ */
23
+ singleton: true
18
24
  }
19
25
 
20
26
  /**
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
3
3
  /**
4
4
  * @class RealWorld.api.Tag
5
5
  * @extends RealWorld.api.Base
6
+ * @singleton
6
7
  */
7
8
  class Tag extends Base {
8
9
  static config = {
@@ -14,7 +15,12 @@ class Tag extends Base {
14
15
  /**
15
16
  * @member {String} resource='/tags'
16
17
  */
17
- resource: '/tags'
18
+ resource: '/tags',
19
+ /**
20
+ * @member {Boolean} singleton=true
21
+ * @protected
22
+ */
23
+ singleton: true
18
24
  }
19
25
  }
20
26
 
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
3
3
  /**
4
4
  * @class RealWorld.api.User
5
5
  * @extends RealWorld.api.Base
6
+ * @singleton
6
7
  */
7
8
  class User extends Base {
8
9
  static config = {
@@ -14,7 +15,12 @@ class User extends Base {
14
15
  /**
15
16
  * @member {String} resource='/tags'
16
17
  */
17
- resource: '/users'
18
+ resource: '/users',
19
+ /**
20
+ * @member {Boolean} singleton=true
21
+ * @protected
22
+ */
23
+ singleton: true
18
24
  }
19
25
  }
20
26
 
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
3
3
  /**
4
4
  * @class RealWorld2.api.Article
5
5
  * @extends RealWorld2.api.Base
6
+ * @singleton
6
7
  */
7
8
  class Article extends Base {
8
9
  static config = {
@@ -14,7 +15,12 @@ class Article extends Base {
14
15
  /**
15
16
  * @member {String} resource='/articles'
16
17
  */
17
- resource: '/articles'
18
+ resource: '/articles',
19
+ /**
20
+ * @member {Boolean} singleton=true
21
+ * @protected
22
+ */
23
+ singleton: true
18
24
  }
19
25
 
20
26
  /**
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
3
3
  /**
4
4
  * @class RealWorld2.api.Favorite
5
5
  * @extends RealWorld2.api.Base
6
+ * @singleton
6
7
  */
7
8
  class Favorite extends Base {
8
9
  static config = {
@@ -10,7 +11,12 @@ class Favorite extends Base {
10
11
  * @member {String} className='RealWorld2.api.Favorite'
11
12
  * @protected
12
13
  */
13
- className: 'RealWorld2.api.Favorite'
14
+ className: 'RealWorld2.api.Favorite',
15
+ /**
16
+ * @member {Boolean} singleton=true
17
+ * @protected
18
+ */
19
+ singleton: true
14
20
  }
15
21
 
16
22
  /**
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
3
3
  /**
4
4
  * @class RealWorld2.api.Profile
5
5
  * @extends RealWorld2.api.Base
6
+ * @singleton
6
7
  */
7
8
  class Profile extends Base {
8
9
  static config = {
@@ -14,7 +15,12 @@ class Profile extends Base {
14
15
  /**
15
16
  * @member {String} resource='/profiles'
16
17
  */
17
- resource: '/profiles'
18
+ resource: '/profiles',
19
+ /**
20
+ * @member {Boolean} singleton=true
21
+ * @protected
22
+ */
23
+ singleton: true
18
24
  }
19
25
 
20
26
  /**
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
3
3
  /**
4
4
  * @class RealWorld2.api.Tag
5
5
  * @extends RealWorld2.api.Base
6
+ * @singleton
6
7
  */
7
8
  class Tag extends Base {
8
9
  static config = {
@@ -14,7 +15,12 @@ class Tag extends Base {
14
15
  /**
15
16
  * @member {String} resource='/tags'
16
17
  */
17
- resource: '/tags'
18
+ resource: '/tags',
19
+ /**
20
+ * @member {Boolean} singleton=true
21
+ * @protected
22
+ */
23
+ singleton: true
18
24
  }
19
25
  }
20
26
 
@@ -3,6 +3,7 @@ import Base from './Base.mjs';
3
3
  /**
4
4
  * @class RealWorld2.api.User
5
5
  * @extends RealWorld2.api.Base
6
+ * @singleton
6
7
  */
7
8
  class User extends Base {
8
9
  static config = {
@@ -14,7 +15,12 @@ class User extends Base {
14
15
  /**
15
16
  * @member {String} resource='/tags'
16
17
  */
17
- resource: '/users'
18
+ resource: '/users',
19
+ /**
20
+ * @member {Boolean} singleton=true
21
+ * @protected
22
+ */
23
+ singleton: true
18
24
  }
19
25
  }
20
26
 
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='7.2.0'
23
+ * @member {String} version='7.4.0'
24
24
  */
25
- version: '7.2.0'
25
+ version: '7.4.0'
26
26
  }
27
27
 
28
28
  /**
@@ -41,12 +41,6 @@ class MainStore extends Store {
41
41
  firstname: 'Bastian',
42
42
  githubId : 'bhaustein',
43
43
  lastname : 'Haustein'
44
- }, {
45
- colspan : {firstname: 3},
46
- country : 'Germany',
47
- firstname: 'Colspan 3',
48
- githubId : 'random',
49
- lastname : ''
50
44
  }]
51
45
  }
52
46
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "7.2.0",
3
+ "version": "7.4.0",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -31,6 +31,8 @@
31
31
  "javascript",
32
32
  "frontend",
33
33
  "framework",
34
+ "offscreencanvas",
35
+ "sharedworker",
34
36
  "webworker",
35
37
  "ecmascript",
36
38
  "css",
@@ -49,7 +51,7 @@
49
51
  "clean-webpack-plugin": "^4.0.0",
50
52
  "commander": "^12.1.0",
51
53
  "cssnano": "^7.0.6",
52
- "envinfo": "^7.13.0",
54
+ "envinfo": "^7.14.0",
53
55
  "fs-extra": "^11.2.0",
54
56
  "highlightjs-line-numbers.js": "^2.8.0",
55
57
  "inquirer": "^10.2.2",
@@ -57,7 +59,7 @@
57
59
  "monaco-editor": "0.50.0",
58
60
  "neo-jsdoc": "1.0.1",
59
61
  "neo-jsdoc-x": "1.0.5",
60
- "postcss": "^8.4.45",
62
+ "postcss": "^8.4.47",
61
63
  "sass": "^1.78.0",
62
64
  "siesta-lite": "5.5.2",
63
65
  "url": "^0.11.4",
@@ -5,6 +5,7 @@
5
5
  cursor : default;
6
6
  display : flex;
7
7
  max-width : 800px;
8
+ margin : 0 auto;
8
9
  overflow : hidden;
9
10
  padding : 0;
10
11
  transition : height var(--portal-transition-duration) ease-out, margin-bottom var(--portal-transition-duration) ease-out;
@@ -50,6 +51,21 @@
50
51
  transition: margin var(--portal-transition-duration) ease-out;
51
52
  }
52
53
 
54
+ .neo-multi-window {
55
+ align-items : center;
56
+ background-color: #fff;
57
+ border-radius : 50%;
58
+ box-shadow : 0 5px 10px rgba(0, 0, 0, 0.3);
59
+ color : #3E63DD;
60
+ display : flex;
61
+ height : 2em;
62
+ justify-content : center;
63
+ position : absolute;
64
+ right : 1em;
65
+ top : 1em;
66
+ width : 2em;
67
+ }
68
+
53
69
  .neo-relative {
54
70
  position: relative;
55
71
  }
@@ -1,8 +1,8 @@
1
1
  .portal-examples-tab-container.neo-tab-container {
2
- margin : 0 auto;
3
- max-width: 830px;
2
+
4
3
  }
5
4
 
5
+ // must not be inside the root class to honor the styling for tab button drag&drop
6
6
  .portal-examples-tab-header-toolbar.neo-tab-header-toolbar {
7
7
  background-color: #8BA6FF;
8
8
 
@@ -262,12 +262,12 @@ const DefaultConfig = {
262
262
  useVdomWorker: true,
263
263
  /**
264
264
  * buildScripts/injectPackageVersion.mjs will update this value
265
- * @default '7.2.0'
265
+ * @default '7.4.0'
266
266
  * @memberOf! module:Neo
267
267
  * @name config.version
268
268
  * @type String
269
269
  */
270
- version: '7.2.0'
270
+ version: '7.4.0'
271
271
  };
272
272
 
273
273
  Object.assign(DefaultConfig, {
package/src/Main.mjs CHANGED
@@ -53,6 +53,7 @@ class Main extends core.Base {
53
53
  'importAddon',
54
54
  'log',
55
55
  'redirectTo',
56
+ 'reloadWindow',
56
57
  'setNeoConfig',
57
58
  'setRoute',
58
59
  'windowClose',
@@ -410,6 +411,13 @@ class Main extends core.Base {
410
411
  this.addon[addon.constructor.name] = addon
411
412
  }
412
413
 
414
+ /**
415
+ * @param {Object} data
416
+ */
417
+ reloadWindow(data) {
418
+ location.reload()
419
+ }
420
+
413
421
  /**
414
422
  * Triggers the different DOM operation queues
415
423
  * @protected