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
@@ -5,6 +5,10 @@ import Style from '../../../src/util/Style.mjs';
5
5
  import VdomHelper from '../../../src/vdom/Helper.mjs';
6
6
  import VDomUtil from '../../../src/util/VDom.mjs';
7
7
 
8
+ // tests are designed for this rendering mode
9
+ Neo.config.useDomApiRenderer = false;
10
+ VdomHelper.onNeoConfigChange({useDomApiRenderer: false})
11
+
8
12
  let deltas, output, tmp, vdom, vnode;
9
13
 
10
14
  StartTest(t => {
@@ -18,16 +22,14 @@ StartTest(t => {
18
22
  vdom = {tag: 'div'};
19
23
  t.diag("VdomHelper.create({tag: div});");
20
24
 
21
- vnode = VdomHelper.create(vdom);
25
+ output = VdomHelper.create({vdom}); vnode = output.vnode;
22
26
 
23
27
  t.isDeeplyStrict(vnode, {
24
28
  attributes: {},
25
29
  childNodes: [],
26
30
  className : [],
27
31
  id : 'neo-vnode-1',
28
- innerHTML : undefined,
29
32
  nodeName : 'div',
30
- outerHTML : '<div id="neo-vnode-1"></div>', // will only get created using VdomHelper.create()
31
33
  style : {},
32
34
  vtype : 'vnode'
33
35
  }, 'vnode got created successfully');
@@ -48,7 +50,6 @@ StartTest(t => {
48
50
  childNodes: [],
49
51
  className : ['neo-component'],
50
52
  id : 'neo-vnode-1',
51
- innerHTML : undefined,
52
53
  nodeName : 'div',
53
54
  style : {},
54
55
  vtype : 'vnode'
@@ -68,7 +69,6 @@ StartTest(t => {
68
69
  childNodes: [],
69
70
  className : ['neo-panel', 'neo-container', 'neo-component'],
70
71
  id : 'neo-vnode-1',
71
- innerHTML : undefined,
72
72
  nodeName : 'div',
73
73
  style : {},
74
74
  vtype : 'vnode'
@@ -88,7 +88,6 @@ StartTest(t => {
88
88
  childNodes: [],
89
89
  className : ['neo-container'],
90
90
  id : 'neo-vnode-1',
91
- innerHTML : undefined,
92
91
  nodeName : 'div',
93
92
  style : {},
94
93
  vtype : 'vnode'
@@ -110,7 +109,6 @@ StartTest(t => {
110
109
  childNodes: [],
111
110
  className : ['neo-container'],
112
111
  id : 'neo-vnode-1',
113
- innerHTML : undefined,
114
112
  nodeName : 'div',
115
113
  style : {backgroundColor: 'red'},
116
114
  vtype : 'vnode'
@@ -133,7 +131,6 @@ StartTest(t => {
133
131
  childNodes: [],
134
132
  className : ['neo-container'],
135
133
  id : 'neo-vnode-1',
136
- innerHTML : undefined,
137
134
  nodeName : 'div',
138
135
  style : {backgroundColor: 'red', color: 'green', height: '100px'},
139
136
  vtype : 'vnode'
@@ -157,7 +154,6 @@ StartTest(t => {
157
154
  childNodes: [],
158
155
  className : ['neo-container'],
159
156
  id : 'neo-vnode-1',
160
- innerHTML : undefined,
161
157
  nodeName : 'div',
162
158
  style : {color: 'green'},
163
159
  vtype : 'vnode'
@@ -183,7 +179,6 @@ StartTest(t => {
183
179
  childNodes: [],
184
180
  className : ['neo-container'],
185
181
  id : 'neo-vnode-1',
186
- innerHTML : undefined,
187
182
  nodeName : 'div',
188
183
  style : {color: 'green'},
189
184
  vtype : 'vnode'
@@ -206,7 +201,6 @@ StartTest(t => {
206
201
  childNodes: [],
207
202
  className : ['neo-container'],
208
203
  id : 'neo-vnode-1',
209
- innerHTML : undefined,
210
204
  nodeName : 'div',
211
205
  style : {color: 'green'},
212
206
  vtype : 'vnode'
@@ -229,7 +223,6 @@ StartTest(t => {
229
223
  childNodes: [],
230
224
  className : ['neo-container'],
231
225
  id : 'neo-vnode-1',
232
- innerHTML : undefined,
233
226
  nodeName : 'div',
234
227
  style : {color: 'green'},
235
228
  vtype : 'vnode'
@@ -254,15 +247,14 @@ StartTest(t => {
254
247
  attributes: {},
255
248
  className : ['neo-container'],
256
249
  id : 'neo-vnode-1',
257
- innerHTML : undefined,
258
250
  nodeName : 'div',
259
251
  style : {color: 'green'},
260
252
  vtype : 'vnode',
261
253
 
262
254
  childNodes: [
263
- {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'},
264
- {attributes: {}, childNodes: [], className: [], id: 'neo-button-1', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'},
265
- {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'}
255
+ {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', nodeName: 'div', style: {}, vtype: 'vnode'},
256
+ {attributes: {}, childNodes: [], className: [], id: 'neo-button-1', nodeName: 'div', style: {}, vtype: 'vnode'},
257
+ {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', nodeName: 'div', style: {}, vtype: 'vnode'}
266
258
  ]
267
259
  }, 'vnode got updated successfully');
268
260
 
@@ -281,15 +273,14 @@ StartTest(t => {
281
273
  attributes: {},
282
274
  className : ['neo-container'],
283
275
  id : 'neo-vnode-1',
284
- innerHTML : undefined,
285
276
  nodeName : 'div',
286
277
  style : {color: 'green'},
287
278
  vtype : 'vnode',
288
279
 
289
280
  childNodes: [
290
- {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'},
291
- {attributes: {}, childNodes: [], className: [], id: 'neo-button-1', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'},
292
- {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'}
281
+ {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', nodeName: 'div', style: {}, vtype: 'vnode'},
282
+ {attributes: {}, childNodes: [], className: [], id: 'neo-button-1', nodeName: 'div', style: {}, vtype: 'vnode'},
283
+ {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', nodeName: 'div', style: {}, vtype: 'vnode'}
293
284
  ]
294
285
  }, 'vnode got updated successfully');
295
286
 
@@ -307,15 +298,14 @@ StartTest(t => {
307
298
  attributes: {},
308
299
  className : ['neo-container'],
309
300
  id : 'neo-vnode-1',
310
- innerHTML : undefined,
311
301
  nodeName : 'div',
312
302
  style : {color: 'green'},
313
303
  vtype : 'vnode',
314
304
 
315
305
  childNodes: [
316
- {attributes: {}, childNodes: [], className: [], id: 'neo-button-1', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'},
317
- {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'},
318
- {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'}
306
+ {attributes: {}, childNodes: [], className: [], id: 'neo-button-1', nodeName: 'div', style: {}, vtype: 'vnode'},
307
+ {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', nodeName: 'div', style: {}, vtype: 'vnode'},
308
+ {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', nodeName: 'div', style: {}, vtype: 'vnode'}
319
309
  ]
320
310
  }, 'vnode got updated successfully');
321
311
 
@@ -333,15 +323,14 @@ StartTest(t => {
333
323
  attributes: {},
334
324
  className : ['neo-container'],
335
325
  id : 'neo-vnode-1',
336
- innerHTML : undefined,
337
326
  nodeName : 'div',
338
327
  style : {color: 'green'},
339
328
  vtype : 'vnode',
340
329
 
341
330
  childNodes: [
342
- {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'},
343
- {attributes: {}, childNodes: [], className: [], id: 'neo-button-1', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'},
344
- {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', innerHTML: undefined, nodeName: 'div', style: {}, vtype: 'vnode'}
331
+ {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-3', nodeName: 'div', style: {}, vtype: 'vnode'},
332
+ {attributes: {}, childNodes: [], className: [], id: 'neo-button-1', nodeName: 'div', style: {}, vtype: 'vnode'},
333
+ {attributes: {}, childNodes: [], className: [], id: 'neo-vnode-2', nodeName: 'div', style: {}, vtype: 'vnode'}
345
334
  ]
346
335
  }, 'vnode got updated successfully');
347
336
 
@@ -370,15 +359,13 @@ StartTest(t => {
370
359
  ]
371
360
  };
372
361
 
373
- vnode = VdomHelper.create(vdom);
362
+ output = VdomHelper.create({vdom}); vnode = output.vnode;
374
363
 
375
364
  t.isDeeplyStrict(vnode, {
376
365
  attributes: {},
377
366
  className : ['neo-list-container', 'neo-list'],
378
367
  id : 'neo-list-1',
379
- innerHTML : undefined,
380
368
  nodeName : 'ul',
381
- outerHTML : '<ul style="width:100px;" class="neo-list-container neo-list" id="neo-list-1"><li class="neo-list-item" id="neo-list-1__bhaustein" tabIndex="-1">Bastian</li><li class="neo-list-item" id="neo-list-1__camtnbikerrwc" tabIndex="-1">Gerard</li><li class="neo-list-item" id="neo-list-1__jsakalos" tabIndex="-1">Jozef</li><li class="neo-list-item" id="neo-list-1__mrsunshine" tabIndex="-1">Nils</li><li class="neo-list-item" id="neo-list-1__rwaters" tabIndex="-1">Rich</li><li class="neo-list-item" id="neo-list-1__tobiu" tabIndex="-1">Tobias</li></ul>',
382
369
  style : {width: '100px'},
383
370
  vtype : 'vnode',
384
371
 
@@ -406,7 +393,6 @@ StartTest(t => {
406
393
  attributes: {},
407
394
  className : ['neo-list-container', 'neo-list'],
408
395
  id : 'neo-list-1',
409
- innerHTML : undefined,
410
396
  nodeName : 'ul',
411
397
  style : {width: '100px'},
412
398
  vtype : 'vnode',
@@ -443,7 +429,6 @@ StartTest(t => {
443
429
  attributes: {},
444
430
  className : ['neo-list-container', 'neo-list'],
445
431
  id : 'neo-list-1',
446
- innerHTML : undefined,
447
432
  nodeName : 'ul',
448
433
  style : {width: '100px'},
449
434
  vtype : 'vnode',
@@ -481,7 +466,6 @@ StartTest(t => {
481
466
  attributes: {},
482
467
  className : ['neo-list-container', 'neo-list'],
483
468
  id : 'neo-list-1',
484
- innerHTML : undefined,
485
469
  nodeName : 'ul',
486
470
  style : {width: '100px'},
487
471
  vtype : 'vnode',
@@ -558,15 +542,13 @@ StartTest(t => {
558
542
  {id: '9', html: 'w'}
559
543
  ]};
560
544
 
561
- vnode = VdomHelper.create(vdom);
545
+ output = VdomHelper.create({vdom}); vnode = output.vnode;
562
546
 
563
547
  t.isDeeplyStrict(vnode, {
564
548
  attributes: {},
565
549
  className : [],
566
550
  id : 'root',
567
- innerHTML : undefined,
568
551
  nodeName : 'div',
569
- outerHTML : t.any(String),
570
552
  style : {},
571
553
  vtype : 'vnode',
572
554
 
@@ -603,7 +585,6 @@ StartTest(t => {
603
585
  attributes: {},
604
586
  className : [],
605
587
  id : 'root',
606
- innerHTML : undefined,
607
588
  nodeName : 'div',
608
589
  style : {},
609
590
  vtype : 'vnode',
@@ -635,15 +616,13 @@ StartTest(t => {
635
616
  ]}
636
617
  ]};
637
618
 
638
- vnode = VdomHelper.create(vdom);
619
+ output = VdomHelper.create({vdom}); vnode = output.vnode;
639
620
 
640
621
  t.isDeeplyStrict(vnode, {
641
622
  attributes: {},
642
623
  className : [],
643
624
  id : 'level-1',
644
- innerHTML : undefined,
645
625
  nodeName : 'div',
646
- outerHTML : t.any(String),
647
626
  style : {},
648
627
  vtype : 'vnode',
649
628
 
@@ -651,7 +630,6 @@ StartTest(t => {
651
630
  id : 'level-2',
652
631
  attributes: {},
653
632
  className : [],
654
- innerHTML : undefined,
655
633
  nodeName : 'div',
656
634
  style : {},
657
635
  vtype : 'vnode',
@@ -661,7 +639,6 @@ StartTest(t => {
661
639
  attributes: {},
662
640
  childNodes: [],
663
641
  className : [],
664
- innerHTML : undefined,
665
642
  nodeName : 'div',
666
643
  style : {},
667
644
  vtype : 'vnode'
@@ -678,7 +655,6 @@ StartTest(t => {
678
655
  attributes: {},
679
656
  className : [],
680
657
  id : 'level-1',
681
- innerHTML : undefined,
682
658
  nodeName : 'div',
683
659
  style : {},
684
660
  vtype : 'vnode',
@@ -688,7 +664,6 @@ StartTest(t => {
688
664
  attributes: {},
689
665
  childNodes: [],
690
666
  className : [],
691
- innerHTML : undefined,
692
667
  nodeName : 'div',
693
668
  style : {},
694
669
  vtype : 'vnode'
@@ -714,15 +689,13 @@ StartTest(t => {
714
689
  ]}
715
690
  ]};
716
691
 
717
- vnode = VdomHelper.create(vdom);
692
+ output = VdomHelper.create({vdom}); vnode = output.vnode;
718
693
 
719
694
  t.isDeeplyStrict(vnode, {
720
695
  attributes: {},
721
696
  className : [],
722
697
  id : 'level-1',
723
- innerHTML : undefined,
724
698
  nodeName : 'div',
725
- outerHTML : t.any(String),
726
699
  style : {},
727
700
  vtype : 'vnode',
728
701
 
@@ -730,7 +703,6 @@ StartTest(t => {
730
703
  id : 'level-2',
731
704
  attributes: {},
732
705
  className : [],
733
- innerHTML : undefined,
734
706
  nodeName : 'div',
735
707
  style : {},
736
708
  vtype : 'vnode',
@@ -740,7 +712,6 @@ StartTest(t => {
740
712
  attributes: {},
741
713
  childNodes: [],
742
714
  className : [],
743
- innerHTML : undefined,
744
715
  nodeName : 'div',
745
716
  style : {},
746
717
  vtype : 'vnode'
@@ -749,7 +720,6 @@ StartTest(t => {
749
720
  attributes: {},
750
721
  childNodes: [],
751
722
  className : [],
752
- innerHTML : undefined,
753
723
  nodeName : 'div',
754
724
  style : {},
755
725
  vtype : 'vnode'
@@ -766,7 +736,6 @@ StartTest(t => {
766
736
  attributes: {},
767
737
  className : [],
768
738
  id : 'level-1',
769
- innerHTML : undefined,
770
739
  nodeName : 'div',
771
740
  style : {},
772
741
  vtype : 'vnode',
@@ -776,7 +745,6 @@ StartTest(t => {
776
745
  attributes: {},
777
746
  childNodes: [],
778
747
  className : [],
779
- innerHTML : undefined,
780
748
  nodeName : 'div',
781
749
  style : {},
782
750
  vtype : 'vnode'
@@ -785,7 +753,6 @@ StartTest(t => {
785
753
  attributes: {},
786
754
  childNodes: [],
787
755
  className : [],
788
- innerHTML : undefined,
789
756
  nodeName : 'div',
790
757
  style : {},
791
758
  vtype : 'vnode'
@@ -810,7 +777,7 @@ StartTest(t => {
810
777
  ]}
811
778
  ]};
812
779
 
813
- vnode = VdomHelper.create(vdom);
780
+ output = VdomHelper.create({vdom}); vnode = output.vnode;
814
781
 
815
782
  vdom =
816
783
  {id: 'level-1', cn: [
@@ -825,7 +792,6 @@ StartTest(t => {
825
792
  attributes: {},
826
793
  className : [],
827
794
  id : 'level-1',
828
- innerHTML : undefined,
829
795
  nodeName : 'div',
830
796
  style : {},
831
797
  vtype : 'vnode',
@@ -835,7 +801,6 @@ StartTest(t => {
835
801
  attributes: {},
836
802
  childNodes: [],
837
803
  className : [],
838
- innerHTML : undefined,
839
804
  nodeName : 'div',
840
805
  style : {},
841
806
  vtype : 'vnode'
@@ -844,7 +809,6 @@ StartTest(t => {
844
809
  attributes: {},
845
810
  childNodes: [],
846
811
  className : [],
847
- innerHTML : undefined,
848
812
  nodeName : 'div',
849
813
  style : {},
850
814
  vtype : 'vnode'
@@ -853,7 +817,6 @@ StartTest(t => {
853
817
  attributes: {},
854
818
  childNodes: [],
855
819
  className : [],
856
- innerHTML : undefined,
857
820
  nodeName : 'div',
858
821
  style : {},
859
822
  vtype : 'vnode'
@@ -0,0 +1,100 @@
1
+ import Neo from '../../../../src/Neo.mjs';
2
+ import * as core from '../../../../src/core/_export.mjs';
3
+
4
+ class TestComponent extends core.Base {
5
+ static config = {
6
+ className : 'Neo.Test.AfterSetConfigComponent',
7
+ configA_ : 'initialA',
8
+ configB_ : 'initialB',
9
+ configC_ : 'initialC',
10
+ nonReactive : 'initialNonReactive' // Non-reactive config
11
+ }
12
+
13
+ classField = 'initialClassField'; // Public class field
14
+
15
+ afterSetConfigCalls = [];
16
+
17
+ afterSetConfig(key, newValue, oldValue) {
18
+ this.afterSetConfigCalls.push({key, newValue, oldValue});
19
+ }
20
+ }
21
+ Neo.setupClass(TestComponent);
22
+
23
+ StartTest(t => {
24
+ t.it('afterSetConfig should be called for individual config changes', t => {
25
+ const instance = Neo.create(TestComponent);
26
+ instance.afterSetConfigCalls = []; // Reset for this test
27
+
28
+ instance.configA = 'valueA';
29
+ t.is(instance.afterSetConfigCalls.length, 1, 'afterSetConfig should be called once');
30
+ t.isDeeplyStrict(instance.afterSetConfigCalls[0], {key: 'configA', newValue: 'valueA', oldValue: 'initialA'}, 'Correct arguments for configA');
31
+
32
+ instance.configB = 'valueB';
33
+ t.is(instance.afterSetConfigCalls.length, 2, 'afterSetConfig should be called twice');
34
+ t.isDeeplyStrict(instance.afterSetConfigCalls[1], {key: 'configB', newValue: 'valueB', oldValue: 'initialB'}, 'Correct arguments for configB');
35
+ });
36
+
37
+ t.it('afterSetConfig should be called for each changed reactive config when using instance.set()', t => {
38
+ const instance = Neo.create(TestComponent);
39
+ instance.afterSetConfigCalls = []; // Reset for this test
40
+
41
+ instance.set({
42
+ configA: 'newValueA',
43
+ configB: 'newValueB',
44
+ configC: 'newValueC'
45
+ });
46
+
47
+ t.is(instance.afterSetConfigCalls.length, 3, 'afterSetConfig should be called three times');
48
+ t.isDeeplyStrict(instance.afterSetConfigCalls[0], {key: 'configA', newValue: 'newValueA', oldValue: 'initialA'}, 'Correct arguments for configA via set()');
49
+ t.isDeeplyStrict(instance.afterSetConfigCalls[1], {key: 'configB', newValue: 'newValueB', oldValue: 'initialB'}, 'Correct arguments for configB via set()');
50
+ t.isDeeplyStrict(instance.afterSetConfigCalls[2], {key: 'configC', newValue: 'newValueC', oldValue: 'initialC'}, 'Correct arguments for configC via set()');
51
+ });
52
+
53
+ t.it('afterSetConfig should not be called for unchanged values', t => {
54
+ const instance = Neo.create(TestComponent);
55
+ instance.afterSetConfigCalls = []; // Reset for this test
56
+
57
+ instance.configA = 'initialA'; // Set to same value
58
+ t.is(instance.afterSetConfigCalls.length, 0, 'afterSetConfig should not be called for unchanged individual reactive config');
59
+
60
+ instance.set({
61
+ configA: 'initialA',
62
+ configB: 'initialB'
63
+ });
64
+ t.is(instance.afterSetConfigCalls.length, 0, 'afterSetConfig should not be called for unchanged reactive configs via set()');
65
+ });
66
+
67
+ t.it('instance.set() should update class fields and non-reactive configs without calling afterSetConfig', t => {
68
+ const instance = Neo.create(TestComponent);
69
+ instance.afterSetConfigCalls = []; // Reset for this test
70
+
71
+ instance.set({
72
+ configA : 'changedA', // Reactive
73
+ nonReactive: 'changedNonReactive', // Non-reactive
74
+ classField : 'changedClassField' // Class field
75
+ });
76
+
77
+ // Verify reactive config update and afterSetConfig call
78
+ t.is(instance.configA, 'changedA', 'Reactive configA should be updated');
79
+ t.is(instance.afterSetConfigCalls.length, 1, 'afterSetConfig should be called only once for configA');
80
+ t.isDeeplyStrict(instance.afterSetConfigCalls[0], {key: 'configA', newValue: 'changedA', oldValue: 'initialA'}, 'Correct arguments for configA');
81
+
82
+ // Verify non-reactive config update, no afterSetConfig call
83
+ t.is(instance.nonReactive, 'changedNonReactive', 'Non-reactive config should be updated');
84
+
85
+ // Verify class field update, no afterSetConfig call
86
+ t.is(instance.classField, 'changedClassField', 'Class field should be updated');
87
+
88
+ // Reset and test with only non-reactive/class field changes
89
+ instance.afterSetConfigCalls = [];
90
+ instance.set({
91
+ nonReactive: 'changedAgainNonReactive',
92
+ classField : 'changedAgainClassField'
93
+ });
94
+
95
+ t.is(instance.afterSetConfigCalls.length, 0, 'afterSetConfig should not be called for only non-reactive/class field changes');
96
+ t.is(instance.nonReactive, 'changedAgainNonReactive', 'Non-reactive config should be updated again');
97
+ t.is(instance.classField, 'changedAgainClassField', 'Class field should be updated again');
98
+ });
99
+ });
100
+
@@ -1,20 +1,20 @@
1
- import Neo from '../../../src/Neo.mjs';
2
- import * as core from '../../../src/core/_export.mjs';
3
- import {isDescriptor} from '../../../src/core/ConfigSymbols.mjs';
1
+ import Neo from '../../../../src/Neo.mjs';
2
+ import * as core from '../../../../src/core/_export.mjs';
3
+ import {isDescriptor} from '../../../../src/core/ConfigSymbols.mjs';
4
4
 
5
5
  class MyComponent extends core.Base {
6
6
  static config = {
7
- className: 'Neo.TestComponent',
8
- myConfig_ : 'initialValue',
9
- arrayConfig_: {
7
+ className : 'Neo.TestComponent',
8
+ myConfig_ : 'initialValue',
9
+ arrayConfig_ : {
10
10
  [isDescriptor]: true,
11
- value: [],
12
- merge: 'replace'
11
+ value : [],
12
+ merge : 'replace'
13
13
  },
14
14
  objectConfig_: {
15
15
  [isDescriptor]: true,
16
- value: {},
17
- merge: 'deep'
16
+ value : {},
17
+ merge : 'deep'
18
18
  }
19
19
  }
20
20
 
@@ -27,13 +27,12 @@ MyComponent = Neo.setupClass(MyComponent);
27
27
 
28
28
  StartTest(t => {
29
29
  t.it('Basic reactivity with subscribe', t => {
30
- const instance = Neo.create(MyComponent);
31
- const configController = instance.getConfig('myConfig');
30
+ const instance = Neo.create(MyComponent);
32
31
 
33
32
  let subscriberCalled = false;
34
33
  let receivedNewValue, receivedOldValue;
35
34
 
36
- const cleanup = configController.subscribe((newValue, oldValue) => {
35
+ const cleanup = instance.observeConfig(instance, 'myConfig', (newValue, oldValue) => {
37
36
  subscriberCalled = true;
38
37
  receivedNewValue = newValue;
39
38
  receivedOldValue = oldValue;
@@ -54,21 +53,20 @@ StartTest(t => {
54
53
 
55
54
  t.it('Descriptor: arrayConfig_ with merge: replace', t => {
56
55
  const instance = Neo.create(MyComponent);
57
- const configController = instance.getConfig('arrayConfig');
58
56
 
59
57
  let subscriberCalled = 0;
60
- configController.subscribe((newValue, oldValue) => {
58
+ instance.observeConfig(instance, 'arrayConfig', (newValue, oldValue) => {
61
59
  subscriberCalled++;
62
60
  });
63
61
 
64
62
  const arr1 = [1, 2, 3];
65
63
  instance.arrayConfig = arr1;
66
- t.is(instance.arrayConfig, arr1, 'Array should be replaced');
64
+ t.isDeeplyStrict(instance.arrayConfig, arr1, 'Array should be replaced');
67
65
  t.is(subscriberCalled, 1, 'Subscriber called once for array replacement');
68
66
 
69
67
  const arr2 = [4, 5, 6];
70
68
  instance.arrayConfig = arr2;
71
- t.is(instance.arrayConfig, arr2, 'Array should be replaced again');
69
+ t.isDeeplyStrict(instance.arrayConfig, arr2, 'Array should be replaced again');
72
70
  t.is(subscriberCalled, 2, 'Subscriber called twice for array replacement');
73
71
 
74
72
  // Setting the same array should not trigger a change by default isEqual
@@ -78,16 +76,15 @@ StartTest(t => {
78
76
 
79
77
  t.it('Descriptor: objectConfig_ with merge: deep', t => {
80
78
  const instance = Neo.create(MyComponent);
81
- const configController = instance.getConfig('objectConfig');
82
79
 
83
80
  let subscriberCalled = 0;
84
- configController.subscribe((newValue, oldValue) => {
81
+ instance.observeConfig(instance, 'objectConfig', (newValue, oldValue) => {
85
82
  subscriberCalled++;
86
83
  });
87
84
 
88
85
  const obj1 = {a: 1, b: {c: 2}};
89
86
  instance.objectConfig = obj1;
90
- t.is(instance.objectConfig, obj1, 'Object should be set');
87
+ t.isDeeplyStrict(instance.objectConfig, obj1, 'Object should be set');
91
88
  t.is(subscriberCalled, 1, 'Subscriber called once for object set');
92
89
 
93
90
  // Deep merge should happen, but default isEqual will still compare references
@@ -103,10 +100,50 @@ StartTest(t => {
103
100
 
104
101
  // Modifying a nested property should trigger a change if isEqual is deep
105
102
  // NOTE: The current Config.mjs uses Neo.isEqual which is a deep comparison.
106
- // If the object reference changes, it will trigger. If the object reference stays the same, but content changes, it will not trigger unless isEqual is customized.
103
+ // If the object reference changes, it will trigger. If the object reference stays the same,
104
+ // but content changes, it will not trigger unless isEqual is customized.
107
105
  // For now, this test relies on the fact that setting a new object reference triggers the change.
108
106
  const obj3 = {a: 1, b: {c: 2}};
109
107
  instance.objectConfig = obj3;
110
108
  t.is(subscriberCalled, 3, 'Subscriber called for new object reference');
111
109
  });
110
+
111
+ t.it('Multiple subscriptions from same owner ID', t => {
112
+ const instance = Neo.create(MyComponent);
113
+ const publisher = instance; // Observing itself for simplicity
114
+ const configName = 'myConfig';
115
+
116
+ let callback1Called = false;
117
+ let callback2Called = false;
118
+
119
+ const cleanup1 = instance.observeConfig(publisher, configName, (newValue, oldValue) => {
120
+ callback1Called = true;
121
+ });
122
+
123
+ const cleanup2 = instance.observeConfig(publisher, configName, (newValue, oldValue) => {
124
+ callback2Called = true;
125
+ });
126
+
127
+ // Reset flags
128
+ callback1Called = false;
129
+ callback2Called = false;
130
+
131
+ // Change the config value
132
+ instance.myConfig = 'changedValue';
133
+
134
+ t.ok(callback1Called, 'First callback should be called');
135
+ t.ok(callback2Called, 'Second callback should be called');
136
+
137
+ // Test cleanup
138
+ cleanup1();
139
+ cleanup2();
140
+
141
+ callback1Called = false;
142
+ callback2Called = false;
143
+
144
+ instance.myConfig = 'anotherChange';
145
+
146
+ t.notOk(callback1Called, 'First callback should NOT be called after cleanup');
147
+ t.notOk(callback2Called, 'Second callback should NOT be called after cleanup');
148
+ });
112
149
  });