neo.mjs 10.0.0-beta.4 → 10.0.0-beta.6

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 (485) hide show
  1. package/.github/RELEASE_NOTES/v10.0.0-beta.4.md +2 -2
  2. package/.github/RELEASE_NOTES/v10.0.0-beta.5.md +70 -0
  3. package/.github/RELEASE_NOTES/v10.0.0-beta.6.md +48 -0
  4. package/.github/epic-functional-components.md +498 -0
  5. package/.github/ticket-asymmetric-vdom-updates.md +122 -0
  6. package/README.md +0 -3
  7. package/ServiceWorker.mjs +2 -2
  8. package/apps/colors/store/Colors.mjs +1 -0
  9. package/apps/colors/view/GridContainer.mjs +3 -0
  10. package/apps/colors/view/HeaderToolbar.mjs +2 -0
  11. package/apps/colors/view/Viewport.mjs +3 -0
  12. package/apps/covid/view/FooterContainer.mjs +3 -0
  13. package/apps/covid/view/GalleryContainer.mjs +2 -0
  14. package/apps/covid/view/GalleryContainerController.mjs +1 -0
  15. package/apps/covid/view/HeaderContainer.mjs +2 -0
  16. package/apps/covid/view/HelixContainer.mjs +2 -0
  17. package/apps/covid/view/HelixContainerController.mjs +1 -0
  18. package/apps/covid/view/MainContainer.mjs +3 -0
  19. package/apps/covid/view/TableContainer.mjs +3 -0
  20. package/apps/covid/view/TableContainerController.mjs +1 -0
  21. package/apps/covid/view/WorldMapContainer.mjs +2 -0
  22. package/apps/covid/view/country/Gallery.mjs +3 -0
  23. package/apps/covid/view/country/Helix.mjs +8 -0
  24. package/apps/covid/view/country/HistoricalDataTable.mjs +1 -0
  25. package/apps/covid/view/country/Table.mjs +2 -0
  26. package/apps/covid/view/mapboxGl/Component.mjs +1 -0
  27. package/apps/covid/view/mapboxGl/Container.mjs +2 -0
  28. package/apps/email/EPIC_PLAN.md +58 -0
  29. package/apps/email/neo-config.json +2 -2
  30. package/apps/email/store/Emails.mjs +11 -1
  31. package/apps/email/view/ComposeView.mjs +44 -0
  32. package/apps/email/view/MainView.mjs +89 -0
  33. package/apps/email/view/Viewport.mjs +4 -33
  34. package/apps/email/view/ViewportStateProvider.mjs +3 -3
  35. package/apps/form/store/SideNav.mjs +1 -0
  36. package/apps/form/view/FormContainer.mjs +1 -0
  37. package/apps/form/view/FormPageContainer.mjs +2 -0
  38. package/apps/form/view/SideNavList.mjs +1 -0
  39. package/apps/form/view/Viewport.mjs +3 -0
  40. package/apps/portal/childapps/preview/MainContainer.mjs +1 -0
  41. package/apps/portal/index.html +1 -1
  42. package/apps/portal/store/BlogPosts.mjs +2 -0
  43. package/apps/portal/store/Content.mjs +1 -0
  44. package/apps/portal/store/ContentSections.mjs +1 -0
  45. package/apps/portal/store/Examples.mjs +1 -0
  46. package/apps/portal/view/HeaderToolbar.mjs +1 -0
  47. package/apps/portal/view/Viewport.mjs +5 -0
  48. package/apps/portal/view/ViewportController.mjs +8 -2
  49. package/apps/portal/view/about/Container.mjs +2 -0
  50. package/apps/portal/view/about/MemberContainer.mjs +7 -0
  51. package/apps/portal/view/blog/Container.mjs +2 -0
  52. package/apps/portal/view/blog/List.mjs +2 -0
  53. package/apps/portal/view/examples/List.mjs +1 -0
  54. package/apps/portal/view/examples/TabContainer.mjs +4 -0
  55. package/apps/portal/view/home/ContentBox.mjs +3 -0
  56. package/apps/portal/view/home/FeatureSection.mjs +8 -0
  57. package/apps/portal/view/home/FooterContainer.mjs +4 -1
  58. package/apps/portal/view/home/MainContainer.mjs +2 -0
  59. package/apps/portal/view/home/parts/AfterMath.mjs +2 -0
  60. package/apps/portal/view/home/parts/BaseContainer.mjs +1 -0
  61. package/apps/portal/view/home/parts/Colors.mjs +4 -0
  62. package/apps/portal/view/home/parts/Features.mjs +2 -0
  63. package/apps/portal/view/home/parts/Helix.mjs +5 -0
  64. package/apps/portal/view/home/parts/How.mjs +4 -0
  65. package/apps/portal/view/home/parts/MainNeo.mjs +1 -0
  66. package/apps/portal/view/home/parts/References.mjs +2 -0
  67. package/apps/portal/view/learn/ContentComponent.mjs +11 -5
  68. package/apps/portal/view/learn/ContentTreeList.mjs +2 -0
  69. package/apps/portal/view/learn/CubeLayoutButton.mjs +1 -0
  70. package/apps/portal/view/learn/MainContainer.mjs +4 -0
  71. package/apps/portal/view/learn/PageContainer.mjs +2 -0
  72. package/apps/portal/view/learn/PageSectionsContainer.mjs +3 -0
  73. package/apps/portal/view/learn/PageSectionsList.mjs +1 -0
  74. package/apps/portal/view/services/Component.mjs +1 -0
  75. package/apps/realworld/api/Base.mjs +1 -0
  76. package/apps/realworld/view/HeaderComponent.mjs +4 -0
  77. package/apps/realworld/view/HomeComponent.mjs +7 -0
  78. package/apps/realworld/view/MainContainer.mjs +2 -0
  79. package/apps/realworld/view/MainContainerController.mjs +2 -0
  80. package/apps/realworld/view/article/CommentComponent.mjs +3 -0
  81. package/apps/realworld/view/article/Component.mjs +17 -10
  82. package/apps/realworld/view/article/CreateCommentComponent.mjs +2 -0
  83. package/apps/realworld/view/article/CreateComponent.mjs +5 -0
  84. package/apps/realworld/view/article/PreviewComponent.mjs +9 -0
  85. package/apps/realworld/view/article/TagListComponent.mjs +2 -0
  86. package/apps/realworld/view/user/ProfileComponent.mjs +7 -0
  87. package/apps/realworld/view/user/SettingsComponent.mjs +5 -0
  88. package/apps/realworld/view/user/SignUpComponent.mjs +3 -0
  89. package/apps/realworld2/api/Base.mjs +1 -0
  90. package/apps/realworld2/view/FooterComponent.mjs +1 -0
  91. package/apps/realworld2/view/HeaderToolbar.mjs +3 -0
  92. package/apps/realworld2/view/HomeContainer.mjs +1 -0
  93. package/apps/realworld2/view/MainContainer.mjs +2 -0
  94. package/apps/realworld2/view/MainContainerController.mjs +1 -0
  95. package/apps/realworld2/view/article/Helix.mjs +1 -0
  96. package/apps/realworld2/view/article/PreviewComponent.mjs +9 -0
  97. package/apps/realworld2/view/article/PreviewList.mjs +1 -0
  98. package/apps/realworld2/view/article/TagListComponent.mjs +2 -0
  99. package/apps/route/view/CenterContainer.mjs +1 -0
  100. package/apps/route/view/MainView.mjs +1 -0
  101. package/apps/sharedcovid/childapps/sharedcovidchart/MainContainer.mjs +1 -0
  102. package/apps/sharedcovid/childapps/sharedcovidgallery/MainContainer.mjs +1 -0
  103. package/apps/sharedcovid/childapps/sharedcovidhelix/MainContainer.mjs +1 -0
  104. package/apps/sharedcovid/childapps/sharedcovidmap/MainContainer.mjs +1 -0
  105. package/apps/sharedcovid/view/FooterContainer.mjs +3 -0
  106. package/apps/sharedcovid/view/GalleryContainer.mjs +2 -0
  107. package/apps/sharedcovid/view/GalleryContainerController.mjs +1 -0
  108. package/apps/sharedcovid/view/HeaderContainer.mjs +2 -0
  109. package/apps/sharedcovid/view/HelixContainer.mjs +2 -0
  110. package/apps/sharedcovid/view/HelixContainerController.mjs +1 -0
  111. package/apps/sharedcovid/view/MainContainer.mjs +3 -0
  112. package/apps/sharedcovid/view/TableContainer.mjs +3 -0
  113. package/apps/sharedcovid/view/TableContainerController.mjs +1 -0
  114. package/apps/sharedcovid/view/WorldMapContainer.mjs +2 -0
  115. package/apps/sharedcovid/view/country/Gallery.mjs +3 -0
  116. package/apps/sharedcovid/view/country/Helix.mjs +8 -0
  117. package/apps/sharedcovid/view/country/HistoricalDataTable.mjs +1 -0
  118. package/apps/sharedcovid/view/country/Table.mjs +2 -0
  119. package/apps/sharedcovid/view/mapboxGl/Component.mjs +1 -0
  120. package/apps/sharedcovid/view/mapboxGl/Container.mjs +2 -0
  121. package/apps/shareddialog/childapps/shareddialog2/view/MainContainer.mjs +2 -0
  122. package/apps/shareddialog/view/DemoDialog.mjs +2 -0
  123. package/apps/shareddialog/view/MainContainer.mjs +2 -0
  124. package/apps/shareddialog/view/MainContainerController.mjs +1 -0
  125. package/buildScripts/addReactiveTags.mjs +191 -0
  126. package/buildScripts/checkReactiveTags.mjs +160 -0
  127. package/docs/app/store/Api.mjs +1 -0
  128. package/docs/app/store/Examples.mjs +1 -0
  129. package/docs/app/view/ApiTreeList.mjs +1 -0
  130. package/docs/app/view/ContentTabContainer.mjs +2 -0
  131. package/docs/app/view/ExamplesTreeList.mjs +2 -0
  132. package/docs/app/view/HeaderContainer.mjs +3 -0
  133. package/docs/app/view/MainContainer.mjs +5 -0
  134. package/docs/app/view/classdetails/HeaderComponent.mjs +1 -0
  135. package/docs/app/view/classdetails/MainContainer.mjs +3 -0
  136. package/docs/app/view/classdetails/MembersList.mjs +5 -0
  137. package/docs/app/view/classdetails/SourceViewComponent.mjs +2 -0
  138. package/examples/ConfigurationViewport.mjs +14 -8
  139. package/examples/button/effect/MainContainer.mjs +207 -0
  140. package/examples/button/effect/app.mjs +6 -0
  141. package/examples/button/effect/index.html +11 -0
  142. package/examples/button/effect/neo-config.json +6 -0
  143. package/examples/calendar/weekview/MainContainer.mjs +4 -0
  144. package/examples/component/coronaGallery/CountryGallery.mjs +2 -0
  145. package/examples/component/coronaGallery/CountryStore.mjs +1 -0
  146. package/examples/component/coronaGallery/Viewport.mjs +3 -0
  147. package/examples/component/coronaGallery/ViewportController.mjs +1 -0
  148. package/examples/component/coronaHelix/CountryHelix.mjs +7 -0
  149. package/examples/component/coronaHelix/MainContainer.mjs +1 -0
  150. package/examples/component/gallery/ImageStore.mjs +1 -0
  151. package/examples/component/helix/ImageStore.mjs +1 -0
  152. package/examples/component/helix/Viewport.mjs +3 -0
  153. package/examples/component/helix/ViewportController.mjs +1 -0
  154. package/examples/component/multiWindowCoronaGallery/childapp/Viewport.mjs +1 -0
  155. package/examples/component/multiWindowHelix/childapp/Viewport.mjs +1 -0
  156. package/examples/component/wrapper/googleMaps/MapComponent.mjs +2 -0
  157. package/examples/core/config/MainContainer.mjs +2 -0
  158. package/examples/dialog/DemoDialog.mjs +2 -0
  159. package/examples/dialog/MainContainer.mjs +1 -0
  160. package/examples/form/field/color/MainStore.mjs +1 -0
  161. package/examples/functional/defineComponent/Component.mjs +18 -0
  162. package/examples/functional/defineComponent/MainContainer.mjs +41 -0
  163. package/examples/functional/defineComponent/app.mjs +6 -0
  164. package/examples/functional/defineComponent/index.html +11 -0
  165. package/examples/functional/defineComponent/neo-config.json +6 -0
  166. package/examples/functional/hostComponent/Component.mjs +32 -0
  167. package/examples/functional/hostComponent/MainContainer.mjs +48 -0
  168. package/examples/functional/hostComponent/app.mjs +6 -0
  169. package/examples/functional/hostComponent/index.html +11 -0
  170. package/examples/functional/hostComponent/neo-config.json +6 -0
  171. package/examples/grid/animatedRowSorting/Viewport.mjs +1 -1
  172. package/examples/grid/bigData/ControlsContainer.mjs +3 -0
  173. package/examples/grid/bigData/GridContainer.mjs +4 -2
  174. package/examples/grid/bigData/MainContainer.mjs +2 -0
  175. package/examples/grid/bigData/MainModel.mjs +1 -0
  176. package/examples/grid/bigData/MainStore.mjs +3 -0
  177. package/examples/grid/cellEditing/MainContainer.mjs +1 -1
  178. package/examples/grid/container/MainContainer.mjs +1 -1
  179. package/examples/grid/covid/GridContainer.mjs +3 -0
  180. package/examples/grid/covid/MainContainer.mjs +2 -0
  181. package/examples/grid/covid/Store.mjs +1 -0
  182. package/examples/grid/nestedRecordFields/EditUserDialog.mjs +3 -0
  183. package/examples/grid/nestedRecordFields/Viewport.mjs +3 -1
  184. package/examples/list/animate/List.mjs +4 -0
  185. package/examples/list/animate/MainContainer.mjs +2 -0
  186. package/examples/list/circle/MainStore.mjs +1 -0
  187. package/examples/list/color/MainStore.mjs +1 -0
  188. package/examples/preloadingAssets/view/MainContainer.mjs +2 -0
  189. package/examples/stateProvider/advanced/MainContainer.mjs +1 -0
  190. package/examples/stateProvider/dialog/EditUserDialog.mjs +2 -0
  191. package/examples/stateProvider/dialog/MainContainer.mjs +1 -0
  192. package/examples/stateProvider/extendedClass/MainContainer.mjs +2 -0
  193. package/examples/stateProvider/inline/MainContainer.mjs +1 -0
  194. package/examples/stateProvider/inlineNoStateProvider/MainContainer.mjs +1 -0
  195. package/examples/stateProvider/inlineNoStateProvider/MainContainerController.mjs +2 -0
  196. package/examples/stateProvider/multiWindow/EditUserDialog.mjs +3 -0
  197. package/examples/stateProvider/multiWindow/MainContainer.mjs +1 -0
  198. package/examples/stateProvider/multiWindow/Viewport.mjs +1 -0
  199. package/examples/stateProvider/nestedData/MainContainer.mjs +1 -0
  200. package/examples/stateProvider/table/MainContainer.mjs +1 -0
  201. package/examples/table/covid/MainContainer.mjs +2 -0
  202. package/examples/table/covid/Store.mjs +1 -0
  203. package/examples/table/covid/TableContainer.mjs +3 -0
  204. package/examples/table/nestedRecordFields/EditUserDialog.mjs +3 -0
  205. package/examples/table/nestedRecordFields/Viewport.mjs +1 -0
  206. package/examples/todoList/version1/MainComponent.mjs +1 -1
  207. package/examples/toolbar/breadcrumb/view/MainContainer.mjs +2 -0
  208. package/examples/toolbar/paging/store/Users.mjs +1 -0
  209. package/examples/toolbar/paging/view/AddUserDialog.mjs +3 -0
  210. package/examples/toolbar/paging/view/MainContainer.mjs +3 -0
  211. package/examples/treeAccordion/MainContainer.mjs +2 -2
  212. package/examples/worker/task/MainContainer.mjs +1 -0
  213. package/learn/Glossary.md +1 -0
  214. package/learn/UsingTheseTopics.md +1 -0
  215. package/learn/benefits/ConfigSystem.md +2 -0
  216. package/learn/benefits/Effort.md +1 -0
  217. package/learn/benefits/Features.md +1 -0
  218. package/learn/benefits/FormsEngine.md +1 -0
  219. package/learn/benefits/FourEnvironments.md +2 -0
  220. package/learn/benefits/Introduction.md +2 -0
  221. package/learn/benefits/MultiWindow.md +3 -1
  222. package/learn/benefits/OffTheMainThread.md +2 -0
  223. package/learn/benefits/Quick.md +2 -0
  224. package/learn/benefits/RPCLayer.md +2 -0
  225. package/learn/benefits/Speed.md +2 -0
  226. package/learn/comparisons/NeoVsAngular.md +90 -0
  227. package/learn/comparisons/NeoVsExtJs.md +178 -0
  228. package/learn/comparisons/NeoVsNextJs.md +124 -0
  229. package/learn/comparisons/NeoVsReact.md +95 -0
  230. package/learn/comparisons/NeoVsSolid.md +78 -0
  231. package/learn/comparisons/NeoVsVue.md +92 -0
  232. package/learn/comparisons/Overview.md +46 -0
  233. package/learn/gettingstarted/ComponentModels.md +2 -0
  234. package/learn/gettingstarted/Config.md +2 -0
  235. package/learn/gettingstarted/DescribingTheUI.md +2 -0
  236. package/learn/gettingstarted/Events.md +2 -0
  237. package/learn/gettingstarted/Extending.md +2 -0
  238. package/learn/gettingstarted/References.md +2 -0
  239. package/learn/gettingstarted/Setup.md +3 -2
  240. package/learn/gettingstarted/Workspaces.md +2 -0
  241. package/learn/guides/datahandling/Collections.md +1 -0
  242. package/learn/guides/datahandling/Records.md +1 -0
  243. package/learn/guides/datahandling/StateProviders.md +131 -16
  244. package/learn/guides/datahandling/Tables.md +1 -1
  245. package/learn/guides/fundamentals/ConfigSystemDeepDive.md +1 -0
  246. package/learn/guides/fundamentals/DeclarativeComponentTreesVsImperativeVdom.md +2 -0
  247. package/learn/guides/fundamentals/DeclarativeVDOMWithEffects.md +168 -0
  248. package/learn/guides/fundamentals/ExtendingNeoClasses.md +1 -0
  249. package/learn/guides/fundamentals/InstanceLifecycle.md +3 -1
  250. package/learn/guides/fundamentals/MainThreadAddons.md +2 -0
  251. package/learn/guides/specificfeatures/Mixins.md +3 -1
  252. package/learn/guides/specificfeatures/MultiWindow.md +3 -1
  253. package/learn/guides/specificfeatures/PortalApp.md +2 -0
  254. package/learn/guides/uibuildingblocks/ComponentsAndContainers.md +2 -0
  255. package/learn/guides/uibuildingblocks/CustomComponents.md +2 -0
  256. package/learn/guides/uibuildingblocks/Layouts.md +2 -0
  257. package/learn/guides/uibuildingblocks/WorkingWithVDom.md +2 -0
  258. package/learn/guides/userinteraction/Forms.md +2 -0
  259. package/learn/guides/userinteraction/events/CustomEvents.md +2 -1
  260. package/learn/guides/userinteraction/events/DomEvents.md +2 -0
  261. package/learn/javascript/ClassFeatures.md +4 -3
  262. package/learn/javascript/Classes.md +10 -13
  263. package/learn/javascript/Overrides.md +10 -6
  264. package/learn/javascript/Super.md +12 -8
  265. package/learn/tree.json +71 -63
  266. package/learn/tutorials/Earthquakes.md +2 -0
  267. package/learn/tutorials/RSP.md +3 -1
  268. package/learn/tutorials/TodoList.md +103 -7
  269. package/package.json +6 -4
  270. package/resources/scss/src/apps/email/ComposeView.scss +16 -0
  271. package/resources/scss/src/apps/email/MainView.scss +5 -0
  272. package/resources/scss/src/apps/portal/learn/ContentComponent.scss +5 -4
  273. package/src/DefaultConfig.mjs +12 -2
  274. package/src/Main.mjs +1 -0
  275. package/src/Neo.mjs +377 -178
  276. package/src/Xhr.mjs +1 -0
  277. package/src/button/Base.mjs +13 -0
  278. package/src/button/Effect.mjs +449 -0
  279. package/src/button/Split.mjs +2 -0
  280. package/src/calendar/store/Calendars.mjs +1 -0
  281. package/src/calendar/store/Colors.mjs +1 -0
  282. package/src/calendar/store/Events.mjs +1 -0
  283. package/src/calendar/view/DayComponent.mjs +2 -0
  284. package/src/calendar/view/EditEventContainer.mjs +4 -1
  285. package/src/calendar/view/MainContainer.mjs +13 -0
  286. package/src/calendar/view/MainContainerStateProvider.mjs +14 -28
  287. package/src/calendar/view/SettingsContainer.mjs +1 -0
  288. package/src/calendar/view/YearComponent.mjs +16 -0
  289. package/src/calendar/view/calendars/ColorsList.mjs +2 -0
  290. package/src/calendar/view/calendars/Container.mjs +2 -0
  291. package/src/calendar/view/calendars/EditContainer.mjs +1 -0
  292. package/src/calendar/view/month/Component.mjs +11 -0
  293. package/src/calendar/view/settings/GeneralContainer.mjs +1 -0
  294. package/src/calendar/view/settings/MonthContainer.mjs +1 -0
  295. package/src/calendar/view/settings/WeekContainer.mjs +1 -0
  296. package/src/calendar/view/settings/YearContainer.mjs +1 -0
  297. package/src/calendar/view/week/Component.mjs +15 -1
  298. package/src/calendar/view/week/TimeAxisComponent.mjs +4 -0
  299. package/src/code/LivePreview.mjs +51 -23
  300. package/src/collection/Base.mjs +14 -12
  301. package/src/collection/Filter.mjs +6 -0
  302. package/src/collection/Sorter.mjs +3 -0
  303. package/src/component/Base.mjs +156 -802
  304. package/src/component/Canvas.mjs +1 -0
  305. package/src/component/Chip.mjs +4 -0
  306. package/src/component/Circle.mjs +14 -0
  307. package/src/component/Clock.mjs +4 -0
  308. package/src/component/DateSelector.mjs +12 -0
  309. package/src/component/Gallery.mjs +11 -0
  310. package/src/component/Helix.mjs +24 -0
  311. package/src/component/Label.mjs +1 -0
  312. package/src/component/Legend.mjs +3 -0
  313. package/src/component/MagicMoveText.mjs +4 -0
  314. package/src/component/Progress.mjs +3 -0
  315. package/src/component/Splitter.mjs +3 -0
  316. package/src/component/StatusBadge.mjs +6 -0
  317. package/src/component/Timer.mjs +4 -0
  318. package/src/component/Toast.mjs +6 -0
  319. package/src/component/Video.mjs +1 -0
  320. package/src/component/mwc/Button.mjs +7 -0
  321. package/src/component/mwc/TextField.mjs +9 -0
  322. package/src/component/wrapper/AmChart.mjs +2 -0
  323. package/src/component/wrapper/GoogleMaps.mjs +3 -0
  324. package/src/component/wrapper/MapboxGL.mjs +5 -0
  325. package/src/component/wrapper/MonacoEditor.mjs +12 -0
  326. package/src/container/Accordion.mjs +2 -0
  327. package/src/container/Base.mjs +34 -26
  328. package/src/container/Panel.mjs +1 -0
  329. package/src/container/Viewport.mjs +1 -0
  330. package/src/controller/Application.mjs +1 -0
  331. package/src/controller/Base.mjs +1 -0
  332. package/src/controller/Component.mjs +1 -0
  333. package/src/core/Base.mjs +193 -22
  334. package/src/core/Compare.mjs +4 -7
  335. package/src/core/Config.mjs +137 -33
  336. package/src/core/Effect.mjs +193 -0
  337. package/src/core/EffectBatchManager.mjs +67 -0
  338. package/src/core/EffectManager.mjs +60 -0
  339. package/src/core/IdGenerator.mjs +13 -44
  340. package/src/data/Model.mjs +2 -0
  341. package/src/data/Store.mjs +7 -0
  342. package/src/data/connection/WebSocket.mjs +2 -0
  343. package/src/date/DayViewComponent.mjs +2 -0
  344. package/src/date/SelectorContainer.mjs +14 -0
  345. package/src/dialog/Base.mjs +8 -0
  346. package/src/draggable/DragZone.mjs +5 -0
  347. package/src/draggable/tree/DragZone.mjs +1 -0
  348. package/src/filter/BooleanContainer.mjs +2 -0
  349. package/src/filter/NumberContainer.mjs +3 -0
  350. package/src/filter/ToggleOperatorsButton.mjs +2 -0
  351. package/src/form/Fieldset.mjs +6 -0
  352. package/src/form/field/Base.mjs +7 -0
  353. package/src/form/field/CheckBox.mjs +18 -0
  354. package/src/form/field/Chip.mjs +1 -0
  355. package/src/form/field/ComboBox.mjs +8 -0
  356. package/src/form/field/Country.mjs +1 -0
  357. package/src/form/field/Currency.mjs +2 -0
  358. package/src/form/field/Date.mjs +4 -0
  359. package/src/form/field/Display.mjs +1 -0
  360. package/src/form/field/Email.mjs +1 -0
  361. package/src/form/field/FileUpload.mjs +7 -0
  362. package/src/form/field/Hidden.mjs +1 -0
  363. package/src/form/field/Number.mjs +7 -0
  364. package/src/form/field/Password.mjs +1 -0
  365. package/src/form/field/Phone.mjs +3 -0
  366. package/src/form/field/Picker.mjs +2 -0
  367. package/src/form/field/Radio.mjs +1 -0
  368. package/src/form/field/Range.mjs +3 -0
  369. package/src/form/field/Search.mjs +2 -0
  370. package/src/form/field/Text.mjs +32 -0
  371. package/src/form/field/TextArea.mjs +7 -0
  372. package/src/form/field/Time.mjs +6 -0
  373. package/src/form/field/Url.mjs +3 -0
  374. package/src/form/field/ZipCode.mjs +2 -0
  375. package/src/form/field/trigger/Base.mjs +3 -0
  376. package/src/form/field/trigger/Clear.mjs +2 -0
  377. package/src/form/field/trigger/CopyToClipboard.mjs +2 -0
  378. package/src/form/field/trigger/Date.mjs +1 -0
  379. package/src/form/field/trigger/Picker.mjs +1 -0
  380. package/src/form/field/trigger/Search.mjs +1 -0
  381. package/src/form/field/trigger/SpinDown.mjs +2 -0
  382. package/src/form/field/trigger/SpinUp.mjs +1 -0
  383. package/src/form/field/trigger/Time.mjs +2 -0
  384. package/src/functional/_export.mjs +6 -0
  385. package/src/functional/component/Base.mjs +499 -0
  386. package/src/functional/defineComponent.mjs +102 -0
  387. package/src/functional/useConfig.mjs +52 -0
  388. package/src/functional/useEvent.mjs +43 -0
  389. package/src/grid/Body.mjs +20 -1
  390. package/src/grid/Container.mjs +57 -63
  391. package/src/grid/ScrollManager.mjs +2 -0
  392. package/src/grid/VerticalScrollbar.mjs +2 -0
  393. package/src/grid/column/Base.mjs +2 -0
  394. package/src/grid/column/Component.mjs +1 -1
  395. package/src/grid/header/Button.mjs +7 -0
  396. package/src/grid/header/Toolbar.mjs +6 -0
  397. package/src/grid/plugin/AnimateRows.mjs +2 -0
  398. package/src/layout/Base.mjs +3 -0
  399. package/src/layout/Card.mjs +1 -0
  400. package/src/layout/Cube.mjs +11 -1
  401. package/src/layout/Fit.mjs +1 -0
  402. package/src/layout/Flexbox.mjs +7 -0
  403. package/src/layout/Form.mjs +2 -0
  404. package/src/layout/Grid.mjs +1 -0
  405. package/src/layout/HBox.mjs +1 -0
  406. package/src/layout/VBox.mjs +1 -0
  407. package/src/list/Base.mjs +13 -0
  408. package/src/list/Chip.mjs +1 -0
  409. package/src/list/Circle.mjs +2 -0
  410. package/src/list/Color.mjs +1 -0
  411. package/src/list/plugin/Animate.mjs +2 -0
  412. package/src/main/DeltaUpdates.mjs +1 -0
  413. package/src/main/DomEvents.mjs +2 -0
  414. package/src/main/addon/CloneNode.mjs +1 -0
  415. package/src/main/addon/Cookie.mjs +1 -0
  416. package/src/main/addon/GoogleMaps.mjs +1 -0
  417. package/src/main/addon/LocalStorage.mjs +1 -0
  418. package/src/main/addon/MapboxGL.mjs +1 -0
  419. package/src/main/addon/Markdown.mjs +1 -0
  420. package/src/main/addon/Navigator.mjs +1 -0
  421. package/src/main/addon/Popover.mjs +1 -0
  422. package/src/main/addon/Stylesheet.mjs +1 -0
  423. package/src/main/addon/WindowPosition.mjs +1 -0
  424. package/src/manager/Component.mjs +0 -71
  425. package/src/manager/VDomUpdate.mjs +235 -0
  426. package/src/menu/List.mjs +6 -0
  427. package/src/menu/Model.mjs +1 -0
  428. package/src/menu/Panel.mjs +3 -0
  429. package/src/menu/Store.mjs +1 -0
  430. package/src/mixin/DomEvents.mjs +130 -0
  431. package/src/mixin/VdomLifecycle.mjs +667 -0
  432. package/src/plugin/Base.mjs +1 -0
  433. package/src/plugin/Resizable.mjs +2 -0
  434. package/src/selection/Model.mjs +15 -18
  435. package/src/selection/grid/BaseModel.mjs +1 -0
  436. package/src/sitemap/Component.mjs +1 -0
  437. package/src/state/Provider.mjs +376 -457
  438. package/src/state/createHierarchicalDataProxy.mjs +138 -0
  439. package/src/tab/Container.mjs +6 -0
  440. package/src/tab/Strip.mjs +1 -0
  441. package/src/tab/header/Button.mjs +2 -0
  442. package/src/tab/header/EffectButton.mjs +77 -0
  443. package/src/tab/header/Toolbar.mjs +1 -0
  444. package/src/table/Body.mjs +3 -0
  445. package/src/table/Container.mjs +10 -0
  446. package/src/table/header/Button.mjs +8 -0
  447. package/src/table/header/Toolbar.mjs +5 -0
  448. package/src/table/plugin/CellEditing.mjs +1 -0
  449. package/src/toolbar/Base.mjs +4 -0
  450. package/src/toolbar/Breadcrumb.mjs +3 -0
  451. package/src/toolbar/Paging.mjs +5 -0
  452. package/src/tooltip/Base.mjs +2 -0
  453. package/src/tree/List.mjs +3 -0
  454. package/src/util/HashHistory.mjs +1 -0
  455. package/src/util/KeyNavigation.mjs +2 -0
  456. package/src/util/Matrix.mjs +1 -0
  457. package/src/util/VDom.mjs +7 -1
  458. package/src/util/VNode.mjs +7 -1
  459. package/src/util/vdom/TreeBuilder.mjs +129 -0
  460. package/src/vdom/Helper.mjs +44 -33
  461. package/src/vdom/VNode.mjs +5 -7
  462. package/src/worker/App.mjs +1 -5
  463. package/src/worker/Base.mjs +2 -0
  464. package/src/worker/Manager.mjs +2 -0
  465. package/src/worker/ServiceBase.mjs +6 -1
  466. package/test/siesta/siesta.js +36 -1
  467. package/test/siesta/tests/CollectionBase.mjs +10 -10
  468. package/test/siesta/tests/VdomCalendar.mjs +13 -9
  469. package/test/siesta/tests/VdomHelper.mjs +22 -59
  470. package/test/siesta/tests/config/AfterSetConfig.mjs +100 -0
  471. package/test/siesta/tests/{ReactiveConfigs.mjs → config/Basic.mjs} +58 -21
  472. package/test/siesta/tests/config/CircularDependencies.mjs +166 -0
  473. package/test/siesta/tests/config/CustomFunctions.mjs +69 -0
  474. package/test/siesta/tests/config/Hierarchy.mjs +94 -0
  475. package/test/siesta/tests/config/MemoryLeak.mjs +92 -0
  476. package/test/siesta/tests/config/MultiLevelHierarchy.mjs +85 -0
  477. package/test/siesta/tests/core/Effect.mjs +127 -0
  478. package/test/siesta/tests/core/EffectBatching.mjs +310 -0
  479. package/test/siesta/tests/neo/MixinStaticConfig.mjs +138 -0
  480. package/test/siesta/tests/state/Provider.mjs +537 -0
  481. package/test/siesta/tests/state/ProviderNestedDataConfigs.mjs +255 -0
  482. package/test/siesta/tests/state/createHierarchicalDataProxy.mjs +204 -0
  483. package/test/siesta/tests/vdom/VdomAsymmetricUpdates.mjs +366 -0
  484. package/test/siesta/tests/vdom/VdomRealWorldUpdates.mjs +249 -0
  485. package/learn/javascript/NewNode.md +0 -31
@@ -0,0 +1,95 @@
1
+ # Neo.mjs vs React.js
2
+
3
+ Neo.mjs is a comprehensive JavaScript ecosystem for building high-performance, multi-threaded web applications. Unlike libraries such as React that form only one part of a complex, manually assembled toolchain, Neo.mjs is a self-contained system with **zero runtime dependencies**. It provides a complete, out-of-the-box solution that includes four distinct development and deployment environments, from a revolutionary zero-builds development mode to thread-optimized production bundles.
4
+
5
+ This article provides a focused comparison between the Neo.mjs ecosystem and React. React, now over a decade old, has become an industry standard, but its foundational architecture is rooted in the single-threaded limitations of its time. We will explore their fundamentally different approaches to **architecture, rendering, and reactivity**, highlighting the trade-offs between React's library-focused, Main-Thread-bound model and Neo.mjs's holistic, worker-based paradigm.
6
+
7
+ ## Foundational Concepts: A Shared Heritage
8
+
9
+ Despite their architectural differences, both frameworks build upon foundational concepts that have shaped UI development:
10
+
11
+ * **Component-Based Architecture (with a distinction):** Both frameworks promote building UIs as a composition of reusable components. However, Neo.mjs extends this concept with `Neo.core.Base`, allowing any class-based entity (like controllers, models, or routers) to leverage the framework's powerful class system, even if they don't directly render UI. This contrasts with frameworks where non-visual logic might often be shoehorned into component structures.
12
+ * **Declarative UI:** Developers describe *what* the UI should look like for a given state, and the framework handles *how* to update the DOM.
13
+ * **Reactive Paradigm:** Both leverage reactive programming principles where UI updates are driven by changes in state.
14
+ * **Functional Components & Hooks:** Both support defining components as functions and provide hooks for managing state and side effects, though their implementation and performance characteristics differ significantly.
15
+
16
+ ## Key Differences: Architectural & Rendering Strategies
17
+
18
+ This is where the two frameworks diverge significantly, each offering unique trade-offs and advantages.
19
+
20
+ ### 1. Overall Architecture: Main Thread vs. Worker-Based
21
+
22
+ * **React: Main Thread Focused**
23
+ * React applications run predominantly on the Main JavaScript Thread of the browser. All component logic, state management, VDOM reconciliation, and direct DOM manipulation occur on this single thread.
24
+ * **Implication:** While React is highly optimized, complex computations, large state updates, or extensive component trees can potentially block the Main Thread, leading to UI jank, unresponsiveness, and a poor user experience. React relies on techniques like Fiber reconciliation and `requestIdleCallback` (via `Scheduler`) to yield to the browser, but it's still fundamentally bound by the Main Thread's limitations.
25
+
26
+ * **Neo.mjs: Worker-Based (Main Thread + App Worker + VDom Worker)**
27
+ * Neo.mjs's defining feature is its multi-threaded architecture. Application logic (component instances, state, business logic, `vdomEffect`s) runs in a dedicated **App Worker**, separate from the Main Thread. The VDOM diffing occurs in a **VDom Worker**.
28
+ * Communication between workers and the Main Thread happens via asynchronous message passing.
29
+ * **Benefit:** This architecture keeps the Main Thread almost entirely free and responsive, preventing UI freezes even during heavy computations or complex application logic. It inherently leverages multi-core CPUs for parallel processing, leading to superior UI responsiveness and performance under heavy load.
30
+
31
+ ### 2. Rendering Mechanism
32
+
33
+ * **React: Main-Thread VDOM & Enforced Immutability**
34
+ * React uses a Virtual DOM. When state or props change, React builds a new VDOM tree on the Main Thread, compares it with the previous one (reconciliation), and calculates the minimal set of changes (diffing). These changes are then applied to the real DOM, all on the same thread responsible for user interactions.
35
+ * **VDOM Definition:** Primarily uses JSX, a syntax extension requiring a build step (e.g., Babel) to transpile HTML-like structures into `React.createElement` calls.
36
+ * **The Burden of Immutability:** React's reconciliation algorithm relies on developers treating state as immutable. To change state, you must create a *new* object or array reference instead of modifying the existing one. This forces developers into patterns using spread syntax (`...`) or libraries like Immer to manage state changes. While this simplifies React's diffing logic, it offloads significant cognitive and boilerplate burden onto the developer and can be a frequent source of bugs when not handled correctly.
37
+
38
+ * **Neo.mjs: Off-Thread VDOM & Developer-Friendly Mutability**
39
+ * Neo.mjs also uses a Virtual DOM, but its philosophy and implementation are fundamentally different. The VDOM is defined using plain JavaScript objects and arrays—no JSX or build step is required for UI definition.
40
+ * **Mutability by Design, Immutability in Process:** Neo.mjs embraces developer convenience by allowing **direct, mutable manipulation** of component state (configs) and the VDOM structure within the App Worker. This eliminates the boilerplate and cognitive load of managing immutable updates. The architectural brilliance lies in how it achieves the benefits of immutability: when an update is triggered, Neo.mjs creates a **JSON snapshot** of the relevant VDOM tree. This snapshot is sent to the VDom Worker, making the *update process itself* immutable and predictable for diffing. This provides the best of both worlds: simple, direct mutation for the developer and a safe, immutable structure for the high-performance diffing algorithm in another thread.
41
+ * **Off-Main-Thread Diffing:** The entire VDOM diffing process occurs in the dedicated **VDom Worker**, completely freeing the Main Thread from this heavy computation.
42
+ * **Scoped VDOM (Encapsulation & Performance):** The VDom Worker sends only the "deltas" (a minimal set of change instructions) back to the Main Thread. For insertions, `DomApiRenderer` **builds the entire new DOM subtree in memory**, completely detached from the live document, and inserts it in a **single, atomic operation**. Furthermore, Neo.mjs's VDOM is **scoped by default**. When a parent component renders, its children are represented by simple `{componentId: '...'}` placeholders. This provides two key advantages:
43
+ 1. **Performance:** A parent's update never processes the complex VDOM of its children, keeping update payloads extremely small and efficient.
44
+ 2. **Encapsulation:** It is architecturally impossible for a parent to accidentally reach into and manipulate a child's internal VDOM structure. This enforces clear ownership and prevents a wide class of bugs.
45
+
46
+ ### 3. Component Execution Model: Precision vs. Brute Force
47
+
48
+ * **React: Cascading Re-Renders & The `memo` Tax**
49
+ * When a component's state changes, React re-executes the entire component function. This is just the beginning. By default, it then triggers a cascading re-render of **all its child components**, regardless of whether their own props have changed.
50
+ * This brute-force approach creates a significant performance problem known as "unnecessary re-renders." To fight this, developers are forced to pay the `memo` tax: wrapping components in `React.memo()`, manually memoizing functions with `useCallback()`, and objects with `useMemo()`. This adds significant boilerplate, increases complexity, and is a notorious source of bugs, including stale closures and incorrect dependency arrays. This manual optimization becomes a core, and often frustrating, part of the development process.
51
+
52
+ * **Neo.mjs: Surgical Effects & Automatic Efficiency**
53
+ * Neo.mjs's model is fundamentally more efficient and intelligent. A component's `createVdom` method is wrapped in a `Neo.core.Effect`. This effect automatically and dynamically tracks its dependencies—the specific `config` values it reads.
54
+ * When a config value changes, only the specific `createVdom` effects that depend on that *exact* piece of state are queued for re-execution. There are no cascading re-renders. If a parent's `createVdom` re-runs, but the configs passed to a child have not changed, the child component's `createVdom` function is **never executed**.
55
+ * **Benefit (Zero Manual Optimization):** This fine-grained reactivity completely eliminates the need for manual memoization (`memo`, `useCallback`, `useMemo`). The framework handles dependency tracking automatically and precisely, delivering optimal performance out-of-the-box without the boilerplate and complexity inherent in React. This also sidesteps entire classes of bugs like stale closures, as dependencies are discovered fresh on every run, without requiring manual dependency arrays.
56
+
57
+ * **State Management & The End of Props Drilling:** React often relies on its Context API or third-party state management libraries to avoid "props drilling." However, this often introduces performance issues, as any change to a context value re-renders all consuming components by default. Neo.mjs's architecture makes props drilling an obsolete anti-pattern. A deeply nested component can subscribe directly to the precise piece of state it needs from a `StateProvider` via an `Effect`. This creates a direct, performant link between the state and the component that needs it, completely bypassing all intermediate components. This results in a cleaner, more decoupled, and more performant architecture by default.
58
+
59
+ ### 4. Scaling Complexity: Linear Effort vs. Exponential Overhead
60
+
61
+ A key differentiator between the frameworks is how they handle growing application complexity.
62
+
63
+ * **React: Exponential Complexity in Large Applications**
64
+ * Consider a complex dashboard with a global state (e.g., a user profile in a Context). When a single value in that state changes (e.g., the user's name), React's default behavior is to re-render **every single component** that consumes that context.
65
+ * To prevent the entire UI from lagging, developers must manually optimize each consuming component. This involves wrapping components in `React.memo` and using selector-like functions with `useMemo` to extract only the needed data. As the application grows, the number of these manual optimizations grows, leading to an exponential increase in boilerplate and performance-tuning effort. The burden is on the developer to constantly fight the framework's default behavior.
66
+
67
+ * **Neo.mjs: Built-in Efficiency and Linear Effort**
68
+ * Neo.mjs's architecture is designed to handle this scenario effortlessly. Multiple state changes are automatically batched into a single, de-duplicated update cycle via the `EffectBatchManager`.
69
+ * In the same complex dashboard scenario, if a value in a global `StateProvider` changes, only the `createVdom` effects in components that *directly depend on that specific value* will re-run. All other components remain untouched, with **zero manual optimization required from the developer**.
70
+ * This leads to a **linear relationship between complexity and effort**. As you add more components, you don't need to add more performance optimizations. The framework's core design ensures that updates are always surgical and efficient, allowing developers to focus on features instead of fighting the rendering engine. This is a direct result of the sophisticated, multi-layered batching and aggregation built into the framework's core.
71
+
72
+ ### Other Considerations:
73
+
74
+ * **Development & Deployment Environments:** Neo.mjs offers four distinct environments, providing unparalleled flexibility:
75
+ * **Zero Builds Development Mode:** The primary development workflow, leveraging native ES Modules for instant code reflection and debugging without a build step. This contrasts sharply with React's typical development setup which always involves a build process.
76
+ * **`dist/esm`:** Deploys as native ES Modules, preserving the dev mode's file structure for efficient modular loading in modern browsers.
77
+ * **`dist/production`:** Generates highly optimized, thread-specific bundles using Webpack for maximum compatibility and minification.
78
+ * **`dist/development`:** A bundled but unminified environment for debugging production-specific issues or for TypeScript preference, serving as a bridge to traditional build-based workflows.
79
+ * **Dynamic Module Loading:** Neo.mjs uniquely supports dynamically loading code-based modules (even with arbitrary `import` statements) from different environments at runtime, a powerful feature for plugin architectures or user-generated code that most other frameworks struggle with.
80
+
81
+ * **JSX vs. Plain Objects:** React uses JSX (requiring a build step for UI definition). Neo.mjs uses plain JavaScript objects for VDOM (no JSX compilation needed for VDOM definition).
82
+ * **Side Effects:** Both frameworks advocate for managing side effects outside the pure render function. React uses `useEffect`. Neo.mjs uses separate `Neo.core.Effect` instances or dedicated hooks for side effects.
83
+ * **Ecosystem & Maturity:** React has a massive, mature ecosystem with abundant libraries, tools, and community support. Neo.mjs has a smaller but dedicated community, with a focus on framework-level solutions and integrated features.
84
+ * **Learning Curve:** React's initial learning curve can be gentle, but mastering its performance optimizations (memoization, context, custom hooks) can be complex. Neo.mjs has a steeper initial learning curve due to its worker-based architecture, but once understood, it offers inherent performance benefits.
85
+ * **Dependency Management (Batteries Included):** React projects often involve a large `node_modules` directory and can lead to complex dependency trees and version conflicts, a common pain point often referred to as "dependency hell." Neo.mjs, in contrast, is a "batteries included" framework. It literally has zero real runtime dependencies outside of its own core. This native ES Module approach and integrated framework significantly reduces this complexity, offering a much leaner and more controlled dependency management experience.
86
+
87
+ ## Conclusion: Why Neo.mjs Offers Significant Technical Advantages Over React
88
+
89
+ For applications where guaranteed Main Thread responsiveness, high performance under load, leveraging multi-core processing, and long-term maintainability are paramount, Neo.mjs presents a compelling and technically superior alternative.
90
+
91
+ * **Unblocked Main Thread & Inherent Performance:** Neo.mjs's unique worker-based architecture fundamentally shifts application logic off the Main Thread. This ensures the UI remains fluid and responsive even during heavy computations, leading to inherently higher performance ceilings without the need for extensive manual optimizations common in React.
92
+ * **Optimized & Precise DOM Updates:** Through off-Main-Thread VDOM diffing, sophisticated batching, and surgical direct DOM API updates, Neo.mjs achieves highly efficient and smooth visual updates, precisely targeting changes and avoiding unnecessary re-renders.
93
+ * **Linear Effort for Complexity:** Unlike frameworks where effort can grow exponentially with application complexity, Neo.mjs's unified config system, predictable component lifecycle, and modular design enable a more linear relationship between complexity and development effort, leading to faster development cycles and lower maintenance costs in the long run.
94
+
95
+ The choice between them depends on the specific application's needs. For applications where guaranteed Main Thread responsiveness, high performance under load, leveraging multi-core processing, and long-term maintainability are paramount, Neo.mjs presents a compelling and technically superior alternative.
@@ -0,0 +1,78 @@
1
+ # Neo.mjs vs Solid.js
2
+
3
+ Neo.mjs is a comprehensive JavaScript ecosystem for building high-performance, multi-threaded web applications. Unlike libraries such as Solid.js that focus purely on rendering and are typically part of a manually assembled toolchain, Neo.mjs is a self-contained system with **zero runtime dependencies**. It provides a complete, out-of-the-box solution that includes four distinct development and deployment environments, from a revolutionary zero-builds development mode to thread-optimized production bundles.
4
+
5
+ This article provides a focused comparison between the Neo.mjs ecosystem and Solid.js. While both frameworks leverage fine-grained reactivity for high performance, they employ fundamentally different architectural and rendering strategies to achieve their goals. We will explore their approaches to **rendering, reactivity, and DOM updates**, highlighting the trade-offs between Solid's "no-VDOM," Main-Thread-bound model and Neo.mjs's holistic, worker-based paradigm.
6
+
7
+ ## Core Similarities: Fine-Grained Reactivity
8
+
9
+ At their heart, both frameworks share the philosophy of **fine-grained reactivity**:
10
+
11
+ * **Direct Updates:** When a piece of reactive state changes, only the specific parts of the UI that directly depend on that state are updated. This minimizes unnecessary re-renders of entire component trees, a common performance bottleneck in traditional Virtual DOM frameworks.
12
+ * **Reactive Primitives:**
13
+ * **Solid.js:** Utilizes "signals" (`createSignal`) as its primary reactive primitive.
14
+ * **Neo.mjs:** Employs `Neo.core.Config` instances as its core reactive primitive.
15
+ * **Automatic Dependency Tracking:** Both frameworks automatically detect dependencies. When code executes within a reactive context (e.g., an effect, a memo, or a component's render logic), any reactive primitive accessed during that execution is automatically subscribed to. This eliminates the need for manual dependency declarations in many cases.
16
+
17
+ ## Key Differences: Architectural & Rendering Strategies
18
+
19
+ This is where the two frameworks diverge significantly, each offering unique trade-offs.
20
+
21
+ ### 1. Rendering Mechanism: A Tale of Two Architectures
22
+
23
+ * **Solid.js: No VDOM—A Consequence of Single-Threaded Design**
24
+ * Because it operates entirely on the Main Thread, Solid.js can forgo a Virtual DOM. It compiles JSX directly into highly optimized, imperative JavaScript instructions that create and surgically manipulate the real DOM.
25
+ * When a signal (which holds an immutable value) updates, Solid's reactive graph knows precisely which DOM node to change and updates it directly, without any VDOM diffing overhead.
26
+ * **Benefit:** This "no VDOM" approach is extremely fast for DOM updates, as it eliminates the overhead of VDOM reconciliation. This is the peak of Main-Thread rendering performance.
27
+
28
+ * **Neo.mjs: VDOM as a Necessity for Multi-Threading**
29
+ * For Neo.mjs, a Virtual DOM is not an optional design choice—it is a **necessary and powerful consequence** of its multi-threaded architecture. Since components and application logic live in the App Worker, they have **no access to the DOM**.
30
+ * The VDOM serves as the essential, serializable blueprint of the UI. It's a lightweight description defined using plain JavaScript objects (no JSX).
31
+ * **Mutability by Design, Immutability in Process:** Neo.mjs allows for convenient, direct mutation of state and VDOM in the App Worker. When an update is triggered, it sends an immutable JSON snapshot of the VDOM to a dedicated VDom Worker for diffing. This provides developer convenience without sacrificing performance.
32
+ * **Benefit:** This architecture makes off-thread VDOM diffing possible, which in turn guarantees Main Thread responsiveness. The overhead of the VDOM is the price for keeping the UI from ever freezing. The process is further optimized via atomic DOM insertions, where entire subtrees are built in a detached state and inserted into the live DOM in a single operation.
33
+
34
+ ### 2. Component Execution Model
35
+
36
+ * **Solid.js: Components Run Once**
37
+ * Solid's functional components execute only *once* during their initial render. Their primary role is to set up the reactive graph (signals, effects, memos) and create the real DOM nodes. They do not re-run when state changes. Updates are handled by the fine-grained reactivity system directly updating the DOM.
38
+ * **Benefit:** Extremely efficient, as component functions are not re-executed.
39
+
40
+ * **Neo.mjs: `createVdom` Re-runs Inside an Effect**
41
+ * In Neo.mjs, the `createVdom` method of a functional component is wrapped in a `Neo.core.Effect`. This effect automatically tracks which `config` values it reads.
42
+ * When a dependency changes, the `Effect` re-executes the `createVdom()` function to get a new VDOM description. This is fundamentally different from a React re-render, as it's a targeted re-execution of only the VDOM generation logic, not the entire component setup, and it doesn't cascade to children whose configs haven't changed.
43
+ * **Benefit:** This model is highly intuitive (the VDOM function re-runs when its inputs change) and provides automatic, surgical updates without the developer needing to worry about manual dependency tracking or memoization.
44
+
45
+ ### 3. Overall Architecture
46
+
47
+ * **Solid.js: Single-Threaded (Main Thread Focused)**
48
+ * Solid.js operates entirely on the main JavaScript thread. Its optimizations are focused on making the Main Thread's work as fast and efficient as possible.
49
+ * **Benefit:** Simpler deployment and debugging model, as all JavaScript runs in one context.
50
+
51
+ * **Neo.mjs: Worker-Based (Main Thread + App Worker + VDom Worker)**
52
+ * This is Neo.mjs's most distinctive feature. Application logic (including component instances, state, and `vdomEffect`s) runs in a dedicated **App Worker**, separate from the Main Thread. The VDOM diffing occurs in a **VDom Worker**.
53
+ * Communication between workers and the Main Thread happens via message passing.
54
+ * **Benefit:** Keeps the Main Thread free and responsive, preventing UI freezes even during heavy computations or complex application logic. It inherently leverages multi-core CPUs for parallel processing.
55
+
56
+ ### 4. Update Aggregation & Batching
57
+
58
+ * **Solid.js:** Relies on its fine-grained reactivity and direct DOM manipulation for efficient updates. While it has its own batching mechanisms for signal updates, it doesn't have a VDOM reconciliation phase to aggregate changes.
59
+ * **Neo.mjs:** Employs sophisticated batching and aggregation:
60
+ * **Roundtrip-Based Batching:** Multiple reactive changes within a single tick can be batched into one VDom worker request.
61
+ * **VDom Tree Aggregation (`VdomLifecycle`):** Changes in child components can be aggregated into a parent's update. If a parent is updating, a child's update is deferred and its changes are included in the parent's VDOM diff, minimizing redundant VDom worker roundtrips.
62
+ * **`requestAnimationFrame` Aggregation:** The final application of deltas on the Main Thread (via `DeltaUpdates`) is implicitly batched by the browser's `requestAnimationFrame` cycle, ensuring all DOM changes for a frame are applied efficiently.
63
+ * **Benefit:** This multi-layered batching and aggregation strategy leads to significantly fewer real DOM changes and smoother visual updates, especially in complex applications.
64
+
65
+ ### Other Considerations:
66
+
67
+ * **JSX vs. Plain Objects:** Solid uses JSX (requiring a build step), while Neo.mjs uses plain JavaScript objects for VDOM (no JSX compilation needed). **This means Neo.mjs's VDOM is defined using simple nested JavaScript objects and arrays, akin to a JSON-like description of the DOM.**
68
+ * **Side Effects:** Solid has explicit `createEffect` and `createRenderEffect` hooks for managing side effects. In Neo.mjs, `createVdom` is the primary effect for rendering, and other side effects would typically be managed by separate `Neo.core.Effect` instances or dedicated hooks.
69
+ * **Ecosystem & Maturity:** Solid.js has a growing community and ecosystem. Neo.mjs has a smaller but dedicated community, with a focus on framework-level solutions.
70
+
71
+ ## Conclusion
72
+
73
+ Both Neo.mjs and Solid.js are highly performant, modern reactive frameworks.
74
+
75
+ * **Solid.js** excels by completely sidestepping the Virtual DOM, compiling directly to efficient DOM operations, and running components only once. It's a lean, fast choice for Main Thread-bound applications.
76
+ * **Neo.mjs** offers a unique value proposition with its worker-based architecture, offloading heavy computation from the Main Thread to ensure UI responsiveness. It combines this with a sophisticated VDOM pipeline that includes off-Main-Thread diffing, intelligent batching/aggregation, and surgical direct DOM API updates.
77
+
78
+ The choice between them depends on the specific application's needs: Solid.js for ultimate Main Thread rendering speed, and Neo.mjs for guaranteed Main Thread responsiveness and leveraging multi-core processing, especially in complex, data-intensive applications.
@@ -0,0 +1,92 @@
1
+ # Neo.mjs vs Vue.js
2
+
3
+ Neo.mjs is a comprehensive JavaScript ecosystem for building high-performance, multi-threaded web applications. Unlike frameworks like Vue.js, which operate within a single-threaded browser environment, Neo.mjs is a self-contained system with **zero runtime dependencies**. It provides a complete, out-of-the-box solution that includes four distinct development and deployment environments, from a revolutionary zero-builds development mode to thread-optimized production bundles.
4
+
5
+ This article provides a focused comparison between the Neo.mjs ecosystem and Vue.js. While both frameworks share a commitment to reactivity and component-based architecture, their underlying philosophies on how to achieve performance and scalability are fundamentally different. We will explore their approaches to **architecture, rendering, and reactivity**, highlighting the trade-offs between Vue's highly optimized, single-threaded model and Neo.mjs's holistic, worker-based paradigm.
6
+
7
+ ## Foundational Concepts: A Shared Heritage
8
+
9
+ Despite their architectural differences, both frameworks build upon foundational concepts that have shaped modern UI development:
10
+
11
+ * **Component-Based Architecture:** Both frameworks champion building UIs as a composition of reusable components. Neo.mjs extends this with `Neo.core.Base`, allowing any class-based entity (controllers, models, etc.) to leverage the framework's powerful class system, even without a UI.
12
+ * **Declarative UI:** Developers describe *what* the UI should look like for a given state, and the framework handles *how* to update the DOM.
13
+ * **Reactive Paradigm:** Both are built on reactive principles where UI updates are driven by changes in state. Vue's reactivity system is renowned for its efficiency and ease of use.
14
+ * **Functional Components & Modern APIs:** Both support defining components as functions (or with script setup in Vue) and provide APIs (Hooks in Neo.mjs, Composition API in Vue) for managing state and side effects.
15
+
16
+ ## Key Differences: Architectural & Rendering Strategies
17
+
18
+ This is where the two frameworks diverge significantly, each offering unique trade-offs and advantages.
19
+
20
+ ### 1. Overall Architecture: Main Thread vs. Worker-Based
21
+
22
+ * **Vue.js: Main Thread Focused**
23
+ * Vue applications run entirely on the Main JavaScript Thread. All component logic, state management (e.g., Pinia), VDOM reconciliation, and direct DOM manipulation occur on this single thread.
24
+ * **Implication:** Vue is exceptionally well-optimized for the Main Thread. Its reactivity system is designed to minimize unnecessary work. However, it is still fundamentally bound by the single-threaded nature of JavaScript. Very complex computations or large, synchronous state updates can still potentially block the Main Thread, impacting the user experience in data-heavy, high-frequency update scenarios.
25
+
26
+ * **Neo.mjs: Worker-Based (Main Thread + App Worker + VDom Worker)**
27
+ * Neo.mjs's defining feature is its multi-threaded architecture. Application logic (component instances, state, business logic, `vdomEffect`s) runs in a dedicated **App Worker**, separate from the Main Thread. The VDOM diffing occurs in a **VDom Worker**.
28
+ * Communication between workers and the Main Thread happens via asynchronous message passing.
29
+ * **Benefit:** This architecture keeps the Main Thread almost entirely free and responsive, preventing UI freezes even during heavy computations or complex application logic. It inherently leverages multi-core CPUs for parallel processing, leading to superior UI responsiveness and performance under heavy load.
30
+
31
+ ### 2. Rendering Mechanism
32
+
33
+ * **Vue.js: Main-Thread VDOM & Compiler-Optimized Updates**
34
+ * Vue uses a Virtual DOM and a sophisticated compiler. During the build process, Vue's template compiler analyzes templates and converts them into highly optimized render functions.
35
+ * **VDOM Definition:** Primarily uses Single-File Components (SFCs) with HTML-like templates, which are compiled into JavaScript render functions. It also supports JSX.
36
+ * **Compiler Intelligence:** The compiler can detect static parts of a template and hoist them out of the render function, so they are created only once. It also applies other optimizations, such as patching flags, to help the runtime VDOM diffing algorithm take fast paths and skip unnecessary checks. This makes Vue's rendering extremely efficient on the Main Thread.
37
+
38
+ * **Neo.mjs: Off-Thread VDOM & Developer-Friendly Mutability**
39
+ * Neo.mjs also uses a Virtual DOM, but its philosophy and implementation are fundamentally different. The VDOM is defined using plain JavaScript objects and arrays—no special template syntax or build step is required for UI definition.
40
+ * **Mutability by Design, Immutability in Process:** Neo.mjs embraces developer convenience by allowing **direct, mutable manipulation** of component state (configs) and the VDOM structure within the App Worker. This eliminates the boilerplate and cognitive load of managing immutable updates. The architectural brilliance lies in how it achieves the benefits of immutability: when an update is triggered, Neo.mjs creates a **JSON snapshot** of the relevant VDOM tree. This snapshot is sent to the VDom Worker, making the *update process itself* immutable and predictable for diffing. This provides the best of both worlds: simple, direct mutation for the developer and a safe, immutable structure for the high-performance diffing algorithm in another thread.
41
+ * **Off-Main-Thread Diffing:** The entire VDOM diffing process occurs in the dedicated **VDom Worker**, completely freeing the Main Thread from this heavy computation.
42
+ * **Scoped VDOM (Encapsulation & Performance):** The VDom Worker sends only the "deltas" (a minimal set of change instructions) back to the Main Thread. For insertions, `DomApiRenderer` **builds the entire new DOM subtree in memory**, completely detached from the live document, and inserts it in a **single, atomic operation**. Furthermore, Neo.mjs's VDOM is **scoped by default**. When a parent component renders, its children are represented by simple `{componentId: '...'}` placeholders. This provides two key advantages:
43
+ 1. **Performance:** A parent's update never processes the complex VDOM of its children, keeping update payloads extremely small and efficient.
44
+ 2. **Encapsulation:** It is architecturally impossible for a parent to accidentally reach into and manipulate a child's internal VDOM structure. This enforces clear ownership and prevents a wide class of bugs.
45
+
46
+ ### 3. Component Execution Model: Precision vs. Optimization
47
+
48
+ * **Vue.js: Fine-Grained Reactivity & Optimized Re-Renders**
49
+ * Vue's reactivity system is one of its most celebrated features. When a piece of reactive state (e.g., from `ref` or `reactive`) changes, Vue automatically tracks which components depend on it and triggers updates only for those specific components.
50
+ * It avoids the "cascading re-render" problem of React by default. If a parent component re-renders, it will not unnecessarily re-render child components whose props have not changed. This is a significant performance advantage and a core part of Vue's design.
51
+
52
+ * **Neo.mjs: Surgical Effects & Automatic Efficiency**
53
+ * Neo.mjs's model achieves a similar outcome through a different mechanism. A component's `createVdom` method is wrapped in a `Neo.core.Effect`. This effect automatically and dynamically tracks its dependencies—the specific `config` values it reads.
54
+ * When a config value changes, only the specific `createVdom` effects that depend on that *exact* piece of state are queued for re-execution. There are no cascading re-renders. If a parent's `createVdom` re-runs, but the configs passed to a child have not changed, the child component's `createVdom` function is **never executed**.
55
+ * **Benefit (Zero Manual Optimization):** Like Vue, this fine-grained reactivity eliminates the need for manual memoization (`memo`, `useCallback`, `useMemo`) that plagues React development. The framework handles dependency tracking automatically and precisely, delivering optimal performance out-of-the-box.
56
+
57
+ ### 4. Scaling Complexity: Linear Effort vs. Main-Thread Limits
58
+
59
+ A key differentiator between the frameworks is how they handle growing application complexity.
60
+
61
+ * **Vue.js: Optimized for Main-Thread Scalability**
62
+ * Vue is designed to scale gracefully on the Main Thread. Its reactivity system and compiler optimizations ensure that as an application grows, performance remains high. State management with Pinia is also highly optimized.
63
+ * However, the fundamental limitation remains: all work competes for the same single thread. For extremely data-intensive applications, like real-time financial dashboards or complex graphical editors, the Main Thread can still become a bottleneck, no matter how optimized the framework is.
64
+
65
+ * **Neo.mjs: Built-in Efficiency and Linear Effort**
66
+ * Neo.mjs's architecture is designed to handle this scenario effortlessly. Multiple state changes are automatically batched into a single, de-duplicated update cycle via the `EffectBatchManager`.
67
+ * In a complex dashboard scenario, if a value in a global `StateProvider` changes, only the `createVdom` effects in components that *directly depend on that specific value* will re-run. All other components remain untouched. The crucial difference is that this logic runs in the **App Worker**, and the VDOM diffing runs in the **VDom Worker**, leaving the Main Thread free.
68
+ * This leads to a **linear relationship between complexity and effort**. As you add more components, you don't need to add more performance optimizations. The framework's core design ensures that updates are always surgical and efficient, allowing developers to focus on features instead of fighting the rendering engine. This is a direct result of the sophisticated, multi-layered batching and aggregation built into the framework's core.
69
+
70
+ ### Other Considerations:
71
+
72
+ * **Development & Deployment Environments:** Neo.mjs offers four distinct environments, providing unparalleled flexibility:
73
+ * **Zero Builds Development Mode:** The primary development workflow, leveraging native ES Modules for instant code reflection and debugging without a build step. This contrasts with Vue's typical SFC-based development which always requires a build process (e.g., Vite).
74
+ * **`dist/esm`:** Deploys as native ES Modules, preserving the dev mode's file structure.
75
+ * **`dist/production`:** Generates highly optimized, thread-specific bundles using Webpack.
76
+ * **`dist/development`:** A bundled but unminified environment for debugging production-specific issues.
77
+ * **Dynamic Module Loading:** Neo.mjs uniquely supports dynamically loading code-based modules (even with arbitrary `import` statements) from different environments at runtime, a powerful feature for plugin architectures.
78
+
79
+ * **Templates vs. Plain Objects:** Vue primarily uses HTML-like templates in SFCs (requiring a build step). Neo.mjs uses plain JavaScript objects for VDOM (no compilation needed for VDOM definition).
80
+ * **Ecosystem & Maturity:** Vue has a massive, mature ecosystem with a rich collection of libraries, tools (like Vite and Vue Devtools), and extensive community support. Neo.mjs has a smaller but dedicated community, with a focus on framework-level solutions and integrated features.
81
+ * **Learning Curve:** Vue is famous for its gentle learning curve and excellent documentation. Neo.mjs has a steeper initial learning curve due to its worker-based architecture, but once understood, it offers inherent performance benefits that don't require manual tuning.
82
+ * **Dependency Management (Batteries Included):** Vue projects, while often leaner than React, still rely on `node_modules` and a build toolchain. Neo.mjs is a "batteries included" framework with zero real runtime dependencies outside of its own core. This native ES Module approach significantly reduces complexity and dependency management overhead.
83
+
84
+ ## Conclusion: Why Neo.mjs Offers Significant Technical Advantages Over Vue.js
85
+
86
+ For applications where guaranteed Main Thread responsiveness, high performance under load, leveraging multi-core processing, and long-term maintainability are paramount, Neo.mjs presents a compelling and technically superior alternative.
87
+
88
+ * **Unblocked Main Thread & Inherent Performance:** While Vue is highly optimized for the Main Thread, Neo.mjs's unique worker-based architecture fundamentally removes application logic from the Main Thread entirely. This is not an optimization strategy but a core architectural principle, ensuring the UI remains fluid and responsive even during heavy computations that would challenge any single-threaded framework.
89
+ * **True Parallelism:** Neo.mjs doesn't just optimize tasks on the Main Thread; it runs them in parallel on separate threads. This provides a higher performance ceiling for complex, data-intensive applications.
90
+ * **Linear Effort for Complexity:** Like Vue, Neo.mjs avoids unnecessary re-renders. However, by offloading this work to workers, it ensures that even complex update cycles have zero impact on the Main Thread's availability, allowing for more scalable and maintainable applications in the long run.
91
+
92
+ The choice between them depends on the specific application's needs. For many content-driven sites and standard business applications, Vue's performance and developer experience are excellent. For applications pushing the boundaries of complexity and performance, where guaranteed UI fluidity is a critical requirement, Neo.mjs offers a fundamentally more robust and scalable architecture.
@@ -0,0 +1,46 @@
1
+ # Overview
2
+
3
+ ## Framework Comparisons
4
+
5
+ This section provides detailed comparisons between Neo.mjs and other popular JavaScript frameworks. Our goal is to help
6
+ you understand the key similarities, differences, and unique advantages of Neo.mjs in relation to technologies you might
7
+ already be familiar with.
8
+
9
+ We aim to compare these frameworks from a **technical, objective, and constructive perspective**, focusing on how
10
+ different architectural choices and design philosophies address common web development challenges. Please note that
11
+ these comparison documents were generated with the assistance of a large language model (Gemini).
12
+
13
+ Each comparison article will focus on:
14
+
15
+ * **Bridging Knowledge Gaps:** Mapping concepts you know to Neo.mjs.
16
+ * **Highlighting Differentiators:** What makes Neo.mjs unique.
17
+ * **Side-by-Side Analysis:** Feature-by-feature comparisons.
18
+ * **Trade-offs and Use Cases:** When Neo.mjs might be the optimal choice.
19
+
20
+ ### Architectural Snapshot
21
+
22
+ The table below offers a high-level architectural comparison of the frameworks discussed in this section. It is designed
23
+ to provide a quick snapshot of their core differences. For a deeper understanding, please refer to the detailed comparison
24
+ articles.
25
+
26
+ | Feature | Neo.mjs | React | Vue.js | Solid.js | Angular |
27
+ | ----------------------- |----------------------------------------| --------------------------------------- | ------------------------------------ | --------------------------------------- | --------------------------------------- |
28
+ | **Core Architecture** | Multi-Threaded (Worker-Based) | Single-Threaded (Main-Thread Bound) | Single-Threaded (Main-Thread Bound) | Single-Threaded (Main-Thread Bound) | Single-Threaded (Main-Thread Bound) |
29
+ | **VDOM Location** | App Worker | Main Thread | Main Thread | No VDOM (Direct DOM Updates) | Main Thread |
30
+ | **Reactivity Model** | Fine-Grained (Surgical Atomic Updates) | Cascading Re-Renders (Manual Memo) | Fine-Grained (Compiler-Assisted) | Fine-Grained (Non-Destructive) | Zone.js (Automatic Change Detection) |
31
+ | **Manual Optimizations**| Not Required | Required (`memo`, `useCallback`, `useMemo`) | Not Required | Not Required | Not Required |
32
+ | **State Mutability** | Directly Mutable | Immutable (Enforced) | Mutable (Proxied) | Mutable (Proxied) | Mutable (Observable-based) |
33
+ | **Dev Environment** | Zero-Builds (Instant) | Build-Based (Vite, etc.) | Build-Based (Vite) | Build-Based (Vite) | Build-Based (Angular CLI) |
34
+ | **Multi-Window Support**| Native (Shared Data/Components) | Limited/Requires Custom Logic | Limited/Requires Custom Logic | Limited/Requires Custom Logic | Limited/Requires Custom Logic |
35
+
36
+ ### Available Comparisons
37
+
38
+ * [Neo.mjs vs. React](/learn/comparisons/NeoVsReact.md)
39
+ * [Neo.mjs vs. Angular](/learn/comparisons/NeoVsAngular.md)
40
+ * [Neo.mjs vs. Vue.js](/learn/comparisons/NeoVsVue.md)
41
+ * [Neo.mjs vs. Solid.js](/learn/comparisons/NeoVsSolid.md)
42
+ * [Neo.mjs vs. Next.js](/learn/comparisons/NeoVsNextJs.md)
43
+ * [Neo.mjs vs. Ext.js](/learn/comparisons/NeoVsExtJs.md)
44
+
45
+ If you have feedback on any of our comparisons or would like to see a new one, please feel free to open an issue on our
46
+ [GitHub repository](https://github.com/neomjs/neo/issues).
@@ -1,3 +1,5 @@
1
+ # Shared Bindable Data
2
+
1
3
  Neo has a feature that allows shared, bindable, data.
2
4
 
3
5
  A _state provider_ — `Neo.state.Provider` — instance holds properties that
@@ -1,3 +1,5 @@
1
+ # Config
2
+
1
3
  As you've probably noticed, Neo.mjs classes have a `static config` property.
2
4
 
3
5
  The config describes properties you can specify as you create an instance of the class.
@@ -1,3 +1,5 @@
1
+ # Describing a View
2
+
1
3
  A Neo.mjs view is comprised of components and containers. A component is a visual widget, like a button,
2
4
  and a container is a visual collection of components.
3
5
 
@@ -1,3 +1,5 @@
1
+ # Events
2
+
1
3
  All components fire events. For example, form fields fire a `change` event, various
2
4
  focus events, and others. Some other types fire events too, such as `Neo.data.Store`,
3
5
  which fires a `load` event after the store is loaded with data.
@@ -1,3 +1,5 @@
1
+ # Extending Classes
2
+
1
3
  In theory, a Neo.mjs app could be defined in a single `.mjs` source file. But that would be very hard to
2
4
  maintain, and any reusable configs would have to be duplicated. Instead, each of your views and reusable
3
5
  widgets will be defined as its own class. The result is simpler views which are inherently reusable and easier
@@ -1,3 +1,5 @@
1
+ # Component References
2
+
1
3
  Controllers often need to get references to components in order to update
2
4
  the UI or access component properties.
3
5
  There are two common ways of doing that:
@@ -1,3 +1,5 @@
1
+ # Setup
2
+
1
3
  Setting up Neo.mjs is pretty easy — all you have to do is confirm that you have some required
2
4
  software then follow a single npx script.
3
5
 
@@ -5,9 +7,8 @@ software then follow a single npx script.
5
7
 
6
8
  Before you get started, Neo.mjs requires that you have a few of things installed:
7
9
 
8
- - npm (see <a href="https://docs.npmjs.com/downloading-and-installing-node-js-and-npm" target="_blank">https://docs.npmjs.com/downloading-and-installing-node-js-and-npm</a>)
10
+ - npm & nodejs (see <a href="https://docs.npmjs.com/downloading-and-installing-node-js-and-npm" target="_blank">https://docs.npmjs.com/downloading-and-installing-node-js-and-npm</a>)
9
11
  - npx (see <a href="https://www.npmjs.com/package/npx" target="_blank">https://www.npmjs.com/package/npx</a>)
10
- - node (see <a href="https://nodejs.org/en/download" target="_blank">https://nodejs.org/en/download</a>)
11
12
 
12
13
  ## Installation
13
14
 
@@ -1,3 +1,5 @@
1
+ # Workspaces and Applications
2
+
1
3
  The purpose of this tutorial is to let you see the structure of a Neo.mjs workspace,
2
4
  and the structure of an application.
3
5
 
@@ -1,3 +1,4 @@
1
+ # Collections
1
2
 
2
3
  Neo.mjs provides a powerful and flexible `Neo.collection.Base` class for managing data. This guide will explore its
3
4
  features, including:
@@ -1,3 +1,4 @@
1
+ # Records
1
2
 
2
3
  In Neo.mjs, a **Record** is a super lightweight, reactive JavaScript object, dynamically created and structured
3
4
  according to a `Neo.data.Model`. Records provide a powerful way to manage application data with built-in features like