neo.mjs 6.21.0 → 6.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) 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 +33 -10
  11. package/apps/portal/view/about/Container.mjs +52 -0
  12. package/apps/portal/view/about/MemberContainer.mjs +191 -0
  13. package/apps/portal/view/blog/Container.mjs +14 -1
  14. package/apps/portal/view/home/MainContainer.mjs +15 -3
  15. package/apps/portal/view/home/parts/AfterMath.mjs +12 -8
  16. package/apps/portal/view/home/parts/Colors.mjs +8 -2
  17. package/apps/portal/view/home/parts/Features.mjs +50 -83
  18. package/apps/portal/view/home/parts/Helix.mjs +8 -2
  19. package/apps/portal/view/home/parts/MainNeo.mjs +17 -5
  20. package/apps/portal/view/learn/ContentView.mjs +18 -4
  21. package/apps/portal/view/learn/PageContainer.mjs +13 -0
  22. package/apps/portal/view/services/Component.mjs +13 -0
  23. package/apps/realworld/api/Base.mjs +5 -5
  24. package/apps/realworld/view/MainContainerController.mjs +19 -17
  25. package/apps/realworld2/api/Base.mjs +5 -5
  26. package/apps/realworld2/view/MainContainerController.mjs +11 -11
  27. package/apps/realworld2/view/article/Gallery.mjs +6 -4
  28. package/apps/sharedcovid/view/MainContainerController.mjs +11 -12
  29. package/apps/sharedcovid/view/TableContainer.mjs +7 -5
  30. package/apps/sharedcovid/view/country/Gallery.mjs +6 -4
  31. package/apps/shareddialog/view/MainContainerController.mjs +5 -5
  32. package/buildScripts/webpack/json/myApps.template.json +1 -2
  33. package/docs/app/view/classdetails/MembersList.mjs +8 -8
  34. package/docs/app/view/classdetails/SourceViewComponent.mjs +6 -6
  35. package/docs/app/view/classdetails/TutorialComponent.mjs +9 -9
  36. package/examples/ServiceWorker.mjs +2 -2
  37. package/examples/component/coronaGallery/CountryGallery.mjs +6 -4
  38. package/examples/component/helix/Viewport.mjs +2 -2
  39. package/examples/list/circle/MainContainer.mjs +7 -7
  40. package/examples/preloadingAssets/view/MainContainerController.mjs +5 -5
  41. package/package.json +5 -5
  42. package/resources/data/deck/learnneo/pages/GuideEvents.md +2 -4
  43. package/resources/data/deck/learnneo/pages/WhyNeo-Features.md +46 -0
  44. package/resources/data/deck/learnneo/pages/WhyNeo-Intro.md +5 -6
  45. package/resources/data/deck/learnneo/pages/WhyNeo-Multi-Window.md +1 -1
  46. package/resources/data/deck/learnneo/tree.json +3 -2
  47. package/resources/fonts/GT-Planar-Regular.otf +0 -0
  48. package/resources/images/logo/neo_logo_favicon.svg +16 -0
  49. package/resources/images/team/tobiu.png +0 -0
  50. package/resources/images/team/torsten.png +0 -0
  51. package/resources/scss/src/apps/colors/HeaderToolbar.scss +23 -1
  52. package/resources/scss/src/apps/colors/Viewport.scss +10 -0
  53. package/resources/scss/src/apps/portal/HeaderToolbar.scss +7 -7
  54. package/resources/scss/src/apps/portal/Viewport.scss +10 -0
  55. package/resources/scss/src/apps/portal/about/Container.scss +4 -0
  56. package/resources/scss/src/apps/portal/about/MemberContainer.scss +70 -0
  57. package/resources/scss/src/apps/portal/home/FooterContainer.scss +12 -0
  58. package/resources/scss/src/apps/portal/home/parts/BaseContainer.scss +16 -16
  59. package/resources/scss/src/apps/portal/home/parts/MainNeo.scss +62 -7
  60. package/resources/scss/src/apps/portal/learn/ContentView.scss +1 -0
  61. package/resources/scss/src/apps/portal/learn/PageContainer.scss +6 -0
  62. package/resources/scss/src/layout/Cube.scss +3 -3
  63. package/resources/scss/src/plugin/Resizable.scss +12 -19
  64. package/resources/scss/theme-neo-light/dialog/Base.scss +12 -2
  65. package/src/DefaultConfig.mjs +2 -2
  66. package/src/calendar/view/MainContainer.mjs +10 -10
  67. package/src/calendar/view/SettingsContainer.mjs +10 -10
  68. package/src/calendar/view/YearComponent.mjs +2 -2
  69. package/src/calendar/view/calendars/List.mjs +2 -2
  70. package/src/calendar/view/month/Component.mjs +4 -4
  71. package/src/calendar/view/week/Component.mjs +2 -2
  72. package/src/calendar/view/week/plugin/DragDrop.mjs +4 -4
  73. package/src/code/LivePreview.mjs +6 -15
  74. package/src/component/Base.mjs +3 -3
  75. package/src/component/Circle.mjs +5 -5
  76. package/src/component/DateSelector.mjs +4 -4
  77. package/src/component/Gallery.mjs +8 -8
  78. package/src/component/Helix.mjs +12 -12
  79. package/src/component/Toast.mjs +1 -1
  80. package/src/component/wrapper/AmChart.mjs +2 -2
  81. package/src/component/wrapper/CesiumJS.mjs +2 -2
  82. package/src/component/wrapper/GoogleMaps.mjs +2 -2
  83. package/src/component/wrapper/MonacoEditor.mjs +3 -3
  84. package/src/core/Observable.mjs +2 -2
  85. package/src/data/Store.mjs +2 -2
  86. package/src/dialog/Base.mjs +44 -14
  87. package/src/draggable/DragZone.mjs +4 -4
  88. package/src/draggable/list/DragZone.mjs +4 -4
  89. package/src/draggable/tab/header/toolbar/SortZone.mjs +2 -2
  90. package/src/draggable/toolbar/DragZone.mjs +4 -4
  91. package/src/draggable/toolbar/SortZone.mjs +3 -3
  92. package/src/form/field/ComboBox.mjs +3 -2
  93. package/src/form/field/FileUpload.mjs +3 -3
  94. package/src/form/field/Text.mjs +2 -2
  95. package/src/form/field/TextArea.mjs +2 -2
  96. package/src/grid/Container.mjs +2 -2
  97. package/src/layout/Cube.mjs +1 -3
  98. package/src/list/plugin/Animate.mjs +23 -23
  99. package/src/main/DomAccess.mjs +1 -1
  100. package/src/main/DomEvents.mjs +14 -5
  101. package/src/main/addon/AmCharts.mjs +2 -2
  102. package/src/main/addon/MapboxGL.mjs +4 -4
  103. package/src/manager/DomEvent.mjs +2 -2
  104. package/src/manager/Focus.mjs +2 -2
  105. package/src/manager/Toast.mjs +6 -4
  106. package/src/manager/rpc/Message.mjs +2 -2
  107. package/src/plugin/Resizable.mjs +11 -3
  108. package/src/selection/HelixModel.mjs +3 -3
  109. package/src/tab/Strip.mjs +4 -4
  110. package/src/table/Container.mjs +4 -4
  111. package/src/util/Logger.mjs +6 -4
  112. package/src/worker/App.mjs +2 -2
  113. package/src/worker/Manager.mjs +3 -2
  114. package/apps/website/Overwrites.mjs +0 -16
  115. package/apps/website/app.mjs +0 -7
  116. package/apps/website/data/blog.json +0 -769
  117. package/apps/website/data/docs.json +0 -29
  118. package/apps/website/data/examples_devmode.json +0 -173
  119. package/apps/website/data/examples_dist_dev.json +0 -164
  120. package/apps/website/data/examples_dist_prod.json +0 -164
  121. package/apps/website/index.html +0 -11
  122. package/apps/website/model/BlogPost.mjs +0 -60
  123. package/apps/website/model/Example.mjs +0 -48
  124. package/apps/website/neo-config.json +0 -7
  125. package/apps/website/store/BlogPosts.mjs +0 -39
  126. package/apps/website/store/Examples.mjs +0 -35
  127. package/apps/website/view/HeaderContainer.mjs +0 -72
  128. package/apps/website/view/MainContainer.mjs +0 -95
  129. package/apps/website/view/MainContainerController.mjs +0 -230
  130. package/apps/website/view/blog/Container.mjs +0 -50
  131. package/apps/website/view/blog/List.mjs +0 -171
  132. package/apps/website/view/examples/List.mjs +0 -124
  133. package/apps/website/view/examples/TabContainer.mjs +0 -66
  134. package/apps/website/view/home/DeveloperIntroComponent.mjs +0 -266
  135. package/apps/website/view/home/ExecutiveIntroComponent.mjs +0 -291
  136. package/apps/website/view/home/TabContainer.mjs +0 -56
  137. package/resources/scss/src/apps/website/HeaderContainer.scss +0 -136
  138. package/resources/scss/src/apps/website/MainContainer.scss +0 -25
  139. package/resources/scss/src/apps/website/blog/Container.scss +0 -18
  140. package/resources/scss/src/apps/website/blog/List.scss +0 -183
  141. package/resources/scss/src/apps/website/examples/List.scss +0 -157
  142. package/resources/scss/src/apps/website/home/TabContainer.scss +0 -117
  143. package/resources/scss/theme-dark/apps/website/HeaderContainer.scss +0 -5
  144. package/resources/scss/theme-dark/apps/website/MainContainer.scss +0 -4
  145. package/resources/scss/theme-dark/apps/website/blog/Container.scss +0 -3
  146. package/resources/scss/theme-dark/apps/website/home/TabContainer.scss +0 -4
  147. package/resources/scss/theme-light/apps/website/HeaderContainer.scss +0 -5
  148. package/resources/scss/theme-light/apps/website/MainContainer.scss +0 -4
  149. package/resources/scss/theme-light/apps/website/blog/Container.scss +0 -3
  150. package/resources/scss/theme-light/apps/website/home/TabContainer.scss +0 -4
  151. package/resources/scss/theme-neo-light/apps/website/HeaderContainer.scss +0 -5
  152. package/resources/scss/theme-neo-light/apps/website/MainContainer.scss +0 -4
  153. package/resources/scss/theme-neo-light/apps/website/blog/Container.scss +0 -3
  154. package/resources/scss/theme-neo-light/apps/website/home/TabContainer.scss +0 -4
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='6.21.0'
23
+ * @member {String} version='6.22.1'
24
24
  */
25
- version: '6.21.0'
25
+ version: '6.22.1'
26
26
  }
27
27
 
28
28
  /**
@@ -15,9 +15,9 @@ class HeaderToolbar extends Toolbar {
15
15
  */
16
16
  className: 'Colors.view.HeaderToolbar',
17
17
  /**
18
- * @member {String[]} cls=['portal-header-toolbar']
18
+ * @member {String[]} cls=['colors-header-toolbar']
19
19
  */
20
- cls: ['portal-header-toolbar'],
20
+ cls: ['colors-header-toolbar'],
21
21
  /**
22
22
  * @member {Object} layout={ntype:'hbox',align:'stretch',wrap:'wrap'}
23
23
  */
@@ -64,7 +64,11 @@ class HeaderToolbar extends Toolbar {
64
64
  listeners : {change: 'onChangeAmountRows'},
65
65
  store : ['5', '10', '15', '20'],
66
66
  width : 90
67
- }, '->', {
67
+ }, {
68
+ ntype: 'component',
69
+ cls : ['header-spacer'],
70
+ flex : 1
71
+ }, {
68
72
  handler : 'onDetachTableButtonClick',
69
73
  iconCls : 'fas fa-table',
70
74
  reference: 'detach-table-button',
@@ -186,11 +186,11 @@ class MainContainerController extends ComponentController {
186
186
  .catch(err => console.log('Can’t access ' + me.apiSummaryUrl, err))
187
187
  .then(data => me.applySummaryData(data));
188
188
 
189
- setTimeout(() => {
189
+ me.timeout(2000).then(() => {
190
190
  if (!me.summaryData) {
191
- me.onLoadSummaryDataFail();
191
+ me.onLoadSummaryDataFail()
192
192
  }
193
- }, 2000);
193
+ })
194
194
  }
195
195
 
196
196
  /**
@@ -261,11 +261,11 @@ class MainContainerController extends ComponentController {
261
261
  me.activeMainTabIndex = activeIndex;
262
262
 
263
263
  if (!activeView) {
264
- setTimeout(() => {
264
+ me.timeout(10).then(() => {
265
265
  me.onHashChange(value, oldValue);
266
- }, 10);
266
+ });
267
267
 
268
- return;
268
+ return
269
269
  }
270
270
 
271
271
  me.getModel().setData({
@@ -178,9 +178,11 @@ class TableContainer extends Container {
178
178
  * @protected
179
179
  */
180
180
  afterSetCountryRecord(value, oldValue) {
181
- setTimeout(() => {
182
- this.controller.onCountryChange(value);
183
- }, this.isConstructed ? 0 : 50);
181
+ let me = this;
182
+
183
+ me.timeout(me.isConstructed ? 0 : 50).then(() => {
184
+ me.controller.onCountryChange(value)
185
+ })
184
186
  }
185
187
  }
186
188
 
@@ -162,10 +162,12 @@ class CountryGallery extends Gallery {
162
162
  onStoreLoad(items) {
163
163
  super.onStoreLoad(items);
164
164
 
165
- setTimeout(() => {
166
- this.selectOnMount = true;
167
- this.afterSetMounted(true, false);
168
- }, 400);
165
+ let me = this;
166
+
167
+ me.timeout(400).then(() => {
168
+ me.selectOnMount = true;
169
+ me.afterSetMounted(true, false)
170
+ })
169
171
  }
170
172
  }
171
173
 
@@ -82,9 +82,9 @@ class ViewportModel extends Component {
82
82
  if (page instanceof Neo.core.Base) {
83
83
  page.setValues(me.formData, true);
84
84
  } else {
85
- setTimeout(() => {
85
+ me.timeout(30).then(() => {
86
86
  me.onDataPropertyChange(key, value, oldValue)
87
- }, 30)
87
+ })
88
88
  }
89
89
  }
90
90
  }
@@ -3,7 +3,29 @@
3
3
  <head>
4
4
  <meta name="viewport" content="width=device-width, initial-scale=1">
5
5
  <meta charset="UTF-8">
6
- <title>neo.mjs</title>
6
+ <title>Neo.mjs</title>
7
+ <meta name="description" content="Neo.mjs provides a new approach for building feature-rich web applications. Increase productivity by leveraging a vast component library and harness the power of multi-threading for extreme real-time performance.">
8
+ <meta name="robots" content="index, follow">
9
+ <script type="application/ld+json">
10
+ {
11
+ "@context": "http://schema.org",
12
+ "@type": "SoftwareApplication",
13
+ "name": "Neo.mjs",
14
+ "url": "https://neomjs.com/",
15
+ "author": {
16
+ "@type": "Organization",
17
+ "name": "Neo.mjs"
18
+ },
19
+ "datePublished": "2024-07-27",
20
+ "publisher": {
21
+ "@type": "Organization",
22
+ "name": "Neo.mjs"
23
+ },
24
+ "applicationCategory": "JavaScript Framework",
25
+ "downloadUrl": "https://github.com/neomjs/neo"
26
+ }
27
+ </script>
28
+ <link rel="icon" href="../../resources/images/logo/neo_logo_favicon.svg">
7
29
  <link
8
30
  href="https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&family=Source+Sans+3:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&family=Source+Serif+4:ital,opsz,wght@0,8..60,400;0,8..60,500;0,8..60,600;0,8..60,700;1,8..60,400;1,8..60,500;1,8..60,600;1,8..60,700&display=swap"
9
31
  rel="stylesheet">
@@ -12,9 +12,9 @@ class HeaderToolbar extends Base {
12
12
  */
13
13
  className: 'Portal.view.HeaderToolbar',
14
14
  /**
15
- * @member {String[]} cls=['learnneo-header-toolbar']
15
+ * @member {String[]} cls=['portal-header-toolbar']
16
16
  */
17
- cls: ['learnneo-header-toolbar'],
17
+ cls: ['portal-header-toolbar'],
18
18
  /**
19
19
  * @member {Object} itemDefaults
20
20
  */
@@ -40,6 +40,7 @@ class Viewport extends BaseViewport {
40
40
  flex : 'none'
41
41
  }, {
42
42
  module : Container,
43
+ cls : ['portal-main-content'],
43
44
  reference: 'main-content',
44
45
 
45
46
  // The layout will get assigned inside ViewportController
@@ -49,7 +50,8 @@ class Viewport extends BaseViewport {
49
50
  {module: () => import('./learn/MainContainer.mjs')},
50
51
  {module: () => import('./blog/Container.mjs')},
51
52
  {module: () => import('../../../docs/app/view/MainContainer.mjs')},
52
- {module: () => import('./services/Component.mjs')}
53
+ {module: () => import('./services/Component.mjs')},
54
+ {module: () => import('./about/Container.mjs')}
53
55
  ]
54
56
  }],
55
57
  /**
@@ -9,7 +9,7 @@ import {getSearchParams} from '../Util.mjs';
9
9
  class ViewportController extends Controller {
10
10
  /**
11
11
  * Valid values for mainContentLayout
12
- * @member {String[]} iconPositions=['top','right','bottom','left']
12
+ * @member {String[]} mainContentLayouts=['card','cube','mixed']
13
13
  * @protected
14
14
  * @static
15
15
  */
@@ -42,6 +42,7 @@ class ViewportController extends Controller {
42
42
  * @member {Object} routes
43
43
  */
44
44
  routes: {
45
+ '/about-us' : 'onAboutUsRoute',
45
46
  '/blog' : 'onBlogRoute',
46
47
  '/docs' : 'onDocsRoute',
47
48
  '/home' : 'onHomeRoute',
@@ -55,6 +56,12 @@ class ViewportController extends Controller {
55
56
  * @member {String[]} connectedApps=[]
56
57
  */
57
58
  connectedApps = []
59
+ /**
60
+ * Internal flag to store the amount of main navigation changes
61
+ * @member {Number} #transitionId=0
62
+ * @private
63
+ */
64
+ #transitionId = 0
58
65
 
59
66
  /**
60
67
  * Triggered after the mainContentLayout config got changed
@@ -83,6 +90,15 @@ class ViewportController extends Controller {
83
90
  return this.beforeSetEnumValue(value, oldValue, 'mainContentLayout')
84
91
  }
85
92
 
93
+ /**
94
+ * @param {Object} params
95
+ * @param {Object} value
96
+ * @param {Object} oldValue
97
+ */
98
+ onAboutUsRoute(params, value, oldValue) {
99
+ this.setMainContentIndex(5)
100
+ }
101
+
86
102
  /**
87
103
  * @param {Object} data
88
104
  * @param {String} data.appName
@@ -98,7 +114,7 @@ class ViewportController extends Controller {
98
114
  livePreviewId = getSearchParams(searchString).id,
99
115
  livePreview = Neo.getComponent(livePreviewId),
100
116
  sourceContainer = livePreview.getReference('preview'),
101
- tabContainer = livePreview.tabContainer,
117
+ {tabContainer} = livePreview,
102
118
  sourceView = sourceContainer.removeAt(0, false);
103
119
 
104
120
  livePreview.previewContainer = mainView;
@@ -126,7 +142,7 @@ class ViewportController extends Controller {
126
142
  livePreviewId = getSearchParams(searchString).id,
127
143
  livePreview = Neo.getComponent(livePreviewId),
128
144
  sourceContainer = livePreview.getReference('preview'),
129
- tabContainer = livePreview.tabContainer,
145
+ {tabContainer} = livePreview,
130
146
  sourceView = mainView.removeAt(0, false);
131
147
 
132
148
  livePreview.previewContainer = null;
@@ -225,16 +241,23 @@ class ViewportController extends Controller {
225
241
  let me = this,
226
242
  {activeIndex, mainContentLayout} = me,
227
243
  container = me.getReference('main-content'),
228
- updateLayout = true;
244
+ updateLayout = true,
245
+ transitionId;
229
246
 
230
247
  if (index !== activeIndex) {
248
+ me.activeIndex = index;
249
+ me.#transitionId++;
250
+
251
+ transitionId = me.#transitionId;
252
+
231
253
  // skip the initial layout-switch, since we do not need a transition
232
254
  if (mainContentLayout === 'mixed' && Neo.isNumber(activeIndex)) {
233
255
  updateLayout = false;
234
256
 
235
- container.wrapperStyle; // todo: without accessing the getter, the flex value can get lost.
236
-
237
- container.layout = {ntype: 'cube', activeIndex, fitContainer: true, hideInactiveCardsOnDestroy: true};
257
+ // enable "fast clicking" on main nav items => do not replace a cube layout with a new instance of cube
258
+ if (container.layout.ntype !== 'layout-cube') {
259
+ container.layout = {ntype: 'cube', activeIndex, fitContainer: true, hideInactiveCardsOnDestroy: true}
260
+ }
238
261
 
239
262
  await me.timeout(200);
240
263
 
@@ -242,14 +265,14 @@ class ViewportController extends Controller {
242
265
 
243
266
  await me.timeout(1100);
244
267
 
245
- container.layout = {ntype: 'card', activeIndex: index}
268
+ if (transitionId === me.#transitionId) {
269
+ container.layout = {ntype: 'card', activeIndex: index}
270
+ }
246
271
  }
247
272
 
248
273
  if (updateLayout) {
249
274
  container.layout.activeIndex = index
250
275
  }
251
-
252
- me.activeIndex = index
253
276
  }
254
277
  }
255
278
  }
@@ -0,0 +1,52 @@
1
+ import Base from '../../../../src/container/Base.mjs';
2
+ import MemberContainer from './MemberContainer.mjs';
3
+
4
+ /**
5
+ * @class Portal.view.about.Container
6
+ * @extends Neo.container.Base
7
+ */
8
+ class Container extends Base {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='Portal.view.about.Container'
12
+ * @protected
13
+ */
14
+ className: 'Portal.view.about.Container',
15
+ /**
16
+ * @member {String[]} cls=['portal-about-container']
17
+ */
18
+ cls: ['portal-about-container'],
19
+ /**
20
+ * @member {Object[]} items
21
+ */
22
+ items: [{
23
+ html: 'Meet the Team',
24
+ tag : 'h1'
25
+ }, {
26
+ module : MemberContainer,
27
+ location : 'Germany',
28
+ name : 'Tobias Uhlig',
29
+ picture : 'tobiu.png',
30
+ profileGitHub : 'https://github.com/tobiu',
31
+ profileLinkedIn: 'https://www.linkedin.com/in/tobiasuhlig/',
32
+ profileX : 'https://x.com/UhligTobias',
33
+ teamRole : 'Co-Founder & Core Team Member'
34
+ }, {
35
+ module : MemberContainer,
36
+ location : 'Germany',
37
+ name : 'Torsten Dinkheller',
38
+ picture : 'torsten.png',
39
+ profileGitHub : 'https://github.com/Dinkh',
40
+ profileLinkedIn: 'https://www.linkedin.com/in/dinkheller/',
41
+ teamRole : 'Co-Founder & Core Team Member'
42
+ }],
43
+ /**
44
+ * @member {Object} layout={ntype:'vbox',align:'start'}
45
+ */
46
+ layout: {ntype: 'vbox', align: 'start'}
47
+ }
48
+ }
49
+
50
+ Neo.setupClass(Container);
51
+
52
+ export default Container;
@@ -0,0 +1,191 @@
1
+ import Container from '../../../../src/container/Base.mjs';
2
+ import Toolbar from '../../../../src/toolbar/Base.mjs';
3
+
4
+ /**
5
+ * @class Portal.view.about.MemberContainer
6
+ * @extends Neo.container.Base
7
+ */
8
+ class MemberContainer extends Container {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='Portal.view.about.MemberContainer'
12
+ * @protected
13
+ */
14
+ className: 'Portal.view.about.MemberContainer',
15
+ /**
16
+ * @member {String[]} cls=['portal-about-member-container']
17
+ */
18
+ cls: ['portal-about-member-container'],
19
+ /**
20
+ * @member {String|null} location_=null
21
+ */
22
+ location_: null,
23
+ /**
24
+ * @member {String|null} name_=null
25
+ */
26
+ name_: null,
27
+ /**
28
+ * @member {String|null} picture_=null
29
+ */
30
+ picture_: null,
31
+ /**
32
+ * @member {String|null} profileGitHub_=null
33
+ */
34
+ profileGitHub_: null,
35
+ /**
36
+ * @member {String|null} profileLinkedIn_=null
37
+ */
38
+ profileLinkedIn_: null,
39
+ /**
40
+ * @member {String|null} profileX_=null
41
+ */
42
+ profileX_: null,
43
+ /**
44
+ * @member {String|null} teamRole_=null
45
+ */
46
+ teamRole_: null,
47
+ /**
48
+ * @member {Object[]} items
49
+ */
50
+ items: [{
51
+ module : Toolbar,
52
+ cls : ['portal-profiles'],
53
+ itemDefaults: {ntype: 'button', ui: 'ghost'},
54
+
55
+ items: [{
56
+ iconCls: 'portal-profile fa-brands fa-github'
57
+ }, {
58
+ iconCls: 'portal-profile fa-brands fa-linkedin'
59
+ }, {
60
+ iconCls: 'portal-profile fa-brands fa-x-twitter'
61
+ }]
62
+ }, {
63
+ cls : ['portal-profile-component'],
64
+ vdom:
65
+ {cn: [
66
+ {tag: 'img', cls: ['portal-profile-picture']},
67
+ {cls: ['portal-profile-content'], cn: [
68
+ {tag: 'h2', cls: ['portal-profile-name']},
69
+ {cls: ['portal-profile-role']},
70
+ {cn: [
71
+ {tag: 'i', cls: ['portal-profile-location']},
72
+ {vtype: 'text'}
73
+ ]}
74
+ ]}
75
+ ]}
76
+ }]
77
+ }
78
+
79
+ /**
80
+ * Triggered after the location config got changed
81
+ * @param {String|null} value
82
+ * @param {String|null} oldValue
83
+ * @protected
84
+ */
85
+ afterSetLocation(value, oldValue) {
86
+ if (value) {
87
+ let item = this.items[1];
88
+
89
+ item.vdom.cn[1].cn[2].cn[1].html = value;
90
+ item.update?.()
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Triggered after the name config got changed
96
+ * @param {String|null} value
97
+ * @param {String|null} oldValue
98
+ * @protected
99
+ */
100
+ afterSetName(value, oldValue) {
101
+ if (value) {
102
+ let item = this.items[1];
103
+
104
+ item.vdom.cn[1].cn[0].html = value;
105
+ item.update?.()
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Triggered after the picture config got changed
111
+ * @param {String|null} value
112
+ * @param {String|null} oldValue
113
+ * @protected
114
+ */
115
+ afterSetPicture(value, oldValue) {
116
+ if (value) {
117
+ let item = this.items[1];
118
+
119
+ item.vdom.cn[0].src = '../../../resources/images/team/' + value;
120
+ item.update?.()
121
+ }
122
+ }
123
+
124
+ /**
125
+ * Triggered after the profileGitHub config got changed
126
+ * @param {String|null} value
127
+ * @param {String|null} oldValue
128
+ * @protected
129
+ */
130
+ afterSetProfileGitHub(value, oldValue) {
131
+ this.updateProfileButton(this.items[0].items[0], value)
132
+ }
133
+
134
+ /**
135
+ * Triggered after the profileLinkedIn config got changed
136
+ * @param {String|null} value
137
+ * @param {String|null} oldValue
138
+ * @protected
139
+ */
140
+ afterSetProfileLinkedIn(value, oldValue) {
141
+ this.updateProfileButton(this.items[0].items[1], value)
142
+ }
143
+
144
+ /**
145
+ * Triggered after the profileX config got changed
146
+ * @param {String|null} value
147
+ * @param {String|null} oldValue
148
+ * @protected
149
+ */
150
+ afterSetProfileX(value, oldValue) {
151
+ this.updateProfileButton(this.items[0].items[2], value)
152
+ }
153
+
154
+ /**
155
+ * Triggered after the teamRole config got changed
156
+ * @param {String|null} value
157
+ * @param {String|null} oldValue
158
+ * @protected
159
+ */
160
+ afterSetTeamRole(value, oldValue) {
161
+ if (value) {
162
+ let item = this.items[1];
163
+
164
+ item.vdom.cn[1].cn[1].html = value;
165
+ item.update?.()
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Depending on the lifecycle, we will either pass a button instance or a config object
171
+ * @param {Neo.button.Base|Object} button
172
+ * @param {String|null} url
173
+ * @protected
174
+ */
175
+ updateProfileButton(button, url) {
176
+ if (button.set) {
177
+ button.set({
178
+ hidden: !url,
179
+ url
180
+ })
181
+ } else {
182
+ // initial values
183
+ button.hidden = !url;
184
+ button.url = url;
185
+ }
186
+ }
187
+ }
188
+
189
+ Neo.setupClass(MemberContainer);
190
+
191
+ export default MemberContainer;
@@ -36,7 +36,20 @@ class Container extends BaseContainer {
36
36
  }, {
37
37
  module : List,
38
38
  flex : 1,
39
- reference: 'blog-list'
39
+ reference: 'blog-list',
40
+ /**
41
+ * @member {Object[]} domListeners
42
+ */
43
+ domListeners: [{
44
+ scroll(event) {
45
+ const isHomeContainer = event.target.cls.includes('portal-blog-list'),
46
+ beyondEighty = event.scrollTop > 80;
47
+
48
+ if (isHomeContainer) {
49
+ this.toggleCls('hide-sidebar', beyondEighty);
50
+ }
51
+ }
52
+ }]
40
53
  }],
41
54
  /**
42
55
  * @member {Object} layout={ntype:'vbox',align:'stretch'}
@@ -28,10 +28,16 @@ class MainContainer extends Container {
28
28
  */
29
29
  domListeners: [{
30
30
  intersect(data) {
31
+ this.activePartsId = data.targetId;
31
32
  Neo.getComponent(data.targetId)?.activate?.()
32
33
  },
33
34
  scroll(event) {
34
- this.toggleCls('hide-sidebar', event.scrollTop > 80)
35
+ const isHomeContainer = event.target.cls.includes('portal-home-maincontainer'),
36
+ beyondEighty = event.scrollTop > 80;
37
+
38
+ if (isHomeContainer) {
39
+ this.toggleCls('hide-sidebar', beyondEighty);
40
+ }
35
41
  }
36
42
  }],
37
43
  /**
@@ -53,6 +59,12 @@ class MainContainer extends Container {
53
59
  scrollable: true
54
60
  }
55
61
 
62
+ /**
63
+ * Internal flag containing the id of the currently visible parts item
64
+ * @member {String|null} activePartsId=null
65
+ */
66
+ activePartsId = null
67
+
56
68
  /**
57
69
  * Triggered after the mounted config got changed
58
70
  * @param {Boolean} value
@@ -65,7 +77,7 @@ class MainContainer extends Container {
65
77
  let me = this,
66
78
  {id, windowId} = me;
67
79
 
68
- value && setTimeout(() => {
80
+ value && me.timeout(50).then(() => {
69
81
  Neo.main.addon.IntersectionObserver.register({
70
82
  callback : 'isVisible',
71
83
  id,
@@ -74,7 +86,7 @@ class MainContainer extends Container {
74
86
  threshold: 1.0,
75
87
  windowId
76
88
  })
77
- }, 50)
89
+ })
78
90
  }
79
91
  }
80
92
 
@@ -28,18 +28,22 @@ class AfterMath extends BaseContainer {
28
28
  }, {
29
29
  cls : ['neo-h1'],
30
30
  flex: 'none',
31
- html: 'Additional Stuff',
31
+ html: 'Next Steps',
32
32
  tag : 'h1'
33
- }, {
34
- cls : ['neo-h2'],
35
- flex: 'none',
36
- html: 'More to come here',
37
- tag : 'h2'
38
33
  }, {
39
34
  cls : ['neo-content'],
40
35
  flex: 'none',
41
- html: 'Lorem Ipsum',
42
- tag : 'p'
36
+ html: `
37
+ <p>
38
+ To learn more about Neo.mjs please read <a href="#/learn">the Learning Section</a> or browse <a href="#/blog">the blog</a>.
39
+ </p>
40
+ <p>
41
+ To arrange a demo or to talk to an engineer email <a href="mailto:info@neomjs.com">info@neomjs.com</a>.
42
+ <br>For help starting a project email <a href="mailto:services@neomjs.com">services@neomjs.com</a>.
43
+ <br>For questions about private training email <a href="mailto:training@neomjs.com">training@neomjs.com</a>.
44
+ </p>
45
+ `,
46
+ tag : 'div'
43
47
  }, {
44
48
  flex: 1
45
49
  }, {
@@ -89,8 +89,14 @@ class Colors extends BaseContainer {
89
89
  *
90
90
  */
91
91
  async activate() {
92
- await this.timeout(1000);
93
- this.getReference('live-preview').activeView = 'preview'
92
+ let me = this,
93
+ {parent} = me;
94
+
95
+ await me.timeout(1000);
96
+
97
+ if (parent.activePartsId === me.id && parent.mounted) {
98
+ me.getReference('live-preview').activeView = 'preview'
99
+ }
94
100
  }
95
101
  }
96
102