neo.mjs 6.18.3 → 6.19.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.
- package/README.md +28 -214
- package/apps/ServiceWorker.mjs +2 -2
- package/apps/colors/view/ViewportController.mjs +7 -3
- package/apps/portal/data/blog.json +13 -0
- package/apps/portal/view/HeaderToolbar.mjs +2 -2
- package/apps/portal/view/Viewport.mjs +4 -2
- package/apps/portal/view/ViewportController.mjs +88 -7
- package/apps/portal/view/blog/Container.mjs +8 -8
- package/apps/portal/view/blog/List.mjs +6 -6
- package/apps/portal/view/home/FooterContainer.mjs +123 -0
- package/apps/portal/view/home/MainContainer.mjs +3 -2
- package/apps/portal/view/home/parts/AfterMath.mjs +17 -24
- package/apps/portal/view/home/parts/Colors.mjs +2 -2
- package/apps/portal/view/home/parts/How.mjs +3 -3
- package/apps/portal/view/home/parts/MainNeo.mjs +6 -7
- package/apps/portal/view/home/parts/References.mjs +88 -0
- package/apps/portal/view/learn/MainContainer.mjs +3 -2
- package/apps/portal/view/learn/MainContainerController.mjs +11 -0
- package/apps/portal/view/learn/PageContainer.mjs +5 -3
- package/apps/portal/view/services/Component.mjs +73 -0
- package/apps/website/data/blog.json +13 -0
- package/examples/ServiceWorker.mjs +2 -2
- package/examples/component/carousel/MainContainer.mjs +42 -33
- package/examples/layout/cube/MainContainer.mjs +217 -0
- package/examples/layout/cube/app.mjs +6 -0
- package/examples/layout/cube/index.html +11 -0
- package/examples/layout/cube/neo-config.json +6 -0
- package/examples/model/twoWay/MainContainer.mjs +76 -0
- package/examples/model/twoWay/app.mjs +6 -0
- package/examples/model/twoWay/index.html +11 -0
- package/examples/model/twoWay/neo-config.json +6 -0
- package/package.json +7 -7
- package/resources/data/deck/learnneo/pages/Earthquakes-01-goals.md +32 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-01-generate-a-workspace.md +47 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-02-generate-the-starter-app.md +150 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-03-debugging.md +136 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-04-fetch-data.md +146 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-05-refactor-the-table.md +146 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-06-use-a-view-model.md +301 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-07-use-the-google-maps-addon.md +175 -0
- package/resources/data/deck/learnneo/pages/Earthquakes-Lab-08-events.md +38 -0
- package/resources/data/deck/learnneo/pages/Earthquakes.md +8 -8
- package/resources/data/deck/learnneo/pages/Glossary.md +0 -0
- package/resources/data/deck/learnneo/pages/GuideEvents.md +80 -1
- package/resources/data/deck/learnneo/tree.json +2 -1
- package/resources/images/apps/portal/neo-references.png +0 -0
- package/resources/scss/src/apps/portal/Viewport.scss +18 -0
- package/resources/scss/src/apps/portal/blog/Container.scss +7 -7
- package/resources/scss/src/apps/portal/blog/List.scss +20 -16
- package/resources/scss/src/apps/portal/home/FooterContainer.scss +31 -0
- package/resources/scss/src/apps/portal/home/parts/AfterMath.scss +5 -0
- package/resources/scss/src/apps/portal/home/parts/MainNeo.scss +4 -5
- package/resources/scss/src/apps/portal/home/parts/References.scss +46 -0
- package/resources/scss/src/apps/portal/learn/ContentTreeList.scss +20 -0
- package/resources/scss/src/apps/portal/learn/ContentView.scss +4 -0
- package/resources/scss/src/apps/portal/learn/MainContainer.scss +1 -1
- package/resources/scss/src/apps/portal/learn/PageContainer.scss +22 -16
- package/resources/scss/src/apps/portal/services/Component.scss +20 -0
- package/resources/scss/src/component/Carousel.scss +21 -0
- package/resources/scss/src/examples/layout/cube/MainContainer.scss +7 -0
- package/resources/scss/src/layout/Cube.scss +80 -0
- package/resources/scss/src/tab/Container.scss +10 -10
- package/resources/scss/theme-neo-light/apps/portal/blog/Container.scss +3 -0
- package/resources/scss/theme-neo-light/form/field/Search.scss +1 -1
- package/resources/scss/theme-neo-light/tooltip/Base.scss +1 -1
- package/src/DefaultConfig.mjs +2 -2
- package/src/Main.mjs +15 -1
- package/src/Neo.mjs +14 -3
- package/src/calendar/view/MainContainer.mjs +8 -7
- package/src/component/Base.mjs +28 -8
- package/src/component/DateSelector.mjs +2 -2
- package/src/container/Base.mjs +3 -1
- package/src/dialog/Base.mjs +1 -2
- package/src/form/field/Time.mjs +18 -16
- package/src/layout/Base.mjs +43 -6
- package/src/layout/Card.mjs +21 -59
- package/src/layout/Cube.mjs +432 -0
- package/src/layout/Fit.mjs +9 -38
- package/src/layout/Flexbox.mjs +16 -17
- package/src/layout/Form.mjs +13 -70
- package/src/layout/Grid.mjs +6 -18
- package/src/list/Base.mjs +3 -3
- package/src/main/mixin/DeltaUpdates.mjs +16 -3
- package/src/model/Component.mjs +25 -6
- package/src/util/Array.mjs +36 -0
- package/src/vdom/Helper.mjs +338 -442
- package/src/vdom/VNode.mjs +12 -1
- package/test/siesta/siesta.js +16 -1
- package/test/siesta/tests/VdomCalendar.mjs +2193 -37
- package/test/siesta/tests/VdomHelper.mjs +287 -48
- package/test/siesta/tests/vdom/Advanced.mjs +368 -0
- package/test/siesta/tests/vdom/layout/Cube.mjs +189 -0
- package/test/siesta/tests/vdom/table/Container.mjs +133 -0
- package/resources/scss/theme-neo-light/apps/portal/learn/ContentTreeList.scss +0 -23
@@ -0,0 +1,123 @@
|
|
1
|
+
import Button from '../../../../src/button/Base.mjs';
|
2
|
+
import Component from '../../../../src/component/Base.mjs';
|
3
|
+
import Container from '../../../../src/container/Base.mjs';
|
4
|
+
|
5
|
+
/**
|
6
|
+
* @class Portal.view.home.FooterContainer
|
7
|
+
* @extends Neo.container.Base
|
8
|
+
*/
|
9
|
+
class FooterContainer extends Container {
|
10
|
+
static config = {
|
11
|
+
/**
|
12
|
+
* @member {String} className='Portal.view.home.FooterContainer'
|
13
|
+
* @protected
|
14
|
+
*/
|
15
|
+
className: 'Portal.view.home.FooterContainer',
|
16
|
+
/**
|
17
|
+
* @member {String[]} cls=['portal-home-footer-container']
|
18
|
+
*/
|
19
|
+
cls: ['portal-home-footer-container'],
|
20
|
+
/**
|
21
|
+
* @member {Object} itemDefaults
|
22
|
+
*/
|
23
|
+
itemDefaults: {
|
24
|
+
module: Container,
|
25
|
+
cls : ['portal-home-footer-section'],
|
26
|
+
layout: {ntype: 'vbox', align: 'start'},
|
27
|
+
|
28
|
+
itemDefaults: {
|
29
|
+
module: Button,
|
30
|
+
ui : 'ghost'
|
31
|
+
}
|
32
|
+
},
|
33
|
+
/**
|
34
|
+
* @member {Object[]} items
|
35
|
+
*/
|
36
|
+
items: [{
|
37
|
+
items: [{
|
38
|
+
module: Component,
|
39
|
+
cls : ['neo-h2'],
|
40
|
+
html : 'Content',
|
41
|
+
tag : 'h2'
|
42
|
+
}, {
|
43
|
+
iconCls: 'fas fa-people-group',
|
44
|
+
route : '/about-us',
|
45
|
+
text : 'About Us'
|
46
|
+
}, {
|
47
|
+
iconCls: 'fas fa-book',
|
48
|
+
route : '/docs',
|
49
|
+
text : 'API Docs'
|
50
|
+
}, {
|
51
|
+
iconCls: 'fas fa-blog',
|
52
|
+
route : '/blog',
|
53
|
+
text : 'Blog'
|
54
|
+
}, {
|
55
|
+
iconCls: 'fas fa-graduation-cap',
|
56
|
+
route : '/learn',
|
57
|
+
text : 'Learn'
|
58
|
+
}, {
|
59
|
+
iconCls: 'fas fa-handshake-angle',
|
60
|
+
route : '/services',
|
61
|
+
text : 'Services'
|
62
|
+
}]
|
63
|
+
}, {
|
64
|
+
items: [{
|
65
|
+
module: Component,
|
66
|
+
cls : ['neo-h2'],
|
67
|
+
html : 'Community',
|
68
|
+
tag : 'h2'
|
69
|
+
}, {
|
70
|
+
iconCls: 'fa-brands fa-github',
|
71
|
+
text : 'Contribute',
|
72
|
+
url : 'https://github.com/neomjs/neo/blob/dev/CONTRIBUTING.md'
|
73
|
+
}, {
|
74
|
+
iconCls: 'fa-brands fa-github',
|
75
|
+
text : 'Code of Conduct',
|
76
|
+
url : 'https://github.com/neomjs/neo/blob/dev/.github/CODE_OF_CONDUCT.md'
|
77
|
+
}, {
|
78
|
+
iconCls: 'fa-brands fa-github',
|
79
|
+
text : 'Report Issues',
|
80
|
+
url : 'https://github.com/neomjs/neo/issues'
|
81
|
+
}, {
|
82
|
+
iconCls: 'fa-brands fa-slack',
|
83
|
+
text : 'Slack',
|
84
|
+
url : 'https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA'
|
85
|
+
}, {
|
86
|
+
iconCls: 'fa-brands fa-discord',
|
87
|
+
text : 'Discord',
|
88
|
+
url : 'https://discord.gg/6p8paPq'
|
89
|
+
}]
|
90
|
+
}, {
|
91
|
+
items: [{
|
92
|
+
module: Component,
|
93
|
+
cls : ['neo-h2'],
|
94
|
+
html : 'Social Media',
|
95
|
+
tag : 'h2'
|
96
|
+
}, {
|
97
|
+
iconCls: 'fa-brands fa-linkedin',
|
98
|
+
text : 'LinkedIn',
|
99
|
+
url : 'https://www.linkedin.com/company/neo-mjs/'
|
100
|
+
}, {
|
101
|
+
iconCls: 'fa-brands fa-facebook',
|
102
|
+
text : 'Facebook',
|
103
|
+
url : 'https://www.facebook.com/neo.mjs'
|
104
|
+
}, {
|
105
|
+
iconCls: 'fa-brands fa-x-twitter',
|
106
|
+
text : 'X',
|
107
|
+
url : 'https://x.com/neomjs1'
|
108
|
+
}]
|
109
|
+
}],
|
110
|
+
/**
|
111
|
+
* @member {Object} layout={ntype:'hbox',align:'stretch'}
|
112
|
+
*/
|
113
|
+
layout: {ntype: 'hbox', align: 'stretch'},
|
114
|
+
/**
|
115
|
+
* @member {String} tag='footer'
|
116
|
+
*/
|
117
|
+
tag: 'footer'
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
Neo.setupClass(FooterContainer);
|
122
|
+
|
123
|
+
export default FooterContainer;
|
@@ -1,10 +1,10 @@
|
|
1
1
|
import AfterMath from './parts/AfterMath.mjs';
|
2
2
|
import Colors from './parts/Colors.mjs';
|
3
3
|
import Container from '../../../../src/container/Base.mjs';
|
4
|
-
import Features from './parts/Features.mjs';
|
5
4
|
import Helix from './parts/Helix.mjs';
|
6
5
|
import How from './parts/How.mjs';
|
7
6
|
import MainNeo from './parts/MainNeo.mjs';
|
7
|
+
// import References from './parts/References.mjs';
|
8
8
|
|
9
9
|
/**
|
10
10
|
* @class Portal.view.home.MainContainer
|
@@ -38,7 +38,8 @@ class MainContainer extends Container {
|
|
38
38
|
items: [
|
39
39
|
{ntype: 'component', cls: ['portal-home-progress']},
|
40
40
|
MainNeo,
|
41
|
-
|
41
|
+
// References,
|
42
|
+
// Features,
|
42
43
|
Helix,
|
43
44
|
Colors,
|
44
45
|
How,
|
@@ -1,4 +1,5 @@
|
|
1
|
-
import BaseContainer
|
1
|
+
import BaseContainer from './BaseContainer.mjs';
|
2
|
+
import FooterContainer from '../FooterContainer.mjs';
|
2
3
|
|
3
4
|
/**
|
4
5
|
* @class Portal.view.home.parts.AfterMath
|
@@ -11,6 +12,10 @@ class AfterMath extends BaseContainer {
|
|
11
12
|
* @protected
|
12
13
|
*/
|
13
14
|
className: 'Portal.view.home.parts.AfterMath',
|
15
|
+
/**
|
16
|
+
* @member {String[]} cls=['portal-home-aftermath']
|
17
|
+
*/
|
18
|
+
cls: ['portal-home-aftermath'],
|
14
19
|
/**
|
15
20
|
* @member {Object} layout={ntype:'vbox',align:'stretch',pack:'center'}
|
16
21
|
*/
|
@@ -19,39 +24,27 @@ class AfterMath extends BaseContainer {
|
|
19
24
|
* @member {Object[]} items
|
20
25
|
*/
|
21
26
|
items: [{
|
22
|
-
|
23
|
-
flex : 1
|
27
|
+
flex: 1
|
24
28
|
}, {
|
25
|
-
cls : 'neo-h1',
|
29
|
+
cls : ['neo-h1'],
|
26
30
|
flex: 'none',
|
27
31
|
html: 'Additional Stuff',
|
28
|
-
|
32
|
+
tag : 'h1'
|
29
33
|
}, {
|
30
|
-
cls : 'neo-h2',
|
34
|
+
cls : ['neo-h2'],
|
31
35
|
flex: 'none',
|
32
36
|
html: 'More to come here',
|
33
|
-
|
37
|
+
tag : 'h2'
|
34
38
|
}, {
|
35
|
-
cls : 'neo-content',
|
39
|
+
cls : ['neo-content'],
|
36
40
|
flex: 'none',
|
37
|
-
html: '
|
38
|
-
|
41
|
+
html: 'Lorem Ipsum',
|
42
|
+
tag : 'p'
|
39
43
|
}, {
|
40
|
-
|
41
|
-
flex : 1
|
44
|
+
flex: 1
|
42
45
|
}, {
|
43
|
-
|
44
|
-
|
45
|
-
height: '40%',
|
46
|
-
html : 'This is the footer',
|
47
|
-
vdom : {tag: 'footer'},
|
48
|
-
|
49
|
-
style : { // todo: css
|
50
|
-
background: 'black',
|
51
|
-
color : 'white',
|
52
|
-
height : '40%',
|
53
|
-
padding : '15px'
|
54
|
-
}
|
46
|
+
module: FooterContainer,
|
47
|
+
height: '35%'
|
55
48
|
}]
|
56
49
|
}
|
57
50
|
}
|
@@ -28,12 +28,12 @@ class Colors extends BaseContainer {
|
|
28
28
|
style : {padding: '2rem'},
|
29
29
|
layout: {ntype: 'vbox', align: 'center', pack: 'center'},
|
30
30
|
items : [{
|
31
|
-
cls : 'neo-h1',
|
31
|
+
cls : ['neo-h1'],
|
32
32
|
flex: 'none',
|
33
33
|
html: 'Amazing Potential',
|
34
34
|
vdom: {tag: 'h1'}
|
35
35
|
}, {
|
36
|
-
cls : 'neo-h2',
|
36
|
+
cls : ['neo-h2'],
|
37
37
|
flex: 'none',
|
38
38
|
html: 'Socket Data',
|
39
39
|
vdom: {tag: 'h2'}
|
@@ -27,17 +27,17 @@ class How extends BaseContainer {
|
|
27
27
|
style : {padding: '2rem'},
|
28
28
|
layout: {ntype: 'vbox', align: 'center', pack: 'center'},
|
29
29
|
items : [{
|
30
|
-
cls : 'neo-h1',
|
30
|
+
cls : ['neo-h1'],
|
31
31
|
flex: 'none',
|
32
32
|
html: 'How?',
|
33
33
|
vdom: {tag: 'h1'}
|
34
34
|
}, {
|
35
|
-
cls : 'neo-h2',
|
35
|
+
cls : ['neo-h2'],
|
36
36
|
flex: 'none',
|
37
37
|
html: 'How Does Neo.mjs Do It?',
|
38
38
|
vdom: {tag: 'h2'}
|
39
39
|
}, {
|
40
|
-
cls : 'neo-h3',
|
40
|
+
cls : ['neo-h3'],
|
41
41
|
flex: 'none',
|
42
42
|
vdom: {tag: 'p'},
|
43
43
|
html: [
|
@@ -28,19 +28,18 @@ class MainNeo extends BaseContainer {
|
|
28
28
|
}, {
|
29
29
|
cls : ['neo-h1'],
|
30
30
|
flex: 'none',
|
31
|
-
html: '
|
31
|
+
html: 'Harness the Power of Multi-Threading for Ultra-Fast Frontends',
|
32
32
|
vdom: {tag: 'h1'}
|
33
33
|
}, {
|
34
34
|
ntype: 'container',
|
35
35
|
cls : ['button-group'],
|
36
36
|
flex : 'none',
|
37
|
-
|
38
37
|
items: [{
|
39
|
-
module
|
40
|
-
cls
|
41
|
-
|
42
|
-
|
43
|
-
|
38
|
+
module: Button,
|
39
|
+
cls : ['get-started-button'],
|
40
|
+
flex : 'none',
|
41
|
+
route : '/learn',
|
42
|
+
text : 'Get started'
|
44
43
|
}, {
|
45
44
|
module: Button,
|
46
45
|
cls : ['neo-github'],
|
@@ -0,0 +1,88 @@
|
|
1
|
+
import BaseContainer from './BaseContainer.mjs';
|
2
|
+
import Carousel from "../../../../../src/component/Carousel.mjs";
|
3
|
+
|
4
|
+
/**
|
5
|
+
* @class Portal.view.home.parts.References
|
6
|
+
* @extends Portal.view.home.parts.BaseContainer
|
7
|
+
*/
|
8
|
+
class References extends BaseContainer {
|
9
|
+
static config = {
|
10
|
+
/**
|
11
|
+
* @member {String} className='Portal.view.home.parts.References'
|
12
|
+
* @protected
|
13
|
+
*/
|
14
|
+
className: 'Portal.view.home.parts.References',
|
15
|
+
/**
|
16
|
+
* @member {String} cls='portal-references'
|
17
|
+
*/
|
18
|
+
cls: 'portal-references',
|
19
|
+
/**
|
20
|
+
* @member {Object} layout={ntype:'vbox',align:'stretch',pack:'center'}
|
21
|
+
*/
|
22
|
+
layout: {ntype: 'vbox', align: 'stretch', pack: 'center'},
|
23
|
+
/**
|
24
|
+
* @member {Object[]} items
|
25
|
+
*/
|
26
|
+
items: [{
|
27
|
+
ntype: 'container',
|
28
|
+
flex : '1 1 100%'
|
29
|
+
}, {
|
30
|
+
cls : 'neo-h1',
|
31
|
+
flex: 'none',
|
32
|
+
html: 'References',
|
33
|
+
vdom: {tag: 'h1'}
|
34
|
+
}, {
|
35
|
+
cls : 'neo-h2',
|
36
|
+
flex: 'none',
|
37
|
+
html: 'What people think about Neo',
|
38
|
+
vdom: {tag: 'h2'}
|
39
|
+
}, {
|
40
|
+
module: Carousel,
|
41
|
+
// will automatically change to the next extry every 5500 ms
|
42
|
+
// if not set or 0, this will show arrows to navigate
|
43
|
+
autoRun: 5500,
|
44
|
+
store : {
|
45
|
+
model: {
|
46
|
+
fields: [
|
47
|
+
// @formatter:off
|
48
|
+
{name: 'quote', type: 'String'},
|
49
|
+
{name: 'publisher', type: 'String'},
|
50
|
+
{name: 'date', type: 'String'}
|
51
|
+
// @formatter:on
|
52
|
+
]
|
53
|
+
},
|
54
|
+
data : [{
|
55
|
+
quote : 'Neo has inspired me to try out new ways and pursue more modern approaches.',
|
56
|
+
publisher: 'Torsten Dinkheller',
|
57
|
+
date : 'Mai 2024'
|
58
|
+
}, {
|
59
|
+
quote : 'With Neo, I no longer lose sight of important customers. I can finally use 2 monitors for my work.',
|
60
|
+
publisher: 'Pat Wemerson',
|
61
|
+
date : 'June 2024'
|
62
|
+
}, {
|
63
|
+
quote : 'Up-to-dateness is everything in my job, so Neo\'s data processing speed is just right for me.',
|
64
|
+
publisher: 'Texas Ranger',
|
65
|
+
date : 'Juli 2024'
|
66
|
+
}, {
|
67
|
+
quote : 'Starting a project with Neo has brought me back up to speed. Always one step ahead of the browser.',
|
68
|
+
publisher: 'Future Developer',
|
69
|
+
date : 'April 2024'
|
70
|
+
}]
|
71
|
+
},
|
72
|
+
// custom item cls
|
73
|
+
itemCls: 'example-carousel-item',
|
74
|
+
// each item will be created like the itemTpl structure
|
75
|
+
itemTpl: data => [{
|
76
|
+
cls : 'neo-quote',
|
77
|
+
html: data.quote
|
78
|
+
}, {
|
79
|
+
cls : 'neo-details',
|
80
|
+
html: `${data.publisher} - ${data.date}`
|
81
|
+
}]
|
82
|
+
}]
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
Neo.setupClass(References);
|
87
|
+
|
88
|
+
export default References;
|
@@ -18,9 +18,9 @@ class MainContainer extends Container {
|
|
18
18
|
*/
|
19
19
|
className: 'Portal.view.learn.MainContainer',
|
20
20
|
/**
|
21
|
-
* @member {String[]} cls=['
|
21
|
+
* @member {String[]} cls=['portal-learn-maincontainer']
|
22
22
|
*/
|
23
|
-
cls: ['
|
23
|
+
cls: ['portal-learn-maincontainer'],
|
24
24
|
/**
|
25
25
|
* @member {Neo.controller.Component} controller=MainContainerController
|
26
26
|
*/
|
@@ -34,6 +34,7 @@ class MainContainer extends Container {
|
|
34
34
|
cls : ['sidenav-container'],
|
35
35
|
layout : 'fit',
|
36
36
|
minWidth: 350,
|
37
|
+
tag :'aside',
|
37
38
|
width : 350,
|
38
39
|
|
39
40
|
items: [{
|
@@ -16,6 +16,7 @@ class MainContainerController extends Controller {
|
|
16
16
|
* @member {Object} routes
|
17
17
|
*/
|
18
18
|
routes: {
|
19
|
+
'/learn' : 'onRouteDefault',
|
19
20
|
'/learn/{itemId}': 'onRouteLearnItem'
|
20
21
|
}
|
21
22
|
}
|
@@ -130,6 +131,16 @@ class MainContainerController extends Controller {
|
|
130
131
|
/**
|
131
132
|
* @param {Object} data
|
132
133
|
*/
|
134
|
+
onRouteDefault(data) {
|
135
|
+
if (!this.getModel().data.currentPageRecord) {
|
136
|
+
this.onRouteLearnItem({itemId: 'WhyNeo-Intro'})
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
/**
|
141
|
+
* @param {Object} data
|
142
|
+
* @param {String} data.itemId
|
143
|
+
*/
|
133
144
|
onRouteLearnItem(data) {
|
134
145
|
let model = this.getModel(),
|
135
146
|
store = model.getStore('contentTree');
|
@@ -14,10 +14,10 @@ class PageContainer extends Container {
|
|
14
14
|
*/
|
15
15
|
className: 'Portal.view.learn.PageContainer',
|
16
16
|
/**
|
17
|
-
* @member {String[]} baseCls=['learn-
|
17
|
+
* @member {String[]} baseCls=['portal-learn-page-container','neo-container']
|
18
18
|
* @protected
|
19
19
|
*/
|
20
|
-
baseCls: ['learn-
|
20
|
+
baseCls: ['portal-learn-page-container', 'neo-container'],
|
21
21
|
/**
|
22
22
|
* @member {Object} bind
|
23
23
|
*/
|
@@ -38,7 +38,9 @@ class PageContainer extends Container {
|
|
38
38
|
}, {
|
39
39
|
module: Toolbar,
|
40
40
|
flex : 'none',
|
41
|
-
cls : 'content-bottom-toolbar',
|
41
|
+
cls : ['content-bottom-toolbar'],
|
42
|
+
layout: 'grid',
|
43
|
+
tag : 'nav',
|
42
44
|
items : [{
|
43
45
|
cls : ['content-bottom-toolbar-previous'],
|
44
46
|
handler : 'onPreviousPageButtonClick',
|
@@ -0,0 +1,73 @@
|
|
1
|
+
import BaseComponent from '../../../../src/component/Base.mjs';
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @class Portal.view.services.Component
|
5
|
+
* @extends Neo.component.Base
|
6
|
+
*/
|
7
|
+
class Component extends BaseComponent {
|
8
|
+
static config = {
|
9
|
+
/**
|
10
|
+
* @member {String} className='Portal.view.services.Component'
|
11
|
+
* @protected
|
12
|
+
*/
|
13
|
+
className: 'Portal.view.services.Component',
|
14
|
+
/**
|
15
|
+
* @member {String[]} cls=['portal-services-component']
|
16
|
+
*/
|
17
|
+
cls: ['portal-services-component'],
|
18
|
+
/**
|
19
|
+
* @member {Object} vdom
|
20
|
+
*/
|
21
|
+
vdom:
|
22
|
+
{cn: [
|
23
|
+
{tag: 'h1', html: 'Services'},
|
24
|
+
{cls: ['info-block'], cn: [
|
25
|
+
{tag: 'h2', html: 'Weekly Workshops'},
|
26
|
+
{tag: 'p', html: [
|
27
|
+
'We are doing weekly workshops on Thursdays 17:30 CEST (11:30am EST) for 60m free of charge.</br>',
|
28
|
+
'Ping us inside our ',
|
29
|
+
'<a href="https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA">Slack Channel</a>, ',
|
30
|
+
'in case you would like to join us.'
|
31
|
+
].join('')},
|
32
|
+
]},
|
33
|
+
{cls: ['info-block'], cn: [
|
34
|
+
{tag: 'h2', html: 'Professional Trainings'},
|
35
|
+
{tag: 'p', html: [
|
36
|
+
'While we do have a self-study based Learning Section online, you can also hire us ',
|
37
|
+
'in case you prefer an Instructor-led Training for bringing your team up to speed.'
|
38
|
+
].join('')},
|
39
|
+
{tag: 'ul', cn: [
|
40
|
+
{tag: 'li', html: 'One week packed with 40h of intense training.'},
|
41
|
+
{tag: 'li', html: 'Including hands-on Labs'},
|
42
|
+
{tag: 'li', html: '6 - 12 attendees'},
|
43
|
+
{tag: 'li', html: 'While Remote Trainings are possible, we strongly recommend On-Site Trainings instead.'},
|
44
|
+
]},
|
45
|
+
{tag: 'p', html: [
|
46
|
+
'Feel free to send us an <a href="mailto:trainings@neomjs.com">Email</a> to plan your training timeframe.',
|
47
|
+
].join('')},
|
48
|
+
]},
|
49
|
+
{cls: ['info-block'], cn: [
|
50
|
+
{tag: 'h2', html: 'Professional Services'},
|
51
|
+
{tag: 'p', html: [
|
52
|
+
'We can help you to ensure your Neo.mjs based projects run successfully.',
|
53
|
+
].join('')},
|
54
|
+
{tag: 'ul', cn: [
|
55
|
+
{tag: 'li', html: 'Feasibility Analysis: Is Neo.mjs a good fit for your project needs?'},
|
56
|
+
{tag: 'li', html: 'Creating a Neo.mjs PoC which matches your specific needs'},
|
57
|
+
{tag: 'li', html: 'Code Reviews'},
|
58
|
+
{tag: 'li', html: 'Frontend-Architecture Guidance'},
|
59
|
+
{tag: 'li', html: 'Application & Framework Debugging'},
|
60
|
+
{tag: 'li', html: 'Creation of Custom Components, Design Themes & new Features'},
|
61
|
+
{tag: 'li', html: 'Hands-On Application Development Support'}
|
62
|
+
]},
|
63
|
+
{tag: 'p', html: [
|
64
|
+
'In case you need help, send us an <a href="mailto:services@neomjs.com">Email</a>.',
|
65
|
+
].join('')}
|
66
|
+
]}
|
67
|
+
]}
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
Neo.setupClass(Component);
|
72
|
+
|
73
|
+
export default Component;
|
@@ -1,4 +1,17 @@
|
|
1
1
|
[
|
2
|
+
{
|
3
|
+
"author" : "Tobias Uhlig",
|
4
|
+
"authorImage" : "author_TobiasUhlig.jpeg",
|
5
|
+
"date" : "Jul 12, 2024",
|
6
|
+
"id" : 59,
|
7
|
+
"image" : "transform_dom_tree.png",
|
8
|
+
"name" : "A blazing-fast algorithm to transform one DOM tree into another",
|
9
|
+
"provider" : "Medium",
|
10
|
+
"publisher" : "ITNEXT",
|
11
|
+
"selectedInto": [],
|
12
|
+
"type" : "Blog Post",
|
13
|
+
"url" : "https://itnext.io/a-blazing-fast-algorithm-to-transform-one-dom-tree-into-another-4ff9c934bc49?source=friends_link&sk=f1de46dbd464095b8d0b0a271644cb75"
|
14
|
+
},
|
2
15
|
{
|
3
16
|
"author" : "Tobias Uhlig",
|
4
17
|
"authorImage" : "author_TobiasUhlig.jpeg",
|
@@ -22,21 +22,21 @@ class MainContainer extends ConfigurationViewport {
|
|
22
22
|
labelText: 'autoRun',
|
23
23
|
listeners: {change: me.onConfigChange.bind(me, 'autoRun')}
|
24
24
|
}, {
|
25
|
-
module
|
26
|
-
labelText
|
27
|
-
listeners
|
28
|
-
maxValue
|
29
|
-
minValue
|
30
|
-
stepSize
|
31
|
-
value
|
25
|
+
module : RangeField,
|
26
|
+
labelText: 'height',
|
27
|
+
listeners: {change: me.onConfigChange.bind(me, 'height')},
|
28
|
+
maxValue : 800,
|
29
|
+
minValue : 200,
|
30
|
+
stepSize : 1,
|
31
|
+
value : me.exampleComponent.height
|
32
32
|
}, {
|
33
|
-
module
|
34
|
-
labelText
|
35
|
-
listeners
|
36
|
-
maxValue
|
37
|
-
minValue
|
38
|
-
stepSize
|
39
|
-
value
|
33
|
+
module : RangeField,
|
34
|
+
labelText: 'width',
|
35
|
+
listeners: {change: me.onConfigChange.bind(me, 'width')},
|
36
|
+
maxValue : 800,
|
37
|
+
minValue : 200,
|
38
|
+
stepSize : 1,
|
39
|
+
value : me.exampleComponent.width
|
40
40
|
}];
|
41
41
|
}
|
42
42
|
|
@@ -48,33 +48,42 @@ class MainContainer extends ConfigurationViewport {
|
|
48
48
|
// if not set or 0, this will show arrows to navigate
|
49
49
|
// cannot be changed after created
|
50
50
|
autoRun: 5500,
|
51
|
-
store: {
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
},
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
51
|
+
store : {
|
52
|
+
model: {
|
53
|
+
fields: [
|
54
|
+
// @formatter:off
|
55
|
+
{name: 'quote', type: 'String'},
|
56
|
+
{name: 'publisher', type: 'String'},
|
57
|
+
{name: 'date', type: 'String'}
|
58
|
+
// @formatter:on
|
59
|
+
]
|
60
|
+
},
|
61
|
+
data : [{
|
62
|
+
quote : 'We love the German inspired dishes on the menu',
|
63
|
+
publisher: 'Trip Advisor',
|
64
|
+
date : 'Dezember 2020'
|
65
|
+
}, {
|
66
|
+
quote : 'Everything about this place was excellent, from start to finish',
|
67
|
+
publisher: 'Trip Advisor',
|
68
|
+
date : 'Dezember 2021'
|
69
|
+
}, {
|
70
|
+
quote : 'We had three courses and everything was great',
|
71
|
+
publisher: 'Trip Advisor',
|
72
|
+
date : 'September 2020'
|
73
|
+
}, {
|
74
|
+
quote : 'Excellent Food, Wine and Service',
|
75
|
+
publisher: 'Best Food',
|
76
|
+
date : 'August 2020'
|
68
77
|
}]
|
69
78
|
},
|
70
79
|
// custom item cls
|
71
80
|
itemCls: 'example-carousel-item',
|
72
81
|
// each item will be created like the itemTpl structure
|
73
82
|
itemTpl: data => [{
|
74
|
-
cls: 'example-quote',
|
83
|
+
cls : 'example-quote',
|
75
84
|
html: data.quote
|
76
85
|
}, {
|
77
|
-
cls: 'example-details',
|
86
|
+
cls : 'example-details',
|
78
87
|
html: `${data.publisher} - ${data.date}`
|
79
88
|
}]
|
80
89
|
});
|