neo.mjs 6.9.10 → 6.9.12

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 (245) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/learnneo/index.html +4 -3
  3. package/apps/learnneo/neo-config.json +2 -1
  4. package/apps/learnneo/store/Content.mjs +1 -1
  5. package/apps/learnneo/view/Viewport.mjs +18 -0
  6. package/apps/learnneo/view/ViewportController.mjs +2 -2
  7. package/apps/learnneo/view/home/ContentTreeList.mjs +22 -14
  8. package/apps/learnneo/view/home/ContentView.mjs +60 -0
  9. package/apps/learnneo/view/home/MainContainer.mjs +14 -6
  10. package/apps/learnneo/view/home/MainContainerController.mjs +57 -18
  11. package/apps/learnneo/view/home/MainContainerModel.mjs +3 -5
  12. package/apps/newwebsite/app.mjs +6 -0
  13. package/apps/newwebsite/index.html +13 -0
  14. package/apps/newwebsite/neo-config.json +7 -0
  15. package/apps/newwebsite/view/MainContainer.mjs +59 -0
  16. package/buildScripts/convertDesignTokens.mjs +173 -0
  17. package/buildScripts/webpack/json/myApps.template.json +1 -0
  18. package/examples/ConfigurationViewport.mjs +12 -9
  19. package/examples/ServiceWorker.mjs +2 -2
  20. package/package.json +3 -2
  21. package/resources/data/{learnneo → deck/learnneo}/p/2023-10-01T18-29-19-158Z.md +3 -6
  22. package/resources/data/deck/learnneo/p/2023-10-08T20-20-37-336Z.md +36 -0
  23. package/resources/data/deck/learnneo/p/stylesheet.md +58 -0
  24. package/resources/data/{learnneo → deck/learnneo}/t.json +19 -2
  25. package/resources/data/deck/training/p/2022-12-27T21-54-52-300Z.md +11 -0
  26. package/resources/data/deck/training/p/2022-12-27T21-55-23-144Z.md +43 -0
  27. package/resources/data/deck/training/p/2022-12-27T21-55-30-948Z.md +1 -0
  28. package/resources/data/deck/training/p/2022-12-27T21-55-43-542Z.md +84 -0
  29. package/resources/data/deck/training/p/2022-12-27T22-23-55-083Z.md +1 -0
  30. package/resources/data/deck/training/p/2022-12-27T22-24-07-886Z.md +8 -0
  31. package/resources/data/deck/training/p/2022-12-27T22-24-52-295Z.md +8 -0
  32. package/resources/data/deck/training/p/2022-12-27T22-25-03-853Z.md +5 -0
  33. package/resources/data/deck/training/p/2022-12-27T22-43-58-924Z.md +10 -0
  34. package/resources/data/deck/training/p/2022-12-27T22-44-28-881Z.md +3 -0
  35. package/resources/data/deck/training/p/2022-12-27T22-44-41-791Z.md +4 -0
  36. package/resources/data/deck/training/p/2022-12-27T22-45-21-032Z.md +7 -0
  37. package/resources/data/deck/training/p/2022-12-27T22-49-22-078Z.md +4 -0
  38. package/resources/data/deck/training/p/2022-12-27T22-50-20-626Z.md +4 -0
  39. package/resources/data/deck/training/p/2022-12-28T16-58-47-786Z.md +0 -0
  40. package/resources/data/deck/training/p/2022-12-28T16-58-55-192Z.md +9 -0
  41. package/resources/data/deck/training/p/2022-12-28T17-10-18-058Z.md +15 -0
  42. package/resources/data/deck/training/p/2022-12-28T17-10-42-296Z.md +40 -0
  43. package/resources/data/deck/training/p/2022-12-28T17-11-34-653Z.md +41 -0
  44. package/resources/data/deck/training/p/2022-12-28T17-13-09-994Z.md +0 -0
  45. package/resources/data/deck/training/p/2022-12-28T21-32-14-420Z.md +0 -0
  46. package/resources/data/deck/training/p/2022-12-29T01-43-32-431Z.md +7 -0
  47. package/resources/data/deck/training/p/2022-12-29T15-56-54-485Z.md +7 -0
  48. package/resources/data/deck/training/p/2022-12-29T15-57-11-499Z.md +7 -0
  49. package/resources/data/deck/training/p/2022-12-29T16-00-13-223Z.md +7 -0
  50. package/resources/data/deck/training/p/2022-12-29T18-34-25-826Z.md +4 -0
  51. package/resources/data/deck/training/p/2022-12-29T18-36-08-226Z.md +106 -0
  52. package/resources/data/deck/training/p/2022-12-29T18-36-56-893Z.md +112 -0
  53. package/resources/data/deck/training/p/2022-12-29T19-31-30-507Z.md +31 -0
  54. package/resources/data/deck/training/p/2022-12-29T19-31-55-091Z.md +14 -0
  55. package/resources/data/deck/training/p/2022-12-29T20-03-42-628Z.md +9 -0
  56. package/resources/data/deck/training/p/2022-12-29T20-21-20-669Z.md +7 -0
  57. package/resources/data/deck/training/p/2022-12-29T20-37-08-919Z.md +46 -0
  58. package/resources/data/deck/training/p/2022-12-29T20-37-20-344Z.md +43 -0
  59. package/resources/data/deck/training/p/2022-12-30T19-04-30-990Z.md +8 -0
  60. package/resources/data/deck/training/p/2022-12-31T18-43-56-338Z.md +7 -0
  61. package/resources/data/deck/training/p/2022-12-31T18-51-50-682Z.md +1 -0
  62. package/resources/data/deck/training/p/2022-12-31T18-54-04-176Z.md +4 -0
  63. package/resources/data/deck/training/p/2022-12-31T22-11-55-555Z.md +112 -0
  64. package/resources/data/deck/training/p/2022-12-31T23-00-41-222Z.md +6 -0
  65. package/resources/data/deck/training/p/2022-12-31T23-18-55-655Z.md +69 -0
  66. package/resources/data/deck/training/p/2022-12-31T23-25-40-735Z.md +21 -0
  67. package/resources/data/deck/training/p/2022-12-31T23-25-51-014Z.md +7 -0
  68. package/resources/data/deck/training/p/2023-01-01T17-49-18-429Z.md +3 -0
  69. package/resources/data/deck/training/p/2023-01-01T18-44-07-034Z.md +34 -0
  70. package/resources/data/deck/training/p/2023-01-01T18-47-39-766Z.md +15 -0
  71. package/resources/data/deck/training/p/2023-01-01T19-04-22-830Z.md +4 -0
  72. package/resources/data/deck/training/p/2023-01-01T21-11-58-025Z.md +25 -0
  73. package/resources/data/deck/training/p/2023-01-01T21-12-37-340Z.md +23 -0
  74. package/resources/data/deck/training/p/2023-01-01T21-13-13-880Z.md +8 -0
  75. package/resources/data/deck/training/p/2023-01-01T21-14-45-740Z.md +98 -0
  76. package/resources/data/deck/training/p/2023-01-01T21-18-23-886Z.md +26 -0
  77. package/resources/data/deck/training/p/2023-01-01T21-18-31-316Z.md +19 -0
  78. package/resources/data/deck/training/p/2023-01-01T21-18-42-290Z.md +23 -0
  79. package/resources/data/deck/training/p/2023-01-01T21-19-57-020Z.md +24 -0
  80. package/resources/data/deck/training/p/2023-01-01T21-22-31-184Z.md +13 -0
  81. package/resources/data/deck/training/p/2023-01-01T21-22-38-317Z.md +17 -0
  82. package/resources/data/deck/training/p/2023-01-01T21-22-47-693Z.md +20 -0
  83. package/resources/data/deck/training/p/2023-01-01T21-23-17-716Z.md +39 -0
  84. package/resources/data/deck/training/p/2023-01-01T21-23-28-532Z.md +22 -0
  85. package/resources/data/deck/training/p/2023-01-01T21-25-23-899Z.md +3 -0
  86. package/resources/data/deck/training/p/2023-01-01T21-25-59-742Z.md +1 -0
  87. package/resources/data/deck/training/p/2023-01-01T21-26-53-748Z.md +12 -0
  88. package/resources/data/deck/training/p/2023-01-01T23-38-42-863Z.md +2 -0
  89. package/resources/data/deck/training/p/2023-01-03T02-07-19-014Z.md +143 -0
  90. package/resources/data/deck/training/p/2023-01-04T01-52-23-454Z.md +76 -0
  91. package/resources/data/deck/training/p/2023-01-06T23-21-12-009Z.md +127 -0
  92. package/resources/data/deck/training/p/2023-01-06T23-21-31-685Z.md +81 -0
  93. package/resources/data/deck/training/p/2023-01-06T23-21-59-596Z.md +36 -0
  94. package/resources/data/deck/training/p/2023-01-06T23-34-13-897Z.md +87 -0
  95. package/resources/data/deck/training/p/2023-01-06T23-44-02-340Z.md +0 -0
  96. package/resources/data/deck/training/p/2023-01-06T23-46-36-687Z.md +1 -0
  97. package/resources/data/deck/training/p/2023-01-06T23-46-45-783Z.md +33 -0
  98. package/resources/data/deck/training/p/2023-01-08T00-45-11-144Z.md +50 -0
  99. package/resources/data/deck/training/p/2023-01-08T01-06-31-267Z.md +41 -0
  100. package/resources/data/deck/training/p/2023-01-08T01-24-21-088Z.md +95 -0
  101. package/resources/data/deck/training/p/2023-01-08T01-25-12-557Z.md +11 -0
  102. package/resources/data/deck/training/p/2023-01-08T01-46-50-723Z.md +25 -0
  103. package/resources/data/deck/training/p/2023-01-08T02-09-07-802Z.md +18 -0
  104. package/resources/data/deck/training/p/2023-01-08T02-09-19-678Z.md +66 -0
  105. package/resources/data/deck/training/p/2023-01-08T02-11-26-333Z.md +29 -0
  106. package/resources/data/deck/training/p/2023-01-08T17-22-48-841Z.md +14 -0
  107. package/resources/data/deck/training/p/2023-01-08T20-46-11-806Z.md +5 -0
  108. package/resources/data/deck/training/p/2023-01-08T20-47-23-682Z.md +5 -0
  109. package/resources/data/deck/training/p/2023-01-08T20-47-32-064Z.md +13 -0
  110. package/resources/data/deck/training/p/2023-01-08T20-47-57-045Z.md +0 -0
  111. package/resources/data/deck/training/p/2023-01-08T20-48-03-791Z.md +18 -0
  112. package/resources/data/deck/training/p/2023-01-08T20-48-32-466Z.md +9 -0
  113. package/resources/data/deck/training/p/2023-01-08T20-48-51-322Z.md +20 -0
  114. package/resources/data/deck/training/p/2023-01-08T20-49-52-741Z.md +0 -0
  115. package/resources/data/deck/training/p/2023-01-08T20-52-03-556Z.md +0 -0
  116. package/resources/data/deck/training/p/2023-01-08T20-57-36-333Z.md +2 -0
  117. package/resources/data/deck/training/p/2023-01-08T20-57-51-136Z.md +5 -0
  118. package/resources/data/deck/training/p/2023-01-09T00-07-37-951Z.md +0 -0
  119. package/resources/data/deck/training/p/2023-01-09T00-35-40-671Z.md +3 -0
  120. package/resources/data/deck/training/p/2023-01-10T01-29-38-148Z.md +10 -0
  121. package/resources/data/deck/training/p/2023-01-10T01-43-12-166Z.md +31 -0
  122. package/resources/data/deck/training/p/2023-01-10T02-21-54-303Z.md +10 -0
  123. package/resources/data/deck/training/p/2023-01-12T01-50-54-617Z.md +74 -0
  124. package/resources/data/deck/training/p/2023-01-13T19-55-24-735Z.md +14 -0
  125. package/resources/data/deck/training/p/2023-01-13T20-08-27-068Z.md +28 -0
  126. package/resources/data/deck/training/p/2023-01-13T20-23-38-411Z.md +25 -0
  127. package/resources/data/deck/training/p/2023-01-13T20-37-06-267Z.md +13 -0
  128. package/resources/data/deck/training/p/2023-01-13T21-05-57-708Z.md +8 -0
  129. package/resources/data/deck/training/p/2023-01-13T21-48-17-258Z.md +20 -0
  130. package/resources/data/deck/training/p/2023-01-13T22-05-05-799Z.md +14 -0
  131. package/resources/data/deck/training/p/2023-01-13T22-08-30-863Z.md +17 -0
  132. package/resources/data/deck/training/p/2023-01-13T23-01-50-449Z.md +4 -0
  133. package/resources/data/deck/training/p/2023-01-14T00-33-05-958Z.md +62 -0
  134. package/resources/data/deck/training/p/2023-01-14T00-40-27-784Z.md +229 -0
  135. package/resources/data/deck/training/p/2023-01-14T00-41-59-081Z.md +153 -0
  136. package/resources/data/deck/training/p/2023-01-14T13-50-28-199Z.md +19 -0
  137. package/resources/data/deck/training/p/2023-01-14T13-59-20-275Z.md +6 -0
  138. package/resources/data/deck/training/p/2023-01-14T14-03-29-456Z.md +3 -0
  139. package/resources/data/deck/training/p/2023-01-14T14-27-57-678Z.md +7 -0
  140. package/resources/data/deck/training/p/2023-01-14T17-30-18-228Z.md +33 -0
  141. package/resources/data/deck/training/p/2023-01-14T18-28-39-316Z.md +1 -0
  142. package/resources/data/deck/training/p/2023-01-14T18-28-44-115Z.md +4 -0
  143. package/resources/data/deck/training/p/2023-01-14T18-28-49-548Z.md +18 -0
  144. package/resources/data/deck/training/p/2023-01-14T18-40-13-758Z.md +10 -0
  145. package/resources/data/deck/training/p/2023-01-14T19-29-15-291Z.md +12 -0
  146. package/resources/data/deck/training/p/2023-01-15T18-51-52-134Z.md +83 -0
  147. package/resources/data/deck/training/p/2023-01-15T20-03-30-073Z.md +11 -0
  148. package/resources/data/deck/training/p/2023-01-15T22-07-52-073Z.md +16 -0
  149. package/resources/data/deck/training/p/2023-01-15T22-22-13-517Z.md +12 -0
  150. package/resources/data/deck/training/p/2023-01-15T22-28-57-508Z.md +131 -0
  151. package/resources/data/deck/training/p/2023-01-15T22-36-30-913Z.md +115 -0
  152. package/resources/data/deck/training/p/2023-01-16T16-03-40-770Z.md +12 -0
  153. package/resources/data/deck/training/p/2023-01-16T20-21-56-859Z.md +5 -0
  154. package/resources/data/deck/training/p/2023-01-16T20-24-09-690Z.md +24 -0
  155. package/resources/data/deck/training/p/2023-01-20T12-51-22-646Z.md +21 -0
  156. package/resources/data/deck/training/p/2023-01-20T13-06-46-614Z.md +9 -0
  157. package/resources/data/deck/training/p/2023-01-20T13-08-51-600Z.md +7 -0
  158. package/resources/data/deck/training/p/2023-01-20T15-20-13-363Z.md +26 -0
  159. package/resources/data/deck/training/p/2023-01-20T15-34-58-813Z.md +75 -0
  160. package/resources/data/deck/training/p/2023-01-21T16-33-20-458Z.md +33 -0
  161. package/resources/data/deck/training/p/2023-01-21T16-45-28-263Z.md +28 -0
  162. package/resources/data/deck/training/p/2023-01-21T16-56-25-452Z.md +3 -0
  163. package/resources/data/deck/training/p/2023-01-21T17-28-31-493Z.md +6 -0
  164. package/resources/data/deck/training/p/2023-01-21T19-49-51-918Z.md +13 -0
  165. package/resources/data/deck/training/p/2023-01-21T20-08-24-452Z.md +15 -0
  166. package/resources/data/deck/training/p/2023-01-21T20-35-54-947Z.md +20 -0
  167. package/resources/data/deck/training/p/2023-01-21T20-54-47-603Z.md +39 -0
  168. package/resources/data/deck/training/p/2023-01-21T20-56-28-184Z.md +25 -0
  169. package/resources/data/deck/training/p/2023-01-21T20-57-32-927Z.md +4 -0
  170. package/resources/data/deck/training/p/2023-01-21T23-13-33-394Z.md +6 -0
  171. package/resources/data/deck/training/p/2023-01-28T19-11-37-464Z.md +24 -0
  172. package/resources/data/deck/training/p/2023-01-28T20-43-41-188Z.md +9 -0
  173. package/resources/data/deck/training/p/2023-01-28T20-53-56-476Z.md +8 -0
  174. package/resources/data/deck/training/p/2023-01-28T20-58-43-776Z.md +10 -0
  175. package/resources/data/deck/training/p/2023-01-28T22-18-41-259Z.md +33 -0
  176. package/resources/data/deck/training/p/2023-01-28T22-24-34-808Z.md +24 -0
  177. package/resources/data/deck/training/p/2023-01-29T16-25-24-528Z.md +44 -0
  178. package/resources/data/deck/training/p/2023-01-29T21-14-32-588Z.md +12 -0
  179. package/resources/data/deck/training/p/2023-01-31T19-24-53-504Z.md +8 -0
  180. package/resources/data/deck/training/p/2023-01-31T20-33-55-855Z.md +11 -0
  181. package/resources/data/deck/training/p/2023-01-31T20-34-30-261Z.md +7 -0
  182. package/resources/data/deck/training/p/2023-01-31T20-52-53-367Z.md +43 -0
  183. package/resources/data/deck/training/p/2023-02-04T15-18-35-682Z.md +20 -0
  184. package/resources/data/deck/training/p/2023-02-04T15-49-47-597Z.md +14 -0
  185. package/resources/data/deck/training/p/2023-02-04T18-58-57-808Z.md +1 -0
  186. package/resources/data/deck/training/p/2023-02-04T20-07-11-288Z.md +1 -0
  187. package/resources/data/deck/training/p/2023-02-04T20-09-50-169Z.md +1 -0
  188. package/resources/data/deck/training/p/2023-02-04T20-19-42-740Z.md +8 -0
  189. package/resources/data/deck/training/p/2023-02-04T20-23-56-013Z.md +12 -0
  190. package/resources/data/deck/training/p/2023-02-04T20-28-12-391Z.md +20 -0
  191. package/resources/data/deck/training/p/2023-02-05T00-20-32-554Z.md +16 -0
  192. package/resources/data/deck/training/p/2023-02-05T00-35-56-282Z.md +13 -0
  193. package/resources/data/deck/training/p/2023-02-05T15-36-57-182Z.md +24 -0
  194. package/resources/data/deck/training/p/2023-02-05T17-39-51-712Z.md +70 -0
  195. package/resources/data/deck/training/p/2023-02-05T17-44-53-815Z.md +195 -0
  196. package/resources/data/deck/training/p/2023-02-05T17-45-40-114Z.md +92 -0
  197. package/resources/data/deck/training/p/2023-02-05T18-12-14-489Z.md +60 -0
  198. package/resources/data/deck/training/p/2023-02-06T00-14-54-457Z.md +9 -0
  199. package/resources/data/deck/training/p/2023-06-28T18-03-14-313Z.md +8 -0
  200. package/resources/data/deck/training/p/2023-06-28T18-26-17-290Z.md +7 -0
  201. package/resources/data/deck/training/p/2023-06-28T21-16-24-034Z.md +40 -0
  202. package/resources/data/deck/training/p/2023-06-28T21-16-34-972Z.md +16 -0
  203. package/resources/data/deck/training/p/2023-06-28T21-28-28-379Z.md +4 -0
  204. package/resources/data/deck/training/p/2023-06-29T23-15-10-411Z.md +5 -0
  205. package/resources/data/deck/training/p/2023-07-01T15-42-45-193Z.md +433 -0
  206. package/resources/data/deck/training/p/2023-07-01T21-54-31-329Z.md +6 -0
  207. package/resources/data/deck/training/p/2023-07-02T16-14-06-970Z.md +14 -0
  208. package/resources/data/deck/training/p/2023-07-31T00-26-03-842Z.md +4 -0
  209. package/resources/data/deck/training/p/2023-07-31T00-31-51-933Z.md +10 -0
  210. package/resources/data/deck/training/p/2023-07-31T00-37-21-927Z.md +205 -0
  211. package/resources/data/deck/training/p/2023-10-01T18-29-19-158Z.md +76 -0
  212. package/resources/data/deck/training/p/2023-10-07T19-18-28-517Z.md +102 -0
  213. package/resources/data/deck/training/p/2023-10-08T20-20-07-934Z.md +75 -0
  214. package/resources/data/deck/training/p/2023-10-08T20-37-30-658Z.md +0 -0
  215. package/resources/data/deck/training/p/2023-10-08T21-58-25-809Z.md +68 -0
  216. package/resources/data/deck/training/p/2023-10-08T22-22-11-013Z.md +0 -0
  217. package/resources/data/deck/training/p/2023-10-14T19-25-08-153Z.md +119 -0
  218. package/resources/data/deck/training/t.json +1276 -0
  219. package/resources/design-tokens/json/component.json +288 -0
  220. package/resources/design-tokens/json/core.json +352 -0
  221. package/resources/design-tokens/json/semantic.json +231 -0
  222. package/resources/scss/src/apps/learnneo/Viewport.scss +3 -0
  223. package/resources/scss/src/apps/learnneo/home/ContentTreeList.scss +60 -13
  224. package/resources/scss/src/apps/learnneo/home/ContentView.scss +58 -0
  225. package/resources/scss/src/apps/newwebsite/MainContainer.scss +32 -0
  226. package/resources/scss/src/list/Base.scss +1 -1
  227. package/resources/scss/theme-neo-light/Global.scss +65 -1
  228. package/resources/scss/theme-neo-light/design-tokens/Component.scss +64 -0
  229. package/resources/scss/theme-neo-light/design-tokens/Core.scss +67 -0
  230. package/resources/scss/theme-neo-light/design-tokens/Semantic.scss +61 -0
  231. package/resources/scss/theme-neo-light/design-tokens/_all.scss +4 -0
  232. package/resources/scss/theme-neo-light/list/Base.scss +29 -6
  233. package/src/DefaultConfig.mjs +4 -4
  234. package/src/controller/Base.mjs +31 -23
  235. package/src/data/connection/Xhr.mjs +1 -1
  236. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-07T19-18-28-517Z.md +0 -0
  237. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-20-07-934Z.md +0 -0
  238. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-37-30-658Z.md +0 -0
  239. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T21-58-25-809Z.md +0 -0
  240. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T22-22-11-013Z.md +0 -0
  241. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-14T19-25-08-153Z.md +0 -0
  242. /package/resources/data/{learnneo → deck/learnneo}/pages/whyneo.md +0 -0
  243. /package/resources/data/{learnneo → deck/learnneo}/tree.json +0 -0
  244. /package/resources/data/{learnneo → deck/training}/p/2023-10-08T20-20-37-336Z.md +0 -0
  245. /package/resources/{deck → data/deck}/whyneo.md +0 -0
@@ -0,0 +1,173 @@
1
+ import fs from 'fs-extra';
2
+ import os from 'os';
3
+ import path from 'path';
4
+
5
+ let jsonPath = './resources/design-tokens/json',
6
+ jsonFolder = fs.readdirSync(jsonPath),
7
+ tokenPrefix = '',
8
+ tokenRegex = new RegExp(/{(.*?)}/g),
9
+ emptyString, fileContent, keyMaxLength, map, match, matches, output;
10
+
11
+ function capitalize(value) {
12
+ return value[0].toUpperCase() + value.slice(1);
13
+ }
14
+
15
+ function createEmptyString(len) {
16
+ return ' '.repeat(len);
17
+ }
18
+
19
+ function parseTokens(fileContent, prefix=tokenPrefix, map=[]) {
20
+ let baseKey, baseValue, keyValue, keys, modify, ns;
21
+
22
+ Object.entries(fileContent).forEach(([key, value]) => {
23
+ key = key.replace(/\?/g, '');
24
+ key = key.replace(/&/g, '-'); // some token names contain & chars
25
+ ns = prefix === tokenPrefix ? (tokenPrefix + key) : key === 'value' ? prefix : `${prefix}-${key}`;
26
+
27
+ if (typeof value === 'object') {
28
+ keys = Object.keys(value);
29
+ modify = value[keys[0]]?.$extensions?.['studio.tokens']?.modify || // the first key could contain the value,
30
+ value[keys[1]]?.$extensions?.['studio.tokens']?.modify; // so we are checking the 2nd too
31
+
32
+ if (modify) {
33
+ // assuming that each object contains its base value
34
+ keys.forEach(objKey => {
35
+ if (!value[objKey].$extensions) {
36
+ baseKey = objKey;
37
+ baseValue = value[baseKey].value;
38
+ }
39
+ });
40
+
41
+ keys.forEach(objKey => {
42
+ if (objKey !== baseKey) {
43
+ modify = value[objKey].$extensions?.['studio.tokens']?.modify;
44
+ keyValue = `${modify.type}(${baseValue}, ${modify.value * 100}%)`;
45
+
46
+ map.push([`${ns}-${objKey}`, keyValue]);
47
+ } else {
48
+ parseTokens(value[baseKey], `${ns}-${baseKey}`, map);
49
+ }
50
+ })
51
+ } else {
52
+ parseTokens(value, ns, map);
53
+ }
54
+ } else if (key !== 'description' && key !== 'type') {
55
+ if (typeof value === 'string') {
56
+ if (!value.includes('{')) {
57
+ if (value.includes(' ')) {
58
+ value = `'${value}'`;
59
+ }
60
+ } else {
61
+ value = value.replace(/\?/g, '');
62
+ matches = value.matchAll(tokenRegex);
63
+
64
+ // replace . with - only inside each token
65
+ for (match of matches) {
66
+ value = value.replace(match[0], match[0].replace(/\./g, '-'));
67
+ }
68
+
69
+ /*
70
+ * some design tokens contain operations without empty spaces
71
+ * e.g. {token}*0.9
72
+ * calc() relies on having spaces around operators
73
+ */
74
+ value = value.replace(/(\S)(\*)(\S)/g, '$1 $2 $3');
75
+ value = value.replace(/(\S)(\/)(\S)/g, '$1 $2 $3');
76
+
77
+ // most likely a multiplication
78
+ if (!value.endsWith('}')) {
79
+ value = `calc(${value})`;
80
+ }
81
+
82
+ // convert tokens into CSS variables
83
+ value = value.replace(/{(.*?)}/g, `var(--${tokenPrefix}$1)`);
84
+
85
+ // multiple occurrences of a css variable need to get wrapped into calc()
86
+ if (value.indexOf('var') !== value.lastIndexOf('var')) {
87
+ value = `calc(${value})`;
88
+ }
89
+
90
+ // -token needs to get converted
91
+ if (value.startsWith('-')) {
92
+ value = `calc(${value.substring(1)} * -1)`
93
+ }
94
+ }
95
+ }
96
+
97
+ map.push([ns, value]);
98
+ }
99
+ });
100
+
101
+ return map;
102
+ }
103
+
104
+ function replaceObjectValue(obj) {
105
+ Object.entries(obj).forEach(([key, value]) => {
106
+ if (key === 'value') {
107
+ if (typeof value === 'object') {
108
+ Object.entries(value).forEach(([valKey, prop]) => {
109
+ // some token vars contain an empty string, which SCSS can not handle.
110
+ if (prop === '') {
111
+ prop = 'none';
112
+ }
113
+
114
+ obj[valKey] = {
115
+ type : obj.type,
116
+ value: prop
117
+ };
118
+ });
119
+
120
+ delete obj.type;
121
+ delete obj.value;
122
+ }
123
+ } else if (typeof value === 'object') {
124
+ replaceObjectValue(value);
125
+ }
126
+ });
127
+ }
128
+
129
+ function sortArray(a, b) {
130
+ const nameA = a[0].toUpperCase();
131
+ const nameB = b[0].toUpperCase();
132
+ if (nameA < nameB) {
133
+ return -1;
134
+ }
135
+ if (nameA > nameB) {
136
+ return 1;
137
+ }
138
+
139
+ return 0;
140
+ }
141
+
142
+ jsonFolder.forEach(fileName => {
143
+ if (fileName.endsWith(".json")) {
144
+ console.log('Parsing file:', fileName);
145
+
146
+ fileContent = JSON.parse(fs.readFileSync(path.join(jsonPath, fileName)));
147
+ keyMaxLength = 0;
148
+ output = [':root .neo-theme-neo-light {'];
149
+
150
+ replaceObjectValue(fileContent);
151
+
152
+ map = parseTokens(fileContent);
153
+
154
+ map.sort(sortArray);
155
+
156
+ map.forEach(item => {
157
+ keyMaxLength = Math.max(item[0].length, keyMaxLength);
158
+ });
159
+
160
+ map.forEach(item => {
161
+ emptyString = createEmptyString(keyMaxLength - item[0].length);
162
+
163
+ output.push(` --${item[0] + emptyString}: ${item[1]};`);
164
+ });
165
+
166
+ output.push('}');
167
+ output.push('');
168
+
169
+ fileName = capitalize(fileName.split('.').shift()) + '.scss'
170
+
171
+ fs.writeFileSync(path.join('./resources/scss/theme-neo-light/design-tokens/', fileName), output.join(os.EOL));
172
+ }
173
+ });
@@ -4,6 +4,7 @@
4
4
  "Docs",
5
5
  "Form",
6
6
  "Krausest",
7
+ "NewWebsite",
7
8
  "RealWorld",
8
9
  "RealWorld2",
9
10
  "SharedCovid",
@@ -6,8 +6,9 @@ import Viewport from '../src/container/Viewport.mjs';
6
6
 
7
7
  // add custom themes here
8
8
  const themes = [
9
- {name: 'neo-theme-dark', label: 'Theme Dark'},
10
- {name: 'neo-theme-light', label: 'Theme Light'}
9
+ {name: 'neo-theme-light', label: 'Theme Light'},
10
+ {name: 'neo-theme-dark', label: 'Theme Dark'},
11
+ {name: 'neo-theme-neo-light', label: 'Theme Neo-Light'}
11
12
  ]
12
13
 
13
14
  /**
@@ -121,12 +122,12 @@ class ConfigurationViewport extends Viewport {
121
122
  handler: bindAppend(me.onSwitchTheme, me, 'cmp'),
122
123
  style : {marginTop: '20px'},
123
124
  text : theme === 'neo-theme-dark' ? 'Theme Light' : 'Theme Dark',
124
- width : 100
125
+ width : 130
125
126
  }, {
126
127
  module : Button,
127
128
  handler: me.logInstance.bind(me),
128
129
  text : 'Log Instance',
129
- width : 100
130
+ width : 130
130
131
  }]
131
132
  }]
132
133
  }];
@@ -184,7 +185,7 @@ class ConfigurationViewport extends Viewport {
184
185
  let me = this,
185
186
  button = data.component,
186
187
  countThemes = themes.length,
187
- newTheme, oldIndex, oldTheme, themeIndex;
188
+ futureIndex, newTheme, oldIndex, oldTheme, themeIndex;
188
189
 
189
190
  themes.forEach((theme, index) => {
190
191
  if (button.text === theme.label) {
@@ -193,14 +194,16 @@ class ConfigurationViewport extends Viewport {
193
194
  }
194
195
  });
195
196
 
196
- oldIndex = (themeIndex + 1) % countThemes;
197
- oldTheme = themes[oldIndex].name;
197
+ futureIndex = (themeIndex + countThemes +1) % countThemes;
198
+ oldIndex = (themeIndex + countThemes -1) % countThemes;
199
+ oldTheme = themes[oldIndex].name;
198
200
 
199
- button.text = themes[oldIndex].label;
201
+
202
+ button.text = themes[futureIndex].label;
200
203
 
201
204
  if (target === 'cmp') {
202
205
  me.exampleComponent.theme = newTheme;
203
- } else {
206
+ } else {console.log(newTheme, oldTheme);
204
207
  Neo.applyDeltas(me.appName, {
205
208
  cls: {
206
209
  add : [newTheme],
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='6.9.10'
23
+ * @member {String} version='6.9.12'
24
24
  */
25
- version: '6.9.10'
25
+ version: '6.9.12'
26
26
  }
27
27
 
28
28
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo.mjs",
3
- "version": "6.9.10",
3
+ "version": "6.9.12",
4
4
  "description": "The webworkers driven UI framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -16,6 +16,7 @@
16
16
  "build-all-questions": "node ./buildScripts/buildAll.mjs -f",
17
17
  "build-themes": "node ./buildScripts/buildThemes.mjs -f",
18
18
  "build-threads": "node ./buildScripts/webpack/buildThreads.mjs -f",
19
+ "convert-design-tokens": "node ./buildScripts/convertDesignTokens.mjs",
19
20
  "create-app": "node ./buildScripts/createApp.mjs",
20
21
  "create-class": "node ./buildScripts/createClass.mjs",
21
22
  "create-component": "node ./buildScripts/createComponent.mjs",
@@ -52,7 +53,7 @@
52
53
  "envinfo": "^7.11.0",
53
54
  "fs-extra": "^11.1.1",
54
55
  "highlightjs-line-numbers.js": "^2.8.0",
55
- "inquirer": "^9.2.11",
56
+ "inquirer": "^9.2.12",
56
57
  "neo-jsdoc": "1.0.1",
57
58
  "neo-jsdoc-x": "1.0.5",
58
59
  "postcss": "^8.4.31",
@@ -1,12 +1,9 @@
1
- # This is a h1
2
- ## This is a h2
3
- ### This is a h3
4
- #### This is a h4
5
-
6
1
 
7
2
  Neo.mjs is a framework used to create <mark>browser-based</mark> applications.
8
3
 
9
- Some key features and benefits of Neo.mjs are:
4
+ # Some key features and benefits of Neo.mjs are:
5
+
6
+ <code><A code snippet></code>
10
7
 
11
8
  <details>
12
9
  <summary>Multi-Threaded</summary>
@@ -0,0 +1,36 @@
1
+ Neo.mjs uses standard modular JavaScript, so you're free to use other class
2
+ features, like private members.
3
+ <pre><code class="javascript">
4
+ class Human extends Mammal {
5
+ static config = {
6
+ className: 'Simple.example.Human',
7
+ name : 'J. Doe',
8
+ married : false
9
+ }
10
+
11
+ static #privateStaticField = 'foo'
12
+
13
+ #privateInstanceField = 'bar'
14
+
15
+ #privateInstanceMethod() {
16
+ console.log(`Psst. Don't tell anyone, but ${this.#privateInstanceField} and ${Human.#privateStaticField}`);
17
+ }
18
+
19
+ speak(tellSecret) {
20
+ console.log(`Hello! My name is ${this.name}. I am ${this.married?'':'not'} married.`);
21
+ if (tellSecret) this.#privateInstanceMethod();
22
+ }
23
+
24
+ yodel() {
25
+ console.log('Yodelay hee hoo!');
26
+ }
27
+ }
28
+
29
+ Neo.applyClassConfig(Human);
30
+
31
+ const myPerson = Neo.create(Human, {
32
+ name: 'Herbert'
33
+ });
34
+
35
+ myPerson.speak(true);
36
+ </code></pre>
@@ -0,0 +1,58 @@
1
+ <details>
2
+ <summary>Training material advice</summary>
3
+ Training content is different than self-study content.
4
+ Training material _augments_ the lecture. The audience should be focused on what the speaker is
5
+ saying; the slides support the lecture. An important concept in writing
6
+ training material is to avoid a _wall of words_, where there are lengthy
7
+ paragraphs. People will read what's in front of them. If you have a lecture slide
8
+ with a lot of text, your audience will be reading while you are lecturing,
9
+ and information is lost.
10
+ </details>
11
+
12
+
13
+ # This is an h1
14
+ ## This is an h2
15
+ ### This is an h3
16
+ #### This is an h4
17
+
18
+ <br>
19
+
20
+ To show highlighted source code use
21
+ <pre>
22
+ &lt;pre>
23
+ &lt;code class="javascript">
24
+ // Source code goes here
25
+ &lt;/code>
26
+ &lt;/pre>
27
+
28
+ <pre>
29
+ <code class="javascript">
30
+ import Base from '../../../node_modules/neo.mjs/src/core/Base.mjs';
31
+
32
+ class Mammal extends Base {
33
+ static config = {
34
+ className: 'Simple.example.Mammal'
35
+ }
36
+ }
37
+ </code>
38
+ </pre>
39
+
40
+ For short in-line statements of code use &lt;code> or backticks.
41
+
42
+ When definining variables avoid `var` &mdash; use `let` or `const` instead.
43
+
44
+ <br>
45
+
46
+ For expandable bullet points and lab steps use a &lt;details> tag
47
+ <pre>
48
+ &lt;details>
49
+ &lt;summary>This describes the item&lt;/summary>
50
+ This is the item contents.
51
+ &lt;/details>
52
+ </pre>
53
+
54
+ <details>
55
+ <summary>This describes the item</summary>
56
+ This is the item contents.
57
+ </details>
58
+
@@ -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>