neo.mjs 6.20.1 → 6.22.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 (151) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/colors/view/HeaderToolbar.mjs +7 -3
  3. package/apps/covid/view/MainContainerController.mjs +6 -6
  4. package/apps/covid/view/TableContainer.mjs +5 -3
  5. package/apps/covid/view/country/Gallery.mjs +6 -4
  6. package/apps/form/view/ViewportModel.mjs +2 -2
  7. package/apps/portal/index.html +23 -1
  8. package/apps/portal/view/HeaderToolbar.mjs +2 -2
  9. package/apps/portal/view/Viewport.mjs +3 -1
  10. package/apps/portal/view/ViewportController.mjs +10 -0
  11. package/apps/portal/view/about/Container.mjs +44 -0
  12. package/apps/portal/view/about/MemberContainer.mjs +191 -0
  13. package/apps/portal/view/home/MainContainer.mjs +9 -2
  14. package/apps/portal/view/home/parts/AfterMath.mjs +12 -8
  15. package/apps/portal/view/home/parts/Colors.mjs +8 -2
  16. package/apps/portal/view/home/parts/Features.mjs +50 -83
  17. package/apps/portal/view/home/parts/Helix.mjs +8 -2
  18. package/apps/portal/view/home/parts/MainNeo.mjs +17 -5
  19. package/apps/portal/view/learn/ContentView.mjs +18 -4
  20. package/apps/realworld/api/Base.mjs +5 -5
  21. package/apps/realworld/view/MainContainerController.mjs +19 -17
  22. package/apps/realworld2/api/Base.mjs +5 -5
  23. package/apps/realworld2/view/MainContainerController.mjs +11 -11
  24. package/apps/realworld2/view/article/Gallery.mjs +6 -4
  25. package/apps/sharedcovid/view/MainContainerController.mjs +11 -12
  26. package/apps/sharedcovid/view/TableContainer.mjs +7 -5
  27. package/apps/sharedcovid/view/country/Gallery.mjs +6 -4
  28. package/apps/shareddialog/view/MainContainerController.mjs +5 -5
  29. package/buildScripts/webpack/json/myApps.template.json +1 -2
  30. package/docs/app/view/classdetails/MembersList.mjs +8 -8
  31. package/docs/app/view/classdetails/SourceViewComponent.mjs +6 -6
  32. package/docs/app/view/classdetails/TutorialComponent.mjs +9 -9
  33. package/examples/ServiceWorker.mjs +2 -2
  34. package/examples/component/coronaGallery/CountryGallery.mjs +6 -4
  35. package/examples/component/helix/Viewport.mjs +2 -2
  36. package/examples/list/circle/MainContainer.mjs +7 -7
  37. package/examples/preloadingAssets/view/MainContainerController.mjs +5 -5
  38. package/package.json +5 -5
  39. package/resources/data/deck/learnneo/pages/GuideEvents.md +2 -4
  40. package/resources/data/deck/learnneo/pages/WhyNeo-Features.md +46 -0
  41. package/resources/data/deck/learnneo/pages/WhyNeo-Intro.md +5 -6
  42. package/resources/data/deck/learnneo/pages/WhyNeo-Multi-Window.md +1 -1
  43. package/resources/data/deck/learnneo/tree.json +3 -2
  44. package/resources/fonts/GT-Planar-Regular.otf +0 -0
  45. package/resources/images/logo/neo_logo_favicon.svg +16 -0
  46. package/resources/images/team/tobiu.png +0 -0
  47. package/resources/scss/src/apps/colors/HeaderToolbar.scss +23 -1
  48. package/resources/scss/src/apps/colors/Viewport.scss +10 -0
  49. package/resources/scss/src/apps/portal/HeaderToolbar.scss +7 -7
  50. package/resources/scss/src/apps/portal/Viewport.scss +10 -0
  51. package/resources/scss/src/apps/portal/about/Container.scss +4 -0
  52. package/resources/scss/src/apps/portal/about/MemberContainer.scss +70 -0
  53. package/resources/scss/src/apps/portal/home/FooterContainer.scss +12 -0
  54. package/resources/scss/src/apps/portal/home/parts/BaseContainer.scss +16 -16
  55. package/resources/scss/src/apps/portal/home/parts/MainNeo.scss +62 -7
  56. package/resources/scss/src/apps/portal/learn/ContentView.scss +1 -0
  57. package/resources/scss/src/apps/portal/learn/PageContainer.scss +6 -0
  58. package/resources/scss/src/code/LivePreview.scss +4 -1
  59. package/resources/scss/src/layout/Cube.scss +3 -3
  60. package/resources/scss/src/plugin/Resizable.scss +12 -19
  61. package/resources/scss/theme-neo-light/dialog/Base.scss +12 -2
  62. package/src/DefaultConfig.mjs +2 -2
  63. package/src/calendar/view/MainContainer.mjs +10 -10
  64. package/src/calendar/view/SettingsContainer.mjs +10 -10
  65. package/src/calendar/view/YearComponent.mjs +2 -2
  66. package/src/calendar/view/calendars/List.mjs +2 -2
  67. package/src/calendar/view/month/Component.mjs +4 -4
  68. package/src/calendar/view/week/Component.mjs +2 -2
  69. package/src/calendar/view/week/plugin/DragDrop.mjs +4 -4
  70. package/src/code/LivePreview.mjs +92 -6
  71. package/src/component/Base.mjs +3 -3
  72. package/src/component/Circle.mjs +5 -5
  73. package/src/component/DateSelector.mjs +4 -4
  74. package/src/component/Gallery.mjs +8 -8
  75. package/src/component/Helix.mjs +15 -12
  76. package/src/component/Toast.mjs +1 -1
  77. package/src/component/wrapper/AmChart.mjs +2 -2
  78. package/src/component/wrapper/CesiumJS.mjs +2 -2
  79. package/src/component/wrapper/GoogleMaps.mjs +2 -2
  80. package/src/component/wrapper/MonacoEditor.mjs +3 -3
  81. package/src/core/Observable.mjs +2 -2
  82. package/src/data/Store.mjs +2 -2
  83. package/src/dialog/Base.mjs +44 -14
  84. package/src/draggable/DragZone.mjs +4 -4
  85. package/src/draggable/list/DragZone.mjs +4 -4
  86. package/src/draggable/tab/header/toolbar/SortZone.mjs +2 -2
  87. package/src/draggable/toolbar/DragZone.mjs +4 -4
  88. package/src/draggable/toolbar/SortZone.mjs +3 -3
  89. package/src/form/field/ComboBox.mjs +3 -2
  90. package/src/form/field/FileUpload.mjs +3 -3
  91. package/src/form/field/Text.mjs +2 -2
  92. package/src/form/field/TextArea.mjs +2 -2
  93. package/src/grid/Container.mjs +2 -2
  94. package/src/layout/Cube.mjs +1 -3
  95. package/src/list/plugin/Animate.mjs +23 -23
  96. package/src/main/DomAccess.mjs +1 -1
  97. package/src/main/DomEvents.mjs +14 -5
  98. package/src/main/addon/AmCharts.mjs +2 -2
  99. package/src/main/addon/MapboxGL.mjs +4 -4
  100. package/src/manager/DomEvent.mjs +2 -2
  101. package/src/manager/Focus.mjs +2 -2
  102. package/src/manager/Toast.mjs +6 -4
  103. package/src/manager/rpc/Message.mjs +2 -2
  104. package/src/plugin/Resizable.mjs +11 -3
  105. package/src/selection/HelixModel.mjs +3 -3
  106. package/src/tab/Strip.mjs +4 -4
  107. package/src/table/Container.mjs +4 -4
  108. package/src/util/Logger.mjs +6 -4
  109. package/src/worker/App.mjs +2 -2
  110. package/src/worker/Manager.mjs +3 -2
  111. package/apps/website/Overwrites.mjs +0 -16
  112. package/apps/website/app.mjs +0 -7
  113. package/apps/website/data/blog.json +0 -769
  114. package/apps/website/data/docs.json +0 -29
  115. package/apps/website/data/examples_devmode.json +0 -173
  116. package/apps/website/data/examples_dist_dev.json +0 -164
  117. package/apps/website/data/examples_dist_prod.json +0 -164
  118. package/apps/website/index.html +0 -11
  119. package/apps/website/model/BlogPost.mjs +0 -60
  120. package/apps/website/model/Example.mjs +0 -48
  121. package/apps/website/neo-config.json +0 -7
  122. package/apps/website/store/BlogPosts.mjs +0 -39
  123. package/apps/website/store/Examples.mjs +0 -35
  124. package/apps/website/view/HeaderContainer.mjs +0 -72
  125. package/apps/website/view/MainContainer.mjs +0 -95
  126. package/apps/website/view/MainContainerController.mjs +0 -230
  127. package/apps/website/view/blog/Container.mjs +0 -50
  128. package/apps/website/view/blog/List.mjs +0 -171
  129. package/apps/website/view/examples/List.mjs +0 -124
  130. package/apps/website/view/examples/TabContainer.mjs +0 -66
  131. package/apps/website/view/home/DeveloperIntroComponent.mjs +0 -266
  132. package/apps/website/view/home/ExecutiveIntroComponent.mjs +0 -291
  133. package/apps/website/view/home/TabContainer.mjs +0 -56
  134. package/resources/scss/src/apps/website/HeaderContainer.scss +0 -136
  135. package/resources/scss/src/apps/website/MainContainer.scss +0 -25
  136. package/resources/scss/src/apps/website/blog/Container.scss +0 -18
  137. package/resources/scss/src/apps/website/blog/List.scss +0 -183
  138. package/resources/scss/src/apps/website/examples/List.scss +0 -157
  139. package/resources/scss/src/apps/website/home/TabContainer.scss +0 -117
  140. package/resources/scss/theme-dark/apps/website/HeaderContainer.scss +0 -5
  141. package/resources/scss/theme-dark/apps/website/MainContainer.scss +0 -4
  142. package/resources/scss/theme-dark/apps/website/blog/Container.scss +0 -3
  143. package/resources/scss/theme-dark/apps/website/home/TabContainer.scss +0 -4
  144. package/resources/scss/theme-light/apps/website/HeaderContainer.scss +0 -5
  145. package/resources/scss/theme-light/apps/website/MainContainer.scss +0 -4
  146. package/resources/scss/theme-light/apps/website/blog/Container.scss +0 -3
  147. package/resources/scss/theme-light/apps/website/home/TabContainer.scss +0 -4
  148. package/resources/scss/theme-neo-light/apps/website/HeaderContainer.scss +0 -5
  149. package/resources/scss/theme-neo-light/apps/website/MainContainer.scss +0 -4
  150. package/resources/scss/theme-neo-light/apps/website/blog/Container.scss +0 -3
  151. package/resources/scss/theme-neo-light/apps/website/home/TabContainer.scss +0 -4
@@ -1,171 +0,0 @@
1
- import BaseList from '../../../../src/list/Base.mjs';
2
- import BlogPosts from '../../store/BlogPosts.mjs';
3
- import VDomUtil from '../../../../src/util/VDom.mjs';
4
-
5
- /**
6
- * @class Website.view.blog.List
7
- * @extends Neo.list.Base
8
- */
9
- class List extends BaseList {
10
- /**
11
- * A regex to enforce a maxLength (word break)
12
- * @member {RegExp} nameRegEx
13
- * @protected
14
- * @static
15
- */
16
- static nameRegEx = /^(.{65}[^\s]*).*/
17
-
18
- static config = {
19
- /**
20
- * @member {String} className='Website.view.blog.List'
21
- * @protected
22
- */
23
- className: 'Website.view.blog.List',
24
- /**
25
- * @member {String[]} baseCls=['website-blog-list','neo-list']
26
- */
27
- baseCls: ['website-blog-list', 'neo-list'],
28
- /**
29
- * @member {Neo.data.Store} store=BlogPosts
30
- */
31
- store: BlogPosts,
32
- /**
33
- * @member {Boolean} useWrapperNode=true
34
- */
35
- useWrapperNode: true,
36
- /**
37
- * @member {Object} _vdom
38
- */
39
- _vdom:
40
- {cn: [
41
- {tag: 'ul', cn: []}
42
- ]}
43
- }
44
-
45
- /**
46
- * @param {Neo.data.Store} value
47
- * @param {Neo.data.Store} oldValue
48
- */
49
- afterSetStore(value, oldValue) {
50
- super.afterSetStore(value, oldValue);
51
-
52
- value.on({
53
- load : 'onBlogPostStoreLoad',
54
- scope: this.getController()
55
- })
56
- }
57
-
58
- /**
59
- * @param {Object} record
60
- */
61
- createItemContent(record) {
62
- let basePath;
63
-
64
- if (Neo.config.isGitHubPages) {
65
- basePath = '../../../../resources_pub/website';
66
-
67
- if (Neo.config.environment !== 'development') {
68
- basePath = '../../' + basePath
69
- }
70
- } else {
71
- basePath = 'https://raw.githubusercontent.com/neomjs/pages/main/resources_pub/website'
72
- }
73
-
74
- const vdomCn = [
75
- {cls: ['content', 'neo-relative'], cn: [
76
- {cls: ['neo-full-size', 'preview-image'], style: {
77
- backgroundImage: `url('${basePath}/blog/${record.image}'), linear-gradient(#777, #333)`}
78
- },
79
- {cls: ['neo-absolute', 'neo-item-bottom-position'], cn: [
80
- {tag: 'a', cls: ['neo-title'], href: record.url, target: '_blank', cn: [
81
- {flag: 'name', html: record.name.replace(List.nameRegEx, "$1")}
82
- ]},
83
- {cls: ['neo-top-20'], cn: [
84
- {tag: 'img', cls: ['neo-user-image'], src: `${basePath}/blogAuthor/${record.authorImage}`},
85
- {cls: ['neo-inner-content'], cn: [
86
- {cls: ['neo-inner-details'], flag: 'author', cn: [
87
- {tag: 'span', cls: ['neo-bold'], html: record.author}
88
- ]},
89
- {cls: ['neo-inner-details'], html: record.date}
90
- ]}
91
- ]}
92
- ]}
93
- ]}
94
- ];
95
-
96
- if (record.publisher.length > 0) {
97
- VDomUtil.getByFlag(vdomCn[0], 'author').cn.push(
98
- {vtype: 'text', html : ' in '},
99
- {tag: 'span', cls: ['neo-bold'], html: record.publisher}
100
- )
101
- }
102
-
103
- if (record.selectedInto.length > 0) {
104
- vdomCn[0].cn.splice(1, 0,
105
- {cls: ['neo-absolute', 'neo-item-top-position'], cn: [
106
- {html: `Officially selected by ${record.provider} into`},
107
- {cls: ['neo-bold'], html: record.selectedInto.join('</br>')}
108
- ]}
109
- )
110
- }
111
-
112
- return vdomCn
113
- }
114
-
115
- /**
116
- * Custom filtering logic
117
- * @param {Object} data
118
- */
119
- filterItems(data) {
120
- let me = this,
121
- emptyValue = !data.value || data.value === '',
122
- store = me.store,
123
- valueRegEx = new RegExp(data.value, 'gi'),
124
- hasMatch, itemName, name, record;
125
-
126
- me.getVdomRoot().cn.forEach((item, index) => {
127
- hasMatch = false;
128
- itemName = VDomUtil.getByFlag(item, 'name');
129
- record = store.getAt(index);
130
- name = record.name.replace(List.nameRegEx, "$1");
131
-
132
- item.style = item.style || {};
133
-
134
- if (emptyValue) {
135
- itemName.html = name;
136
- delete item.style.display
137
- } else {
138
- itemName.html = name.replace(valueRegEx, match => {
139
- hasMatch = true;
140
- return `<span class="neo-highlight-search">${match}</span>`;
141
- });
142
-
143
- if (hasMatch) {
144
- delete item.style.display
145
- } else {
146
- item.style.display = 'none'
147
- }
148
- }
149
- });
150
-
151
- me.update()
152
- }
153
-
154
- /**
155
- * @returns {Object}
156
- */
157
- getVdomRoot() {
158
- return this.vdom.cn[0]
159
- }
160
-
161
- /**
162
- * @returns {Object}
163
- */
164
- getVnodeRoot() {
165
- return this.vnode.childNodes[0]
166
- }
167
- }
168
-
169
- Neo.setupClass(List);
170
-
171
- export default List;
@@ -1,124 +0,0 @@
1
- import BaseList from '../../../../src/list/Base.mjs';
2
- import Examples from '../../store/Examples.mjs';
3
-
4
- /**
5
- * @class Website.view.examples.List
6
- * @extends Neo.list.Base
7
- */
8
- class List extends BaseList {
9
- /**
10
- * A regex to enforce a maxLength (word break)
11
- * @member {RegExp} nameRegEx
12
- * @protected
13
- * @static
14
- */
15
- static nameRegEx = /^(.{65}[^\s]*).*/
16
-
17
- static config = {
18
- /**
19
- * @member {String} className='Website.view.examples.List'
20
- * @protected
21
- */
22
- className: 'Website.view.examples.List',
23
- /**
24
- * @member {String[]} baseCls=['website-examples-list','neo-list']
25
- */
26
- baseCls: ['website-examples-list', 'neo-list'],
27
- /**
28
- * @member {Neo.data.Store} store=Examples
29
- */
30
- store: Examples,
31
- /**
32
- * @member {String|null} storeUrl_=null
33
- */
34
- storeUrl_: null,
35
- /**
36
- * @member {Boolean} useWrapperNode=true
37
- */
38
- useWrapperNode: true,
39
- /**
40
- * @member {Object} _vdom
41
- */
42
- _vdom:
43
- {cn: [
44
- {tag: 'ul', cn: []}
45
- ]}
46
- }
47
-
48
- /**
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
54
- */
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) {
74
- let basePath;
75
-
76
- if (Neo.config.isGitHubPages) {
77
- basePath = '../../../../resources_pub/website/examples';
78
-
79
- if (Neo.config.environment !== 'development') {
80
- basePath = '../../' + basePath
81
- }
82
- } else {
83
- basePath = 'https://raw.githubusercontent.com/neomjs/pages/main/resources_pub/website/examples'
84
- }
85
-
86
- 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
- },
91
- {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
- ]},
95
- {cls: ['neo-top-20'], cn: [
96
- {tag: 'a', cls: ['fab fa-github', 'neo-github-image'], href: record.sourceUrl, target: '_blank'},
97
- {cls: ['neo-inner-content'], cn: [
98
- {cls: ['neo-inner-details'], html: record.browsers.join(', ')},
99
- {cls: ['neo-inner-details'], html: record.environments.join(', ')}
100
- ]}
101
- ]}
102
- ]}
103
- ]}
104
- ]
105
- }
106
-
107
- /**
108
- * @returns {Object}
109
- */
110
- getVdomRoot() {
111
- return this.vdom.cn[0]
112
- }
113
-
114
- /**
115
- * @returns {Object}
116
- */
117
- getVnodeRoot() {
118
- return this.vnode.childNodes[0]
119
- }
120
- }
121
-
122
- Neo.setupClass(List);
123
-
124
- export default List;
@@ -1,66 +0,0 @@
1
- import Container from '../../../../src/tab/Container.mjs';
2
- import List from './List.mjs';
3
-
4
- /**
5
- * @class Website.view.examples.TabContainer
6
- * @extends Neo.container.Base
7
- */
8
- class TabContainer extends Container {
9
- static config = {
10
- /**
11
- * @member {String} className='Website.view.examples.TabContainer'
12
- * @protected
13
- */
14
- className: 'Website.view.examples.TabContainer',
15
- /**
16
- * @member {Number} activeIndex=2
17
- */
18
- activeIndex: 2,
19
- /**
20
- * @member {Object} itemDefaults
21
- */
22
- itemDefaults: {
23
- module: List
24
- },
25
- /**
26
- * @member {Object[]} items
27
- */
28
- items: [{
29
- reference : 'examples-devmode-list',
30
- storeUrl : '../../apps/website/data/examples_devmode.json',
31
- tabButtonConfig: {
32
- iconCls: 'fa fa-chess-knight',
33
- route : 'childview=devmode',
34
- text : 'DevMode'
35
- }
36
- }, {
37
- reference : 'examples-dist-dev-list',
38
- storeUrl : '../../apps/website/data/examples_dist_dev.json',
39
- tabButtonConfig: {
40
- iconCls: 'fa fa-chess-queen',
41
- route : 'childview=dist_dev',
42
- text : 'dist/dev'
43
- }
44
- }, {
45
- reference : 'examples-dist-prod-list',
46
- storeUrl : '../../apps/website/data/examples_dist_prod.json',
47
- tabButtonConfig: {
48
- iconCls: 'fa fa-chess-king',
49
- route : 'childview=dist_prod',
50
- text : 'dist/prod'
51
- }
52
- }],
53
- /**
54
- * @member {Boolean} sortable=true
55
- */
56
- sortable: true,
57
- /**
58
- * @member {String} tabBarPosition='left'
59
- */
60
- tabBarPosition: 'left',
61
- }
62
- }
63
-
64
- Neo.setupClass(TabContainer);
65
-
66
- export default TabContainer;
@@ -1,266 +0,0 @@
1
- import Component from '../../../../src/component/Base.mjs';
2
-
3
- /**
4
- * @class Website.view.home.DeveloperIntroComponent
5
- * @extends Neo.component.Base
6
- */
7
- class DeveloperIntroComponent extends Component {
8
- static config = {
9
- /**
10
- * @member {String} className='Website.view.home.DeveloperIntroComponent'
11
- * @protected
12
- */
13
- className: 'Website.view.home.DeveloperIntroComponent',
14
- /**
15
- * @member {String[]} baseCls=['website-intro-component']
16
- * @protected
17
- */
18
- baseCls: ['website-intro-component'],
19
- /**
20
- * @member {Object[]} domListeners
21
- * @protected
22
- */
23
- domListeners: [{
24
- click : 'onNavLinkClick',
25
- delegate: '.nav-link'
26
- }],
27
- /**
28
- * @member {Object} vdom
29
- */
30
- vdom: {innerHTML: [
31
- '<div class="neo-absolute">',
32
- '<h1>Content</h1>',
33
- '<ol>',
34
- '<li><a class="nav-link" data-target="exec-nav-1">Introduction</a></li>',
35
- '<li>',
36
- '<a class="nav-link" data-target="exec-nav-2">Current pain points inside the UI sector</a>',
37
- '<ul>',
38
- '<li>2.1 <a class="nav-link" data-target="dev-nav-2.1">Performance</a></li>',
39
- '<li>2.2 <a class="nav-link" data-target="dev-nav-2.2">Multi Browser Window Apps</a></li>',
40
- '<li>2.3 <a class="nav-link" data-target="dev-nav-2.3">Developing UIs inside nodejs</a></li>',
41
- '<li>2.4 <a class="nav-link" data-target="dev-nav-2.4">Scalable Architectures</a></li>',
42
- '<li>2.5 <a class="nav-link" data-target="dev-nav-2.5">Memory Leaks</a></li>',
43
- '<li>2.6 <a class="nav-link" data-target="dev-nav-2.6">Templates</a></li>',
44
- '<li>2.7 <a class="nav-link" data-target="dev-nav-2.7">Consistent Code</a></li>',
45
- '</ul>',
46
- '</li>',
47
- '<li><a class="nav-link" data-target="dev-nav-3">How to get up to speed?</a></li>',
48
- '<li><a class="nav-link" data-target="dev-nav-4">Join neo.mjs as a Contributor</a></li>',
49
- '<li><a class="nav-link" data-target="dev-nav-5">Incentives for Contributors</a></li>',
50
- '<ol>',
51
- '<h1 class="nav-target" id="dev-nav-1">1. Introduction</h1>',
52
- '<p>',
53
- 'neo.mjs is the next generation UI framework for creating desktop & mobile Web Apps. ',
54
- 'It has a very strong focus on performance and creating scalable & modular architectures. ',
55
- 'A clean & consistent API, as well as the ability to run without any build processes, ',
56
- 'will increase the productivity of your team, while creating better solutions at the same time.',
57
- '</p>',
58
- '<h1 class="nav-target" id="dev-nav-2">2. Current pain points inside the UI sector</h1>',
59
- '<ol>',
60
- '<li>',
61
- '<b class="nav-target" id="dev-nav-2.1">Performance</b>',
62
- '<p>',
63
- '<b>Problem:</b> While current libraries / frameworks like Angular, React or Vue provide a reasonable performance for ',
64
- 'small or mostly static Apps, they lack when it comes to big Apps or complex Components. ',
65
- 'The problem is, that most Apps today run within a single thread (CPU), while each computer or mobile ',
66
- 'device has several CPUs available. Some Apps move expensive tasks into separate threads, but this ',
67
- 'is by far not enough.',
68
- '</p>',
69
- '<p>',
70
- '<b>Solution:</b> Using neo.mjs, most parts of the framework as well as the Apps which you create ',
71
- 'with it, run inside a separate thread. This architecture leaves the main thread mostly idle, so ',
72
- 'it can fully concentrate on its purpose: to only manipulate the real DOM (HTML). Expensive tasks ',
73
- 'simply can not interfere with your animations or even freeze your UI.',
74
- '</p>',
75
- '</li>',
76
- '<li>',
77
- '<b class="nav-target" id="dev-nav-2.2">Multi Browser Window Apps</b>',
78
- '<p>',
79
- '<b>Problem:</b> Expanding Single Page Apps into multiple Browser Windows is simply impossible ',
80
- 'with any other library or framework out there.',
81
- '</p>',
82
- '<p>',
83
- '<b>Solution:</b> Using neo.mjs, you can do it today. With the SharedWorkers setup, you can not ',
84
- 'only directly communicate between Windows, but you can move entire Component trees around, ',
85
- 're-using the same JS instances and no need to care about DOM events. This architecture will rock ',
86
- 'on mobile devices as well, as soon as the Webkit team catches up. Imagine a Native Shell using ',
87
- 'multiple WebViews. Take a look at:',
88
- '</p>',
89
- '<p>',
90
- '<a target="_blank" href="https://medium.com/swlh/expanding-single-page-apps-into-multiple-browser-windows-e6d9bd155d59?source=friends_link&sk=bbfe1dada95c5674669e463f93360822">Expanding Single Page Apps into multiple Browser Windows</a>',
91
- '</p>',
92
- '</li>',
93
- '<li>',
94
- '<b class="nav-target" id="dev-nav-2.3">Developing UIs inside nodejs</b>',
95
- '<p>',
96
- '<b>Problem:</b> nodejs evolved faster than JS inside Browsers, but did not stick to W3C standards. ',
97
- 'Libraries / frameworks like Angular, React & Vue picked this up and moved the entire UI development ',
98
- 'into nodejs. This allows developers to use ES6+ features like classes & JS modules, but at an extremely ',
99
- 'high cost: every change inside your code base requires a build or transpilation, before you can see it. ',
100
- 'An entire ecosystem evolved, like hot module replacements & using source maps to reduce the pain point a bit.',
101
- '</p>',
102
- '<p>',
103
- '<b>Solution:</b> In a couple of years, we will most likely look back at this madness and laugh. Calling it ',
104
- '"a hiccup in the history of Web Development". Browsers did catch up. Using neo.mjs, you can run the Development ',
105
- 'Mode directly inside the Browser. No build processes or source maps needed. You can debug the real ES8+ code. ',
106
- 'This has saved me a lot of time already, since it is the best possible debugging experience.',
107
- '</p>',
108
- '</li>',
109
- '<li>',
110
- '<b class="nav-target" id="dev-nav-2.4">Scalable Architectures</b>',
111
- '<p>',
112
- '<b>Problem:</b> While scalability is an important item inside the backend area (Cloud), it got mostly ',
113
- 'ignored on the frontend side so far.',
114
- '</p>',
115
- '<p>',
116
- '<b>Solution:</b> With the current worker setup, you already have a solid starting point. We can further enhance this, ',
117
- 'if needed. E.g. add a second Vdom worker, in case this one is a bottle-neck. You can stick to common ',
118
- 'patterns like MVC or MVVM, if you like to. You can create multiple Apps on one page and with using ',
119
- 'JS Modules, you can lazy load classes => packages as needed.',
120
- '</p>',
121
- '</li>',
122
- '<li>',
123
- '<b class="nav-target" id="dev-nav-2.5">Memory Leaks</b>',
124
- '<p>',
125
- '<b>Problem:</b> Destroying & re-creating Component Trees can easily lead to memory leaks. Especially in case the destruction ',
126
- 'logic of self created Components is not fully polished.',
127
- '</p>',
128
- '<p>',
129
- '<b>Solution:</b> Using neo.mjs, you can easily re-use existing ',
130
- 'JS instances and just unmount & re-mount their (V)DOM. You can easily move Components Trees to different ',
131
- 'spots inside your App as well.',
132
- '</p>',
133
- '</li>',
134
- '<li>',
135
- '<b class="nav-target" id="dev-nav-2.6">Templates</b>',
136
- '<p>',
137
- '<b>Problem:</b> Close to all current libraries / frameworks out there are template driven. Developers have to create ',
138
- 'a compact, but very messy pseudo XML markup. Variables and methods get mixed into them, with various ',
139
- 'combinations of brackets. Especially complex Components like a Grid (Table) can contain over 1000 lines ',
140
- 'including big amounts of template if & else statements. While you can compile them at build time (e.g. Svelte), ',
141
- 'they are very static. Changes at runtime',
142
- 'this leaves',
143
- '</p>',
144
- '<p>',
145
- '<b>Solution:</b> There are no templates inside neo.mjs. Instead, you create a JSON based virtual DOM tree ',
146
- '(a bit similar to creating a simplified JSX output). You can dynamically change these structures any way ',
147
- 'you like to. There is no need for parsing the structures, since JS is meant to work with objects & arrays. ',
148
- 'The performance gain for run-time changes is significant. The best part is that you can modify the vdom tress ',
149
- 'exactly the same way throughout the entire Component lifecycle (e.g. before & after mounting).',
150
- '</p>',
151
- '</li>',
152
- '<li>',
153
- '<b class="nav-target" id="dev-nav-2.7">Consistent Code</b>',
154
- '<p>',
155
- '<b>Problem:</b> Especially when working with libraries (e.g. React), you don\'t get everything you need ',
156
- 'for creating an UI. You will need several 3rd party extensions, which won\'t provide a consistent code ',
157
- 'base. Another big problem is, that libraries like React do not expose a core. Component is the base class ',
158
- 'for everything and this makes no sense. A router, controller or utility class does not have a DOM output, ',
159
- 'so they really should not use Component as the base class.',
160
- '</p>',
161
- '<p>',
162
- '<b>Solution:</b> neo.mjs is a framework, not a library. The core is exposed (core.Base). There are already ',
163
- 'a big amount a classes available, which follow the same design patterns & API. neo.mjs is created with a ',
164
- 'strong focus on being extendable. It is very easy to create new Components or other classes on your own.',
165
- '</p>',
166
- '</li>',
167
- '</ol>',
168
- '<h1 class="nav-target" id="dev-nav-3">3. How to get up to speed?</h1>',
169
- '<p>',
170
- 'As a first step, explore the Blog Posts & Examples on this page to figure out if you like the framework in general.',
171
- '</p>',
172
- '<p>',
173
- 'Afterwards, I strongly recommend to follow the first 2 Tutorials:',
174
- '</p>',
175
- '<p>',
176
- '<a target="_blank" href="https://medium.com/swlh/how-to-create-a-webworkers-driven-multithreading-app-part-1-fa0cc78a4237?source=friends_link&sk=a10ca85002f5f9c3ee8c69f53c79d95f">How to create a webworkers driven multithreading App — Part 1</a>',
177
- '</p>',
178
- '<p>',
179
- '<a target="_blank" href="https://medium.com/swlh/how-to-create-a-webworkers-driven-multithreading-app-part-2-3c5b3c2d1adb?source=friends_link&sk=cf4b5c0e014fcfd6fc1d9845f4eb3097">How to create a webworkers driven multithreading App — Part 2</a>',
180
- '</p>',
181
- '<p>',
182
- 'At this point, you are definitely ready to create a first neo.mjs App on your own.',
183
- '</p>',
184
- '<p>',
185
- 'Use the neo.mjs issues tracker to create new tickets or comment on existing ones:',
186
- '</p>',
187
- '<p>',
188
- '<a target="_blank" href="https://github.com/neomjs/neo/issues">neo.mjs issues tracker</a>',
189
- '</p>',
190
- '<p>',
191
- 'Join the Slack Channel for questions & feedback:',
192
- '</p>',
193
- '<p>',
194
- '<a target="_blank" href="https://join.slack.com/t/neotericjs/shared_invite/enQtNDk2NjEwMTIxODQ2LWRjNGQ3ZTMzODRmZGM2NDM2NzZmZTMzZmE2YjEwNDM4NDhjZDllNWY2ZDkwOWQ5N2JmZWViYjYzZTg5YjdiMDc">Slack Channel Invite Link</a>',
195
- '</p>',
196
- '<p>',
197
- 'I am willing to help getting the first developers up to speed. For free. Don\'t miss out on this.',
198
- '</p>',
199
- '<h1 class="nav-target" id="dev-nav-4">4. Join neo.mjs as a Contributor</h1>',
200
- '<p>',
201
- 'Open source projects rely on <b>your</b> support. Successful projects require contributors to bring the ideas, ',
202
- 'innovations and collaboration required for a robust and solid project.',
203
- '</p>',
204
- '<p>',
205
- 'Contributions do not necessarily have to be code based. While we encourage you to use the code base and contribute to it, ',
206
- 'we can also use your help in providing other input. Some examples of helpful contributions include:',
207
- '<ol>',
208
- '<li>Work on the source code, enhancing and improving it</li>',
209
- '<li>Providing documentation content, review and editing</li>',
210
- '<li>Sample application creation</li>',
211
- '<li>Blog content</li>',
212
- '<li>Guides and How-To docs</li>',
213
- '</ol>',
214
- '</p>',
215
- '<p>',
216
- 'With your help, especially in case you are a curious and passionate developer, we can speed up the development of neo.mjs. A lot.',
217
- '</p>',
218
- '<p>',
219
- 'To get started, make sure to join our ',
220
- '<a target="_blank" href="https://join.slack.com/t/neotericjs/shared_invite/enQtNDk2NjEwMTIxODQ2LWRjNGQ3ZTMzODRmZGM2NDM2NzZmZTMzZmE2YjEwNDM4NDhjZDllNWY2ZDkwOWQ5N2JmZWViYjYzZTg5YjdiMDc">Slack Channel</a>',
221
- ' as it is a great resource and a way to communicate with the growing neo.mjs community. ',
222
- 'You may also comment on existing tickets which you find interesting or ',
223
- 'create new ones as needed. Please feel free to fork the repository and create pull requests as needed.',
224
- '</p>',
225
- '<p>',
226
- 'For more information, please review our contribution guide <a target="_blank" href="https://github.com/neomjs/neo/blob/dev/CONTRIBUTING.md">here</a>.',
227
- '</p>',
228
- '<h1 class="nav-target" id="dev-nav-5">5. Incentives for Contributors</h1>',
229
- '<p>',
230
- 'The neo.mjs project is in its infancy, but growing every day in both content and exposure. We firmly believe that neo.mjs ',
231
- 'will gain traction and adoption as it matures and this is where your contributions don\'t end with just source code and ',
232
- 'content. Your active participation in sharing your experiences and knowledge of neo.mjs is crucial to its growth. ',
233
- '</p>',
234
- '<p>',
235
- 'Additionally, actively contributing to open source projects increases your exposure to different projects and gives you ',
236
- 'more experience in code design and collaborating with other developers. This is a much sought after skill set for employers ',
237
- 'and gives you better professional credit. This experience can also result in better salaries for you as an employee, or ',
238
- 'better hourly rates for you as a contractor.',
239
- '</p>',
240
- '<p>',
241
- 'As neo.mjs grows and adoption increases, there will be projects and jobs requiring skilled and experienced neo.mjs developers. ',
242
- 'While it can be very hard to get a reputation of being a skilled Angular, React or Vue developer (primarily because of the ',
243
- 'established large developer community) it will be the pioneer contributors and adopters of neo.mjs who will gain reputation ',
244
- 'as being an expert in this framework.',
245
- '</p>',
246
- '<p>',
247
- 'We plan on creating a <b>Certified Developer</b> program and those who show a true interest in being a contributor and ',
248
- 'ambassador for neo.mjs will be the first to receive such certification. This will be our way of thanking you for your work and ',
249
- 'dedication to neo.mjs.',
250
- '</p>',
251
- '<p>',
252
- 'And finally, if you have had the chance to read the Executives\' Introduction, you will also know that we plan on ',
253
- 'creating jobs and contractor positions when we get financially sustainable. Of course, we will be looking to our ',
254
- 'contributors first to fulfill these positions.',
255
- '</p>',
256
- '<p>',
257
- 'Thank you for taking the time to read this and we look forward to the future of neo.mjs and your participation in it!',
258
- '</p>',
259
- '</div>'
260
- ].join('')}
261
- }
262
- }
263
-
264
- Neo.setupClass(DeveloperIntroComponent);
265
-
266
- export default DeveloperIntroComponent;