neo.mjs 6.9.10 → 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 (235) 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 +8 -5
  6. package/apps/learnneo/view/home/ContentView.mjs +60 -0
  7. package/apps/learnneo/view/home/MainContainer.mjs +22 -14
  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/package.json +2 -2
  18. package/resources/data/{learnneo → deck/learnneo}/p/2023-10-01T18-29-19-158Z.md +3 -6
  19. package/resources/data/deck/learnneo/p/stylesheet.md +40 -0
  20. package/resources/data/{learnneo → deck/learnneo}/t.json +19 -2
  21. package/resources/data/deck/training/p/2022-12-27T21-54-52-300Z.md +11 -0
  22. package/resources/data/deck/training/p/2022-12-27T21-55-23-144Z.md +43 -0
  23. package/resources/data/deck/training/p/2022-12-27T21-55-30-948Z.md +1 -0
  24. package/resources/data/deck/training/p/2022-12-27T21-55-43-542Z.md +84 -0
  25. package/resources/data/deck/training/p/2022-12-27T22-23-55-083Z.md +1 -0
  26. package/resources/data/deck/training/p/2022-12-27T22-24-07-886Z.md +8 -0
  27. package/resources/data/deck/training/p/2022-12-27T22-24-52-295Z.md +8 -0
  28. package/resources/data/deck/training/p/2022-12-27T22-25-03-853Z.md +5 -0
  29. package/resources/data/deck/training/p/2022-12-27T22-43-58-924Z.md +10 -0
  30. package/resources/data/deck/training/p/2022-12-27T22-44-28-881Z.md +3 -0
  31. package/resources/data/deck/training/p/2022-12-27T22-44-41-791Z.md +4 -0
  32. package/resources/data/deck/training/p/2022-12-27T22-45-21-032Z.md +7 -0
  33. package/resources/data/deck/training/p/2022-12-27T22-49-22-078Z.md +4 -0
  34. package/resources/data/deck/training/p/2022-12-27T22-50-20-626Z.md +4 -0
  35. package/resources/data/deck/training/p/2022-12-28T16-58-47-786Z.md +0 -0
  36. package/resources/data/deck/training/p/2022-12-28T16-58-55-192Z.md +9 -0
  37. package/resources/data/deck/training/p/2022-12-28T17-10-18-058Z.md +15 -0
  38. package/resources/data/deck/training/p/2022-12-28T17-10-42-296Z.md +40 -0
  39. package/resources/data/deck/training/p/2022-12-28T17-11-34-653Z.md +41 -0
  40. package/resources/data/deck/training/p/2022-12-28T17-13-09-994Z.md +0 -0
  41. package/resources/data/deck/training/p/2022-12-28T21-32-14-420Z.md +0 -0
  42. package/resources/data/deck/training/p/2022-12-29T01-43-32-431Z.md +7 -0
  43. package/resources/data/deck/training/p/2022-12-29T15-56-54-485Z.md +7 -0
  44. package/resources/data/deck/training/p/2022-12-29T15-57-11-499Z.md +7 -0
  45. package/resources/data/deck/training/p/2022-12-29T16-00-13-223Z.md +7 -0
  46. package/resources/data/deck/training/p/2022-12-29T18-34-25-826Z.md +4 -0
  47. package/resources/data/deck/training/p/2022-12-29T18-36-08-226Z.md +106 -0
  48. package/resources/data/deck/training/p/2022-12-29T18-36-56-893Z.md +112 -0
  49. package/resources/data/deck/training/p/2022-12-29T19-31-30-507Z.md +31 -0
  50. package/resources/data/deck/training/p/2022-12-29T19-31-55-091Z.md +14 -0
  51. package/resources/data/deck/training/p/2022-12-29T20-03-42-628Z.md +9 -0
  52. package/resources/data/deck/training/p/2022-12-29T20-21-20-669Z.md +7 -0
  53. package/resources/data/deck/training/p/2022-12-29T20-37-08-919Z.md +46 -0
  54. package/resources/data/deck/training/p/2022-12-29T20-37-20-344Z.md +43 -0
  55. package/resources/data/deck/training/p/2022-12-30T19-04-30-990Z.md +8 -0
  56. package/resources/data/deck/training/p/2022-12-31T18-43-56-338Z.md +7 -0
  57. package/resources/data/deck/training/p/2022-12-31T18-51-50-682Z.md +1 -0
  58. package/resources/data/deck/training/p/2022-12-31T18-54-04-176Z.md +4 -0
  59. package/resources/data/deck/training/p/2022-12-31T22-11-55-555Z.md +112 -0
  60. package/resources/data/deck/training/p/2022-12-31T23-00-41-222Z.md +6 -0
  61. package/resources/data/deck/training/p/2022-12-31T23-18-55-655Z.md +69 -0
  62. package/resources/data/deck/training/p/2022-12-31T23-25-40-735Z.md +21 -0
  63. package/resources/data/deck/training/p/2022-12-31T23-25-51-014Z.md +7 -0
  64. package/resources/data/deck/training/p/2023-01-01T17-49-18-429Z.md +3 -0
  65. package/resources/data/deck/training/p/2023-01-01T18-44-07-034Z.md +34 -0
  66. package/resources/data/deck/training/p/2023-01-01T18-47-39-766Z.md +15 -0
  67. package/resources/data/deck/training/p/2023-01-01T19-04-22-830Z.md +4 -0
  68. package/resources/data/deck/training/p/2023-01-01T21-11-58-025Z.md +25 -0
  69. package/resources/data/deck/training/p/2023-01-01T21-12-37-340Z.md +23 -0
  70. package/resources/data/deck/training/p/2023-01-01T21-13-13-880Z.md +8 -0
  71. package/resources/data/deck/training/p/2023-01-01T21-14-45-740Z.md +98 -0
  72. package/resources/data/deck/training/p/2023-01-01T21-18-23-886Z.md +26 -0
  73. package/resources/data/deck/training/p/2023-01-01T21-18-31-316Z.md +19 -0
  74. package/resources/data/deck/training/p/2023-01-01T21-18-42-290Z.md +23 -0
  75. package/resources/data/deck/training/p/2023-01-01T21-19-57-020Z.md +24 -0
  76. package/resources/data/deck/training/p/2023-01-01T21-22-31-184Z.md +13 -0
  77. package/resources/data/deck/training/p/2023-01-01T21-22-38-317Z.md +17 -0
  78. package/resources/data/deck/training/p/2023-01-01T21-22-47-693Z.md +20 -0
  79. package/resources/data/deck/training/p/2023-01-01T21-23-17-716Z.md +39 -0
  80. package/resources/data/deck/training/p/2023-01-01T21-23-28-532Z.md +22 -0
  81. package/resources/data/deck/training/p/2023-01-01T21-25-23-899Z.md +3 -0
  82. package/resources/data/deck/training/p/2023-01-01T21-25-59-742Z.md +1 -0
  83. package/resources/data/deck/training/p/2023-01-01T21-26-53-748Z.md +12 -0
  84. package/resources/data/deck/training/p/2023-01-01T23-38-42-863Z.md +2 -0
  85. package/resources/data/deck/training/p/2023-01-03T02-07-19-014Z.md +143 -0
  86. package/resources/data/deck/training/p/2023-01-04T01-52-23-454Z.md +76 -0
  87. package/resources/data/deck/training/p/2023-01-06T23-21-12-009Z.md +127 -0
  88. package/resources/data/deck/training/p/2023-01-06T23-21-31-685Z.md +81 -0
  89. package/resources/data/deck/training/p/2023-01-06T23-21-59-596Z.md +36 -0
  90. package/resources/data/deck/training/p/2023-01-06T23-34-13-897Z.md +87 -0
  91. package/resources/data/deck/training/p/2023-01-06T23-44-02-340Z.md +0 -0
  92. package/resources/data/deck/training/p/2023-01-06T23-46-36-687Z.md +1 -0
  93. package/resources/data/deck/training/p/2023-01-06T23-46-45-783Z.md +33 -0
  94. package/resources/data/deck/training/p/2023-01-08T00-45-11-144Z.md +50 -0
  95. package/resources/data/deck/training/p/2023-01-08T01-06-31-267Z.md +41 -0
  96. package/resources/data/deck/training/p/2023-01-08T01-24-21-088Z.md +95 -0
  97. package/resources/data/deck/training/p/2023-01-08T01-25-12-557Z.md +11 -0
  98. package/resources/data/deck/training/p/2023-01-08T01-46-50-723Z.md +25 -0
  99. package/resources/data/deck/training/p/2023-01-08T02-09-07-802Z.md +18 -0
  100. package/resources/data/deck/training/p/2023-01-08T02-09-19-678Z.md +66 -0
  101. package/resources/data/deck/training/p/2023-01-08T02-11-26-333Z.md +29 -0
  102. package/resources/data/deck/training/p/2023-01-08T17-22-48-841Z.md +14 -0
  103. package/resources/data/deck/training/p/2023-01-08T20-46-11-806Z.md +5 -0
  104. package/resources/data/deck/training/p/2023-01-08T20-47-23-682Z.md +5 -0
  105. package/resources/data/deck/training/p/2023-01-08T20-47-32-064Z.md +13 -0
  106. package/resources/data/deck/training/p/2023-01-08T20-47-57-045Z.md +0 -0
  107. package/resources/data/deck/training/p/2023-01-08T20-48-03-791Z.md +18 -0
  108. package/resources/data/deck/training/p/2023-01-08T20-48-32-466Z.md +9 -0
  109. package/resources/data/deck/training/p/2023-01-08T20-48-51-322Z.md +20 -0
  110. package/resources/data/deck/training/p/2023-01-08T20-49-52-741Z.md +0 -0
  111. package/resources/data/deck/training/p/2023-01-08T20-52-03-556Z.md +0 -0
  112. package/resources/data/deck/training/p/2023-01-08T20-57-36-333Z.md +2 -0
  113. package/resources/data/deck/training/p/2023-01-08T20-57-51-136Z.md +5 -0
  114. package/resources/data/deck/training/p/2023-01-09T00-07-37-951Z.md +0 -0
  115. package/resources/data/deck/training/p/2023-01-09T00-35-40-671Z.md +3 -0
  116. package/resources/data/deck/training/p/2023-01-10T01-29-38-148Z.md +10 -0
  117. package/resources/data/deck/training/p/2023-01-10T01-43-12-166Z.md +31 -0
  118. package/resources/data/deck/training/p/2023-01-10T02-21-54-303Z.md +10 -0
  119. package/resources/data/deck/training/p/2023-01-12T01-50-54-617Z.md +74 -0
  120. package/resources/data/deck/training/p/2023-01-13T19-55-24-735Z.md +14 -0
  121. package/resources/data/deck/training/p/2023-01-13T20-08-27-068Z.md +28 -0
  122. package/resources/data/deck/training/p/2023-01-13T20-23-38-411Z.md +25 -0
  123. package/resources/data/deck/training/p/2023-01-13T20-37-06-267Z.md +13 -0
  124. package/resources/data/deck/training/p/2023-01-13T21-05-57-708Z.md +8 -0
  125. package/resources/data/deck/training/p/2023-01-13T21-48-17-258Z.md +20 -0
  126. package/resources/data/deck/training/p/2023-01-13T22-05-05-799Z.md +14 -0
  127. package/resources/data/deck/training/p/2023-01-13T22-08-30-863Z.md +17 -0
  128. package/resources/data/deck/training/p/2023-01-13T23-01-50-449Z.md +4 -0
  129. package/resources/data/deck/training/p/2023-01-14T00-33-05-958Z.md +62 -0
  130. package/resources/data/deck/training/p/2023-01-14T00-40-27-784Z.md +229 -0
  131. package/resources/data/deck/training/p/2023-01-14T00-41-59-081Z.md +153 -0
  132. package/resources/data/deck/training/p/2023-01-14T13-50-28-199Z.md +19 -0
  133. package/resources/data/deck/training/p/2023-01-14T13-59-20-275Z.md +6 -0
  134. package/resources/data/deck/training/p/2023-01-14T14-03-29-456Z.md +3 -0
  135. package/resources/data/deck/training/p/2023-01-14T14-27-57-678Z.md +7 -0
  136. package/resources/data/deck/training/p/2023-01-14T17-30-18-228Z.md +33 -0
  137. package/resources/data/deck/training/p/2023-01-14T18-28-39-316Z.md +1 -0
  138. package/resources/data/deck/training/p/2023-01-14T18-28-44-115Z.md +4 -0
  139. package/resources/data/deck/training/p/2023-01-14T18-28-49-548Z.md +18 -0
  140. package/resources/data/deck/training/p/2023-01-14T18-40-13-758Z.md +10 -0
  141. package/resources/data/deck/training/p/2023-01-14T19-29-15-291Z.md +12 -0
  142. package/resources/data/deck/training/p/2023-01-15T18-51-52-134Z.md +83 -0
  143. package/resources/data/deck/training/p/2023-01-15T20-03-30-073Z.md +11 -0
  144. package/resources/data/deck/training/p/2023-01-15T22-07-52-073Z.md +16 -0
  145. package/resources/data/deck/training/p/2023-01-15T22-22-13-517Z.md +12 -0
  146. package/resources/data/deck/training/p/2023-01-15T22-28-57-508Z.md +131 -0
  147. package/resources/data/deck/training/p/2023-01-15T22-36-30-913Z.md +115 -0
  148. package/resources/data/deck/training/p/2023-01-16T16-03-40-770Z.md +12 -0
  149. package/resources/data/deck/training/p/2023-01-16T20-21-56-859Z.md +5 -0
  150. package/resources/data/deck/training/p/2023-01-16T20-24-09-690Z.md +24 -0
  151. package/resources/data/deck/training/p/2023-01-20T12-51-22-646Z.md +21 -0
  152. package/resources/data/deck/training/p/2023-01-20T13-06-46-614Z.md +9 -0
  153. package/resources/data/deck/training/p/2023-01-20T13-08-51-600Z.md +7 -0
  154. package/resources/data/deck/training/p/2023-01-20T15-20-13-363Z.md +26 -0
  155. package/resources/data/deck/training/p/2023-01-20T15-34-58-813Z.md +75 -0
  156. package/resources/data/deck/training/p/2023-01-21T16-33-20-458Z.md +33 -0
  157. package/resources/data/deck/training/p/2023-01-21T16-45-28-263Z.md +28 -0
  158. package/resources/data/deck/training/p/2023-01-21T16-56-25-452Z.md +3 -0
  159. package/resources/data/deck/training/p/2023-01-21T17-28-31-493Z.md +6 -0
  160. package/resources/data/deck/training/p/2023-01-21T19-49-51-918Z.md +13 -0
  161. package/resources/data/deck/training/p/2023-01-21T20-08-24-452Z.md +15 -0
  162. package/resources/data/deck/training/p/2023-01-21T20-35-54-947Z.md +20 -0
  163. package/resources/data/deck/training/p/2023-01-21T20-54-47-603Z.md +39 -0
  164. package/resources/data/deck/training/p/2023-01-21T20-56-28-184Z.md +25 -0
  165. package/resources/data/deck/training/p/2023-01-21T20-57-32-927Z.md +4 -0
  166. package/resources/data/deck/training/p/2023-01-21T23-13-33-394Z.md +6 -0
  167. package/resources/data/deck/training/p/2023-01-28T19-11-37-464Z.md +24 -0
  168. package/resources/data/deck/training/p/2023-01-28T20-43-41-188Z.md +9 -0
  169. package/resources/data/deck/training/p/2023-01-28T20-53-56-476Z.md +8 -0
  170. package/resources/data/deck/training/p/2023-01-28T20-58-43-776Z.md +10 -0
  171. package/resources/data/deck/training/p/2023-01-28T22-18-41-259Z.md +33 -0
  172. package/resources/data/deck/training/p/2023-01-28T22-24-34-808Z.md +24 -0
  173. package/resources/data/deck/training/p/2023-01-29T16-25-24-528Z.md +44 -0
  174. package/resources/data/deck/training/p/2023-01-29T21-14-32-588Z.md +12 -0
  175. package/resources/data/deck/training/p/2023-01-31T19-24-53-504Z.md +8 -0
  176. package/resources/data/deck/training/p/2023-01-31T20-33-55-855Z.md +11 -0
  177. package/resources/data/deck/training/p/2023-01-31T20-34-30-261Z.md +7 -0
  178. package/resources/data/deck/training/p/2023-01-31T20-52-53-367Z.md +43 -0
  179. package/resources/data/deck/training/p/2023-02-04T15-18-35-682Z.md +20 -0
  180. package/resources/data/deck/training/p/2023-02-04T15-49-47-597Z.md +14 -0
  181. package/resources/data/deck/training/p/2023-02-04T18-58-57-808Z.md +1 -0
  182. package/resources/data/deck/training/p/2023-02-04T20-07-11-288Z.md +1 -0
  183. package/resources/data/deck/training/p/2023-02-04T20-09-50-169Z.md +1 -0
  184. package/resources/data/deck/training/p/2023-02-04T20-19-42-740Z.md +8 -0
  185. package/resources/data/deck/training/p/2023-02-04T20-23-56-013Z.md +12 -0
  186. package/resources/data/deck/training/p/2023-02-04T20-28-12-391Z.md +20 -0
  187. package/resources/data/deck/training/p/2023-02-05T00-20-32-554Z.md +16 -0
  188. package/resources/data/deck/training/p/2023-02-05T00-35-56-282Z.md +13 -0
  189. package/resources/data/deck/training/p/2023-02-05T15-36-57-182Z.md +24 -0
  190. package/resources/data/deck/training/p/2023-02-05T17-39-51-712Z.md +70 -0
  191. package/resources/data/deck/training/p/2023-02-05T17-44-53-815Z.md +195 -0
  192. package/resources/data/deck/training/p/2023-02-05T17-45-40-114Z.md +92 -0
  193. package/resources/data/deck/training/p/2023-02-05T18-12-14-489Z.md +60 -0
  194. package/resources/data/deck/training/p/2023-02-06T00-14-54-457Z.md +9 -0
  195. package/resources/data/deck/training/p/2023-06-28T18-03-14-313Z.md +8 -0
  196. package/resources/data/deck/training/p/2023-06-28T18-26-17-290Z.md +7 -0
  197. package/resources/data/deck/training/p/2023-06-28T21-16-24-034Z.md +40 -0
  198. package/resources/data/deck/training/p/2023-06-28T21-16-34-972Z.md +16 -0
  199. package/resources/data/deck/training/p/2023-06-28T21-28-28-379Z.md +4 -0
  200. package/resources/data/deck/training/p/2023-06-29T23-15-10-411Z.md +5 -0
  201. package/resources/data/deck/training/p/2023-07-01T15-42-45-193Z.md +433 -0
  202. package/resources/data/deck/training/p/2023-07-01T21-54-31-329Z.md +6 -0
  203. package/resources/data/deck/training/p/2023-07-02T16-14-06-970Z.md +14 -0
  204. package/resources/data/deck/training/p/2023-07-31T00-26-03-842Z.md +4 -0
  205. package/resources/data/deck/training/p/2023-07-31T00-31-51-933Z.md +10 -0
  206. package/resources/data/deck/training/p/2023-07-31T00-37-21-927Z.md +205 -0
  207. package/resources/data/deck/training/p/2023-10-01T18-29-19-158Z.md +76 -0
  208. package/resources/data/deck/training/p/2023-10-07T19-18-28-517Z.md +102 -0
  209. package/resources/data/deck/training/p/2023-10-08T20-20-07-934Z.md +75 -0
  210. package/resources/data/deck/training/p/2023-10-08T20-20-37-336Z.md +29 -0
  211. package/resources/data/deck/training/p/2023-10-08T20-37-30-658Z.md +0 -0
  212. package/resources/data/deck/training/p/2023-10-08T21-58-25-809Z.md +68 -0
  213. package/resources/data/deck/training/p/2023-10-08T22-22-11-013Z.md +0 -0
  214. package/resources/data/deck/training/p/2023-10-14T19-25-08-153Z.md +119 -0
  215. package/resources/data/deck/training/t.json +1 -0
  216. package/resources/scss/src/apps/learnneo/home/{ContentComponent.scss → ContentView.scss} +9 -15
  217. package/resources/scss/theme-neo-light/Global.scss +46 -0
  218. package/resources/scss/theme-neo-light/design-tokens/Core.scss +7 -0
  219. package/resources/scss/theme-neo-light/design-tokens/Semantic.scss +0 -0
  220. package/resources/scss/theme-neo-light/design-tokens/_all.scss +4 -0
  221. package/src/DefaultConfig.mjs +4 -4
  222. package/src/form/field/Text.mjs +2 -2
  223. package/apps/learnneo/view/home/ContentComponent.mjs +0 -24
  224. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-07T19-18-28-517Z.md +0 -0
  225. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-20-07-934Z.md +0 -0
  226. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-20-37-336Z.md +0 -0
  227. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-37-30-658Z.md +0 -0
  228. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T21-58-25-809Z.md +0 -0
  229. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T22-22-11-013Z.md +0 -0
  230. /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-14T19-25-08-153Z.md +0 -0
  231. /package/resources/data/{learnneo → deck/learnneo}/pages/whyneo.md +0 -0
  232. /package/resources/data/{learnneo → deck/learnneo}/tree.json +0 -0
  233. /package/resources/{deck → data/deck}/whyneo.md +0 -0
  234. /package/resources/scss/src/apps/newwebsite/{MainContainer.css → MainContainer.scss} +0 -0
  235. /package/resources/scss/theme-neo-light/design-tokens/{Components.scss → Component.scss} +0 -0
@@ -0,0 +1,76 @@
1
+ Neo.mjs is a framework used to create browser-based applications.
2
+
3
+ Some key features and benefits of Neo.mjs are:
4
+
5
+ <div type="expander" caption="Multi-Threaded">
6
+ <p>
7
+ When a Neo.mjs application starts, the framework spawns three web-workers.
8
+ Web-workers are each run in their own thread. As a result, a typical Neo.mjs application
9
+ has four threads:
10
+ <ol>
11
+ <li>The _main_ thread, where DOM updates are applied
12
+ <li>An _application_ web-worker where normal application locic is run
13
+ <li>A _data_ web-worker were HTTP and socket calls are run
14
+ <li>A _view_ web-worker that manages delta updates
15
+ </ol>
16
+ </div>
17
+
18
+ <div type="expander" caption="Extreme Speed">
19
+ <p>
20
+ The Neo.mjs web-worker proccesses are automatically run in parallel, on separate CPU cores.
21
+ </p>
22
+ <p>
23
+ By contrast, other JavaScript frameworks run in a single thread. That means
24
+ in a typical framework all business logic, data handling, and DOM rendering compete for
25
+ CPU reasources.
26
+ </p>
27
+ <p>
28
+ This means Neo.mjs applications run and render faster. This is
29
+ particularly beneficial for processor- and data-intensive applications,
30
+ and applications that need to rapidly update what's viewed. In testing, Neo.mjs applications
31
+ easily apply over 20,000 DOM updates per second.
32
+ </p>
33
+ <p>
34
+ If the default four threads aren't enough, you're free to launch additional web-worker threads
35
+ to run other specialized logic.
36
+ </p>
37
+ </div>
38
+
39
+ <div type="expander" caption="Quick Application Development">
40
+ <p>
41
+ Neo.js classes let you specify properties in a way that allows code to detect "before" and "after"
42
+ changes. This makes it easy to handle value validation and transformation, and react to changes.
43
+ </p>
44
+ <p>
45
+ Neo.mjs also has elegant yet powerful state management features that make it easy to create shared,
46
+ bindable data. For example, if two components are bound to the same propery, a change to the
47
+ property will automatically be applied to both components.
48
+ </p>
49
+ </div>
50
+
51
+ <div type="expander" caption="Multi-Window Applications">
52
+ <p>
53
+ Neo.mjs applications can also launch as _shared web workers_, which allows you to have a single
54
+ application run in multiple browser windows; those windows could be moved to multiple monitors.
55
+ </p>
56
+ <p>
57
+ For example, you can have a data analysis application with a control panel on one monitor,
58
+ tabular data in another, and charts on another &mdash; all sharing the same data, handling events
59
+ across windows, running seamlessly as a single application.
60
+ </p>
61
+ </div>
62
+
63
+ <div type="expander" caption="Open-Source and Standards-Based">
64
+ <p>
65
+ Neo.mjs is an open-source library. Features needed for the community can be added to the
66
+ library via pull-requests. And since Neo.mjs uses the standard JavaScript class system,
67
+ all Neo.mjs classes can be extended.
68
+ </p>
69
+ <p>
70
+ Neo.mjs uses standard modular JavaScript, so developers don't need to learn non-standard language
71
+ syntax, and there's no need for special pre-compilers or WebPack modules.
72
+ That means fewer dependencies and easier configuration. Furthermore, the use of
73
+ standard JavaScript makes debugging easier: any statement you write while developing your
74
+ applcation can also be run in the debugging console.
75
+ </p>
76
+ </div>
@@ -0,0 +1,102 @@
1
+ Neo.mjs classes are standard JavaSript classes. Every source file
2
+ you write will be a class definition, extending some Neo.mjs
3
+ class.
4
+
5
+ <pre class="neo">
6
+ import Base from '../../../node_modules/neo.mjs/src/core/Base.mjs';
7
+
8
+ class Mammal extends Base {
9
+ static config = {
10
+ className: 'Simple.example.Mammal'
11
+ }
12
+ }
13
+
14
+ const myMammal = Neo.create(Mammal);
15
+
16
+ Neo.applyClassConfig(Mammal); // Where Neo.mjs initialializes the class config.
17
+ export default Mammal; // Makes the class available elsewhere.
18
+ </pre>
19
+
20
+ In the example above, we're extending the Neo.mjs base class. The static
21
+ config block describes the class we're defining.
22
+
23
+ All classes specify the `className`; you'll add other config properties to describe the class.
24
+
25
+ The `const myMammal = Neo.create(Mammal);` statement creates an instance of
26
+ our class. For the sake of our discussion we're putting that statement in the same source
27
+ file where the class is defined, but normally your code would import the class elsewhere,
28
+ and create instances as needed.
29
+
30
+ Let's add a `name` propery to the class.
31
+
32
+ <pre class="neo" style="color:gray">
33
+ import Base from '../../../node_modules/neo.mjs/src/core/Base.mjs';
34
+
35
+ class Mammal extends Base {
36
+ static config = {
37
+ className: 'Simple.example.Mammal',
38
+
39
+ <span style="color:#b91010">name: 'Anonymous'</span>
40
+ }
41
+ }
42
+
43
+ const myMammal = Neo.create(Mammal);
44
+ console.log(<span style="color:#b91010">myMammal.name</span>); // Logs "Anonymous"
45
+ <span style="color:#b91010">myMammal.name</span> = 'Herbert';
46
+ console.log(<span style="color:#b91010">myMammal.name</span>); // Logs "Herbert"
47
+
48
+ Neo.applyClassConfig(Mammal);
49
+
50
+ export default Mammal;
51
+ </pre>
52
+
53
+ In Neo.mjs, instance properties are usually added in the `static config` block.
54
+ The `static config` block does two things:
55
+ - It formally describes the properties API for your class.
56
+ - It lets Neo.mjs manage the initialization and lifecycle of those properties.
57
+
58
+ Think of the `static config` block as "these are the properties
59
+ that can be set as instances are created." Config properties can be introduced
60
+ anywhere in the class hierarchy.
61
+
62
+ Since our class defines a `name` property, we can specify that when creating
63
+ the instance, using the second argument to the `create` method.
64
+
65
+ <pre class="neo" style="color:gray">
66
+ const myMammal = Neo.create(Mammal, <span style="color:#b91010">{
67
+ name: 'Creature'
68
+ }</span>);
69
+ console.log(myMammal.name); // Logs "Creature"
70
+ </pre>
71
+
72
+
73
+ Since _you_ define those properties, you can
74
+ look for them in class methods and use them as needed.
75
+ Let's add a `speak()` method that uses the `name` property.
76
+
77
+ <pre class="neo" style="color:gray">
78
+ import Base from '../../../node_modules/neo.mjs/src/core/Base.mjs';
79
+
80
+ class Mammal extends Base {
81
+ static config = {
82
+ className: 'Simple.example.Mammal',
83
+
84
+ name: 'Anonymous'
85
+ }
86
+ <span style="color:#b91010">speak(){
87
+ console.log(`${this.name} is grunting`);
88
+ }</span>
89
+ }
90
+
91
+ const myMammal = Neo.create(Mammal, {
92
+ name: 'Creature'
93
+ });
94
+ <span style="color:#b91010">myMammal.speak();</span> // Logs "Creature is grunting."
95
+
96
+ Neo.applyClassConfig(Mammal);
97
+
98
+ export default Mammal;
99
+ </pre>
100
+
101
+
102
+
@@ -0,0 +1,75 @@
1
+ In Neo.mjs you sub-class and override methods in the usual way.
2
+
3
+ Here, we'll extend `Mammal` and override the `speak()` method.
4
+ (For brevity, we'll exclude `export` and `import` statements.)
5
+
6
+ <pre class="neo">
7
+ class Mammal extends Base {
8
+ static config = {
9
+ className: 'Simple.example.Mammal',
10
+
11
+ name: 'Anonymous'
12
+ }
13
+ speak(){
14
+ console.log(`(${this.name} is grunting)`);
15
+ }
16
+ }
17
+ Neo.applyClassConfig(Mammal);
18
+ </pre>
19
+ <pre class="neo">
20
+ class Human extends Mammal {
21
+ static config = {
22
+ className: 'Simple.example.Human',
23
+ }
24
+ speak(){
25
+ console.log(`Hello! My name is ${this.name}. I am ${this.married?'':'not'} married.`);
26
+ }
27
+ }
28
+
29
+ const myMammal = Neo.create(Human, {
30
+ name: 'Herbert'
31
+ });
32
+ myMammal.speak(); // Logs "Hello! My name is Herbert. I am not married."
33
+
34
+ Neo.applyClassConfig(Mammal);
35
+ </pre>
36
+
37
+ Any class in the hierarchy is free to add new properties and methods. Let's add
38
+ a property and behavior (method) to the Human class.
39
+
40
+ <pre class="neo">
41
+ import Base from '../../../node_modules/neo.mjs/src/core/Base.mjs';
42
+
43
+ class Mammal extends Base {
44
+ static config = {
45
+ className: 'Simple.example.Mammal',
46
+
47
+ name: 'Anonymous'
48
+ }
49
+ speak(){
50
+ console.log(`(${this.name} is grunting)`);
51
+ }
52
+ }
53
+ </pre>
54
+ <pre class="neo">
55
+ class Human extends Mammal {
56
+ static config = {
57
+ className: 'Simple.example.Human',
58
+ name: 'J. Doe',
59
+ married: false
60
+ }
61
+ speak(){
62
+ console.log(`Hello! My name is ${this.name}. I am ${this.married?'':'not'} married.`);
63
+ },
64
+ yodel(){
65
+ console.log('Yodelay hee hoo!');
66
+ }}
67
+
68
+ const myPerson = Neo.create(Human, {
69
+ name: 'Herbert'
70
+ });
71
+ myPerson.speak(); // Logs "Hello! My name is Herbert. I am not married."
72
+ myPerson.yodel(); // Logs "Yedelay hee hoo!"
73
+
74
+ Neo.applyClassConfig(Human);
75
+ </pre>
@@ -0,0 +1,29 @@
1
+ Neo.mjs uses standard modular JavaScript, so you're free to use other class
2
+ features, like private members.
3
+ <pre class="neo">
4
+ class Human extends Mammal {
5
+ static config = {
6
+ className: 'Simple.example.Human',
7
+ name: 'J. Doe',
8
+ married: false,
9
+ }
10
+ static #privateStaticField = 'foo'
11
+ #privateInstanceField = 'bar'
12
+ #privateInstanceMethod(){
13
+ console.log(`Psst. Don't tell anyone, but ${this.#privateInstanceField} and ${Human.#privateStaticField}`);
14
+ }
15
+ speak(tellSecret){
16
+ console.log(`Hello! My name is ${this.name}. I am ${this.married?'':'not'} married.`);
17
+ if (tellSecret) this.#privateInstanceMethod();
18
+ }
19
+ yodel(){
20
+ console.log('Yodelay hee hoo!');
21
+ }}
22
+
23
+ const myPerson = Neo.create(Human, {
24
+ name: 'Herbert'
25
+ });
26
+ myPerson.speak(true);
27
+
28
+ Neo.applyClassConfig(Human);
29
+ </pre>
@@ -0,0 +1,68 @@
1
+ To call a super-class method use the `super` keyword.
2
+
3
+ <pre class="neo" style="color:gray">
4
+ class Mammal extends Base {
5
+ static config = {
6
+ className: 'Simple.example.Mammal',
7
+
8
+ name: 'Anonymous'
9
+ }
10
+ doSomething(){
11
+ console.log(`${this.name} is doing something mammals do`)
12
+ }
13
+ }
14
+ Neo.applyClassConfig(Mammal);
15
+ </pre>
16
+ <pre class="neo" style="color:gray">
17
+ class Human extends Mammal {
18
+ static config = {
19
+ className: 'Simple.example.Human',
20
+ }
21
+ doSomething(){
22
+ <span style="color:#b91010">super.doSomething();</span>
23
+ console.log(`${this.name} is doing something humans do`)
24
+ }
25
+ }
26
+
27
+ const myPerson = Neo.create(Human, {
28
+ name: 'Herbert'
29
+ });
30
+ myPerson.doSomething();
31
+
32
+ Neo.applyClassConfig(Mammal);
33
+ </pre>
34
+
35
+ Sometimes you aren't sure if a super class has a method. In that case use the
36
+ conditional chaining operator &mdash; `?.`
37
+
38
+ <pre class="neo" style="color:gray">
39
+ class Mammal extends Base {
40
+ static config = {
41
+ className: 'Simple.example.Mammal',
42
+
43
+ name: 'Anonymous'
44
+ }
45
+ doSomething(){
46
+ console.log(`${this.name} is doing something mammals do`)
47
+ }
48
+ }
49
+ Neo.applyClassConfig(Mammal);
50
+ </pre>
51
+ <pre class="neo" style="color:gray">
52
+ class Human extends Mammal {
53
+ static config = {
54
+ className: 'Simple.example.Human',
55
+ }
56
+ doSomething(){
57
+ <span style="color:#b91010">super?.doSomething();</span>
58
+ console.log(`${this.name} is doing something humans do`)
59
+ }
60
+ }
61
+
62
+ const myPerson = Neo.create(Human, {
63
+ name: 'Herbert'
64
+ });
65
+ myPerson.doSomething();
66
+
67
+ Neo.applyClassConfig(Mammal);
68
+ </pre>
@@ -0,0 +1,119 @@
1
+ If you haven't already done it, run `npx neo-app` to create a Neo.mjs workspace.
2
+
3
+ <img src="resources/images/learn/NeoWorkspace.png" style="height: 400px;">
4
+
5
+ As you can see, a Neo.mjs workspace is a conventional npm workspace. If you run
6
+ the script `npm run server-start` from the workspace, Neo.mjs launches a web
7
+ serve whose doc root is the workspace.
8
+
9
+ <img src="resources/images/learn/ServerRoot.png" style="height: 400px;">
10
+
11
+ If you drill down into the `src` directory you'll see your applications.
12
+ The `docs` directory holds the Neo.mjs API docs. Examples are in the `examples` directory.
13
+
14
+ In order to discuss the structure of an app, we'll create a simple starter
15
+ app. To do that, run this command from the workspace.
16
+
17
+ `npm run create-app-empty`
18
+
19
+ At the first prompt, name the app `Foo`, and accept the default for everything else.
20
+ The script creates an application structured as follows.
21
+
22
+ <img src="resources/images/learn/FooFolder.png" style="height: 400px;">
23
+
24
+ These files are part of the typical structure of a Neo.mjs application. The files `index.html`, `app.mjs`, `neo-config.json`, `view/Viewport.mjs` are rarely modified.
25
+ You will, however, edit the main container, and its associated "controller" and "model",
26
+ as well as create new views, new controllers, etc.
27
+
28
+ Now let's look at a source file. This is the contents of `MainView.mjs`.
29
+
30
+ <pre class="neo">
31
+ import Base from '../../../node_modules/neo.mjs/src/container/Base.mjs';
32
+ import Controller from './MainViewController.mjs';
33
+ import ViewModel from './MainViewModel.mjs';
34
+
35
+ class MainView extends Base {
36
+ static config = {
37
+ className: 'Foo.view.MainView',
38
+
39
+ controller: {module: Controller},
40
+ model: {module: ViewModel},
41
+
42
+ layout: {ntype: 'fit'},
43
+ items: [],
44
+ }
45
+ }
46
+
47
+ Neo.applyClassConfig(MainView);
48
+
49
+ export default MainView;
50
+ </pre>
51
+
52
+ Neo.mjs views are composed of components. A component can be a "container", which means it
53
+ visually holds or groups other components, or a regular component, like a button.
54
+
55
+ The main view is a container because it extends `Base`, which is a reference to the
56
+ container base class imported in the first statement. The items in a container are configured
57
+ in `items:[]`, which is empty in this starter code.
58
+
59
+ This view also has a _controller_ and _model_. We'll talk about those later, but in a nutshell,
60
+ a controller is where event handling and app logic goes, and a model is where you set up shared
61
+ bindable data.
62
+
63
+ We'll go into a lot more depth about view, controllers, and models in other topics, but to let
64
+ you see how a component is configured let's put a button in the container.
65
+
66
+ First, we need to import the class that defines buttons. Then we'll describe the new button in the
67
+ `items:[].`
68
+
69
+ <pre class="neo">
70
+
71
+ import Base from '../../../node_modules/neo.mjs/src/container/Base.mjs';
72
+ import Controller from './MainViewController.mjs';
73
+ import ViewModel from './MainViewModel.mjs';
74
+ import Button from '../../../node_modules/neo.mjs/src/button/Base.mjs';
75
+
76
+ class MainView extends Base {
77
+ static config = {
78
+ className: 'Foo.view.MainView',
79
+
80
+ controller: {module: Controller},
81
+ model: {module: ViewModel},
82
+
83
+ layout: {ntype: 'fit'},
84
+ items: [{
85
+ module: Button,
86
+ text: 'Button'
87
+ }],
88
+ }
89
+ }
90
+
91
+ Neo.applyClassConfig(MainView);
92
+
93
+ export default MainView;
94
+ </pre>
95
+
96
+ Note the entry in +items:[]+. That's a description of the button that'll be created as the single
97
+ item in our container. In Neo.mjs terms we're _configuring_ the button. Neo.mjs is _declarative_,
98
+ which components and objects are _described_. It's an abstraction. In other words we're saying
99
+ what we want, but not how it's done. We want a button with some text &mdash; how that's done
100
+ isn't important here in the container. A non-declarative approach would be more focused on _how_,
101
+ where you might way "I want a &lt;button> HTML element with its innerHTML set to some value."
102
+
103
+ In another topic you'll learn about the Neo.mjs config system and declaratively describing
104
+ views, controllers, and other things.
105
+
106
+ If you run the +foo+ app you'll see one huge button. That's because the container is configured to
107
+ use the "fit" layout, which means the container is designed to hold one and only one component,
108
+ and that component will take up all available space. We could get a more normal looking button
109
+ by changing the layout.
110
+
111
+ `layout: {type:'vbox', align:'start},`
112
+
113
+ Change that line and look at the running application.
114
+
115
+ Neo.mjs has scores of component classes.
116
+ You can extend them to create your own reusable components and sets of components.
117
+
118
+ Other topics discuss coding applications, how the config system works, controllers,
119
+ and bindable data. However, as long as we're here
@@ -0,0 +1 @@
1
+ {"data":[{"id":"2022-12-29T19-31-05-548Z","parentId":null,"isLeaf":false,"name":"The Neo Philosophy"},{"id":"2022-12-29T19-31-30-507Z","parentId":"2022-12-29T19-31-05-548Z","isLeaf":true,"name":"What is Neo"},{"id":"2023-01-10T02-21-54-303Z","parentId":"2022-12-29T19-31-05-548Z","isLeaf":true,"name":"Exampless"},{"id":"2023-09-20T15-56-52-693Z","parentId":"2022-12-29T19-31-05-548Z","isLeaf":false,"name":"Coding Style"},{"id":"2023-01-10T01-29-38-148Z","parentId":"2023-09-20T15-56-52-693Z","isLeaf":true,"name":"Introduction"},{"id":"2022-12-29T19-31-55-091Z","parentId":"2023-09-20T15-56-52-693Z","isLeaf":true,"name":"History"},{"id":"2022-12-29T20-03-42-628Z","parentId":"2023-09-20T15-56-52-693Z","isLeaf":true,"name":"Browser-Based Runtime"},{"id":"2022-12-30T19-04-30-990Z","parentId":"2023-09-20T15-56-52-693Z","isLeaf":true,"name":"Neo's Approach"},{"id":"2022-12-29T20-21-20-669Z","parentId":"2023-09-20T15-56-52-693Z","isLeaf":true,"name":"Browser-Based Runtime (continued)"},{"id":"2022-12-27T21-54-09-743Z","parentId":null,"isLeaf":false,"name":"Earthquakes"},{"id":"2023-01-10T01-43-12-166Z","parentId":"2022-12-27T21-54-09-743Z","isLeaf":true,"name":"Lab: Create a Workspace"},{"id":"2022-12-27T21-54-52-300Z","parentId":"2022-12-27T21-54-09-743Z","isLeaf":true,"name":"Useful Scripts"},{"id":"2022-12-29T20-36-54-785Z","parentId":"2022-12-27T21-54-09-743Z","isLeaf":false,"name":"Anatomy"},{"id":"2022-12-27T21-55-23-144Z","parentId":"2022-12-29T20-36-54-785Z","isLeaf":true,"name":".msj"},{"id":"2022-12-29T20-37-08-919Z","parentId":"2022-12-29T20-36-54-785Z","isLeaf":true,"name":"Class-based"},{"id":"2022-12-29T20-37-20-344Z","parentId":"2022-12-29T20-36-54-785Z","isLeaf":true,"name":"Declarative"},{"id":"2022-12-27T21-55-30-948Z","parentId":"2022-12-27T21-54-09-743Z","isLeaf":true,"name":"Order of Execution"},{"id":"2022-12-29T18-36-56-893Z","parentId":"2022-12-27T21-54-09-743Z","isLeaf":true,"name":"Lab: Generate an App "},{"id":"2022-12-29T15-49-59-475Z","parentId":"2022-12-27T21-54-09-743Z","isLeaf":false,"name":"Chrome Devtools"},{"id":"2022-12-29T15-56-54-485Z","parentId":"2022-12-29T15-49-59-475Z","isLeaf":true,"name":"Neo Workers"},{"id":"2022-12-29T18-34-25-826Z","parentId":"2022-12-29T15-49-59-475Z","isLeaf":true,"name":"DevTools JavaScript Context"},{"id":"2022-12-29T15-57-11-499Z","parentId":"2022-12-29T15-49-59-475Z","isLeaf":true,"name":"Getting a Reference to a Component"},{"id":"2023-07-01T21-54-31-329Z","parentId":"2022-12-29T15-49-59-475Z","isLeaf":true,"name":"Don't Use these in App Logic"},{"id":"2023-06-28T21-15-43-718Z","parentId":"2022-12-29T15-49-59-475Z","isLeaf":false,"name":"A Handy Way to Select Components"},{"id":"2023-06-28T18-03-14-313Z","parentId":"2023-06-28T21-15-43-718Z","isLeaf":true,"name":"Introduction"},{"id":"2023-06-28T21-28-28-379Z","parentId":"2023-06-28T21-15-43-718Z","isLeaf":true,"name":"What We Need to Code"},{"id":"2023-06-28T21-16-24-034Z","parentId":"2023-06-28T21-15-43-718Z","isLeaf":true,"name":"Main Thread Code"},{"id":"2023-06-28T21-16-34-972Z","parentId":"2023-06-28T21-15-43-718Z","isLeaf":true,"name":"The Neo.mjs Code to Detect the Event"},{"id":"2023-06-28T18-26-17-290Z","parentId":"2023-06-28T21-15-43-718Z","isLeaf":true,"name":"Demo"},{"id":"2022-12-29T16-00-13-223Z","parentId":"2022-12-29T15-49-59-475Z","isLeaf":true,"name":"Changing Properties"},{"id":"2022-12-31T18-43-56-338Z","parentId":"2022-12-29T15-49-59-475Z","isLeaf":true,"name":"Changing Properties (Continued)"},{"id":"2022-12-31T18-51-50-682Z","parentId":"2022-12-29T15-49-59-475Z","isLeaf":true,"name":"Changing Properties (Continued)"},{"id":"2022-12-31T18-54-04-176Z","parentId":"2022-12-29T15-49-59-475Z","isLeaf":true,"name":"Running Methods"},{"id":"2022-12-29T18-36-08-226Z","parentId":"2022-12-29T15-49-59-475Z","isLeaf":true,"name":"Lab: Introduction to Debugging"},{"id":"2022-12-27T22-13-00-809Z","parentId":"2022-12-27T21-54-09-743Z","isLeaf":false,"name":"Let's Do Something More Interesting"},{"id":"2023-01-08T02-30-13-460Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":false,"name":"Introduction"},{"id":"2022-12-31T23-00-41-222Z","parentId":"2023-01-08T02-30-13-460Z","isLeaf":true,"name":"Introduction"},{"id":"2023-01-08T01-25-12-557Z","parentId":"2023-01-08T02-30-13-460Z","isLeaf":true,"name":"Goals"},{"id":"2023-06-29T23-15-10-411Z","parentId":"2023-01-08T02-30-13-460Z","isLeaf":true,"name":"Key Concepts"},{"id":"2023-01-08T02-11-26-333Z","parentId":"2023-01-08T02-30-13-460Z","isLeaf":true,"name":"The Forest and the Trees"},{"id":"2022-12-27T21-55-43-542Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Let's Add a Table to the App"},{"id":"2022-12-27T22-23-55-083Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"It Does a Lot!"},{"id":"2022-12-27T22-24-07-886Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Key Features"},{"id":"2023-01-01T17-49-18-429Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Inspect the Store"},{"id":"2022-12-27T22-26-59-121Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":false,"name":"Let's Take a Closer Look at the Store"},{"id":"2022-12-27T22-24-52-295Z","parentId":"2022-12-27T22-26-59-121Z","isLeaf":true,"name":"Declarative"},{"id":"2022-12-27T22-25-03-853Z","parentId":"2022-12-27T22-26-59-121Z","isLeaf":true,"name":"Class Based"},{"id":"2022-12-27T22-44-41-791Z","parentId":"2022-12-27T22-26-59-121Z","isLeaf":true,"name":"Neo.data.Store"},{"id":"2022-12-27T22-44-28-881Z","parentId":"2022-12-27T22-26-59-121Z","isLeaf":true,"name":"Neo.data.Model"},{"id":"2023-07-01T15-42-45-193Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Lab: Create a new buildScript"},{"id":"2022-12-31T22-11-55-555Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Lab: Earthquakes \u2014 Create the App"},{"id":"2022-12-27T22-43-58-924Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"<b>Refactor the Table into a Class</b>"},{"id":"2023-01-01T18-44-07-034Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Earthquakes Table"},{"id":"2022-12-31T23-18-55-655Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Lab: Earthquakes \u2014 Refactor"},{"id":"2022-12-27T22-45-21-032Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"The Earthquakes Table is Reusable"},{"id":"2023-01-01T19-04-22-830Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Sharing the Store"},{"id":"2022-12-27T22-49-22-078Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"<b>Component (View) Models</b>"},{"id":"2022-12-27T22-50-20-626Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Example"},{"id":"2023-01-04T01-52-23-454Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Adding a Component Model to Hold the Store"},{"id":"2023-01-08T00-45-11-144Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Refactor the model"},{"id":"2023-01-03T02-07-19-014Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Lab: Earthquakes \u2014 Use a Component Model"},{"id":"2022-12-31T23-25-40-735Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Neo.component.wrapper.GoogleMaps"},{"id":"2023-01-01T18-47-39-766Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Earthquakes Map"},{"id":"2023-01-12T01-50-54-617Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Lab: Earthquakes \u2014 Add a map"},{"id":"2022-12-31T23-25-51-014Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"<b>Events</b>"},{"id":"2023-01-08T01-06-31-267Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Lab: Earthquakes \u2014 Listen to Events"},{"id":"2023-01-01T21-26-53-748Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"<b>Controllers</b>"},{"id":"2023-01-08T01-46-50-723Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Controllers are Simple"},{"id":"2023-01-08T01-24-21-088Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Lab: Earthquakes \u2014 Put the Listeners in the Controller "},{"id":"2023-07-31T00-26-03-842Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"<b>Multi-Window</b>"},{"id":"2023-07-31T00-31-51-933Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"SharedWorker"},{"id":"2023-07-31T00-37-21-927Z","parentId":"2022-12-27T22-13-00-809Z","isLeaf":true,"name":"Lab: Earthquakes &mdash; Make the Application Multi-Window"},{"id":"2023-01-08T01-21-48-916Z","parentId":"2022-12-27T21-54-09-743Z","isLeaf":false,"name":"Review"},{"id":"2023-01-08T02-09-19-678Z","parentId":"2023-01-08T01-21-48-916Z","isLeaf":true,"name":"Review"},{"id":"2023-01-08T02-09-07-802Z","parentId":"2023-01-08T01-21-48-916Z","isLeaf":true,"name":"What's Difficult"},{"id":"2023-01-06T23-44-18-920Z","parentId":null,"isLeaf":false,"name":"Yelp"},{"id":"2023-01-06T23-44-02-340Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"What We'll be Coding"},{"id":"2023-01-06T23-46-36-687Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"What We'll be Coding"},{"id":"2023-01-06T23-46-45-783Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"The Feed"},{"id":"2023-01-01T21-14-45-740Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Create the App"},{"id":"2023-01-14T13-47-50-821Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":false,"name":"Neo.component.Base"},{"id":"2023-01-13T21-05-57-708Z","parentId":"2023-01-14T13-47-50-821Z","isLeaf":true,"name":"Neo.component.Base"},{"id":"2023-01-14T13-50-28-199Z","parentId":"2023-01-14T13-47-50-821Z","isLeaf":true,"name":"Properties"},{"id":"2023-01-14T19-29-15-291Z","parentId":"2023-01-14T13-47-50-821Z","isLeaf":true,"name":"Style"},{"id":"2023-01-14T13-59-20-275Z","parentId":"2023-01-14T13-47-50-821Z","isLeaf":true,"name":"Events"},{"id":"2023-01-14T14-03-29-456Z","parentId":"2023-01-14T13-47-50-821Z","isLeaf":true,"name":"Methods"},{"id":"2023-01-15T20-03-30-073Z","parentId":"2023-01-14T13-47-50-821Z","isLeaf":true,"name":"reference"},{"id":"2023-01-06T23-34-13-897Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Create the Banner"},{"id":"2023-01-01T21-11-08-828Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":false,"name":"<b>Config</b>"},{"id":"2023-01-13T23-01-50-449Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"Introduction"},{"id":"2023-07-02T16-14-06-970Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"The config:{} Block"},{"id":"2023-01-01T21-11-58-025Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"Normal Properties"},{"id":"2023-01-01T21-12-37-340Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"property_"},{"id":"2023-01-16T16-03-40-770Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"Assigning Values"},{"id":"2023-01-01T21-13-13-880Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"Lifecycle Methods"},{"id":"2023-01-13T19-55-24-735Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"User beforeSet to Validate"},{"id":"2023-01-13T20-08-27-068Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"Use beforeSet to Transform"},{"id":"2023-01-13T22-05-05-799Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"Use beforeSet to Create a Defensive Copy"},{"id":"2023-01-13T20-23-38-411Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"Use afterSet for Side Effects or Firing Events"},{"id":"2023-01-13T20-37-06-267Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"Use beforeGet to Control What the Get Returns"},{"id":"2023-01-13T22-08-30-863Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"Use beforeGet to Return a Defensive Copy"},{"id":"2023-01-14T14-27-57-678Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"Component Property Lifecycle Methods"},{"id":"2023-01-14T17-30-18-228Z","parentId":"2023-01-01T21-11-08-828Z","isLeaf":true,"name":"Calling Super Class Methods"},{"id":"2023-01-01T21-16-22-773Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":false,"name":"Containers"},{"id":"2023-01-01T21-18-23-886Z","parentId":"2023-01-01T21-16-22-773Z","isLeaf":true,"name":"items:[]"},{"id":"2023-01-14T17-48-39-137Z","parentId":"2023-01-01T21-16-22-773Z","isLeaf":false,"name":"layout:{}"},{"id":"2023-01-01T21-18-42-290Z","parentId":"2023-01-14T17-48-39-137Z","isLeaf":true,"name":"Introduction"},{"id":"2023-01-14T18-28-39-316Z","parentId":"2023-01-14T17-48-39-137Z","isLeaf":true,"name":"fit"},{"id":"2023-01-14T18-28-44-115Z","parentId":"2023-01-14T17-48-39-137Z","isLeaf":true,"name":"card"},{"id":"2023-01-14T18-28-49-548Z","parentId":"2023-01-14T17-48-39-137Z","isLeaf":true,"name":"vbox, hbox"},{"id":"2023-01-14T18-40-13-758Z","parentId":"2023-01-14T17-48-39-137Z","isLeaf":true,"name":"flexbox"},{"id":"2023-01-01T21-18-31-316Z","parentId":"2023-01-01T21-16-22-773Z","isLeaf":true,"name":"itemDefaults"},{"id":"2023-01-01T21-19-57-020Z","parentId":"2023-01-01T21-16-22-773Z","isLeaf":true,"name":"add()"},{"id":"2023-01-15T22-22-13-517Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Warning!"},{"id":"2023-01-20T12-51-22-646Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Goals"},{"id":"2023-01-06T23-21-12-009Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Create the Filter Container"},{"id":"2023-01-15T18-51-52-134Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Create get/set Properties for City and Category"},{"id":"2023-01-15T22-28-57-508Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Update the UI as the Properties Change"},{"id":"2023-01-15T22-36-30-913Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Update the Properties as the UI Changes"},{"id":"2023-01-15T22-07-52-073Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Those Labs Were Lengthy!"},{"id":"2023-01-01T21-21-02-577Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":false,"name":"Events"},{"id":"2023-01-01T21-22-31-184Z","parentId":"2023-01-01T21-21-02-577Z","isLeaf":true,"name":"Terminology"},{"id":"2023-01-01T21-22-38-317Z","parentId":"2023-01-01T21-21-02-577Z","isLeaf":true,"name":"Declarative"},{"id":"2023-01-01T21-22-47-693Z","parentId":"2023-01-01T21-21-02-577Z","isLeaf":true,"name":"Procedural"},{"id":"2023-01-08T17-22-48-841Z","parentId":"2023-01-01T21-21-02-577Z","isLeaf":true,"name":"Buttons"},{"id":"2023-01-01T21-23-17-716Z","parentId":"2023-01-01T21-21-02-577Z","isLeaf":true,"name":"How it Works"},{"id":"2023-01-01T21-23-28-532Z","parentId":"2023-01-01T21-21-02-577Z","isLeaf":true,"name":"Firing Your Own Events"},{"id":"2023-01-06T23-21-31-685Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Fire cityChange Event"},{"id":"2023-01-01T21-24-25-230Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":false,"name":"Panels"},{"id":"2023-01-01T23-38-42-863Z","parentId":"2023-01-01T21-24-25-230Z","isLeaf":true,"name":"Introduction"},{"id":"2023-01-16T20-21-56-859Z","parentId":"2023-01-01T21-24-25-230Z","isLeaf":true,"name":"headers:[]"},{"id":"2023-01-08T20-57-36-333Z","parentId":"2023-01-01T21-24-25-230Z","isLeaf":true,"name":"Toolbars"},{"id":"2023-01-08T20-57-51-136Z","parentId":"2023-01-01T21-24-25-230Z","isLeaf":true,"name":"Buttons"},{"id":"2023-01-14T00-17-55-115Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":false,"name":"Tab Panels"},{"id":"2023-01-16T20-24-09-690Z","parentId":"2023-01-14T00-17-55-115Z","isLeaf":true,"name":"Neo.tab.Container"},{"id":"2022-12-28T17-11-34-653Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Create the Tab Panel and Map"},{"id":"2022-12-28T16-58-00-245Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":false,"name":"Component (View) Models"},{"id":"2022-12-28T17-13-09-994Z","parentId":"2022-12-28T16-58-00-245Z","isLeaf":true,"name":"Introduction"},{"id":"2022-12-28T16-58-47-786Z","parentId":"2022-12-28T16-58-00-245Z","isLeaf":true,"name":"Structure"},{"id":"2022-12-28T21-31-39-670Z","parentId":"2022-12-28T16-58-00-245Z","isLeaf":false,"name":"Exploring Component Models"},{"id":"2022-12-28T17-10-18-058Z","parentId":"2022-12-28T21-31-39-670Z","isLeaf":true,"name":"The Bound Property Must Have a Setter"},{"id":"2022-12-29T01-43-32-431Z","parentId":"2022-12-28T21-31-39-670Z","isLeaf":true,"name":"One-Way Binding"},{"id":"2022-12-28T17-10-42-296Z","parentId":"2022-12-28T21-31-39-670Z","isLeaf":true,"name":"Your Own Setter Versus a Config"},{"id":"2022-12-28T21-32-14-420Z","parentId":"2022-12-28T21-31-39-670Z","isLeaf":true,"name":"Syncing Properties without Component Models"},{"id":"2022-12-28T16-58-55-192Z","parentId":"2022-12-28T21-31-39-670Z","isLeaf":true,"name":"Component Model \u2014 Inline vs Class"},{"id":"2023-01-20T13-06-46-614Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Neo.controller.Component Review"},{"id":"2023-01-20T13-08-51-600Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Neo.controller.Component Review"},{"id":"2023-01-14T00-33-05-958Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Bind the Map Center"},{"id":"2023-01-20T15-20-13-363Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Create View Mode and Conroller Classes"},{"id":"2023-01-06T23-21-59-596Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Bind City and Category"},{"id":"2023-01-20T15-34-58-813Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Detect Changes to View Model Properties"},{"id":"2023-01-01T21-27-44-418Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":false,"name":"Sending and Receiving Data"},{"id":"2023-01-08T20-17-25-083Z","parentId":"2023-01-01T21-27-44-418Z","isLeaf":false,"name":"Neo.data.*"},{"id":"2023-01-08T20-18-07-668Z","parentId":"2023-01-08T20-17-25-083Z","isLeaf":false,"name":"Introduction"},{"id":"2023-01-08T20-44-13-323Z","parentId":"2023-01-08T20-17-25-083Z","isLeaf":false,"name":"Neo.data.Store"},{"id":"2023-01-08T20-47-23-682Z","parentId":"2023-01-08T20-44-13-323Z","isLeaf":true,"name":"Introduction"},{"id":"2023-01-21T20-57-32-927Z","parentId":"2023-01-08T20-44-13-323Z","isLeaf":true,"name":"Commonly Used Configs"},{"id":"2023-01-21T16-33-14-852Z","parentId":"2023-01-08T20-44-13-323Z","isLeaf":false,"name":"Creating"},{"id":"2023-01-21T16-33-20-458Z","parentId":"2023-01-21T16-33-14-852Z","isLeaf":true,"name":"In-line \"store\" Config"},{"id":"2023-01-21T16-45-28-263Z","parentId":"2023-01-21T16-33-14-852Z","isLeaf":true,"name":"Creating a Store in the View Model"},{"id":"2023-01-21T16-56-25-452Z","parentId":"2023-01-21T16-33-14-852Z","isLeaf":true,"name":"Create and Use a Store Class"},{"id":"2023-01-21T17-28-31-493Z","parentId":"2023-01-21T16-33-14-852Z","isLeaf":true,"name":"Neo.create()"},{"id":"2023-01-08T20-47-32-064Z","parentId":"2023-01-08T20-44-13-323Z","isLeaf":true,"name":"Fetching Data"},{"id":"2023-01-21T20-56-28-184Z","parentId":"2023-01-08T20-44-13-323Z","isLeaf":true,"name":"responseRoot"},{"id":"2023-01-08T20-48-32-466Z","parentId":"2023-01-08T20-44-13-323Z","isLeaf":true,"name":"Selecting Records"},{"id":"2023-01-09T00-19-42-024Z","parentId":"2023-01-08T20-44-13-323Z","isLeaf":false,"name":"Sorting"},{"id":"2023-01-08T20-48-03-791Z","parentId":"2023-01-09T00-19-42-024Z","isLeaf":true,"name":"Sorting"},{"id":"2023-01-09T00-35-40-671Z","parentId":"2023-01-09T00-19-42-024Z","isLeaf":true,"name":"Methods"},{"id":"2023-01-08T20-47-57-045Z","parentId":"2023-01-08T20-44-13-323Z","isLeaf":true,"name":"Filtering"},{"id":"2023-01-09T00-07-37-951Z","parentId":"2023-01-08T20-44-13-323Z","isLeaf":true,"name":"Grouping"},{"id":"2023-01-08T20-18-54-411Z","parentId":"2023-01-08T20-17-25-083Z","isLeaf":false,"name":"Neo.data.Model"},{"id":"2023-01-08T20-46-11-806Z","parentId":"2023-01-08T20-18-54-411Z","isLeaf":true,"name":"Neo.data.Model"},{"id":"2023-01-21T20-08-24-452Z","parentId":"2023-01-08T20-18-54-411Z","isLeaf":true,"name":"fields[]"},{"id":"2023-01-21T19-49-51-918Z","parentId":"2023-01-08T20-18-54-411Z","isLeaf":true,"name":"Field#calculate()"},{"id":"2023-01-21T20-35-54-947Z","parentId":"2023-01-08T20-18-54-411Z","isLeaf":true,"name":"Example"},{"id":"2023-01-08T20-48-51-322Z","parentId":"2023-01-08T20-18-54-411Z","isLeaf":true,"name":"Neo.data.RecordFactory"},{"id":"2023-01-08T20-49-52-741Z","parentId":"2023-01-01T21-27-44-418Z","isLeaf":true,"name":"Neo.data.connection.Xhr"},{"id":"2023-01-08T20-52-03-556Z","parentId":"2023-01-01T21-27-44-418Z","isLeaf":true,"name":"Neo.data.connection.WebSocket"},{"id":"2023-01-21T20-54-47-603Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"The Data Feed"},{"id":"2023-01-14T00-40-27-784Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Fetch Yelp Data"},{"id":"2023-01-21T23-13-33-394Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Contemplate the Moment"},{"id":"2023-01-01T21-29-09-942Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":false,"name":"Tables"},{"id":"2023-01-28T19-11-37-464Z","parentId":"2023-01-01T21-29-09-942Z","isLeaf":true,"name":"Introduction"},{"id":"2023-01-28T20-53-56-476Z","parentId":"2023-01-01T21-29-09-942Z","isLeaf":true,"name":"columns:[]"},{"id":"2023-01-28T20-58-43-776Z","parentId":"2023-01-01T21-29-09-942Z","isLeaf":true,"name":"renderer"},{"id":"2023-01-28T22-24-34-808Z","parentId":"2023-01-01T21-29-09-942Z","isLeaf":true,"name":"Example"},{"id":"2023-01-28T22-18-41-259Z","parentId":"2023-01-01T21-29-09-942Z","isLeaf":true,"name":"Example"},{"id":"2023-01-28T20-43-41-188Z","parentId":"2023-01-01T21-29-09-942Z","isLeaf":true,"name":"Anatomy"},{"id":"2023-01-29T16-25-24-528Z","parentId":"2023-01-01T21-29-09-942Z","isLeaf":true,"name":"Selection"},{"id":"2023-01-29T21-14-32-588Z","parentId":"2023-01-01T21-29-09-942Z","isLeaf":true,"name":"What's Selected"},{"id":"2023-01-14T00-41-59-081Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Add a Table"},{"id":"2023-01-01T21-28-12-759Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":false,"name":"Forms and Fields"},{"id":"2023-01-31T20-34-30-261Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Introduction"},{"id":"2023-02-04T20-09-50-169Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Hierarchy"},{"id":"2023-01-31T20-33-55-855Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Fields are Name/Value Pairs"},{"id":"2023-02-04T20-19-42-740Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Neo.form.field.Base"},{"id":"2023-02-04T20-23-56-013Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Neo.form.field.Text"},{"id":"2023-01-31T20-52-53-367Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Neo.form.field.Text"},{"id":"2023-02-04T15-49-47-597Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Neo.form.field.Text Validation"},{"id":"2023-02-04T20-28-12-391Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Neo.form.field.Text validator()"},{"id":"2023-02-06T00-14-54-457Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Neo.form.field.Number"},{"id":"2023-02-05T00-20-32-554Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Neo.form.field.Picker Components"},{"id":"2023-02-04T15-18-35-682Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"triggers"},{"id":"2023-02-05T00-35-56-282Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Neo.form.field.Select"},{"id":"2023-02-05T15-36-57-182Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Neo.form.field.Select"},{"id":"2023-01-31T19-24-53-504Z","parentId":"2023-01-01T21-28-12-759Z","isLeaf":true,"name":"Neo.form.Container"},{"id":"2023-02-05T17-39-51-712Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Encapsulate the Tab Panel View"},{"id":"2023-02-05T18-12-14-489Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Create the Detail Panel"},{"id":"2023-02-05T17-44-53-815Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Show Business Details"},{"id":"2023-02-05T17-45-40-114Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":true,"name":"Lab: Yelp \u2014 Add a Form"},{"id":"2023-01-21T16-21-16-292Z","parentId":"2023-01-06T23-44-18-920Z","isLeaf":false,"name":"Styling"},{"id":"2023-01-10T01-09-10-911Z","parentId":null,"isLeaf":false,"name":"iTunes"}]}
@@ -1,26 +1,20 @@
1
1
  .learn-content {
2
- font-family : 'Open Sans';
3
- font-size : 13pt;
2
+ font-family: 'Open Sans';
3
+ font-size: 13pt;
4
4
  letter-spacing: 1px;
5
- overflow : scroll;
6
- padding : 1em;
5
+ overflow: scroll;
6
+ padding: 1em;
7
7
 
8
8
  em,
9
9
  i {
10
10
  font-family: Palatino, "Times New Roman", serif;
11
- font-size : 1.07em;
11
+ font-size: 1.07em;
12
12
  }
13
13
 
14
14
  p {
15
15
  margin: 0.5em 0em 0.7em 0em;
16
16
  }
17
17
 
18
- mark {
19
- background-color: #B8FCE3;
20
- color : black;
21
- padding : 0.1em 0.2em;
22
- }
23
-
24
18
  details summary {
25
19
  cursor: pointer;
26
20
  transition: margin 300ms ease-out;
@@ -48,14 +42,14 @@
48
42
  }
49
43
 
50
44
  details summary::before {
51
- color : #c4c4c4;
45
+ color: #c4c4c4;
52
46
  font-family: var(--fa-style-family, "Font Awesome 6 Free");
53
- font-size : 1.3em;
47
+ font-size: 1.3em;
54
48
  font-weight: var(--fa-style, 900);
55
- margin : 0.4em 0.4em 0.4em 0;
49
+ margin: 0.4em 0.4em 0.4em 0;
56
50
  }
57
51
 
58
52
  summary::-webkit-details-marker {
59
53
  display: none;
60
54
  }
61
- }
55
+ }
@@ -5,3 +5,49 @@
5
5
  --neo-font-family : "Helvetica Neue", "Helvetica", "Arial", "Lucida Grande", sans-serif;
6
6
  --neo-font-smoothing : antialiased;
7
7
  }
8
+
9
+ @import "../../../resources/scss/theme-neo-light/design-tokens/_all.scss";
10
+
11
+ h1 {
12
+ color : var(--semantic-color-fg-contrast);
13
+ font-family : var(--core-fontfamily-sans);
14
+ font-size : var(--core-fontsize-h1);
15
+ font-weight : var(--core-fontweight-semibold);
16
+ letter-spacing : -0.02em;
17
+ line-height : var(--core-lineheight-headline);
18
+ }
19
+
20
+
21
+ h2 {
22
+ color : var(--semantic-color-fg-contrast);
23
+ font-family : var(--core-fontfamily-sans);
24
+ font-size : var(--core-fontsize-h2);
25
+ font-weight : var(--core-fontweight-semibold);
26
+ letter-spacing : -0.02em;
27
+ line-height : var(--core-lineheight-headline);
28
+ }
29
+
30
+ p {
31
+ color : var(--semantic-color-fg-default);
32
+ font-family : var(--core-fontfamily-sans);
33
+ font-size : var(--core-fontsize-body);
34
+ font-weight : var(--core-fontweight-regular);
35
+ line-height : var(--core-lineheight-paragraph);
36
+ }
37
+
38
+ // code {
39
+ // background-color: #ededed;
40
+ // border-radius : 2px;
41
+ // color : var(--semantic-color-fg-contrast);
42
+ // font-family : var(--core-fontfamily-mono);
43
+ // font-size : var(--core-fontsize-body);
44
+ // font-weight : var(--core-fontweight-regular);
45
+ // line-height : var(--core-lineheight-headline);
46
+ // padding : 2px 0.3em;
47
+ // }
48
+
49
+ mark {
50
+ background-color: #B8FCE3;
51
+ color : black;
52
+ padding : 0.1em 0.2em;
53
+ }