neo.mjs 10.0.0-beta.5 → 10.0.0

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 (491) hide show
  1. package/.github/RELEASE_NOTES/v10.0.0-beta.1.md +20 -0
  2. package/.github/RELEASE_NOTES/v10.0.0-beta.2.md +73 -0
  3. package/.github/RELEASE_NOTES/v10.0.0-beta.3.md +39 -0
  4. package/.github/RELEASE_NOTES/v10.0.0-beta.5.md +70 -0
  5. package/.github/RELEASE_NOTES/v10.0.0-beta.6.md +48 -0
  6. package/.github/RELEASE_NOTES/v10.0.0.md +52 -0
  7. package/.github/epic-functional-components.md +498 -0
  8. package/.github/ticket-asymmetric-vdom-updates.md +122 -0
  9. package/README.md +0 -3
  10. package/ServiceWorker.mjs +2 -2
  11. package/apps/colors/store/Colors.mjs +1 -0
  12. package/apps/colors/view/GridContainer.mjs +3 -0
  13. package/apps/colors/view/HeaderToolbar.mjs +2 -0
  14. package/apps/colors/view/Viewport.mjs +3 -0
  15. package/apps/covid/view/FooterContainer.mjs +3 -0
  16. package/apps/covid/view/GalleryContainer.mjs +2 -0
  17. package/apps/covid/view/GalleryContainerController.mjs +1 -0
  18. package/apps/covid/view/HeaderContainer.mjs +2 -0
  19. package/apps/covid/view/HelixContainer.mjs +2 -0
  20. package/apps/covid/view/HelixContainerController.mjs +1 -0
  21. package/apps/covid/view/MainContainer.mjs +3 -0
  22. package/apps/covid/view/TableContainer.mjs +3 -0
  23. package/apps/covid/view/TableContainerController.mjs +1 -0
  24. package/apps/covid/view/WorldMapContainer.mjs +2 -0
  25. package/apps/covid/view/country/Gallery.mjs +3 -0
  26. package/apps/covid/view/country/Helix.mjs +8 -0
  27. package/apps/covid/view/country/HistoricalDataTable.mjs +1 -0
  28. package/apps/covid/view/country/Table.mjs +2 -0
  29. package/apps/covid/view/mapboxGl/Component.mjs +1 -0
  30. package/apps/covid/view/mapboxGl/Container.mjs +2 -0
  31. package/apps/email/EPIC_PLAN.md +58 -0
  32. package/apps/email/neo-config.json +2 -2
  33. package/apps/email/store/Emails.mjs +11 -1
  34. package/apps/email/view/ComposeView.mjs +44 -0
  35. package/apps/email/view/MainView.mjs +89 -0
  36. package/apps/email/view/Viewport.mjs +4 -33
  37. package/apps/email/view/ViewportStateProvider.mjs +3 -3
  38. package/apps/form/store/SideNav.mjs +1 -0
  39. package/apps/form/view/FormContainer.mjs +1 -0
  40. package/apps/form/view/FormPageContainer.mjs +2 -0
  41. package/apps/form/view/SideNavList.mjs +1 -0
  42. package/apps/form/view/Viewport.mjs +3 -0
  43. package/apps/portal/childapps/preview/MainContainer.mjs +1 -0
  44. package/apps/portal/index.html +1 -1
  45. package/apps/portal/store/BlogPosts.mjs +2 -0
  46. package/apps/portal/store/Content.mjs +1 -0
  47. package/apps/portal/store/ContentSections.mjs +1 -0
  48. package/apps/portal/store/Examples.mjs +1 -0
  49. package/apps/portal/view/HeaderToolbar.mjs +1 -0
  50. package/apps/portal/view/Viewport.mjs +5 -0
  51. package/apps/portal/view/ViewportController.mjs +11 -3
  52. package/apps/portal/view/about/Container.mjs +2 -0
  53. package/apps/portal/view/about/MemberContainer.mjs +7 -0
  54. package/apps/portal/view/blog/Container.mjs +2 -0
  55. package/apps/portal/view/blog/List.mjs +2 -0
  56. package/apps/portal/view/examples/List.mjs +29 -19
  57. package/apps/portal/view/examples/TabContainer.mjs +4 -0
  58. package/apps/portal/view/home/ContentBox.mjs +3 -0
  59. package/apps/portal/view/home/FeatureSection.mjs +8 -0
  60. package/apps/portal/view/home/FooterContainer.mjs +4 -1
  61. package/apps/portal/view/home/MainContainer.mjs +2 -0
  62. package/apps/portal/view/home/parts/AfterMath.mjs +2 -0
  63. package/apps/portal/view/home/parts/BaseContainer.mjs +1 -0
  64. package/apps/portal/view/home/parts/Colors.mjs +4 -0
  65. package/apps/portal/view/home/parts/Features.mjs +2 -0
  66. package/apps/portal/view/home/parts/Helix.mjs +5 -0
  67. package/apps/portal/view/home/parts/How.mjs +4 -0
  68. package/apps/portal/view/home/parts/MainNeo.mjs +1 -0
  69. package/apps/portal/view/home/parts/References.mjs +2 -0
  70. package/apps/portal/view/learn/ContentComponent.mjs +11 -5
  71. package/apps/portal/view/learn/ContentTreeList.mjs +2 -0
  72. package/apps/portal/view/learn/CubeLayoutButton.mjs +1 -0
  73. package/apps/portal/view/learn/MainContainer.mjs +4 -0
  74. package/apps/portal/view/learn/PageContainer.mjs +2 -0
  75. package/apps/portal/view/learn/PageSectionsContainer.mjs +3 -0
  76. package/apps/portal/view/learn/PageSectionsList.mjs +1 -0
  77. package/apps/portal/view/services/Component.mjs +1 -0
  78. package/apps/realworld/api/Base.mjs +1 -0
  79. package/apps/realworld/view/HeaderComponent.mjs +4 -0
  80. package/apps/realworld/view/HomeComponent.mjs +7 -0
  81. package/apps/realworld/view/MainContainer.mjs +2 -0
  82. package/apps/realworld/view/MainContainerController.mjs +2 -0
  83. package/apps/realworld/view/article/CommentComponent.mjs +3 -0
  84. package/apps/realworld/view/article/Component.mjs +17 -10
  85. package/apps/realworld/view/article/CreateCommentComponent.mjs +2 -0
  86. package/apps/realworld/view/article/CreateComponent.mjs +5 -0
  87. package/apps/realworld/view/article/PreviewComponent.mjs +9 -0
  88. package/apps/realworld/view/article/TagListComponent.mjs +2 -0
  89. package/apps/realworld/view/user/ProfileComponent.mjs +7 -0
  90. package/apps/realworld/view/user/SettingsComponent.mjs +5 -0
  91. package/apps/realworld/view/user/SignUpComponent.mjs +3 -0
  92. package/apps/realworld2/api/Base.mjs +1 -0
  93. package/apps/realworld2/view/FooterComponent.mjs +1 -0
  94. package/apps/realworld2/view/HeaderToolbar.mjs +3 -0
  95. package/apps/realworld2/view/HomeContainer.mjs +1 -0
  96. package/apps/realworld2/view/MainContainer.mjs +2 -0
  97. package/apps/realworld2/view/MainContainerController.mjs +1 -0
  98. package/apps/realworld2/view/article/Helix.mjs +1 -0
  99. package/apps/realworld2/view/article/PreviewComponent.mjs +9 -0
  100. package/apps/realworld2/view/article/PreviewList.mjs +1 -0
  101. package/apps/realworld2/view/article/TagListComponent.mjs +2 -0
  102. package/apps/route/view/CenterContainer.mjs +1 -0
  103. package/apps/route/view/MainView.mjs +1 -0
  104. package/apps/sharedcovid/childapps/sharedcovidchart/MainContainer.mjs +1 -0
  105. package/apps/sharedcovid/childapps/sharedcovidgallery/MainContainer.mjs +1 -0
  106. package/apps/sharedcovid/childapps/sharedcovidhelix/MainContainer.mjs +1 -0
  107. package/apps/sharedcovid/childapps/sharedcovidmap/MainContainer.mjs +1 -0
  108. package/apps/sharedcovid/view/FooterContainer.mjs +3 -0
  109. package/apps/sharedcovid/view/GalleryContainer.mjs +2 -0
  110. package/apps/sharedcovid/view/GalleryContainerController.mjs +1 -0
  111. package/apps/sharedcovid/view/HeaderContainer.mjs +2 -0
  112. package/apps/sharedcovid/view/HelixContainer.mjs +2 -0
  113. package/apps/sharedcovid/view/HelixContainerController.mjs +1 -0
  114. package/apps/sharedcovid/view/MainContainer.mjs +3 -0
  115. package/apps/sharedcovid/view/TableContainer.mjs +3 -0
  116. package/apps/sharedcovid/view/TableContainerController.mjs +1 -0
  117. package/apps/sharedcovid/view/WorldMapContainer.mjs +2 -0
  118. package/apps/sharedcovid/view/country/Gallery.mjs +3 -0
  119. package/apps/sharedcovid/view/country/Helix.mjs +8 -0
  120. package/apps/sharedcovid/view/country/HistoricalDataTable.mjs +1 -0
  121. package/apps/sharedcovid/view/country/Table.mjs +2 -0
  122. package/apps/sharedcovid/view/mapboxGl/Component.mjs +1 -0
  123. package/apps/sharedcovid/view/mapboxGl/Container.mjs +2 -0
  124. package/apps/shareddialog/childapps/shareddialog2/view/MainContainer.mjs +2 -0
  125. package/apps/shareddialog/view/DemoDialog.mjs +2 -0
  126. package/apps/shareddialog/view/MainContainer.mjs +2 -0
  127. package/apps/shareddialog/view/MainContainerController.mjs +1 -0
  128. package/buildScripts/addReactiveTags.mjs +191 -0
  129. package/buildScripts/checkReactiveTags.mjs +160 -0
  130. package/docs/app/store/Api.mjs +1 -0
  131. package/docs/app/store/Examples.mjs +1 -0
  132. package/docs/app/view/ApiTreeList.mjs +1 -0
  133. package/docs/app/view/ContentTabContainer.mjs +2 -0
  134. package/docs/app/view/ExamplesTreeList.mjs +2 -0
  135. package/docs/app/view/HeaderContainer.mjs +3 -0
  136. package/docs/app/view/MainContainer.mjs +5 -0
  137. package/docs/app/view/classdetails/HeaderComponent.mjs +1 -0
  138. package/docs/app/view/classdetails/MainContainer.mjs +3 -0
  139. package/docs/app/view/classdetails/MembersList.mjs +5 -0
  140. package/docs/app/view/classdetails/SourceViewComponent.mjs +2 -0
  141. package/examples/ConfigurationViewport.mjs +14 -8
  142. package/examples/calendar/weekview/MainContainer.mjs +4 -0
  143. package/examples/component/coronaGallery/CountryGallery.mjs +2 -0
  144. package/examples/component/coronaGallery/CountryStore.mjs +1 -0
  145. package/examples/component/coronaGallery/Viewport.mjs +3 -0
  146. package/examples/component/coronaGallery/ViewportController.mjs +1 -0
  147. package/examples/component/coronaHelix/CountryHelix.mjs +7 -0
  148. package/examples/component/coronaHelix/MainContainer.mjs +1 -0
  149. package/examples/component/gallery/ImageStore.mjs +1 -0
  150. package/examples/component/helix/ImageStore.mjs +1 -0
  151. package/examples/component/helix/Viewport.mjs +3 -0
  152. package/examples/component/helix/ViewportController.mjs +1 -0
  153. package/examples/component/multiWindowCoronaGallery/childapp/Viewport.mjs +1 -0
  154. package/examples/component/multiWindowHelix/childapp/Viewport.mjs +1 -0
  155. package/examples/component/wrapper/googleMaps/MapComponent.mjs +2 -0
  156. package/examples/core/config/MainContainer.mjs +2 -0
  157. package/examples/dialog/DemoDialog.mjs +2 -0
  158. package/examples/dialog/MainContainer.mjs +1 -0
  159. package/examples/form/field/color/MainStore.mjs +1 -0
  160. package/examples/functional/button/base/MainContainer.mjs +207 -0
  161. package/examples/functional/button/base/app.mjs +6 -0
  162. package/examples/functional/button/base/index.html +11 -0
  163. package/examples/functional/button/base/neo-config.json +6 -0
  164. package/examples/functional/defineComponent/Component.mjs +18 -0
  165. package/examples/functional/defineComponent/MainContainer.mjs +41 -0
  166. package/examples/functional/defineComponent/app.mjs +6 -0
  167. package/examples/functional/defineComponent/index.html +11 -0
  168. package/examples/functional/defineComponent/neo-config.json +6 -0
  169. package/examples/functional/hostComponent/Component.mjs +32 -0
  170. package/examples/functional/hostComponent/MainContainer.mjs +48 -0
  171. package/examples/functional/hostComponent/app.mjs +6 -0
  172. package/examples/functional/hostComponent/index.html +11 -0
  173. package/examples/functional/hostComponent/neo-config.json +6 -0
  174. package/examples/grid/animatedRowSorting/Viewport.mjs +1 -1
  175. package/examples/grid/bigData/ControlsContainer.mjs +3 -0
  176. package/examples/grid/bigData/GridContainer.mjs +4 -2
  177. package/examples/grid/bigData/MainContainer.mjs +2 -0
  178. package/examples/grid/bigData/MainModel.mjs +1 -0
  179. package/examples/grid/bigData/MainStore.mjs +3 -0
  180. package/examples/grid/cellEditing/MainContainer.mjs +1 -1
  181. package/examples/grid/container/MainContainer.mjs +1 -1
  182. package/examples/grid/covid/GridContainer.mjs +3 -0
  183. package/examples/grid/covid/MainContainer.mjs +2 -0
  184. package/examples/grid/covid/Store.mjs +1 -0
  185. package/examples/grid/nestedRecordFields/EditUserDialog.mjs +3 -0
  186. package/examples/grid/nestedRecordFields/Viewport.mjs +3 -1
  187. package/examples/list/animate/List.mjs +4 -0
  188. package/examples/list/animate/MainContainer.mjs +2 -0
  189. package/examples/list/circle/MainStore.mjs +1 -0
  190. package/examples/list/color/MainStore.mjs +1 -0
  191. package/examples/preloadingAssets/view/MainContainer.mjs +2 -0
  192. package/examples/stateProvider/advanced/MainContainer.mjs +1 -0
  193. package/examples/stateProvider/dialog/EditUserDialog.mjs +2 -0
  194. package/examples/stateProvider/dialog/MainContainer.mjs +1 -0
  195. package/examples/stateProvider/extendedClass/MainContainer.mjs +2 -0
  196. package/examples/stateProvider/inline/MainContainer.mjs +1 -0
  197. package/examples/stateProvider/inlineNoStateProvider/MainContainer.mjs +1 -0
  198. package/examples/stateProvider/inlineNoStateProvider/MainContainerController.mjs +2 -0
  199. package/examples/stateProvider/multiWindow/EditUserDialog.mjs +3 -0
  200. package/examples/stateProvider/multiWindow/MainContainer.mjs +1 -0
  201. package/examples/stateProvider/multiWindow/Viewport.mjs +1 -0
  202. package/examples/stateProvider/nestedData/MainContainer.mjs +1 -0
  203. package/examples/stateProvider/table/MainContainer.mjs +1 -0
  204. package/examples/table/covid/MainContainer.mjs +2 -0
  205. package/examples/table/covid/Store.mjs +1 -0
  206. package/examples/table/covid/TableContainer.mjs +3 -0
  207. package/examples/table/nestedRecordFields/EditUserDialog.mjs +3 -0
  208. package/examples/table/nestedRecordFields/Viewport.mjs +1 -0
  209. package/examples/todoList/version1/MainComponent.mjs +1 -1
  210. package/examples/toolbar/breadcrumb/view/MainContainer.mjs +2 -0
  211. package/examples/toolbar/paging/store/Users.mjs +1 -0
  212. package/examples/toolbar/paging/view/AddUserDialog.mjs +3 -0
  213. package/examples/toolbar/paging/view/MainContainer.mjs +3 -0
  214. package/examples/treeAccordion/MainContainer.mjs +2 -2
  215. package/examples/worker/task/MainContainer.mjs +1 -0
  216. package/learn/Glossary.md +1 -0
  217. package/learn/UsingTheseTopics.md +1 -0
  218. package/learn/benefits/ConfigSystem.md +2 -0
  219. package/learn/benefits/Effort.md +1 -0
  220. package/learn/benefits/Features.md +1 -0
  221. package/learn/benefits/FormsEngine.md +1 -0
  222. package/learn/benefits/FourEnvironments.md +2 -0
  223. package/learn/benefits/Introduction.md +2 -0
  224. package/learn/benefits/MultiWindow.md +3 -1
  225. package/learn/benefits/OffTheMainThread.md +2 -0
  226. package/learn/benefits/Quick.md +2 -0
  227. package/learn/benefits/RPCLayer.md +2 -0
  228. package/learn/benefits/Speed.md +2 -0
  229. package/learn/blog/v10-deep-dive-functional-components.md +293 -0
  230. package/learn/blog/v10-deep-dive-reactivity.md +522 -0
  231. package/learn/blog/v10-deep-dive-state-provider.md +432 -0
  232. package/learn/blog/v10-deep-dive-vdom-revolution.md +194 -0
  233. package/learn/blog/v10-post1-love-story.md +383 -0
  234. package/learn/comparisons/NeoVsAngular.md +90 -0
  235. package/learn/comparisons/NeoVsExtJs.md +178 -0
  236. package/learn/comparisons/NeoVsNextJs.md +124 -0
  237. package/learn/comparisons/NeoVsReact.md +95 -0
  238. package/learn/comparisons/NeoVsSolid.md +78 -0
  239. package/learn/comparisons/NeoVsVue.md +92 -0
  240. package/learn/comparisons/Overview.md +46 -0
  241. package/learn/gettingstarted/ComponentModels.md +2 -0
  242. package/learn/gettingstarted/Config.md +2 -0
  243. package/learn/gettingstarted/DescribingTheUI.md +2 -0
  244. package/learn/gettingstarted/Events.md +2 -0
  245. package/learn/gettingstarted/Extending.md +2 -0
  246. package/learn/gettingstarted/References.md +2 -0
  247. package/learn/gettingstarted/Setup.md +3 -2
  248. package/learn/gettingstarted/Workspaces.md +2 -0
  249. package/learn/guides/datahandling/Collections.md +1 -0
  250. package/learn/guides/datahandling/Records.md +1 -0
  251. package/learn/guides/datahandling/StateProviders.md +130 -16
  252. package/learn/guides/datahandling/Tables.md +1 -1
  253. package/learn/guides/fundamentals/ConfigSystemDeepDive.md +1 -0
  254. package/learn/guides/fundamentals/DeclarativeComponentTreesVsImperativeVdom.md +2 -0
  255. package/learn/guides/fundamentals/DeclarativeVDOMWithEffects.md +10 -8
  256. package/learn/guides/fundamentals/ExtendingNeoClasses.md +1 -0
  257. package/learn/guides/fundamentals/InstanceLifecycle.md +3 -1
  258. package/learn/guides/fundamentals/MainThreadAddons.md +2 -0
  259. package/learn/guides/specificfeatures/Mixins.md +3 -1
  260. package/learn/guides/specificfeatures/MultiWindow.md +3 -1
  261. package/learn/guides/specificfeatures/PortalApp.md +2 -0
  262. package/learn/guides/uibuildingblocks/ComponentsAndContainers.md +2 -0
  263. package/learn/guides/uibuildingblocks/CustomComponents.md +2 -0
  264. package/learn/guides/uibuildingblocks/Layouts.md +2 -0
  265. package/learn/guides/uibuildingblocks/WorkingWithVDom.md +28 -2
  266. package/learn/guides/userinteraction/Forms.md +2 -0
  267. package/learn/guides/userinteraction/events/CustomEvents.md +2 -1
  268. package/learn/guides/userinteraction/events/DomEvents.md +2 -0
  269. package/learn/javascript/ClassFeatures.md +4 -3
  270. package/learn/javascript/Classes.md +10 -13
  271. package/learn/javascript/Overrides.md +10 -6
  272. package/learn/javascript/Super.md +12 -8
  273. package/learn/tree.json +71 -64
  274. package/learn/tutorials/Earthquakes.md +2 -0
  275. package/learn/tutorials/RSP.md +3 -1
  276. package/learn/tutorials/TodoList.md +103 -7
  277. package/package.json +8 -6
  278. package/resources/scss/src/apps/email/ComposeView.scss +16 -0
  279. package/resources/scss/src/apps/email/MainView.scss +5 -0
  280. package/resources/scss/src/apps/portal/learn/ContentComponent.scss +5 -4
  281. package/src/DefaultConfig.mjs +12 -2
  282. package/src/Main.mjs +1 -0
  283. package/src/Neo.mjs +219 -166
  284. package/src/Xhr.mjs +1 -0
  285. package/src/button/Base.mjs +13 -0
  286. package/src/button/Effect.mjs +16 -2
  287. package/src/button/Split.mjs +2 -0
  288. package/src/calendar/store/Calendars.mjs +1 -0
  289. package/src/calendar/store/Colors.mjs +1 -0
  290. package/src/calendar/store/Events.mjs +1 -0
  291. package/src/calendar/view/DayComponent.mjs +2 -0
  292. package/src/calendar/view/EditEventContainer.mjs +4 -1
  293. package/src/calendar/view/MainContainer.mjs +13 -0
  294. package/src/calendar/view/MainContainerStateProvider.mjs +14 -28
  295. package/src/calendar/view/SettingsContainer.mjs +1 -0
  296. package/src/calendar/view/YearComponent.mjs +16 -0
  297. package/src/calendar/view/calendars/ColorsList.mjs +2 -0
  298. package/src/calendar/view/calendars/Container.mjs +2 -0
  299. package/src/calendar/view/calendars/EditContainer.mjs +1 -0
  300. package/src/calendar/view/month/Component.mjs +11 -0
  301. package/src/calendar/view/settings/GeneralContainer.mjs +1 -0
  302. package/src/calendar/view/settings/MonthContainer.mjs +1 -0
  303. package/src/calendar/view/settings/WeekContainer.mjs +1 -0
  304. package/src/calendar/view/settings/YearContainer.mjs +1 -0
  305. package/src/calendar/view/week/Component.mjs +15 -1
  306. package/src/calendar/view/week/TimeAxisComponent.mjs +4 -0
  307. package/src/code/LivePreview.mjs +51 -23
  308. package/src/collection/Base.mjs +7 -10
  309. package/src/collection/Filter.mjs +6 -0
  310. package/src/collection/Sorter.mjs +3 -0
  311. package/src/component/Abstract.mjs +412 -0
  312. package/src/component/Base.mjs +48 -1077
  313. package/src/component/Canvas.mjs +1 -0
  314. package/src/component/Chip.mjs +4 -0
  315. package/src/component/Circle.mjs +14 -0
  316. package/src/component/Clock.mjs +4 -0
  317. package/src/component/DateSelector.mjs +12 -0
  318. package/src/component/Gallery.mjs +11 -0
  319. package/src/component/Helix.mjs +24 -0
  320. package/src/component/Label.mjs +1 -0
  321. package/src/component/Legend.mjs +3 -0
  322. package/src/component/MagicMoveText.mjs +4 -0
  323. package/src/component/Progress.mjs +3 -0
  324. package/src/component/Splitter.mjs +3 -0
  325. package/src/component/StatusBadge.mjs +6 -0
  326. package/src/component/Timer.mjs +4 -0
  327. package/src/component/Toast.mjs +6 -0
  328. package/src/component/Video.mjs +1 -0
  329. package/src/component/mwc/Button.mjs +7 -0
  330. package/src/component/mwc/TextField.mjs +9 -0
  331. package/src/component/wrapper/AmChart.mjs +2 -0
  332. package/src/component/wrapper/GoogleMaps.mjs +3 -0
  333. package/src/component/wrapper/MapboxGL.mjs +5 -0
  334. package/src/component/wrapper/MonacoEditor.mjs +12 -0
  335. package/src/container/Accordion.mjs +2 -0
  336. package/src/container/Base.mjs +7 -3
  337. package/src/container/Panel.mjs +1 -0
  338. package/src/container/Viewport.mjs +1 -0
  339. package/src/controller/Application.mjs +1 -0
  340. package/src/controller/Base.mjs +1 -0
  341. package/src/controller/Component.mjs +1 -0
  342. package/src/core/Base.mjs +86 -33
  343. package/src/core/Compare.mjs +4 -7
  344. package/src/core/Config.mjs +65 -52
  345. package/src/core/Effect.mjs +86 -24
  346. package/src/core/EffectManager.mjs +117 -8
  347. package/src/core/IdGenerator.mjs +13 -44
  348. package/src/core/Observable.mjs +69 -65
  349. package/src/data/Model.mjs +2 -0
  350. package/src/data/Store.mjs +7 -0
  351. package/src/data/connection/WebSocket.mjs +2 -0
  352. package/src/date/DayViewComponent.mjs +2 -0
  353. package/src/date/SelectorContainer.mjs +14 -0
  354. package/src/dialog/Base.mjs +8 -0
  355. package/src/draggable/DragZone.mjs +5 -0
  356. package/src/draggable/tree/DragZone.mjs +1 -0
  357. package/src/filter/BooleanContainer.mjs +2 -0
  358. package/src/filter/NumberContainer.mjs +3 -0
  359. package/src/filter/ToggleOperatorsButton.mjs +2 -0
  360. package/src/form/Fieldset.mjs +6 -0
  361. package/src/form/field/Base.mjs +7 -0
  362. package/src/form/field/CheckBox.mjs +18 -0
  363. package/src/form/field/Chip.mjs +1 -0
  364. package/src/form/field/ComboBox.mjs +8 -0
  365. package/src/form/field/Country.mjs +1 -0
  366. package/src/form/field/Currency.mjs +2 -0
  367. package/src/form/field/Date.mjs +4 -0
  368. package/src/form/field/Display.mjs +1 -0
  369. package/src/form/field/Email.mjs +1 -0
  370. package/src/form/field/FileUpload.mjs +7 -0
  371. package/src/form/field/Hidden.mjs +1 -0
  372. package/src/form/field/Number.mjs +7 -0
  373. package/src/form/field/Password.mjs +1 -0
  374. package/src/form/field/Phone.mjs +3 -0
  375. package/src/form/field/Picker.mjs +2 -0
  376. package/src/form/field/Radio.mjs +1 -0
  377. package/src/form/field/Range.mjs +3 -0
  378. package/src/form/field/Search.mjs +2 -0
  379. package/src/form/field/Text.mjs +43 -5
  380. package/src/form/field/TextArea.mjs +7 -0
  381. package/src/form/field/Time.mjs +6 -0
  382. package/src/form/field/Url.mjs +3 -0
  383. package/src/form/field/ZipCode.mjs +2 -0
  384. package/src/form/field/trigger/Base.mjs +3 -0
  385. package/src/form/field/trigger/Clear.mjs +2 -0
  386. package/src/form/field/trigger/CopyToClipboard.mjs +2 -0
  387. package/src/form/field/trigger/Date.mjs +1 -0
  388. package/src/form/field/trigger/Picker.mjs +1 -0
  389. package/src/form/field/trigger/Search.mjs +1 -0
  390. package/src/form/field/trigger/SpinDown.mjs +2 -0
  391. package/src/form/field/trigger/SpinUp.mjs +1 -0
  392. package/src/form/field/trigger/Time.mjs +2 -0
  393. package/src/functional/_export.mjs +6 -0
  394. package/src/functional/button/Base.mjs +384 -0
  395. package/src/functional/component/Base.mjs +405 -0
  396. package/src/functional/defineComponent.mjs +102 -0
  397. package/src/functional/useConfig.mjs +52 -0
  398. package/src/functional/useEvent.mjs +43 -0
  399. package/src/grid/Body.mjs +20 -1
  400. package/src/grid/Container.mjs +50 -60
  401. package/src/grid/ScrollManager.mjs +2 -0
  402. package/src/grid/VerticalScrollbar.mjs +2 -0
  403. package/src/grid/column/Base.mjs +2 -0
  404. package/src/grid/header/Button.mjs +7 -0
  405. package/src/grid/header/Toolbar.mjs +6 -0
  406. package/src/grid/plugin/AnimateRows.mjs +2 -0
  407. package/src/layout/Base.mjs +3 -0
  408. package/src/layout/Card.mjs +1 -0
  409. package/src/layout/Cube.mjs +18 -4
  410. package/src/layout/Fit.mjs +1 -0
  411. package/src/layout/Flexbox.mjs +7 -0
  412. package/src/layout/Form.mjs +2 -0
  413. package/src/layout/Grid.mjs +1 -0
  414. package/src/layout/HBox.mjs +1 -0
  415. package/src/layout/VBox.mjs +1 -0
  416. package/src/list/Base.mjs +13 -0
  417. package/src/list/Chip.mjs +1 -0
  418. package/src/list/Circle.mjs +2 -0
  419. package/src/list/Color.mjs +1 -0
  420. package/src/list/plugin/Animate.mjs +2 -0
  421. package/src/main/DeltaUpdates.mjs +1 -0
  422. package/src/main/DomEvents.mjs +2 -0
  423. package/src/main/addon/CloneNode.mjs +1 -0
  424. package/src/main/addon/Cookie.mjs +1 -0
  425. package/src/main/addon/GoogleMaps.mjs +1 -0
  426. package/src/main/addon/LocalStorage.mjs +1 -0
  427. package/src/main/addon/MapboxGL.mjs +1 -0
  428. package/src/main/addon/Markdown.mjs +1 -0
  429. package/src/main/addon/Navigator.mjs +1 -0
  430. package/src/main/addon/Popover.mjs +1 -0
  431. package/src/main/addon/Stylesheet.mjs +1 -0
  432. package/src/main/addon/WindowPosition.mjs +1 -0
  433. package/src/manager/Component.mjs +0 -71
  434. package/src/manager/VDomUpdate.mjs +320 -0
  435. package/src/menu/List.mjs +6 -0
  436. package/src/menu/Model.mjs +1 -0
  437. package/src/menu/Panel.mjs +3 -0
  438. package/src/menu/Store.mjs +1 -0
  439. package/src/mixin/DomEvents.mjs +130 -0
  440. package/src/mixin/VdomLifecycle.mjs +670 -0
  441. package/src/plugin/Base.mjs +1 -0
  442. package/src/plugin/Resizable.mjs +2 -0
  443. package/src/selection/Model.mjs +15 -18
  444. package/src/selection/grid/BaseModel.mjs +1 -0
  445. package/src/sitemap/Component.mjs +1 -0
  446. package/src/state/Provider.mjs +129 -87
  447. package/src/state/createHierarchicalDataProxy.mjs +39 -25
  448. package/src/tab/Container.mjs +6 -0
  449. package/src/tab/Strip.mjs +1 -0
  450. package/src/tab/header/Button.mjs +2 -0
  451. package/src/tab/header/EffectButton.mjs +2 -0
  452. package/src/tab/header/Toolbar.mjs +1 -0
  453. package/src/table/Body.mjs +3 -0
  454. package/src/table/Container.mjs +10 -0
  455. package/src/table/header/Button.mjs +8 -0
  456. package/src/table/header/Toolbar.mjs +5 -0
  457. package/src/table/plugin/CellEditing.mjs +1 -0
  458. package/src/toolbar/Base.mjs +4 -0
  459. package/src/toolbar/Breadcrumb.mjs +3 -0
  460. package/src/toolbar/Paging.mjs +5 -0
  461. package/src/tooltip/Base.mjs +2 -0
  462. package/src/tree/List.mjs +3 -0
  463. package/src/util/HashHistory.mjs +1 -0
  464. package/src/util/KeyNavigation.mjs +2 -0
  465. package/src/util/Matrix.mjs +1 -0
  466. package/src/util/VDom.mjs +18 -5
  467. package/src/util/VNode.mjs +7 -1
  468. package/src/util/vdom/TreeBuilder.mjs +105 -0
  469. package/src/vdom/Helper.mjs +35 -23
  470. package/src/vdom/VNode.mjs +4 -6
  471. package/src/worker/App.mjs +1 -0
  472. package/src/worker/Base.mjs +2 -0
  473. package/src/worker/Manager.mjs +2 -0
  474. package/src/worker/ServiceBase.mjs +6 -1
  475. package/src/worker/mixin/RemoteMethodAccess.mjs +1 -6
  476. package/test/siesta/siesta.js +17 -2
  477. package/test/siesta/tests/VdomCalendar.mjs +19 -15
  478. package/test/siesta/tests/VdomHelper.mjs +7 -7
  479. package/test/siesta/tests/classic/Button.mjs +113 -0
  480. package/test/siesta/tests/core/Effect.mjs +10 -14
  481. package/test/siesta/tests/core/EffectBatching.mjs +72 -79
  482. package/test/siesta/tests/functional/Button.mjs +113 -0
  483. package/test/siesta/tests/state/ProviderNestedDataConfigs.mjs +314 -0
  484. package/test/siesta/tests/state/createHierarchicalDataProxy.mjs +42 -55
  485. package/test/siesta/tests/vdom/Advanced.mjs +14 -8
  486. package/test/siesta/tests/vdom/VdomAsymmetricUpdates.mjs +366 -0
  487. package/test/siesta/tests/vdom/VdomRealWorldUpdates.mjs +249 -0
  488. package/test/siesta/tests/vdom/layout/Cube.mjs +11 -7
  489. package/test/siesta/tests/vdom/table/Container.mjs +9 -5
  490. package/learn/javascript/NewNode.md +0 -31
  491. package/src/core/EffectBatchManager.mjs +0 -68
@@ -0,0 +1,191 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * @file addReactiveTags.mjs
5
+ * @description This script automates the process of adding the `@reactive` JSDoc tag
6
+ * to reactive configuration properties in source files.
7
+ * It identifies reactive configs (considering inheritance) that are missing
8
+ * the tag and inserts it into their JSDoc comment blocks.
9
+ *
10
+ * This is an **automation tool** used to fix documentation.
11
+ *
12
+ * @usage `npm run add-reactive-tags`
13
+ * @requires `docs/output/all.json` to be up-to-date (run `npm run generate-docs-json` first).
14
+ * @warning After running this script, you **must** re-run your documentation build script
15
+ * (`npm run generate-docs-json`) to update `docs/output/all.json`.
16
+ * @author Gemini
17
+ */
18
+
19
+ import fs from 'fs-extra';
20
+ import path from 'path';
21
+
22
+ const cwd = process.cwd();
23
+
24
+ const ALL_JSON_PATH = path.join(cwd, 'docs/output/all.json');
25
+ const MY_APPS_JSON_PATH_CWD = path.join(cwd, 'buildScripts/myApps.json');
26
+ const MY_APPS_JSON_PATH_WEBPACK = path.join(cwd, 'buildScripts/webpack/json/myApps.json');
27
+ const MY_APPS_JSON_PATH_TEMPLATE = path.join(cwd, 'buildScripts/webpack/json/myApps.template.json');
28
+ const PROGRAM_NAME = 'add-reactive-tags';
29
+
30
+ async function addReactiveTags() {
31
+ const startDate = new Date();
32
+ console.log(`
33
+ Starting ${PROGRAM_NAME}...`);
34
+
35
+ try {
36
+ const data = JSON.parse(fs.readFileSync(ALL_JSON_PATH, 'utf-8'));
37
+
38
+ let appJson;
39
+ if (fs.existsSync(MY_APPS_JSON_PATH_CWD)) {
40
+ appJson = JSON.parse(fs.readFileSync(MY_APPS_JSON_PATH_CWD, 'utf-8'));
41
+ } else if (fs.existsSync(MY_APPS_JSON_PATH_WEBPACK)) {
42
+ appJson = JSON.parse(fs.readFileSync(MY_APPS_JSON_PATH_WEBPACK, 'utf-8'));
43
+ } else {
44
+ appJson = JSON.parse(fs.readFileSync(MY_APPS_JSON_PATH_TEMPLATE, 'utf-8'));
45
+ }
46
+ const myAppsData = appJson;
47
+
48
+ const appNames = myAppsData.apps.filter(appName => appName !== 'Docs');
49
+ const validClassPrefixes = ['Neo.', ...appNames.map(name => `${name}.`)];
50
+
51
+ const classMap = new Map();
52
+ const memberMap = new Map();
53
+
54
+ for (const entry of data) {
55
+ if (entry.kind === 'class' && entry.neoClassName) {
56
+ classMap.set(entry.neoClassName, entry);
57
+ } else if (entry.kind === 'member' && entry.neoClassName) {
58
+ if (!memberMap.has(entry.neoClassName)) {
59
+ memberMap.set(entry.neoClassName, []);
60
+ }
61
+ memberMap.get(entry.neoClassName).push(entry);
62
+ }
63
+ }
64
+
65
+ const reactiveConfigsByClass = new Map();
66
+
67
+ function getAllReactiveConfigs(className) {
68
+ if (reactiveConfigsByClass.has(className)) {
69
+ return reactiveConfigsByClass.get(className);
70
+ }
71
+
72
+ const currentClassReactiveConfigs = new Set();
73
+ if (memberMap.has(className)) {
74
+ for (const member of memberMap.get(className)) {
75
+ if (member.kind === 'member' && member.name.endsWith('_')) {
76
+ currentClassReactiveConfigs.add(member.name.slice(0, -1));
77
+ }
78
+ }
79
+ }
80
+
81
+ const classEntry = classMap.get(className);
82
+ if (classEntry && classEntry.augments) {
83
+ for (const parentClassName of classEntry.augments) {
84
+ const isNeoOrAppClass = validClassPrefixes.some(prefix => parentClassName.startsWith(prefix));
85
+ if (isNeoOrAppClass) {
86
+ const inheritedReactive = getAllReactiveConfigs(parentClassName);
87
+ for (const configName of inheritedReactive) {
88
+ currentClassReactiveConfigs.add(configName);
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ reactiveConfigsByClass.set(className, currentClassReactiveConfigs);
95
+ return currentClassReactiveConfigs;
96
+ }
97
+
98
+ for (const className of classMap.keys()) {
99
+ getAllReactiveConfigs(className);
100
+ }
101
+
102
+ const filesToModify = new Map(); // filePath -> Array<{configName, jsdocStartLine, jsdocEndLine}>;
103
+
104
+ for (const [className, reactiveConfigNames] of reactiveConfigsByClass.entries()) {
105
+ if (memberMap.has(className)) {
106
+ for (const member of memberMap.get(className)) {
107
+ const baseName = member.name.endsWith('_') ? member.name.slice(0, -1) : member.name;
108
+
109
+ if (reactiveConfigNames.has(baseName)) {
110
+ if (member.defaultvalue !== undefined || member.name.endsWith('_')) {
111
+ if (!member.comment || !member.comment.includes('@reactive')) {
112
+ const filePath = path.join(member.meta.path, member.meta.filename);
113
+ if (!filesToModify.has(filePath)) {
114
+ filesToModify.set(filePath, []);
115
+ }
116
+ filesToModify.get(filePath).push({
117
+ configName: member.name,
118
+ jsdocStartLine: member.meta.lineno - 1, // JSDoc starts one line before the member definition
119
+ jsdocEndLine: member.meta.lineno - 1 + member.comment.split('\n').length // Approximate end line
120
+ });
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ let modifiedCount = 0;
129
+ for (const [filePath, configs] of filesToModify.entries()) {
130
+ let fileContent = fs.readFileSync(filePath, 'utf-8');
131
+ let lines = fileContent.split('\n');
132
+
133
+ // Sort configs by line number in descending order to avoid issues with line shifts
134
+ configs.sort((a, b) => b.jsdocStartLine - a.jsdocStartLine);
135
+
136
+ for (const config of configs) {
137
+ // Find the start of the JSDoc block (line with '/**')
138
+ let jsdocStartLine = -1;
139
+ for (let i = config.jsdocStartLine; i >= 0; i--) { // Search upwards from member definition
140
+ if (lines[i].includes('/**')) {
141
+ jsdocStartLine = i;
142
+ break;
143
+ }
144
+ }
145
+
146
+ // Find the actual end of the JSDoc block (line with '*/')
147
+ let actualJsdocEndLine = -1;
148
+ if (jsdocStartLine !== -1) {
149
+ for (let i = jsdocStartLine; i < lines.length; i++) {
150
+ if (lines[i].includes('*/')) {
151
+ actualJsdocEndLine = i;
152
+ break;
153
+ }
154
+ }
155
+ }
156
+
157
+ if (actualJsdocEndLine !== -1) {
158
+ // Get the indentation (leading whitespace and the asterisk) from the '*/' line.
159
+ // Example: " */" -> " *"
160
+ const indentationMatch = lines[actualJsdocEndLine].match(/^(\s*\*)/);
161
+ const indentation = indentationMatch ? indentationMatch[1] : ' *';
162
+
163
+ // Insert the @reactive tag on the line *before* the '*/'
164
+ lines.splice(actualJsdocEndLine, 0, `${indentation} @reactive`);
165
+ modifiedCount++;
166
+ } else {
167
+ console.warn(`Could not find JSDoc block for config ${config.configName} in ${filePath}`);
168
+ }
169
+ }
170
+ fs.writeFileSync(filePath, lines.join('\n'));
171
+ }
172
+
173
+ if (modifiedCount > 0) {
174
+ console.log(`\nSuccessfully added @reactive tag to ${modifiedCount} configs.`);
175
+ console.log("Please run your documentation build script again to update all.json.");
176
+ process.exit(0);
177
+ } else {
178
+ console.log("\nNo missing @reactive tags found. All reactive configs are already tagged. Well done!");
179
+ process.exit(0);
180
+ }
181
+
182
+ } catch (error) {
183
+ console.error(`\nError during ${PROGRAM_NAME}:`, error);
184
+ process.exit(1);
185
+ } finally {
186
+ const processTime = (new Date() - startDate) / 1000;
187
+ console.log(`Total time for ${PROGRAM_NAME}: ${processTime.toFixed(2)}s`);
188
+ }
189
+ }
190
+
191
+ addReactiveTags();
@@ -0,0 +1,160 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * @file checkReactiveTags.mjs
5
+ * @description This script identifies and reports reactive configuration properties
6
+ * that are missing the `@reactive` JSDoc tag.
7
+ * It builds a class inheritance graph and determines reactivity based
8
+ * on direct definition (trailing underscore) or inheritance from a parent class.
9
+ *
10
+ * This is a **diagnostic tool** used to verify documentation completeness.
11
+ *
12
+ * @usage `npm run check-reactive-tags`
13
+ * @requires `docs/output/all.json` to be up-to-date (run `npm run generate-docs-json` first).
14
+ * @author Gemini
15
+ */
16
+
17
+ import fs from 'fs-extra';
18
+ import path from 'path';
19
+
20
+ const cwd = process.cwd();
21
+
22
+ const ALL_JSON_PATH = path.join(cwd, 'docs/output/all.json');
23
+ const MY_APPS_JSON_PATH = path.join(cwd, 'buildScripts/webpack/json/myApps.json');
24
+ const PROGRAM_NAME = 'check-reactive-tags';
25
+
26
+ const MY_APPS_JSON_PATH_CWD = path.join(cwd, 'buildScripts/myApps.json');
27
+ const MY_APPS_JSON_PATH_WEBPACK = path.join(cwd, 'buildScripts/webpack/json/myApps.json');
28
+ const MY_APPS_JSON_PATH_TEMPLATE = path.join(cwd, 'buildScripts/webpack/json/myApps.template.json');
29
+
30
+ async function checkReactiveTags() {
31
+ const startDate = new Date();
32
+ console.log(`
33
+ Starting ${PROGRAM_NAME}...`);
34
+
35
+ try {
36
+ const data = JSON.parse(fs.readFileSync(ALL_JSON_PATH, 'utf-8'));
37
+
38
+ let appJson;
39
+
40
+ if (fs.existsSync(MY_APPS_JSON_PATH_CWD)) {
41
+ appJson = JSON.parse(fs.readFileSync(MY_APPS_JSON_PATH_CWD, 'utf-8'));
42
+ } else if (fs.existsSync(MY_APPS_JSON_PATH_WEBPACK)) {
43
+ appJson = JSON.parse(fs.readFileSync(MY_APPS_JSON_PATH_WEBPACK, 'utf-8'));
44
+ } else {
45
+ appJson = JSON.parse(fs.readFileSync(MY_APPS_JSON_PATH_TEMPLATE, 'utf-8'));
46
+ }
47
+
48
+ const myAppsData = appJson;
49
+
50
+
51
+ const appNames = myAppsData.apps.filter(appName => appName !== 'Docs'); // Docs is handled separately or implicitly Neo.
52
+ const validClassPrefixes = ['Neo.', ...appNames.map(name => `${name}.`)];
53
+
54
+ const classMap = new Map(); // neoClassName -> class_entry
55
+ const memberMap = new Map(); // neoClassName -> [member_entries]
56
+
57
+ for (const entry of data) {
58
+ if (entry.kind === 'class' && entry.neoClassName) {
59
+ classMap.set(entry.neoClassName, entry);
60
+ } else if (entry.kind === 'member' && entry.neoClassName) {
61
+ if (!memberMap.has(entry.neoClassName)) {
62
+ memberMap.set(entry.neoClassName, []);
63
+ }
64
+ memberMap.get(entry.neoClassName).push(entry);
65
+ }
66
+ }
67
+
68
+ const reactiveConfigsByClass = new Map(); // neoClassName -> Set<configNameWithoutUnderscore>
69
+
70
+ // Recursive function to get all reactive configs for a class, including inherited ones
71
+ function getAllReactiveConfigs(className) {
72
+ if (reactiveConfigsByClass.has(className)) {
73
+ return reactiveConfigsByClass.get(className);
74
+ }
75
+
76
+ const currentClassReactiveConfigs = new Set();
77
+
78
+ // Add directly defined reactive configs (ending with '_')
79
+ if (memberMap.has(className)) {
80
+ for (const member of memberMap.get(className)) {
81
+ if (member.kind === 'member' && member.name.endsWith('_')) {
82
+ currentClassReactiveConfigs.add(member.name.slice(0, -1)); // Add without underscore
83
+ }
84
+ }
85
+ }
86
+
87
+ // Add inherited reactive configs
88
+ const classEntry = classMap.get(className);
89
+ if (classEntry && classEntry.augments) {
90
+ for (const parentClassName of classEntry.augments) {
91
+ // Only consider Neo.mjs or app-specific classes for inheritance
92
+ const isNeoOrAppClass = validClassPrefixes.some(prefix => parentClassName.startsWith(prefix));
93
+
94
+ if (isNeoOrAppClass) {
95
+ const inheritedReactive = getAllReactiveConfigs(parentClassName);
96
+ for (const configName of inheritedReactive) {
97
+ currentClassReactiveConfigs.add(configName);
98
+ }
99
+ }
100
+ }
101
+ }
102
+
103
+ reactiveConfigsByClass.set(className, currentClassReactiveConfigs);
104
+ return currentClassReactiveConfigs;
105
+ }
106
+
107
+ // Populate reactiveConfigsByClass for all classes
108
+ for (const className of classMap.keys()) {
109
+ getAllReactiveConfigs(className);
110
+ }
111
+
112
+ const missingTags = [];
113
+
114
+ // Check for missing @reactive tags
115
+ for (const [className, reactiveConfigNames] of reactiveConfigsByClass.entries()) {
116
+ if (memberMap.has(className)) {
117
+ for (const member of memberMap.get(className)) {
118
+ const baseName = member.name.endsWith('_') ? member.name.slice(0, -1) : member.name;
119
+
120
+ // Check if this member is a reactive config (either directly or inherited)
121
+ if (reactiveConfigNames.has(baseName)) {
122
+ // Heuristic: if it has a defaultvalue, it's likely a config.
123
+ // Or if it's directly defined with an underscore.
124
+ if (member.defaultvalue !== undefined || member.name.endsWith('_')) {
125
+ if (!member.comment || !member.comment.includes('@reactive')) {
126
+ missingTags.push({
127
+ filePath: path.join(member.meta.path, member.meta.filename),
128
+ className: className,
129
+ configName: member.name,
130
+ isDirectlyDefinedReactive: member.name.endsWith('_')
131
+ });
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+
139
+ if (missingTags.length > 0) {
140
+ console.log(`\nThe following ${missingTags.length} reactive configs are missing the @reactive JSDoc tag:`);
141
+ for (const item of missingTags) {
142
+ console.log(`- Class: ${item.className}, Config: ${item.configName} (Directly defined reactive: ${item.isDirectlyDefinedReactive})`);
143
+ console.log(` File: ${item.filePath}`);
144
+ }
145
+ process.exit(1); // Exit with error code if issues are found
146
+ } else {
147
+ console.log("\nAll reactive configs have the @reactive JSDoc tag. Well done!");
148
+ process.exit(0);
149
+ }
150
+
151
+ } catch (error) {
152
+ console.error(`\nError during ${PROGRAM_NAME}:`, error);
153
+ process.exit(1);
154
+ } finally {
155
+ const processTime = (new Date() - startDate) / 1000;
156
+ console.log(`Total time for ${PROGRAM_NAME}: ${processTime.toFixed(2)}s`);
157
+ }
158
+ }
159
+
160
+ checkReactiveTags();
@@ -18,6 +18,7 @@ class Api extends Store {
18
18
  keyProperty: 'id',
19
19
  /**
20
20
  * @member {Neo.data.Model} model=ApiModel
21
+ * @reactive
21
22
  */
22
23
  model: ApiModel,
23
24
  /**
@@ -18,6 +18,7 @@ class Examples extends Store {
18
18
  keyProperty: 'id',
19
19
  /**
20
20
  * @member {Neo.data.Model} model=Example
21
+ * @reactive
21
22
  */
22
23
  model: Example,
23
24
  /**
@@ -20,6 +20,7 @@ class ApiTreeList extends TreeList {
20
20
  /**
21
21
  * @member {Neo.data.Store|null} store=ApiStore
22
22
  * @protected
23
+ * @reactive
23
24
  */
24
25
  store: ApiStore
25
26
  }
@@ -35,6 +35,7 @@ class ContentTabContainer extends Container {
35
35
  },
36
36
  /**
37
37
  * @member {Array} items=[//...]]
38
+ * @reactive
38
39
  */
39
40
  items: [{
40
41
  ntype: 'component',
@@ -48,6 +49,7 @@ class ContentTabContainer extends Container {
48
49
  }],
49
50
  /**
50
51
  * @member {Boolean} sortable=true
52
+ * @reactive
51
53
  */
52
54
  sortable: true
53
55
  }
@@ -19,11 +19,13 @@ class ExamplesTreeList extends TreeList {
19
19
  ntype: 'examples-treelist',
20
20
  /**
21
21
  * @member {String[]} cls=['docs-examples-treelist']
22
+ * @reactive
22
23
  */
23
24
  cls: ['docs-examples-treelist'],
24
25
  /**
25
26
  * @member {Neo.data.Store|null} store=ExamplesStore
26
27
  * @protected
28
+ * @reactive
27
29
  */
28
30
  store: ExamplesStore
29
31
  }
@@ -24,14 +24,17 @@ class HeaderContainer extends Container {
24
24
  baseCls: ['neo-docs-header-container'],
25
25
  /**
26
26
  * @member {Number} height=55
27
+ * @reactive
27
28
  */
28
29
  height: 55,
29
30
  /**
30
31
  * @member {Object} layout={ntype: 'hbox', align: 'stretch'}
32
+ * @reactive
31
33
  */
32
34
  layout: {ntype: 'hbox', align: 'stretch'},
33
35
  /**
34
36
  * @member {Array} items=[//...]
37
+ * @reactive
35
38
  */
36
39
  items: [{
37
40
  module : SearchField,
@@ -32,23 +32,28 @@ class MainContainer extends Viewport {
32
32
  baseCls: ['neo-docs-maincontainer', 'neo-viewport'],
33
33
  /**
34
34
  * @member {Neo.controller.Component} controller=MainContainerController
35
+ * @reactive
35
36
  */
36
37
  controller: MainContainerController,
37
38
  /**
38
39
  * @member {Object} layout={ntype: 'vbox', align: 'stretch'}
40
+ * @reactive
39
41
  */
40
42
  layout: {ntype: 'vbox', align: 'stretch'},
41
43
  /**
42
44
  * @member {Neo.collection.Base|null} store_=null
45
+ * @reactive
43
46
  */
44
47
  store_: null,
45
48
  /**
46
49
  * Important for the Portal App, until the new theme fully supports it
47
50
  * @member {String} theme='neo-theme-light'
51
+ * @reactive
48
52
  */
49
53
  theme: 'neo-theme-light',
50
54
  /**
51
55
  * @member {Array} items=[//...]
56
+ * @reactive
52
57
  */
53
58
  items: [HeaderContainer, {
54
59
  ntype : 'container',
@@ -23,6 +23,7 @@ class HeaderComponent extends Component {
23
23
  baseCls: ['neo-docs-classdetails-headercomponent'],
24
24
  /**
25
25
  * @member {Object|null} record_=null
26
+ * @reactive
26
27
  */
27
28
  record_: null,
28
29
  /**
@@ -29,10 +29,12 @@ class MainContainer extends Container {
29
29
  baseCls: ['neo-docs-classdetails-maincontainer', 'neo-container'],
30
30
  /**
31
31
  * @member {Neo.controller.Component} controller=MainContainerController
32
+ * @reactive
32
33
  */
33
34
  controller: MainContainerController,
34
35
  /**
35
36
  * @member {Object} layout={ntype: 'vbox', align: 'stretch'}
37
+ * @reactive
36
38
  */
37
39
  layout: {ntype: 'vbox', align: 'stretch'},
38
40
  /**
@@ -41,6 +43,7 @@ class MainContainer extends Container {
41
43
  structureData: null,
42
44
  /**
43
45
  * @member {Array} items=[//...]]
46
+ * @reactive
44
47
  */
45
48
  items: [{
46
49
  ntype : 'container',
@@ -24,22 +24,27 @@ class MembersList extends Base {
24
24
  /**
25
25
  * @member {String} filterMembersQuery_=''
26
26
  * @protected
27
+ * @reactive
27
28
  */
28
29
  filterMembersQuery_: '',
29
30
  /**
30
31
  * @member {Boolean} showPrivateMembers_=true
32
+ * @reactive
31
33
  */
32
34
  showPrivateMembers_: true,
33
35
  /**
34
36
  * @member {Boolean} showProtectedMembers_=true
37
+ * @reactive
35
38
  */
36
39
  showProtectedMembers_: true,
37
40
  /**
38
41
  * @member {Boolean} showStaticMembers_=true
42
+ * @reactive
39
43
  */
40
44
  showStaticMembers_: true,
41
45
  /**
42
46
  * @member {Neo.collection.Base} store=null
47
+ * @reactive
43
48
  */
44
49
  store: null,
45
50
  /**
@@ -19,11 +19,13 @@ class SourceViewComponent extends Component {
19
19
  /**
20
20
  * @member {Boolean} isHighlighted_=false
21
21
  * @protected
22
+ * @reactive
22
23
  */
23
24
  isHighlighted_: false,
24
25
  /**
25
26
  * @member {Number|null} line_=null
26
27
  * @protected
28
+ * @reactive
27
29
  */
28
30
  line_: null,
29
31
  /**
@@ -63,15 +63,19 @@ class ConfigurationViewport extends Viewport {
63
63
  exampleComponentFlex: 2,
64
64
  /**
65
65
  * @member {Object} layout={ntype:'hbox', align:'stretch'}
66
+ * @reactive
66
67
  */
67
68
  layout: {ntype: 'hbox', align: 'stretch'}
68
69
  }
69
70
 
70
71
  /**
71
- * Override this method to create the components to show inside the configuration container
72
- * @returns {Object[]|null}
72
+ * Override this method to create the components to show inside the configuration container.
73
+ * The method can optionally be async => Use this for functional components,
74
+ * where you want to subscribe controls to "classic" components inside functional components.
75
+ * @see:Neo.examples.functional.hostComponent.MainContainer
76
+ * @returns {Promise<Object[]>|Object[]|null}
73
77
  */
74
- createConfigurationComponents() {
78
+ async createConfigurationComponents() {
75
79
  return null
76
80
  }
77
81
 
@@ -101,10 +105,10 @@ class ConfigurationViewport extends Viewport {
101
105
  /**
102
106
  *
103
107
  */
104
- onConstructed() {
108
+ async onConstructed() {
105
109
  let me = this,
106
110
  style = me.exampleContainerConfig?.style,
107
- theme;
111
+ exampleComponentType, theme;
108
112
 
109
113
  if (style) {
110
114
  delete me.exampleContainerConfig.style
@@ -112,13 +116,15 @@ class ConfigurationViewport extends Viewport {
112
116
 
113
117
  me.exampleComponent = me.createExampleComponent();
114
118
 
115
- if (Neo.isObject(me.exampleComponent)) {
119
+ exampleComponentType = Neo.typeOf(me.exampleComponent);
120
+
121
+ if (exampleComponentType === 'NeoClass' || exampleComponentType === 'Object') {
116
122
  me.exampleComponent = Neo.create(me.exampleComponent)
117
123
  }
118
124
 
119
- me.configurationComponents = me.createConfigurationComponents() || [];
125
+ me.configurationComponents = await me.createConfigurationComponents() || [];
120
126
 
121
- theme = me.exampleComponent.getTheme();
127
+ theme = me.exampleComponent.getTheme?.() || 'neo-theme-light';
122
128
 
123
129
  me.items = [{
124
130
  module: Container,
@@ -16,6 +16,7 @@ class MainContainer extends Viewport {
16
16
  /**
17
17
  * Value for the container.Base layout_ config
18
18
  * @member {Object} layout={ntype: 'fit'}
19
+ * @reactive
19
20
  */
20
21
  layout: {ntype: 'fit'},
21
22
  /**
@@ -25,6 +26,7 @@ class MainContainer extends Viewport {
25
26
  * 1. Extend Neo.calendar.view.week.Component and add the configs and view model there.
26
27
  * 2. Just drop them into a parent view.
27
28
  * @member {Neo.calendar.view.MainContainerStateProvider} stateProvider=MainContainerStateProvider
29
+ * @reactive
28
30
  */
29
31
  stateProvider: {
30
32
  module: MainContainerStateProvider,
@@ -36,6 +38,7 @@ class MainContainer extends Viewport {
36
38
  * Config options for Neo.calendar.store.Calendars.
37
39
  * The calendar view model relies on it.
38
40
  * @member {Object} calendarStoreConfig_
41
+ * @reactive
39
42
  */
40
43
  calendarStoreConfig_: {
41
44
  autoLoad: true,
@@ -45,6 +48,7 @@ class MainContainer extends Viewport {
45
48
  * Config options for Neo.calendar.store.Events.
46
49
  * The calendar view model relies on it.
47
50
  * @member {Object} eventStoreConfig_
51
+ * @reactive
48
52
  */
49
53
  eventStoreConfig_: {
50
54
  autoLoad: true,
@@ -22,6 +22,7 @@ class CountryGallery extends Gallery {
22
22
  className: 'Neo.examples.component.coronaGallery.CountryGallery',
23
23
  /**
24
24
  * @member {String[]} cls=['neo-country-gallery']
25
+ * @reactive
25
26
  */
26
27
  cls: ['neo-country-gallery'],
27
28
  /**
@@ -46,6 +47,7 @@ class CountryGallery extends Gallery {
46
47
  selectOnMount: false,
47
48
  /**
48
49
  * @member {Neo.data.Store} store=CountryStore
50
+ * @reactive
49
51
  */
50
52
  store: CountryStore
51
53
  }
@@ -18,6 +18,7 @@ class CountryStore extends Store {
18
18
  keyProperty: 'country',
19
19
  /**
20
20
  * @member {Neo.data.Model} model=CountryModel
21
+ * @reactive
21
22
  */
22
23
  model: CountryModel
23
24
  }
@@ -21,6 +21,7 @@ class Viewport extends BaseViewport {
21
21
  baseCls: ['neo-gallery-viewport', 'neo-viewport'],
22
22
  /**
23
23
  * @member {Neo.controller.Component} controller=ViewportController
24
+ * @reactive
24
25
  */
25
26
  controller: ViewportController,
26
27
  /**
@@ -33,10 +34,12 @@ class Viewport extends BaseViewport {
33
34
  galleryConfig: null,
34
35
  /**
35
36
  * @member {Object|null} layout={ntype: 'hbox', align: 'stretch'}
37
+ * @reactive
36
38
  */
37
39
  layout: {ntype: 'hbox', align: 'stretch'},
38
40
  /**
39
41
  * @member {Boolean} showGitHubStarButton_=true
42
+ * @reactive
40
43
  */
41
44
  showGitHubStarButton_: true,
42
45
  /**
@@ -14,6 +14,7 @@ class ViewportController extends Controller {
14
14
  /**
15
15
  * @member {Neo.component.Gallery|null} gallery_=null
16
16
  * @protected
17
+ * @reactive
17
18
  */
18
19
  gallery_: null
19
20
  }