neo.mjs 6.9.9 → 6.9.11

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 (242) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/learnneo/neo-config.json +5 -1
  3. package/apps/learnneo/store/Content.mjs +1 -1
  4. package/apps/learnneo/view/Viewport.mjs +12 -1
  5. package/apps/learnneo/view/home/ContentTreeList.mjs +53 -34
  6. package/apps/learnneo/view/home/ContentView.mjs +60 -0
  7. package/apps/learnneo/view/home/MainContainer.mjs +36 -9
  8. package/apps/learnneo/view/home/MainContainerController.mjs +57 -18
  9. package/apps/newwebsite/app.mjs +6 -0
  10. package/apps/newwebsite/index.html +10 -0
  11. package/apps/newwebsite/neo-config.json +7 -0
  12. package/apps/newwebsite/view/MainContainer.mjs +59 -0
  13. package/buildScripts/webpack/json/myApps.template.json +1 -0
  14. package/examples/ConfigurationViewport.mjs +12 -9
  15. package/examples/ServiceWorker.mjs +2 -2
  16. package/examples/button/base/neo-config.json +1 -2
  17. package/examples/form/field/textarea/MainContainer.mjs +1 -1
  18. package/package.json +2 -2
  19. package/resources/data/{learnneo → deck/learnneo}/p/2023-10-01T18-29-19-158Z.md +3 -6
  20. package/resources/data/deck/learnneo/p/stylesheet.md +40 -0
  21. package/resources/data/{learnneo → deck/learnneo}/t.json +19 -2
  22. package/resources/data/deck/training/p/2022-12-27T21-54-52-300Z.md +11 -0
  23. package/resources/data/deck/training/p/2022-12-27T21-55-23-144Z.md +43 -0
  24. package/resources/data/deck/training/p/2022-12-27T21-55-30-948Z.md +1 -0
  25. package/resources/data/deck/training/p/2022-12-27T21-55-43-542Z.md +84 -0
  26. package/resources/data/deck/training/p/2022-12-27T22-23-55-083Z.md +1 -0
  27. package/resources/data/deck/training/p/2022-12-27T22-24-07-886Z.md +8 -0
  28. package/resources/data/deck/training/p/2022-12-27T22-24-52-295Z.md +8 -0
  29. package/resources/data/deck/training/p/2022-12-27T22-25-03-853Z.md +5 -0
  30. package/resources/data/deck/training/p/2022-12-27T22-43-58-924Z.md +10 -0
  31. package/resources/data/deck/training/p/2022-12-27T22-44-28-881Z.md +3 -0
  32. package/resources/data/deck/training/p/2022-12-27T22-44-41-791Z.md +4 -0
  33. package/resources/data/deck/training/p/2022-12-27T22-45-21-032Z.md +7 -0
  34. package/resources/data/deck/training/p/2022-12-27T22-49-22-078Z.md +4 -0
  35. package/resources/data/deck/training/p/2022-12-27T22-50-20-626Z.md +4 -0
  36. package/resources/data/deck/training/p/2022-12-28T16-58-47-786Z.md +0 -0
  37. package/resources/data/deck/training/p/2022-12-28T16-58-55-192Z.md +9 -0
  38. package/resources/data/deck/training/p/2022-12-28T17-10-18-058Z.md +15 -0
  39. package/resources/data/deck/training/p/2022-12-28T17-10-42-296Z.md +40 -0
  40. package/resources/data/deck/training/p/2022-12-28T17-11-34-653Z.md +41 -0
  41. package/resources/data/deck/training/p/2022-12-28T17-13-09-994Z.md +0 -0
  42. package/resources/data/deck/training/p/2022-12-28T21-32-14-420Z.md +0 -0
  43. package/resources/data/deck/training/p/2022-12-29T01-43-32-431Z.md +7 -0
  44. package/resources/data/deck/training/p/2022-12-29T15-56-54-485Z.md +7 -0
  45. package/resources/data/deck/training/p/2022-12-29T15-57-11-499Z.md +7 -0
  46. package/resources/data/deck/training/p/2022-12-29T16-00-13-223Z.md +7 -0
  47. package/resources/data/deck/training/p/2022-12-29T18-34-25-826Z.md +4 -0
  48. package/resources/data/deck/training/p/2022-12-29T18-36-08-226Z.md +106 -0
  49. package/resources/data/deck/training/p/2022-12-29T18-36-56-893Z.md +112 -0
  50. package/resources/data/deck/training/p/2022-12-29T19-31-30-507Z.md +31 -0
  51. package/resources/data/deck/training/p/2022-12-29T19-31-55-091Z.md +14 -0
  52. package/resources/data/deck/training/p/2022-12-29T20-03-42-628Z.md +9 -0
  53. package/resources/data/deck/training/p/2022-12-29T20-21-20-669Z.md +7 -0
  54. package/resources/data/deck/training/p/2022-12-29T20-37-08-919Z.md +46 -0
  55. package/resources/data/deck/training/p/2022-12-29T20-37-20-344Z.md +43 -0
  56. package/resources/data/deck/training/p/2022-12-30T19-04-30-990Z.md +8 -0
  57. package/resources/data/deck/training/p/2022-12-31T18-43-56-338Z.md +7 -0
  58. package/resources/data/deck/training/p/2022-12-31T18-51-50-682Z.md +1 -0
  59. package/resources/data/deck/training/p/2022-12-31T18-54-04-176Z.md +4 -0
  60. package/resources/data/deck/training/p/2022-12-31T22-11-55-555Z.md +112 -0
  61. package/resources/data/deck/training/p/2022-12-31T23-00-41-222Z.md +6 -0
  62. package/resources/data/deck/training/p/2022-12-31T23-18-55-655Z.md +69 -0
  63. package/resources/data/deck/training/p/2022-12-31T23-25-40-735Z.md +21 -0
  64. package/resources/data/deck/training/p/2022-12-31T23-25-51-014Z.md +7 -0
  65. package/resources/data/deck/training/p/2023-01-01T17-49-18-429Z.md +3 -0
  66. package/resources/data/deck/training/p/2023-01-01T18-44-07-034Z.md +34 -0
  67. package/resources/data/deck/training/p/2023-01-01T18-47-39-766Z.md +15 -0
  68. package/resources/data/deck/training/p/2023-01-01T19-04-22-830Z.md +4 -0
  69. package/resources/data/deck/training/p/2023-01-01T21-11-58-025Z.md +25 -0
  70. package/resources/data/deck/training/p/2023-01-01T21-12-37-340Z.md +23 -0
  71. package/resources/data/deck/training/p/2023-01-01T21-13-13-880Z.md +8 -0
  72. package/resources/data/deck/training/p/2023-01-01T21-14-45-740Z.md +98 -0
  73. package/resources/data/deck/training/p/2023-01-01T21-18-23-886Z.md +26 -0
  74. package/resources/data/deck/training/p/2023-01-01T21-18-31-316Z.md +19 -0
  75. package/resources/data/deck/training/p/2023-01-01T21-18-42-290Z.md +23 -0
  76. package/resources/data/deck/training/p/2023-01-01T21-19-57-020Z.md +24 -0
  77. package/resources/data/deck/training/p/2023-01-01T21-22-31-184Z.md +13 -0
  78. package/resources/data/deck/training/p/2023-01-01T21-22-38-317Z.md +17 -0
  79. package/resources/data/deck/training/p/2023-01-01T21-22-47-693Z.md +20 -0
  80. package/resources/data/deck/training/p/2023-01-01T21-23-17-716Z.md +39 -0
  81. package/resources/data/deck/training/p/2023-01-01T21-23-28-532Z.md +22 -0
  82. package/resources/data/deck/training/p/2023-01-01T21-25-23-899Z.md +3 -0
  83. package/resources/data/deck/training/p/2023-01-01T21-25-59-742Z.md +1 -0
  84. package/resources/data/deck/training/p/2023-01-01T21-26-53-748Z.md +12 -0
  85. package/resources/data/deck/training/p/2023-01-01T23-38-42-863Z.md +2 -0
  86. package/resources/data/deck/training/p/2023-01-03T02-07-19-014Z.md +143 -0
  87. package/resources/data/deck/training/p/2023-01-04T01-52-23-454Z.md +76 -0
  88. package/resources/data/deck/training/p/2023-01-06T23-21-12-009Z.md +127 -0
  89. package/resources/data/deck/training/p/2023-01-06T23-21-31-685Z.md +81 -0
  90. package/resources/data/deck/training/p/2023-01-06T23-21-59-596Z.md +36 -0
  91. package/resources/data/deck/training/p/2023-01-06T23-34-13-897Z.md +87 -0
  92. package/resources/data/deck/training/p/2023-01-06T23-44-02-340Z.md +0 -0
  93. package/resources/data/deck/training/p/2023-01-06T23-46-36-687Z.md +1 -0
  94. package/resources/data/deck/training/p/2023-01-06T23-46-45-783Z.md +33 -0
  95. package/resources/data/deck/training/p/2023-01-08T00-45-11-144Z.md +50 -0
  96. package/resources/data/deck/training/p/2023-01-08T01-06-31-267Z.md +41 -0
  97. package/resources/data/deck/training/p/2023-01-08T01-24-21-088Z.md +95 -0
  98. package/resources/data/deck/training/p/2023-01-08T01-25-12-557Z.md +11 -0
  99. package/resources/data/deck/training/p/2023-01-08T01-46-50-723Z.md +25 -0
  100. package/resources/data/deck/training/p/2023-01-08T02-09-07-802Z.md +18 -0
  101. package/resources/data/deck/training/p/2023-01-08T02-09-19-678Z.md +66 -0
  102. package/resources/data/deck/training/p/2023-01-08T02-11-26-333Z.md +29 -0
  103. package/resources/data/deck/training/p/2023-01-08T17-22-48-841Z.md +14 -0
  104. package/resources/data/deck/training/p/2023-01-08T20-46-11-806Z.md +5 -0
  105. package/resources/data/deck/training/p/2023-01-08T20-47-23-682Z.md +5 -0
  106. package/resources/data/deck/training/p/2023-01-08T20-47-32-064Z.md +13 -0
  107. package/resources/data/deck/training/p/2023-01-08T20-47-57-045Z.md +0 -0
  108. package/resources/data/deck/training/p/2023-01-08T20-48-03-791Z.md +18 -0
  109. package/resources/data/deck/training/p/2023-01-08T20-48-32-466Z.md +9 -0
  110. package/resources/data/deck/training/p/2023-01-08T20-48-51-322Z.md +20 -0
  111. package/resources/data/deck/training/p/2023-01-08T20-49-52-741Z.md +0 -0
  112. package/resources/data/deck/training/p/2023-01-08T20-52-03-556Z.md +0 -0
  113. package/resources/data/deck/training/p/2023-01-08T20-57-36-333Z.md +2 -0
  114. package/resources/data/deck/training/p/2023-01-08T20-57-51-136Z.md +5 -0
  115. package/resources/data/deck/training/p/2023-01-09T00-07-37-951Z.md +0 -0
  116. package/resources/data/deck/training/p/2023-01-09T00-35-40-671Z.md +3 -0
  117. package/resources/data/deck/training/p/2023-01-10T01-29-38-148Z.md +10 -0
  118. package/resources/data/deck/training/p/2023-01-10T01-43-12-166Z.md +31 -0
  119. package/resources/data/deck/training/p/2023-01-10T02-21-54-303Z.md +10 -0
  120. package/resources/data/deck/training/p/2023-01-12T01-50-54-617Z.md +74 -0
  121. package/resources/data/deck/training/p/2023-01-13T19-55-24-735Z.md +14 -0
  122. package/resources/data/deck/training/p/2023-01-13T20-08-27-068Z.md +28 -0
  123. package/resources/data/deck/training/p/2023-01-13T20-23-38-411Z.md +25 -0
  124. package/resources/data/deck/training/p/2023-01-13T20-37-06-267Z.md +13 -0
  125. package/resources/data/deck/training/p/2023-01-13T21-05-57-708Z.md +8 -0
  126. package/resources/data/deck/training/p/2023-01-13T21-48-17-258Z.md +20 -0
  127. package/resources/data/deck/training/p/2023-01-13T22-05-05-799Z.md +14 -0
  128. package/resources/data/deck/training/p/2023-01-13T22-08-30-863Z.md +17 -0
  129. package/resources/data/deck/training/p/2023-01-13T23-01-50-449Z.md +4 -0
  130. package/resources/data/deck/training/p/2023-01-14T00-33-05-958Z.md +62 -0
  131. package/resources/data/deck/training/p/2023-01-14T00-40-27-784Z.md +229 -0
  132. package/resources/data/deck/training/p/2023-01-14T00-41-59-081Z.md +153 -0
  133. package/resources/data/deck/training/p/2023-01-14T13-50-28-199Z.md +19 -0
  134. package/resources/data/deck/training/p/2023-01-14T13-59-20-275Z.md +6 -0
  135. package/resources/data/deck/training/p/2023-01-14T14-03-29-456Z.md +3 -0
  136. package/resources/data/deck/training/p/2023-01-14T14-27-57-678Z.md +7 -0
  137. package/resources/data/deck/training/p/2023-01-14T17-30-18-228Z.md +33 -0
  138. package/resources/data/deck/training/p/2023-01-14T18-28-39-316Z.md +1 -0
  139. package/resources/data/deck/training/p/2023-01-14T18-28-44-115Z.md +4 -0
  140. package/resources/data/deck/training/p/2023-01-14T18-28-49-548Z.md +18 -0
  141. package/resources/data/deck/training/p/2023-01-14T18-40-13-758Z.md +10 -0
  142. package/resources/data/deck/training/p/2023-01-14T19-29-15-291Z.md +12 -0
  143. package/resources/data/deck/training/p/2023-01-15T18-51-52-134Z.md +83 -0
  144. package/resources/data/deck/training/p/2023-01-15T20-03-30-073Z.md +11 -0
  145. package/resources/data/deck/training/p/2023-01-15T22-07-52-073Z.md +16 -0
  146. package/resources/data/deck/training/p/2023-01-15T22-22-13-517Z.md +12 -0
  147. package/resources/data/deck/training/p/2023-01-15T22-28-57-508Z.md +131 -0
  148. package/resources/data/deck/training/p/2023-01-15T22-36-30-913Z.md +115 -0
  149. package/resources/data/deck/training/p/2023-01-16T16-03-40-770Z.md +12 -0
  150. package/resources/data/deck/training/p/2023-01-16T20-21-56-859Z.md +5 -0
  151. package/resources/data/deck/training/p/2023-01-16T20-24-09-690Z.md +24 -0
  152. package/resources/data/deck/training/p/2023-01-20T12-51-22-646Z.md +21 -0
  153. package/resources/data/deck/training/p/2023-01-20T13-06-46-614Z.md +9 -0
  154. package/resources/data/deck/training/p/2023-01-20T13-08-51-600Z.md +7 -0
  155. package/resources/data/deck/training/p/2023-01-20T15-20-13-363Z.md +26 -0
  156. package/resources/data/deck/training/p/2023-01-20T15-34-58-813Z.md +75 -0
  157. package/resources/data/deck/training/p/2023-01-21T16-33-20-458Z.md +33 -0
  158. package/resources/data/deck/training/p/2023-01-21T16-45-28-263Z.md +28 -0
  159. package/resources/data/deck/training/p/2023-01-21T16-56-25-452Z.md +3 -0
  160. package/resources/data/deck/training/p/2023-01-21T17-28-31-493Z.md +6 -0
  161. package/resources/data/deck/training/p/2023-01-21T19-49-51-918Z.md +13 -0
  162. package/resources/data/deck/training/p/2023-01-21T20-08-24-452Z.md +15 -0
  163. package/resources/data/deck/training/p/2023-01-21T20-35-54-947Z.md +20 -0
  164. package/resources/data/deck/training/p/2023-01-21T20-54-47-603Z.md +39 -0
  165. package/resources/data/deck/training/p/2023-01-21T20-56-28-184Z.md +25 -0
  166. package/resources/data/deck/training/p/2023-01-21T20-57-32-927Z.md +4 -0
  167. package/resources/data/deck/training/p/2023-01-21T23-13-33-394Z.md +6 -0
  168. package/resources/data/deck/training/p/2023-01-28T19-11-37-464Z.md +24 -0
  169. package/resources/data/deck/training/p/2023-01-28T20-43-41-188Z.md +9 -0
  170. package/resources/data/deck/training/p/2023-01-28T20-53-56-476Z.md +8 -0
  171. package/resources/data/deck/training/p/2023-01-28T20-58-43-776Z.md +10 -0
  172. package/resources/data/deck/training/p/2023-01-28T22-18-41-259Z.md +33 -0
  173. package/resources/data/deck/training/p/2023-01-28T22-24-34-808Z.md +24 -0
  174. package/resources/data/deck/training/p/2023-01-29T16-25-24-528Z.md +44 -0
  175. package/resources/data/deck/training/p/2023-01-29T21-14-32-588Z.md +12 -0
  176. package/resources/data/deck/training/p/2023-01-31T19-24-53-504Z.md +8 -0
  177. package/resources/data/deck/training/p/2023-01-31T20-33-55-855Z.md +11 -0
  178. package/resources/data/deck/training/p/2023-01-31T20-34-30-261Z.md +7 -0
  179. package/resources/data/deck/training/p/2023-01-31T20-52-53-367Z.md +43 -0
  180. package/resources/data/deck/training/p/2023-02-04T15-18-35-682Z.md +20 -0
  181. package/resources/data/deck/training/p/2023-02-04T15-49-47-597Z.md +14 -0
  182. package/resources/data/deck/training/p/2023-02-04T18-58-57-808Z.md +1 -0
  183. package/resources/data/deck/training/p/2023-02-04T20-07-11-288Z.md +1 -0
  184. package/resources/data/deck/training/p/2023-02-04T20-09-50-169Z.md +1 -0
  185. package/resources/data/deck/training/p/2023-02-04T20-19-42-740Z.md +8 -0
  186. package/resources/data/deck/training/p/2023-02-04T20-23-56-013Z.md +12 -0
  187. package/resources/data/deck/training/p/2023-02-04T20-28-12-391Z.md +20 -0
  188. package/resources/data/deck/training/p/2023-02-05T00-20-32-554Z.md +16 -0
  189. package/resources/data/deck/training/p/2023-02-05T00-35-56-282Z.md +13 -0
  190. package/resources/data/deck/training/p/2023-02-05T15-36-57-182Z.md +24 -0
  191. package/resources/data/deck/training/p/2023-02-05T17-39-51-712Z.md +70 -0
  192. package/resources/data/deck/training/p/2023-02-05T17-44-53-815Z.md +195 -0
  193. package/resources/data/deck/training/p/2023-02-05T17-45-40-114Z.md +92 -0
  194. package/resources/data/deck/training/p/2023-02-05T18-12-14-489Z.md +60 -0
  195. package/resources/data/deck/training/p/2023-02-06T00-14-54-457Z.md +9 -0
  196. package/resources/data/deck/training/p/2023-06-28T18-03-14-313Z.md +8 -0
  197. package/resources/data/deck/training/p/2023-06-28T18-26-17-290Z.md +7 -0
  198. package/resources/data/deck/training/p/2023-06-28T21-16-24-034Z.md +40 -0
  199. package/resources/data/deck/training/p/2023-06-28T21-16-34-972Z.md +16 -0
  200. package/resources/data/deck/training/p/2023-06-28T21-28-28-379Z.md +4 -0
  201. package/resources/data/deck/training/p/2023-06-29T23-15-10-411Z.md +5 -0
  202. package/resources/data/deck/training/p/2023-07-01T15-42-45-193Z.md +433 -0
  203. package/resources/data/deck/training/p/2023-07-01T21-54-31-329Z.md +6 -0
  204. package/resources/data/deck/training/p/2023-07-02T16-14-06-970Z.md +14 -0
  205. package/resources/data/deck/training/p/2023-07-31T00-26-03-842Z.md +4 -0
  206. package/resources/data/deck/training/p/2023-07-31T00-31-51-933Z.md +10 -0
  207. package/resources/data/deck/training/p/2023-07-31T00-37-21-927Z.md +205 -0
  208. package/resources/data/deck/training/p/2023-10-01T18-29-19-158Z.md +76 -0
  209. package/resources/data/deck/training/p/2023-10-07T19-18-28-517Z.md +102 -0
  210. package/resources/data/deck/training/p/2023-10-08T20-20-07-934Z.md +75 -0
  211. package/resources/data/deck/training/p/2023-10-08T20-20-37-336Z.md +29 -0
  212. package/resources/data/deck/training/p/2023-10-08T20-37-30-658Z.md +0 -0
  213. package/resources/data/deck/training/p/2023-10-08T21-58-25-809Z.md +68 -0
  214. package/resources/data/deck/training/p/2023-10-08T22-22-11-013Z.md +0 -0
  215. package/resources/data/deck/training/p/2023-10-14T19-25-08-153Z.md +119 -0
  216. package/resources/data/deck/training/t.json +1 -0
  217. package/resources/scss/src/apps/learnneo/Viewport.scss +0 -106
  218. package/resources/scss/src/apps/learnneo/home/ContentTreeList.scss +37 -0
  219. package/resources/scss/src/apps/learnneo/home/ContentView.scss +55 -0
  220. package/resources/scss/src/form/field/FileUpload.scss +4 -4
  221. package/resources/scss/src/form/field/TextArea.scss +1 -1
  222. package/resources/scss/theme-neo-light/Global.scss +46 -0
  223. package/resources/scss/theme-neo-light/design-tokens/Core.scss +7 -0
  224. package/resources/scss/theme-neo-light/design-tokens/Semantic.scss +0 -0
  225. package/resources/scss/theme-neo-light/design-tokens/_all.scss +4 -0
  226. package/src/DefaultConfig.mjs +4 -4
  227. package/src/form/field/FileUpload.mjs +9 -2
  228. package/src/form/field/TextArea.mjs +19 -34
  229. package/src/main/DomAccess.mjs +34 -0
  230. package/test/components/files/form/field/Select.mjs +1 -1
  231. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-07T19-18-28-517Z.md +0 -0
  232. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-20-07-934Z.md +0 -0
  233. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-20-37-336Z.md +0 -0
  234. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-37-30-658Z.md +0 -0
  235. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T21-58-25-809Z.md +0 -0
  236. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T22-22-11-013Z.md +0 -0
  237. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-14T19-25-08-153Z.md +0 -0
  238. /package/resources/data/{learnneo → deck/learnneo}/pages/whyneo.md +0 -0
  239. /package/resources/data/{learnneo → deck/learnneo}/tree.json +0 -0
  240. /package/resources/{deck → data/deck}/whyneo.md +0 -0
  241. /package/resources/scss/src/apps/newwebsite/{MainContainer.css → MainContainer.scss} +0 -0
  242. /package/resources/scss/theme-neo-light/design-tokens/{Components.scss → Component.scss} +0 -0
@@ -0,0 +1,40 @@
1
+ ###Advice
2
+
3
+ Training content is different than self-study content.
4
+
5
+ <details>
6
+ <summary>Training material</summary>
7
+ Training material _augments_ the lecture. The audience should be focused on what the speaker is
8
+ saying; the slides support the lecture. An important concept in writing
9
+ training material is to avoid a _wall of words_, where there are lengthy
10
+ paragraphs. People will read what's in front of them. If you have a lecture slide
11
+ with a lot of text, your audience will be reading while you are lecturing,
12
+ and information is lost.
13
+ </details>
14
+
15
+ # This is an h1
16
+ ## This is an h2
17
+ ### This is an h3
18
+ #### This is an h4
19
+
20
+ <br>
21
+
22
+ &lt;code>Hi there&lt;/code>
23
+
24
+ <code>Hi there</code>
25
+
26
+ <br>
27
+
28
+ Use a &lt;details> tag for expandable bullet points, and for lab steps.
29
+ <pre>
30
+ &lt;details>
31
+ &lt;summary>This describes the item&lt;/summary>
32
+ This is the item contents.
33
+ &lt;/details>
34
+ </pre>
35
+
36
+ <details>
37
+ <summary>This describes the item</summary>
38
+ This is the item contents.
39
+ </details>
40
+
@@ -4,7 +4,7 @@
4
4
  "id": "2023-10-01T18-29-19-158Z",
5
5
  "parentId": null,
6
6
  "isLeaf": true,
7
- "name": "Why Neo.mjs?"
7
+ "name": "Why Neo.mjs? "
8
8
  },
9
9
  {
10
10
  "id": "2023-09-26T17-26-15-104Z",
@@ -124,7 +124,24 @@
124
124
  "id": "2023-10-16T19-38-29-590Z",
125
125
  "parentId": null,
126
126
  "isLeaf": false,
127
- "name": "Mixins"
127
+ "name": "Mixins "
128
+ },
129
+ {
130
+ "id": "2023-10-31T13-59-37-550Z",
131
+ "parentId": "2023-10-16T19-38-29-590Z",
132
+ "isLeaf": true,
133
+ "name": "New Node"
134
+ },
135
+ {
136
+ "id": "appendix",
137
+ "parentId": null,
138
+ "name": "Appendix"
139
+ },
140
+ {
141
+ "id": "stylesheet",
142
+ "parentId": "appendix",
143
+ "name": "Stylesheet",
144
+ "isLeaf": true
128
145
  }
129
146
  ]
130
147
  }
@@ -0,0 +1,11 @@
1
+ If you look at _package.json_ you'll see what scripts you can use.
2
+
3
+ To generate a new app run<br>
4
+ `npm run create-app`
5
+ <br>You typicically choose all defaults when prompted. We'll use `create-app` a few times
6
+ during this training, but in a work environment it's not used very often.
7
+
8
+ At the start of your coding session you'll probably run <br>
9
+ `npm run server-start`
10
+ <br>and as you write code and need new classes you might run <br>
11
+ `npm run create-class`.
@@ -0,0 +1,43 @@
1
+ Neo source files are JavaScript _modules_, using the `.msj` file extension.
2
+
3
+ JavaScript modules support `import`, `export` (to control which values are
4
+ available outside of the file).
5
+
6
+ <pre class="runnable text readonly">
7
+ import Component from '../../../node_modules/neo.mjs/src/component/Base.mjs';
8
+ import TabContainer from '../../../node_modules/neo.mjs/src/tab/Container.mjs';
9
+ import Viewport from '../../../node_modules/neo.mjs/src/container/Viewport.mjs';
10
+
11
+ class MainContainer extends Viewport {
12
+ static config = {
13
+ className: 'Starter.view.MainContainer',
14
+ ntype: 'main',
15
+ autoMount: true,
16
+ style: { padding: '20px' },
17
+ layout: { ntype: 'fit' },
18
+ items: [{
19
+ module: TabContainer,
20
+ itemDefaults: {
21
+ module: Component,
22
+ cls: ['neo-examples-tab-component'],
23
+ style: { padding: '20px' }
24
+ },
25
+ items: [{
26
+ tabButtonConfig: {
27
+ iconCls: 'fa fa-home',
28
+ text: 'Tab 1'
29
+ },
30
+ vdom: { innerHTML: 'Welcome to your new Neo App.' }
31
+ }, {
32
+ tabButtonConfig: {
33
+ iconCls: 'fa fa-play-circle',
34
+ text: 'Tab 2'
35
+ },
36
+ vdom: { innerHTML: 'Have fun creating something awesome!' }
37
+ }]
38
+ }]
39
+ }
40
+ }
41
+ Neo.applyClassConfig(MainContainer);
42
+ export default MainContainer;
43
+ </pre>
@@ -0,0 +1 @@
1
+ <img height="540" src="resources/images/FlowOfExecution.jpg"></img>
@@ -0,0 +1,84 @@
1
+ Change the starter app's main view to show a table.
2
+
3
+ <pre class="runnable javascript readonly">
4
+ import Table from "../../../node_modules/neo.mjs/src/table/Container.mjs";
5
+ import Viewport from "../../../node_modules/neo.mjs/src/container/Viewport.mjs";
6
+ import Store from "../../../node_modules/neo.mjs/src/data/Store.mjs";
7
+
8
+ class MainContainer extends Viewport {
9
+ static config = {
10
+ className: "Starter.view.MainContainer",
11
+ autoMount: true,
12
+ items: [{
13
+ module: Table,
14
+ flex: 1,
15
+ store: {
16
+ module: Store,
17
+ model: {
18
+ fields: [{
19
+ name: "humanReadableLocation",
20
+ }, {
21
+ name: "size",
22
+ ntype: "data-field-float",
23
+ }, {
24
+ name: "timestamp",
25
+ type: "Date",
26
+ }, {
27
+ name: "title",
28
+ calculate: (data, field, item) => item.humanReadableLocation,
29
+ }, {
30
+ name: "position",
31
+ calculate: (data, field, item) => ({
32
+ lat: item.latitude,
33
+ lng: item.longitude,
34
+ }),
35
+ },
36
+ ],
37
+ },
38
+ url: "https://apis.is/earthquake/is",
39
+ responseRoot: "results",
40
+ autoLoad: true,
41
+ },
42
+ columns: [{
43
+ dataField: "timestamp",
44
+ text: "Date",
45
+ renderer: (data) =>
46
+ data.value.toLocaleDateString(undefined, {
47
+ weekday: "long",
48
+ year: "numeric",
49
+ month: "long",
50
+ day: "numeric",
51
+ }),
52
+ }, {
53
+ dataField: "humanReadableLocation",
54
+ text: "Location",
55
+ }, {
56
+ dataField: "size",
57
+ text: "Magnitude",
58
+ align: "right",
59
+ width: 100,
60
+ renderer: (data) => data.value.toLocaleString(),
61
+ }],
62
+ }],
63
+ layout: {ntype: "fit"},
64
+ };
65
+
66
+ afterSetMounted(value, oldValue) {
67
+ super.afterSetMounted(value, oldValue);
68
+ if (!value) return;
69
+ this.addDomListeners({
70
+ "neo-debug-item-select": (event) => {
71
+ event.path.forEach((item) => {
72
+ const component = Neo.getComponent(item.id);
73
+ if (component) console.log(component);
74
+ });
75
+ },
76
+ });
77
+ }
78
+ }
79
+
80
+ Neo.applyClassConfig(MainContainer);
81
+
82
+ export default MainContainer;
83
+
84
+ </pre>
@@ -0,0 +1 @@
1
+ <img height="580" src="resources/images/intro/InitialTable.png"/>
@@ -0,0 +1,8 @@
1
+ As we discussed before, the app is
2
+ - Class-based
3
+ - Declarative
4
+
5
+ The app
6
+ - Calls a web service
7
+ - Populates a store
8
+ - Shows store data in a table
@@ -0,0 +1,8 @@
1
+ Let's review the code and see how it _describes_ what it's doing. Even if you
2
+ knew nothing about Neo you could deduce what the code is doing.
3
+
4
+ Note how the store defines the field types. This defines how values in the
5
+ feed are converted as the store's records are created.
6
+
7
+ And the table has column renderers which translate how the store values
8
+ are shown to the user.
@@ -0,0 +1,5 @@
1
+ And it's class based. That means we can use inherited
2
+ methods. And we extend classes from the framework, or
3
+ classes we define.
4
+
5
+ We'll explore this more when we refactor some configs into reusable classes.
@@ -0,0 +1,10 @@
1
+ Note that the way we've coded the app, the grid is _not_ reusable.
2
+
3
+ You can reuse any class config block by creating a new class that
4
+ extends the component's class. In other words, if you want to
5
+ reuse a table, you create a new class that extends `Neo.container.Table`
6
+ and uses the same config.
7
+
8
+ Besides reuse, other good reasons to put your components into their own classes
9
+ is make code more abstract, to isolate complexity, and to allow
10
+ those to be tested in isolation.
@@ -0,0 +1,3 @@
1
+ The store's model &mdash; which some people call the _record definition_ &mdash;
2
+ describes how values in the feed are translated into values in each record.
3
+
@@ -0,0 +1,4 @@
1
+ The `store` config specifies a URL, and a `model`.
2
+
3
+ The store also has `autoLoad:true`, which means upon creation the
4
+ store immediatesly calls its url.
@@ -0,0 +1,7 @@
1
+ Now that the table is its own class
2
+ - The main container code is cleaner
3
+ - The table is reusable
4
+
5
+ Since it's reusable, we can create a couple of instances in the main container.
6
+ To do that, just copy and paste the table's config, give both `flex:1`, and
7
+ change the parent container's layout to `vbox`.
@@ -0,0 +1,4 @@
1
+ Neo has a feature that allows _shared, bindable, data_.
2
+
3
+ A `Neo.model.Component` instance holds properties that can be values like
4
+ strings, numbers, or even references, like component or store references.
@@ -0,0 +1,4 @@
1
+ A component model can have two sections: `data` and `stores`.
2
+
3
+ <a href="http://localhost:8080/examples/model/twoway/" target="example">http://localhost:8080/examples/model/twoway/</a>
4
+
@@ -0,0 +1,9 @@
1
+ As we discussed before, any time you configure a class via a config
2
+ you're free to create a class encapsulating the config properties.
3
+
4
+ In other words, any time you have an `ntype` or `module` block,
5
+ you're free to create a new class that extends that type, and
6
+ move the config to the new class `static getConfig` mehtod.
7
+
8
+ Trivial classes might be done inline. Or to keep the view cleaner,
9
+ and more declarative, use a separate view model class.
@@ -0,0 +1,15 @@
1
+ The property's setter is run as the view model property changes.
2
+ <pre class="runnable text readonly 200">
3
+ {
4
+ module: Label,
5
+ bind: {
6
+ // Neo.component.Label.mjs has a text_ config.
7
+ // The value returned by the arrow function is assigned to label.text
8
+ text: data => \`The value of foo is "${data.foo || ''}"\`
9
+ }
10
+ }
11
+ </pre>
12
+
13
+ See <a href="http://localhost:8080/ex/model/oneway/" target="example">
14
+ examples/model/oneway/MainContainer.mjs
15
+ </a>
@@ -0,0 +1,40 @@
1
+ Bindings are all about _setters_ &mdash; if the class has a `set` function you can bind to it.
2
+
3
+ <div type="expander" caption="Your own setter">
4
+ <pre>
5
+ static getConfig() {
6
+ return {
7
+ // configs...
8
+ }
9
+ }
10
+ set foo(value) {
11
+ this.text = value;
12
+ }
13
+ </div>
14
+
15
+ <div type="expander" caption="A configured setter">
16
+ <pre>
17
+ static getConfig() {
18
+ return {
19
+ // configs...
20
+ bar_: null
21
+ }
22
+ }
23
+ afterSetBar(value) {
24
+ this.text = value;
25
+ }
26
+ </div>
27
+
28
+ <div type="expander" caption="Conclusion">
29
+ <p>
30
+ You wouldn't normally use a <code>set</code> function because creating a config
31
+ property is so easy, and it comes
32
+ with the auto-generated _beforeSet_, _afterSet_, and _beforeGet_ methods.
33
+ </p>
34
+ </div>
35
+
36
+
37
+ See <a href="http://localhost:8080/examples/model/setterversusconfig"
38
+ target="example">examples/model/setterversusconfig/MainContainer.mjs</a>
39
+
40
+
@@ -0,0 +1,41 @@
1
+ #Introduction
2
+
3
+ In this lab you'll have code the tab container which will hold the
4
+ map, table, and thumbails.
5
+
6
+ #Steps
7
+
8
+ ??Create `businesses/Tabs`
9
+
10
+ Create a new class named `Yelp.view.businesses.Tabs` that extends `tab/container`.
11
+
12
+ Give it the `ntype:'yelp-businesses-tabs',`.
13
+
14
+ It needs *two* tabs, with the tab button text set to 'Map' and 'Table'.
15
+
16
+ Remember that a tab is configured with the `tabButtonConfig`, and you'll use the
17
+ `html` config as a placeholder to indicate that a map and a table will eventually
18
+ be used. The generated class already has two tabs.
19
+
20
+ The first tab shoudl end up looking like this.
21
+
22
+ {
23
+ ntype: 'component',
24
+ html: 'The map goes here',
25
+ tabButtonConfig: {
26
+ text: 'Map'
27
+ },
28
+ }
29
+
30
+
31
+
32
+ ??Use the new class
33
+
34
+ Edit the main view. Import the new tabs class, and replace the item in the
35
+ `items:[]` to use the new class.
36
+
37
+ Save, refresh, and verify that everything is working.
38
+
39
+ ??Use a map as the first tab item
40
+
41
+ Now replace the tab's first item with a config for a Google map. You'll need
@@ -0,0 +1,7 @@
1
+ The previous example illustrates _one-way_ binding.
2
+
3
+ When the component model's property changes, the binding wakes up and the
4
+ arrow function is evaluated.
5
+
6
+ We can see that in action by looking at the view's component model and
7
+ updating the value &mdash; when that happens the bindings fire.
@@ -0,0 +1,7 @@
1
+ Neo launches three Web Workers:
2
+
3
+ - neomjs-app-worker
4
+ - neomjs-data-worker
5
+ - neomjs-vdom-worker
6
+
7
+ <small>You can configure Neo to launch additional workers, such as a shared app worker.</small>
@@ -0,0 +1,7 @@
1
+ A basic debugging (and coding!) task is getting a referernce to a component.
2
+ You can then see the component's state and run its methods.
3
+
4
+ There are a few ways to get a component reference.
5
+ - `Neo.manager.Component.items` <tt>// Returns [Component]</tt>
6
+ - `Neo.find({property:'value'})` <tt>// Returns [{}] of instances<t/t>
7
+ - `Neo.findFirst({property:'value'})` <tt>// Returns first instance</tt>
@@ -0,0 +1,7 @@
1
+ Let's do a little code inspection using
2
+ - `Neo.manager.Component.items`, or
3
+ - `Neo.find({'ntype':'tab-header-button'})`
4
+
5
+ Look in the API docs to find the `ntype`.
6
+
7
+ <img height="300" src="resources/images/intro/FindingNtype.png"/>
@@ -0,0 +1,4 @@
1
+ As a developer, your work is done in _neomjs-app-worker_. When you're debugging,
2
+ choose that worker in the DevTools JavaScript context dropdown.
3
+
4
+ <img height="400" src="resources/images/DevToolsJavaScriptContext.png">
@@ -0,0 +1,106 @@
1
+ #Introduction
2
+
3
+ In this lab you'll install the bookmarklet, and practice getting component references,
4
+ changing properties, and runing methods.
5
+
6
+ #Steps
7
+
8
+ ?? Try `Neo.manager.Component.items`
9
+
10
+ Run the starter app.
11
+
12
+ In Chrome DevTools | Console, switch to the `neomjs-app-worker` context and
13
+ on the console type `Neo.manager.Component.items`
14
+
15
+ Expand the array and look for one of the tab buttons. The buttons will have
16
+ ids set to something like `neo-tab-header-button-1`. Expand the item and scroll
17
+ down to the `text: (...)` property.
18
+
19
+ Click on the ellipses and enter a new string value. Once you hit Enter or lose
20
+ focus you should see the tab reflect the change.
21
+
22
+ Open `apps/starter/view/MainContainer.mjs` and inspect the code.
23
+
24
+ ?? Try `Neo.findFirst()`
25
+
26
+ Get a reference to to the tab container via this statement:
27
+
28
+ tabContainer = Neo.findFirst('ntype', 'tab-container');
29
+
30
+ Note that the statement assigns the reference to a variable. That'll make it easier
31
+ to inspect it, and run methods on it.
32
+
33
+ Now add a new tab:
34
+
35
+ tabContainer.add({
36
+ tabButtonConfig: {
37
+ iconCls: 'fa fa-home',
38
+ text: 'Hi there!'
39
+ },
40
+ vdom: { innerHTML: 'Yet another tab.' }
41
+ })
42
+
43
+ ??Enable the Ctrl-right-click debugger
44
+
45
+ Edit the starter's `index.html` and use this code.
46
+ <pre class="runnable html">
47
+ &lt;!DOCTYPE HTML>
48
+ &lt;html>
49
+ &lt;head>
50
+ &lt;meta name="viewport" content="width=device-width, initial-scale=1">
51
+ &lt;meta charset="UTF-8">
52
+ &lt;title>Starter&lt;/title>
53
+ &lt;/head>
54
+ &lt;body>
55
+ &lt;script src="../../src/MicroLoader.mjs" type="module">&lt;/script>
56
+ &lt;script>
57
+ new MutationObserver((mutationsList, observer) => {
58
+ for (let mutation of mutationsList) {
59
+ for (let addedNode of mutation.addedNodes) {
60
+ if (addedNode.className && addedNode.className.includes('neo-viewport')) {
61
+ addedNode.addEventListener("contextmenu", function (e) {
62
+ if (!(e.ctrlKey || e.metaKey)) return;
63
+ e.stopPropagation();
64
+ e.preventDefault();
65
+ const event = new Event('neo-debug-item-select', {bubbles: true});
66
+ e.target.dispatchEvent(event);
67
+ });
68
+ observer.disconnect(); // We found the viewport so we're finished listening
69
+ }
70
+ }
71
+ }
72
+ }).observe(document.body, {childList: true, subtree: false});
73
+ &lt;/script>
74
+ &lt;/body>
75
+ &lt;/html>
76
+ </pre>
77
+
78
+ Now edit `MainController.mjs` and add the method to detect the event and log the components.
79
+ This is a _method_, so place it within the class definition.
80
+
81
+ <pre class="runnable html 230">
82
+ afterSetMounted(value, oldValue) {
83
+ super.afterSetMounted(value, oldValue);
84
+ if (!value) return;
85
+ this.addDomListeners({
86
+ "neo-debug-item-select": event => {
87
+ event.path.forEach(item => {
88
+ const component = Neo.getComponent(item.id);
89
+ if (component) console.log(component);
90
+ });
91
+ }
92
+ });
93
+ }
94
+ </pre>
95
+
96
+
97
+ ??Change the text in one of the tab buttons
98
+
99
+ Refresh the app so the new main view method is in effect, then _Ctrl-right-click_
100
+ on one of the tab buttons. It should be logged to the console. Drill-down to the `text` property
101
+ and change the value.
102
+
103
+ Clear the console and do another _Ctrl-right-click_, then right-click on the button component logged in
104
+ the console and choose _Store object as global variable_. It'll use a value like _temp1_.
105
+
106
+ Rather than drilling-down, assign a new text value by entering `temp1.text = 'hi there'`.
@@ -0,0 +1,112 @@
1
+ #Introduction
2
+
3
+ In this lab, you'll generate a starter app and run it.
4
+
5
+ #Steps
6
+
7
+ ??Use the command-line to generate the app
8
+
9
+ Using a terminal window, navigate to the root of your Neo workspace.
10
+
11
+ If you use a code editor, just open the workspace, and open a terminal
12
+ window in the editor. If you ever forget the command-line options,
13
+ just open `package.json` to see the list of scripts.
14
+
15
+ From the workspace, run this command.
16
+
17
+ npm run create-app
18
+
19
+ Name the app _Starter_ and choose the default response for everything.
20
+
21
+ <img src="resources/images/intro/NpmRunCreateApp.png"/>
22
+
23
+ <pre>
24
+ </pre>
25
+
26
+ ??Inspect the application
27
+
28
+ Open `apps/starter/view/MainContainer.mjs` and inspect the code.
29
+
30
+ ??Run the app
31
+
32
+ The command to start the server is `npm run server-start`. This starts a server
33
+ on port 8080 and launches a browser window at the root of the workspace.
34
+
35
+ Click on the `apps` directory, then the `starter` directory, and you'll see the
36
+ running app.
37
+
38
+ ??Change the code and see the result
39
+
40
+ You can change the code any way you dare, but as a suggestion:
41
+ - Remove the `style`, `height`, and `width` configs for the tab container.
42
+ - Then add `style: { padding: '20px' },` to the main container.
43
+
44
+ You need to refresh the browser to see the result of code changes.
45
+
46
+ <pre style="font-size: 80%; color:#cacaca;">
47
+ import Component from '../../../node_modules/neo.mjs/src/component/Base.mjs';
48
+ import TabContainer from '../../../node_modules/neo.mjs/src/tab/Container.mjs';
49
+ import Viewport from '../../../node_modules/neo.mjs/src/container/Viewport.mjs';
50
+
51
+ /**
52
+ * @class june-starter.view.MainContainer
53
+ * @extends Neo.container.Viewport
54
+ */
55
+ class MainContainer extends Viewport {
56
+ static config = {
57
+ /**
58
+ * @member {String} className='june-starter.view.MainContainer'
59
+ * @protected
60
+ */
61
+ className: 'june-starter.view.MainContainer',
62
+ /**
63
+ * @member {Boolean} autoMount=true
64
+ */
65
+ autoMount: true,
66
+ <span style="color:red;">style: { padding: '20px' },</span>
67
+ /**
68
+ * @member {Object[]} items
69
+ */
70
+ items: [{
71
+ module: TabContainer,
72
+ <s style="color:red;">height: 300,</s>
73
+ <s style="color:red;">width : 500,</s>
74
+ <s style="color:red;">style : {flex: 'none', margin: '20px'},</s>
75
+
76
+ itemDefaults: {
77
+ module: Component,
78
+ cls : ['neo-examples-tab-component'],
79
+ style : {padding: '20px'},
80
+ },
81
+
82
+ items: [{
83
+ tabButtonConfig: {
84
+ iconCls: 'fa fa-home',
85
+ text: 'Tab 1'
86
+ },
87
+ vdom: {
88
+ innerHTML: 'Welcome to your new Neo App.'
89
+ }
90
+ }, {
91
+ tabButtonConfig: {
92
+ iconCls: 'fa fa-play-circle',
93
+ text: 'Tab 2'
94
+ },
95
+ vdom: {
96
+ innerHTML: 'Have fun creating something awesome!'
97
+ }
98
+ }]
99
+ }],
100
+ /*
101
+ * @member {Object} layout={ntype:'fit'}
102
+ */
103
+ layout: {
104
+ ntype: 'fit'
105
+ }
106
+ }
107
+ }
108
+
109
+ Neo.applyClassConfig(MainContainer);
110
+
111
+ export default MainContainer;
112
+ </pre>