neo.mjs 6.10.0 → 6.10.2

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 (26) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/learnneo/view/home/HeaderToolbar.mjs +47 -0
  3. package/apps/learnneo/view/home/MainContainer.mjs +32 -25
  4. package/apps/newwebsite/app.mjs +2 -2
  5. package/apps/newwebsite/view/{MainContainer.mjs → Viewport.mjs} +11 -11
  6. package/buildScripts/convertDesignTokens.mjs +1 -1
  7. package/examples/ServiceWorker.mjs +2 -2
  8. package/examples/tab/container/neo-config.json +1 -1
  9. package/package.json +3 -3
  10. package/resources/data/deck/learnneo/p/2023-10-14T19-25-08-153Z.md +18 -21
  11. package/resources/data/deck/learnneo/p/MainThreadAddonIntro.md +2 -2
  12. package/resources/design-tokens/json/component.json +43 -7
  13. package/resources/design-tokens/json/core.json +45 -24
  14. package/resources/design-tokens/json/semantic.json +31 -1
  15. package/resources/scss/src/apps/learnneo/Viewport.scss +3 -3
  16. package/resources/scss/src/apps/learnneo/home/HeaderToolbar.scss +24 -0
  17. package/resources/scss/src/apps/learnneo/home/MainContainer.scss +7 -0
  18. package/resources/scss/src/apps/newwebsite/{MainContainer.scss → Viewport.scss} +1 -1
  19. package/resources/scss/theme-neo-light/design-tokens/Component.scss +12 -7
  20. package/resources/scss/theme-neo-light/design-tokens/Core.scss +67 -66
  21. package/resources/scss/theme-neo-light/design-tokens/Semantic.scss +11 -8
  22. package/resources/scss/theme-neo-light/tab/Strip.scss +3 -3
  23. package/resources/scss/theme-neo-light/tab/header/Button.scss +24 -13
  24. package/src/DefaultConfig.mjs +2 -2
  25. package/src/calendar/view/week/Component.mjs +64 -64
  26. package/src/main/addon/Mwc.mjs +8 -4
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='6.10.0'
23
+ * @member {String} version='6.10.2'
24
24
  */
25
- version: '6.10.0'
25
+ version: '6.10.2'
26
26
  }
27
27
 
28
28
  /**
@@ -0,0 +1,47 @@
1
+ import Base from '../../../../src/toolbar/Base.mjs';
2
+ import Label from '../../../../src/component/Label.mjs';
3
+
4
+ /**
5
+ * @class LearnNeo.view.home.HeaderToolbar
6
+ * @extends Neo.container.Base
7
+ */
8
+ class HeaderToolbar extends Base {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='LearnNeo.view.home.HeaderToolbar'
12
+ * @protected
13
+ */
14
+ className: 'LearnNeo.view.home.HeaderToolbar',
15
+ /**
16
+ * @member {String[]} cls=['learnneo-header-toolbar']
17
+ */
18
+ cls: ['learnneo-header-toolbar'],
19
+ /**
20
+ * @member {Object[]} items
21
+ */
22
+ items: [{
23
+ module: Label,
24
+ cls : ['logo'],
25
+ text : 'neo.mjs'
26
+ }, '->', {
27
+ text: 'Docs',
28
+ ui : 'tertiary'
29
+ }, {
30
+ text: 'Learn',
31
+ ui : 'tertiary'
32
+ }, {
33
+ cls : ['github-button'],
34
+ iconCls: 'fa-brands fa-github',
35
+ ui : 'tertiary',
36
+ url : 'https://github.com/neomjs/neo'
37
+ }, {
38
+ iconCls: 'fa-brands fa-slack',
39
+ ui : 'tertiary',
40
+ url : 'https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA'
41
+ }]
42
+ }
43
+ }
44
+
45
+ Neo.applyClassConfig(HeaderToolbar);
46
+
47
+ export default HeaderToolbar;
@@ -1,6 +1,7 @@
1
1
  import Container from '../../../../src/container/Base.mjs';
2
2
  import ContentView from './ContentView.mjs';
3
3
  import ContentTreeList from './ContentTreeList.mjs';
4
+ import HeaderToolbar from './HeaderToolbar.mjs';
4
5
  import MainContainerController from './MainContainerController.mjs';
5
6
  import MainContainerModel from './MainContainerModel.mjs';
6
7
  import Splitter from '../../../../src/component/Splitter.mjs';
@@ -20,40 +21,46 @@ class MainContainer extends Container {
20
21
  * @member {Neo.controller.Component} controller=MainContainerController
21
22
  */
22
23
  controller: MainContainerController,
23
-
24
- cls: 'learnneo-maincontainer',
24
+ /**
25
+ * @member {String[]} cls=['learnneo-maincontainer']
26
+ */
27
+ cls: ['learnneo-maincontainer'],
25
28
  /**
26
29
  * @member {Object[]} items
27
30
  */
28
31
  items: [{
29
- module : Container,
30
- layout : 'fit',
31
- minWidth: 350,
32
- width : 350,
33
- cls : 'sidenav-container',
32
+ module: HeaderToolbar
33
+ }, {
34
+ module: Container,
35
+ layout: {ntype: 'hbox', align: 'stretch'},
36
+
34
37
  items: [{
35
- module : ContentTreeList,
36
- reference: 'tree',
38
+ module : Container,
39
+ layout : 'fit',
40
+ minWidth: 350,
41
+ width : 350,
42
+ cls : 'sidenav-container',
43
+ items: [{
44
+ module : ContentTreeList,
45
+ reference: 'tree',
46
+ listeners: {
47
+ contentChange: 'onContentChange',
48
+ }
49
+ }]
50
+ }, {
51
+ module : Splitter,
52
+ cls : ['main-content-splitter'],
53
+ resizeTarget: 'previous',
54
+ size : 4
55
+ }, {
56
+ module : ContentView,
57
+ reference: 'content',
37
58
  listeners: {
38
- contentChange: 'onContentChange',
59
+ edit : 'onContentEdit',
60
+ refresh: 'onContentRefresh'
39
61
  }
40
62
  }]
41
- }, {
42
- module : Splitter,
43
- resizeTarget: 'previous',
44
- size : 4
45
- }, {
46
- module : ContentView,
47
- reference: 'content',
48
- listeners: {
49
- edit : 'onContentEdit',
50
- refresh: 'onContentRefresh'
51
- }
52
63
  }],
53
- /**
54
- * @member {Object} layout={ntype:'hbox',align:'stretch'}
55
- */
56
- layout: {ntype: 'hbox', align: 'stretch'},
57
64
  /**
58
65
  * @member {Neo.model.Component} model=MainContainerModel
59
66
  */
@@ -1,6 +1,6 @@
1
- import MainContainer from './view/MainContainer.mjs';
1
+ import Viewport from './view/Viewport.mjs';
2
2
 
3
3
  export const onStart = () => Neo.app({
4
- mainView: MainContainer,
4
+ mainView: Viewport,
5
5
  name : 'NewWebsite'
6
6
  })
@@ -1,22 +1,22 @@
1
- import Button from '../../../src/button/Base.mjs';
2
- import Container from '../../../src/container/Base.mjs';
3
- import Viewport from '../../../src/container/Viewport.mjs';
1
+ import BaseViewport from '../../../src/container/Viewport.mjs';
2
+ import Button from '../../../src/button/Base.mjs';
3
+ import Container from '../../../src/container/Base.mjs';
4
4
 
5
5
  /**
6
- * @class NewWebsite.view.MainContainer
6
+ * @class NewWebsite.view.Viewport
7
7
  * @extends Neo.container.Viewport
8
8
  */
9
- class MainContainer extends Viewport {
9
+ class Viewport extends BaseViewport {
10
10
  static config = {
11
11
  /**
12
- * @member {String} className='NewWebsite.view.MainContainer'
12
+ * @member {String} className='NewWebsite.view.Viewport'
13
13
  * @protected
14
14
  */
15
- className: 'NewWebsite.view.MainContainer',
15
+ className: 'NewWebsite.view.Viewport',
16
16
  /**
17
- * @member {String[]} cls=['newwebsite-main-container']
17
+ * @member {String[]} cls=['newwebsite-viewport']
18
18
  */
19
- cls: ['newwebsite-main-container'],
19
+ cls: ['newwebsite-viewport'],
20
20
  /**
21
21
  * @member {Object[]} items
22
22
  */
@@ -54,6 +54,6 @@ class MainContainer extends Viewport {
54
54
  }
55
55
  }
56
56
 
57
- Neo.applyClassConfig(MainContainer);
57
+ Neo.applyClassConfig(Viewport);
58
58
 
59
- export default MainContainer;
59
+ export default Viewport;
@@ -41,7 +41,7 @@ function parseTokens(fileContent, prefix=tokenPrefix, map=[]) {
41
41
  keys.forEach(objKey => {
42
42
  if (objKey !== baseKey) {
43
43
  modify = value[objKey].$extensions?.['studio.tokens']?.modify;
44
- keyValue = `${modify.type}(${baseValue}, ${modify.value * 100}%)`;
44
+ keyValue = `#{${modify.type}(${baseValue}, ${modify.value * 100}%)}`;
45
45
 
46
46
  map.push([`${ns}-${objKey}`, keyValue]);
47
47
  } else {
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='6.10.0'
23
+ * @member {String} version='6.10.2'
24
24
  */
25
- version: '6.10.0'
25
+ version: '6.10.2'
26
26
  }
27
27
 
28
28
  /**
@@ -3,5 +3,5 @@
3
3
  "basePath" : "../../../",
4
4
  "environment": "development",
5
5
  "mainPath" : "./Main.mjs",
6
- "themes" : ["neo-theme-dark", "neo-theme-light"]
6
+ "themes" : ["neo-theme-dark", "neo-theme-light", "neo-theme-neo-light"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "6.10.0",
3
+ "version": "6.10.2",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -42,14 +42,14 @@
42
42
  },
43
43
  "homepage": "https://neomjs.github.io/pages/",
44
44
  "devDependencies": {
45
- "@fortawesome/fontawesome-free": "^6.4.2",
45
+ "@fortawesome/fontawesome-free": "^6.5.0",
46
46
  "autoprefixer": "^10.4.16",
47
47
  "chalk": "^5.3.0",
48
48
  "clean-webpack-plugin": "^4.0.0",
49
49
  "commander": "^11.1.0",
50
50
  "cssnano": "^6.0.1",
51
51
  "envinfo": "^7.11.0",
52
- "fs-extra": "^11.1.1",
52
+ "fs-extra": "^11.2.0",
53
53
  "highlightjs-line-numbers.js": "^2.8.0",
54
54
  "inquirer": "^9.2.12",
55
55
  "neo-jsdoc": "1.0.1",
@@ -5,9 +5,9 @@ If you wish, you can create a workspace for yourself by running `npx neo-app` wo
5
5
 
6
6
  <img src="https://raw.githubusercontent.com/neomjs/pages/main/resources/images/apps/learnneo/NeoWorkspace.png" style="height: 400px;">
7
7
 
8
- As you can see, a Neo.mjs workspace is a conventional npm workspace. If you run
8
+ As you can see, a Neo.mjs workspace is a conventional npm package. If you run
9
9
  the script `npm run server-start` from the workspace, Neo.mjs launches a web
10
- serve whose doc root is the workspace.
10
+ server whose doc root is the workspace.
11
11
 
12
12
  <img src="https://raw.githubusercontent.com/neomjs/pages/main/resources/images/apps/learnneo/ServerRoot.png" style="height: 400px;">
13
13
 
@@ -32,19 +32,17 @@ as well as create new views classes, their controllers, and other application lo
32
32
  Now let's look at a source file. This is the contents of `MainView.mjs`.
33
33
 
34
34
  <pre data-javascript>
35
- import Base from '../../../node_modules/neo.mjs/src/container/Base.mjs';
35
+ import Container from '../../../node_modules/neo.mjs/src/container/Base.mjs';
36
36
  import Controller from './MainViewController.mjs';
37
37
  import ViewModel from './MainViewModel.mjs';
38
38
 
39
- class MainView extends Base {
39
+ class MainView extends Container {
40
40
  static config = {
41
- className: 'Foo.view.MainView',
42
-
43
- controller: {module: Controller},
44
- model: {module: ViewModel},
45
-
46
- layout: {ntype: 'fit'},
47
- items: [],
41
+ className : 'Foo.view.MainView',
42
+ controller: Controller,
43
+ model : ViewModel,
44
+ layout : {ntype: 'fit'},
45
+ items : []
48
46
  }
49
47
  }
50
48
 
@@ -70,23 +68,22 @@ First, we need to import the class that defines buttons. Then we'll describe the
70
68
  `items:[].`
71
69
 
72
70
  <pre data-javascript>
73
- import Base from '../../../node_modules/neo.mjs/src/container/Base.mjs';
71
+ import Button from '../../../node_modules/neo.mjs/src/button/Base.mjs';
72
+ import Container from '../../../node_modules/neo.mjs/src/container/Base.mjs';
74
73
  import Controller from './MainViewController.mjs';
75
74
  import ViewModel from './MainViewModel.mjs';
76
- import Button from '../../../node_modules/neo.mjs/src/button/Base.mjs';
77
75
 
78
- class MainView extends Base {
76
+ class MainView extends Container {
79
77
  static config = {
80
- className: 'Foo.view.MainView',
81
-
82
- controller: {module: Controller},
83
- model: {module: ViewModel},
78
+ className : 'Foo.view.MainView',
79
+ controller: Controller,
80
+ model : ViewModel,
84
81
 
85
82
  layout: {ntype: 'fit'},
86
- items: [{
83
+ items : [{
87
84
  module: Button,
88
- text: 'Button'
89
- }],
85
+ text : 'Button'
86
+ }]
90
87
  }
91
88
  }
92
89
 
@@ -20,8 +20,8 @@ example, the following statement logs the URL query string.
20
20
 
21
21
 
22
22
  <pre data-javascript>
23
- Neo.Main.getByPath('window.location.search')
24
- .then(value=>console.log(value)); // Logs the search string
23
+ const search = await Neo.Main.getByPath('window.location.search');
24
+ console.log(search); // Logs the search string
25
25
  </pre>
26
26
 
27
27
  `Neo.Main` has some simple methods for accessing the
@@ -86,7 +86,7 @@
86
86
  }
87
87
  },
88
88
  "spacex": {
89
- "value": "{sem.spacing.medium}",
89
+ "value": "{sem.spacing.xsmall}",
90
90
  "type": "spacing"
91
91
  },
92
92
  "spacey": {
@@ -273,15 +273,51 @@
273
273
  }
274
274
  },
275
275
  "tab": {
276
- "foreground": {
277
- "default": {
278
- "value": "{sem.color.fg.neutral.default}",
276
+ "height": {
277
+ "value": "{sem.height.xxlarge}",
278
+ "type": "sizing"
279
+ },
280
+ "spacinghorizontal": {
281
+ "value": "{sem.spacing.medium}",
282
+ "type": "spacing"
283
+ },
284
+ "gap": {
285
+ "value": "{sem.spacing.xsmall}",
286
+ "type": "spacing"
287
+ },
288
+ "strip": {
289
+ "height": {
290
+ "value": "3px",
291
+ "type": "sizing"
292
+ },
293
+ "selected": {
294
+ "value": "{sem.color.fg.neutral.contrast}",
295
+ "type": "color"
296
+ },
297
+ "unselected": {
298
+ "value": "transparent",
279
299
  "type": "color"
280
300
  }
281
301
  },
282
- "height": {
283
- "value": "{sem.height.xlarge}",
284
- "type": "sizing"
302
+ "borderradius": {
303
+ "value": "{sem.borderradius.large}",
304
+ "type": "borderRadius"
305
+ },
306
+ "unselected": {
307
+ "bg": {
308
+ "default": {
309
+ "value": "transparent",
310
+ "type": "color"
311
+ },
312
+ "hover": {
313
+ "value": "{sem.color.bg.neutral.hover}",
314
+ "type": "color"
315
+ },
316
+ "active": {
317
+ "value": "{sem.color.bg.neutral.active}",
318
+ "type": "color"
319
+ }
320
+ }
285
321
  }
286
322
  }
287
323
  }
@@ -1,5 +1,18 @@
1
1
  {
2
2
  "green": {
3
+ "50": {
4
+ "value": "{green.500}",
5
+ "type": "color",
6
+ "$extensions": {
7
+ "studio.tokens": {
8
+ "modify": {
9
+ "type": "lighten",
10
+ "value": "0.85",
11
+ "space": "hsl"
12
+ }
13
+ }
14
+ }
15
+ },
3
16
  "100": {
4
17
  "value": "{green.500}",
5
18
  "type": "color",
@@ -111,55 +124,55 @@
111
124
  },
112
125
  "spacing": {
113
126
  "2": {
114
- "value": "2",
127
+ "value": "2px",
115
128
  "type": "spacing"
116
129
  },
117
130
  "4": {
118
- "value": "4",
131
+ "value": "4px",
119
132
  "type": "spacing"
120
133
  },
121
134
  "8": {
122
- "value": "8",
135
+ "value": "8px",
123
136
  "type": "spacing"
124
137
  },
125
138
  "12": {
126
- "value": "12",
139
+ "value": "12px",
127
140
  "type": "spacing"
128
141
  },
129
142
  "16": {
130
- "value": "16",
143
+ "value": "16px",
131
144
  "type": "spacing"
132
145
  },
133
146
  "20": {
134
- "value": "20",
147
+ "value": "20px",
135
148
  "type": "spacing"
136
149
  },
137
150
  "24": {
138
- "value": "24",
151
+ "value": "24px",
139
152
  "type": "spacing"
140
153
  },
141
154
  "32": {
142
- "value": "32",
155
+ "value": "32px",
143
156
  "type": "spacing"
144
157
  },
145
158
  "40": {
146
- "value": "40",
159
+ "value": "40px",
147
160
  "type": "spacing"
148
161
  },
149
162
  "48": {
150
- "value": "48",
163
+ "value": "48px",
151
164
  "type": "spacing"
152
165
  },
153
166
  "64": {
154
- "value": "64",
167
+ "value": "64px",
155
168
  "type": "spacing"
156
169
  },
157
170
  "80": {
158
- "value": "80",
171
+ "value": "80px",
159
172
  "type": "spacing"
160
173
  },
161
174
  "96": {
162
- "value": "96",
175
+ "value": "96px",
163
176
  "type": "spacing"
164
177
  }
165
178
  },
@@ -207,15 +220,15 @@
207
220
  },
208
221
  "borderradius": {
209
222
  "0": {
210
- "value": "0",
223
+ "value": "0px",
211
224
  "type": "borderRadius"
212
225
  },
213
226
  "4": {
214
- "value": "4",
227
+ "value": "4px",
215
228
  "type": "borderRadius"
216
229
  },
217
230
  "8": {
218
- "value": "8",
231
+ "value": "8px",
219
232
  "type": "borderRadius"
220
233
  }
221
234
  },
@@ -229,27 +242,31 @@
229
242
  },
230
243
  "height": {
231
244
  "2": {
232
- "value": "2",
245
+ "value": "2px",
233
246
  "type": "sizing"
234
247
  },
235
248
  "4": {
236
- "value": "4",
249
+ "value": "4px",
237
250
  "type": "sizing"
238
251
  },
239
252
  "8": {
240
- "value": "8",
253
+ "value": "8px",
241
254
  "type": "sizing"
242
255
  },
243
256
  "16": {
244
- "value": "16",
257
+ "value": "16px",
245
258
  "type": "sizing"
246
259
  },
247
260
  "32": {
248
- "value": "32",
261
+ "value": "32px",
249
262
  "type": "sizing"
250
263
  },
251
264
  "48": {
252
- "value": "48",
265
+ "value": "48px",
266
+ "type": "sizing"
267
+ },
268
+ "56": {
269
+ "value": "56px",
253
270
  "type": "sizing"
254
271
  }
255
272
  },
@@ -302,7 +319,7 @@
302
319
  "type": "fontFamilies"
303
320
  },
304
321
  "sans": {
305
- "value": "Source Sans Pro",
322
+ "value": "Source Sans 3",
306
323
  "type": "fontFamilies"
307
324
  },
308
325
  "serif": {
@@ -312,7 +329,7 @@
312
329
  },
313
330
  "fontsize": {
314
331
  "body": {
315
- "value": "18px",
332
+ "value": "16px",
316
333
  "type": "fontSizes"
317
334
  },
318
335
  "h1": {
@@ -336,6 +353,10 @@
336
353
  "bold": {
337
354
  "value": "700",
338
355
  "type": "fontWeights"
356
+ },
357
+ "medium": {
358
+ "value": "500",
359
+ "type": "fontWeights"
339
360
  }
340
361
  },
341
362
  "lineheight": {
@@ -56,7 +56,7 @@
56
56
  "type": "color"
57
57
  },
58
58
  "background": {
59
- "value": "{green.100}",
59
+ "value": "{green.50}",
60
60
  "type": "color"
61
61
  },
62
62
  "disabled": {
@@ -111,6 +111,10 @@
111
111
  "contrast": {
112
112
  "value": "{black}",
113
113
  "type": "color"
114
+ },
115
+ "focus": {
116
+ "value": "#5595F5",
117
+ "type": "color"
114
118
  }
115
119
  }
116
120
  },
@@ -176,6 +180,10 @@
176
180
  "xlarge": {
177
181
  "value": "{height.48}",
178
182
  "type": "sizing"
183
+ },
184
+ "xxlarge": {
185
+ "value": "{height.56}",
186
+ "type": "sizing"
179
187
  }
180
188
  },
181
189
  "borderradius": {
@@ -225,6 +233,28 @@
225
233
  "lineHeight": "{core.lineheight.paragraph}"
226
234
  },
227
235
  "type": "typography"
236
+ },
237
+ "label-medium": {
238
+ "value": {
239
+ "fontFamily": "{core.fontfamily.sans}",
240
+ "fontSize": "{core.fontsize.body}",
241
+ "fontWeight": "{core.fontweight.medium}"
242
+ },
243
+ "type": "typography"
244
+ },
245
+ "label-regular": {
246
+ "value": {
247
+ "fontFamily": "{core.fontfamily.sans}",
248
+ "fontWeight": "{core.fontweight.regular}",
249
+ "fontSize": "{core.fontsize.body}"
250
+ },
251
+ "type": "typography"
252
+ }
253
+ },
254
+ "borderwidth": {
255
+ "focus": {
256
+ "value": "3px",
257
+ "type": "borderWidth"
228
258
  }
229
259
  }
230
260
  }
@@ -1,3 +1,3 @@
1
- .learnneo-maincontainer {
2
- background-color: #f2f2f2;
3
- }
1
+ .learnneo-viewport {
2
+
3
+ }
@@ -0,0 +1,24 @@
1
+ .learnneo-header-toolbar {
2
+ margin-bottom: 1px; // fakes a bottom border
3
+
4
+ .logo {
5
+ margin-left: 1em;
6
+ }
7
+
8
+ .neo-button {
9
+ margin-left: 10px;
10
+
11
+ &.no-text {
12
+ margin-left: 0;
13
+ width : 1.2em;
14
+
15
+ &.github-button {
16
+ margin-left: 5em;
17
+ }
18
+
19
+ .neo-button-glyph {
20
+ font-size: 24px;
21
+ }
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,7 @@
1
+ .learnneo-maincontainer {
2
+ background-color: #f2f2f2;
3
+
4
+ .main-content-splitter{
5
+ margin: 0 2px;
6
+ }
7
+ }