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
@@ -13,10 +13,12 @@ class GridContainer extends BaseGridContainer {
13
13
  className: 'Colors.view.GridContainer',
14
14
  /**
15
15
  * @member {Number|null} amountColumns_=null
16
+ * @reactive
16
17
  */
17
18
  amountColumns_: null,
18
19
  /**
19
20
  * @member {Number|null} amountRows_=null
21
+ * @reactive
20
22
  */
21
23
  amountRows_: null,
22
24
  /**
@@ -29,6 +31,7 @@ class GridContainer extends BaseGridContainer {
29
31
  },
30
32
  /**
31
33
  * @member {String[]} cls=['colors-grid-container']
34
+ * @reactive
32
35
  */
33
36
  cls: ['colors-grid-container']
34
37
  }
@@ -16,10 +16,12 @@ class HeaderToolbar extends Toolbar {
16
16
  className: 'Colors.view.HeaderToolbar',
17
17
  /**
18
18
  * @member {String[]} cls=['colors-header-toolbar']
19
+ * @reactive
19
20
  */
20
21
  cls: ['colors-header-toolbar'],
21
22
  /**
22
23
  * @member {Object} layout={ntype:'hbox',align:'stretch',wrap:'wrap'}
24
+ * @reactive
23
25
  */
24
26
  layout: {ntype: 'hbox', align: 'center', pack: 'start', wrap: 'wrap'},
25
27
  /**
@@ -19,10 +19,12 @@ class Viewport extends BaseViewport {
19
19
  className: 'Colors.view.Viewport',
20
20
  /**
21
21
  * @member {String[]} cls=['colors-viewport']
22
+ * @reactive
22
23
  */
23
24
  cls: ['colors-viewport'],
24
25
  /**
25
26
  * @member {Neo.controller.Component} controller=ViewportController
27
+ * @reactive
26
28
  */
27
29
  controller: ViewportController,
28
30
  /**
@@ -49,6 +51,7 @@ class Viewport extends BaseViewport {
49
51
  }],
50
52
  /**
51
53
  * @member {Neo.state.Provider} stateProvider=ViewportStateProvider
54
+ * @reactive
52
55
  */
53
56
  stateProvider: ViewportStateProvider
54
57
  }
@@ -13,14 +13,17 @@ class FooterContainer extends Container {
13
13
  className: 'Covid.view.FooterContainer',
14
14
  /**
15
15
  * @member {Number} height=20
16
+ * @reactive
16
17
  */
17
18
  height: 25,
18
19
  /**
19
20
  * @member {Object} layout={ntype: 'hbox'}
21
+ * @reactive
20
22
  */
21
23
  layout: {ntype: 'hbox'},
22
24
  /**
23
25
  * @member {String} reference='footer'
26
+ * @reactive
24
27
  */
25
28
  reference: 'footer',
26
29
  /**
@@ -22,6 +22,7 @@ class GalleryContainer extends Container {
22
22
  baseCls: ['neo-gallery-maincontainer', 'neo-viewport'],
23
23
  /**
24
24
  * @member {Neo.controller.Component|null} controller=GalleryContainerController
25
+ * @reactive
25
26
  */
26
27
  controller: GalleryContainerController,
27
28
  /**
@@ -34,6 +35,7 @@ class GalleryContainer extends Container {
34
35
  galleryConfig: null,
35
36
  /**
36
37
  * @member {Object|null} layout={ntype: 'hbox', align: 'stretch'}
38
+ * @reactive
37
39
  */
38
40
  layout: {ntype: 'hbox', align: 'stretch'},
39
41
  /**
@@ -14,6 +14,7 @@ class GalleryContainerController extends ComponentController {
14
14
  /**
15
15
  * @member {Neo.component.Gallery|null} gallery_=null
16
16
  * @protected
17
+ * @reactive
17
18
  */
18
19
  gallery_: null
19
20
  }
@@ -19,10 +19,12 @@ class HeaderContainer extends Container {
19
19
  baseCls: ['covid-header-container'],
20
20
  /**
21
21
  * @member {Number} height=70
22
+ * @reactive
22
23
  */
23
24
  height: 120,
24
25
  /**
25
26
  * @member {Object} layout={ntype: 'hbox', align: 'stretch'}
27
+ * @reactive
26
28
  */
27
29
  layout: {ntype: 'hbox', align: 'stretch'},
28
30
  /**
@@ -22,6 +22,7 @@ class HelixContainer extends Container {
22
22
  baseCls: ['neo-helix-maincontainer', 'neo-viewport'],
23
23
  /**
24
24
  * @member {Neo.controller.Component|null} controller=HelixContainerController
25
+ * @reactive
25
26
  */
26
27
  controller: HelixContainerController,
27
28
  /**
@@ -34,6 +35,7 @@ class HelixContainer extends Container {
34
35
  helixConfig: null,
35
36
  /**
36
37
  * @member {Object|null} layout={ntype: 'hbox', align: 'stretch'}
38
+ * @reactive
37
39
  */
38
40
  layout: {ntype: 'hbox', align: 'stretch'},
39
41
  /**
@@ -14,6 +14,7 @@ class HelixContainerController extends ComponentController {
14
14
  /**
15
15
  * @member {Neo.component.Helix|null} helix_=null
16
16
  * @protected
17
+ * @reactive
17
18
  */
18
19
  helix_: null
19
20
  }
@@ -22,6 +22,7 @@ class MainContainer extends Viewport {
22
22
  baseCls: ['covid-viewport', 'neo-viewport'],
23
23
  /**
24
24
  * @member {Neo.controller.Component} controller=MainContainerController
25
+ * @reactive
25
26
  */
26
27
  controller: MainContainerController,
27
28
  /**
@@ -83,10 +84,12 @@ class MainContainer extends Viewport {
83
84
  }, FooterContainer],
84
85
  /**
85
86
  * @member {Object} layout={ntype: 'vbox', align: 'stretch'}
87
+ * @reactive
86
88
  */
87
89
  layout: {ntype: 'vbox', align: 'stretch'},
88
90
  /**
89
91
  * @member {Neo.state.Provider} stateProvider=MainContainerStateProvider
92
+ * @reactive
90
93
  */
91
94
  stateProvider: MainContainerStateProvider
92
95
  }
@@ -27,10 +27,12 @@ class TableContainer extends Container {
27
27
  },
28
28
  /**
29
29
  * @member {Neo.controller.Component|null} controller=TableContainerController
30
+ * @reactive
30
31
  */
31
32
  controller: TableContainerController,
32
33
  /**
33
34
  * @member {Object} countryRecord_=null
35
+ * @reactive
34
36
  */
35
37
  countryRecord_: null,
36
38
  /**
@@ -48,6 +50,7 @@ class TableContainer extends Container {
48
50
  tableConfig: null,
49
51
  /**
50
52
  * @member {Object|null} layout={ntype: 'hbox', align: 'stretch'}
53
+ * @reactive
51
54
  */
52
55
  layout: {ntype: 'hbox', align: 'stretch'},
53
56
  /**
@@ -45,6 +45,7 @@ class TableContainerController extends ComponentController {
45
45
  /**
46
46
  * @member {Neo.table.Container|null} table_=null
47
47
  * @protected
48
+ * @reactive
48
49
  */
49
50
  table_: null
50
51
  }
@@ -17,10 +17,12 @@ class WorldMapContainer extends Container {
17
17
  className: 'Covid.view.WorldMapContainer',
18
18
  /**
19
19
  * @member {Neo.controller.Component} controller=WorldMapContainerController
20
+ * @reactive
20
21
  */
21
22
  controller: WorldMapContainerController,
22
23
  /**
23
24
  * @member {Object} layout={ntype: 'vbox', align: 'stretch'}
25
+ * @reactive
24
26
  */
25
27
  layout: {ntype: 'vbox', align: 'stretch'},
26
28
  /**
@@ -25,6 +25,7 @@ class CountryGallery extends Gallery {
25
25
  },
26
26
  /**
27
27
  * @member {String|null} country_=null
28
+ * @reactive
28
29
  */
29
30
  country_: null,
30
31
  /**
@@ -34,6 +35,7 @@ class CountryGallery extends Gallery {
34
35
  itemHeight: 280,
35
36
  /**
36
37
  * @member {Object} itemTpl_
38
+ * @reactive
37
39
  */
38
40
  itemTpl:
39
41
  {cls: ['neo-gallery-item', 'image-wrap', 'view', 'neo-transition-1000'], tabIndex: '-1', cn: [
@@ -86,6 +88,7 @@ class CountryGallery extends Gallery {
86
88
  selectOnMount: false,
87
89
  /**
88
90
  * @member {Neo.data.Store} store=CountryStore
91
+ * @reactive
89
92
  */
90
93
  store: CountryStore
91
94
  }
@@ -25,15 +25,18 @@ class CountryHelix extends Helix {
25
25
  },
26
26
  /**
27
27
  * @member {String|null} country_=null
28
+ * @reactive
28
29
  */
29
30
  country_: null,
30
31
  /**
31
32
  * The vertical delta between each helix item (increasing this value will create a spiral)
32
33
  * @member {Number} deltaY=1.2
34
+ * @reactive
33
35
  */
34
36
  deltaY: 1.2,
35
37
  /**
36
38
  * @member {Object} itemTpl_
39
+ * @reactive
37
40
  */
38
41
  itemTpl:
39
42
  {cls: ['surface', 'neo-helix-item'], style: {}, tabIndex: '-1', cn: [
@@ -77,11 +80,13 @@ class CountryHelix extends Helix {
77
80
  /**
78
81
  * The radius of the Helix in px
79
82
  * @member {Number} radius=2500
83
+ * @reactive
80
84
  */
81
85
  radius: 2500,
82
86
  /**
83
87
  * The rotationAngle of the Helix in degrees
84
88
  * @member {Number} rotationAngle=720
89
+ * @reactive
85
90
  */
86
91
  rotationAngle: 720,
87
92
  /**
@@ -91,16 +96,19 @@ class CountryHelix extends Helix {
91
96
  showCloneInfo: false,
92
97
  /**
93
98
  * @member {Neo.data.Store} store=CountryStore
99
+ * @reactive
94
100
  */
95
101
  store: CountryStore,
96
102
  /**
97
103
  * The translateX value gets included into each helix item
98
104
  * @member {Number} translateY=500
105
+ * @reactive
99
106
  */
100
107
  translateY: 500,
101
108
  /**
102
109
  * The translateX value gets included into each helix item
103
110
  * @member {Number} translateZ_=-2300
111
+ * @reactive
104
112
  */
105
113
  translateZ: -2300
106
114
  }
@@ -80,6 +80,7 @@ class HistoricalDataTable extends Container {
80
80
  }],
81
81
  /**
82
82
  * @member {Neo.data.Store} store=HistoricalData
83
+ * @reactive
83
84
  */
84
85
  store: HistoricalData
85
86
  }
@@ -104,10 +104,12 @@ class Table extends Container {
104
104
  }],
105
105
  /**
106
106
  * @member {String|null} country_=null
107
+ * @reactive
107
108
  */
108
109
  country_: null,
109
110
  /**
110
111
  * @member {Neo.data.Store} store=CountryStore
112
+ * @reactive
111
113
  */
112
114
  store: CountryStore
113
115
  }
@@ -17,6 +17,7 @@ class Component extends BaseComponent {
17
17
  accessToken: 'pk.eyJ1IjoidG9iaXUiLCJhIjoiY2s4dTlsdHA5MDRmYzNtcGxlczFpcGVncyJ9.qcmzDjpdyQeLtz9z7d7CkA',
18
18
  /**
19
19
  * @member {Object} center={lat: 40, lng: 20}
20
+ * @reactive
20
21
  */
21
22
  center: {lat: 40, lng: 20},
22
23
  /**
@@ -22,6 +22,7 @@ class Container extends BaseContainer {
22
22
  ntype: 'covid-mapboxgl-container',
23
23
  /**
24
24
  * @member {Neo.controller.Component} controller=ContainerController
25
+ * @reactive
25
26
  */
26
27
  controller: ContainerController,
27
28
  /**
@@ -88,6 +89,7 @@ class Container extends BaseContainer {
88
89
  }],
89
90
  /**
90
91
  * @member {Object} layout={ntype: 'fit'}
92
+ * @reactive
91
93
  */
92
94
  layout: {ntype: 'fit'},
93
95
 
@@ -0,0 +1,58 @@
1
+ # EPIC: Refactor and Enhance the Email App
2
+
3
+ This document outlines the plan for refactoring the `apps/email` application into a showcase for the Neo.mjs functional component architecture and multi-window capabilities.
4
+
5
+ ## Architectural Milestones & Key Learnings
6
+
7
+ This epic has driven significant architectural improvements to the functional component system. For a full understanding of the current state, review this ticket:
8
+
9
+ - **[#ticket-functional-recursive-config-diffing.md](/.github/ticket-functional-recursive-config-diffing.md):** A plan for a future enhancement to make the diffing logic recursive, allowing for deep, declarative control over nested component configurations.
10
+
11
+ ---
12
+
13
+ ## Phase 1: Foundation and Basic Layout (Completed)
14
+
15
+ **Goal:** Implement the main 3-pane layout as a functional `MainView` component and set it as the content of the existing classic `Viewport`.
16
+
17
+ **Learnings & Decisions:**
18
+ - **Interoperability:** Kept the classic `Viewport` and embedded the new functional `MainView` component, showcasing seamless integration.
19
+ - **Naming:** Renamed `Main.mjs` to `MainView.mjs` for clarity.
20
+
21
+ ---
22
+
23
+ ## Phase 2: Email List View (Completed)
24
+
25
+ **Goal:** Implement the email list pane using a `Neo.grid.Container`.
26
+
27
+ **Learnings & Decisions:**
28
+ - **Complex Component Integration:** Discovered that complex classic components require specific configs (e.g., `wrapperStyle`) to manage their own layout when nested inside functional components.
29
+ - **Stateful Child Problem:** Uncovered the core issue of stateful children (stores, columns) being re-created on every parent render. This led directly to the architectural work on VDOM diffing.
30
+
31
+ ---
32
+
33
+ ## Phase 3: Email Detail View (Completed)
34
+
35
+ **Goal:** Display the content of a selected email from the grid.
36
+ - Implemented a `selection.RowModel` on the grid and used a `useConfig` state variable (`selectedEmail`) to drive a conditional render of the detail pane.
37
+
38
+ ---
39
+
40
+ ## Phase 4: Compose Email Functionality (Next)
41
+
42
+ **Goal:** Implement the ability to compose a new email, initially within the main window.
43
+
44
+ **Proposed Plan:**
45
+ 1. **Compose Button:** Add a `Neo.button.Base` to the "Folders" pane.
46
+ 2. **State Management:** Use `useConfig` in `MainView` to manage an `isComposing` boolean state.
47
+ 3. **Compose View:** Create a new functional component, `view/ComposeView.mjs`, containing the form for the new email.
48
+ 4. **Conditional Rendering:** Use the `isComposing` flag to conditionally render the `ComposeView` as an overlay on top of the main view.
49
+ 5. **Event Handling:** The "Compose" button will set `isComposing` to `true`. The `ComposeView` will have a "Close" button that sets it back to `false`.
50
+ 6. **Overlay Implementation:** We will build a custom functional overlay for this, as it's a good exercise and provides maximum flexibility.
51
+
52
+ ---
53
+
54
+ ## Phase 5: Multi-Window Detach
55
+
56
+ **Goal:** Implement the "detach" functionality to move the compose view into a separate browser window.
57
+ **Sub-Tasks:** *(To be defined)*
58
+
@@ -4,6 +4,6 @@
4
4
  "environment": "development",
5
5
  "mainPath": "./Main.mjs",
6
6
  "themes": [
7
- "neo-theme-light"
7
+ "neo-theme-dark"
8
8
  ]
9
- }
9
+ }
@@ -15,7 +15,17 @@ class Emails extends Store {
15
15
  /**
16
16
  * @member {Neo.data.Model} model=Email
17
17
  */
18
- model: EmailModel
18
+ model: EmailModel,
19
+ /**
20
+ * @member {Object[]} data
21
+ */
22
+ data: [
23
+ {id: 1, sender: 'John Doe', title: 'Hello World!', content: 'This is the first email.', dateSent: '2025-07-15T10:00:00Z'},
24
+ {id: 2, sender: 'Jane Smith', title: 'Re: Project Update', content: 'Here is the project update you requested.', dateSent: '2025-07-15T11:30:00Z'},
25
+ {id: 3, sender: 'Peter Jones', title: 'Lunch tomorrow?', content: 'Are we still on for lunch tomorrow at 12:30?', dateSent: '2025-07-15T12:15:00Z'},
26
+ {id: 4, sender: 'Mary Williams', title: 'Your order has shipped', content: 'Your order #12345 has shipped and will arrive in 3-5 business days.', dateSent: '2025-07-14T15:45:00Z'},
27
+ {id: 5, sender: 'David Brown', title: 'Quick question', content: 'I have a quick question about the new feature.', dateSent: '2025-07-14T09:20:00Z'}
28
+ ]
19
29
  }
20
30
  }
21
31
 
@@ -0,0 +1,44 @@
1
+ import Button from '../../../src/button/Base.mjs';
2
+ import TextField from '../../../src/form/field/Text.mjs';
3
+ import TextAreaField from '../../../src/form/field/TextArea.mjs';
4
+ import {defineComponent} from '../../../src/functional/_export.mjs';
5
+
6
+ export default defineComponent({
7
+ config: {
8
+ className: 'Email.view.ComposeView',
9
+ cls : ['email-compose-view']
10
+ },
11
+ createVdom({onClose}) {
12
+ const fieldStyle = {
13
+ marginBottom: '10px'
14
+ };
15
+
16
+ return {
17
+ cn: [{
18
+ module : TextField,
19
+ id : 'compose-to',
20
+ labelText : 'To:',
21
+ labelWidth: 80,
22
+ style : fieldStyle
23
+ }, {
24
+ module : TextField,
25
+ id : 'compose-subject',
26
+ labelText : 'Subject:',
27
+ labelWidth: 80,
28
+ style : fieldStyle
29
+ }, {
30
+ module : TextAreaField,
31
+ id : 'compose-body',
32
+ labelText: 'Body:',
33
+ height : 200,
34
+ style : fieldStyle
35
+ }, {
36
+ module : Button,
37
+ handler: onClose,
38
+ id : 'compose-close-button',
39
+ style : {alignSelf: 'flex-end'},
40
+ text : 'Close'
41
+ }]
42
+ }
43
+ }
44
+ });
@@ -0,0 +1,89 @@
1
+ import Button from '../../../src/button/Base.mjs';
2
+ import ComposeView from './ComposeView.mjs';
3
+ import EmailsStore from '../store/Emails.mjs';
4
+ import GridContainer from '../../../src/grid/Container.mjs';
5
+ import RowModel from '../../../src/selection/grid/RowModel.mjs';
6
+ import {defineComponent, useConfig} from '../../../src/functional/_export.mjs';
7
+
8
+ export default defineComponent({
9
+ config: {
10
+ className: 'Email.view.MainView',
11
+ cls : ['email-main-view']
12
+ },
13
+ createVdom() {
14
+ const
15
+ [isComposing, setIsComposing] = useConfig(false),
16
+ [selectedEmail, setSelectedEmail] = useConfig(null);
17
+
18
+ const paneStyle = {
19
+ border : '1px solid #c0c0c0',
20
+ margin : '10px',
21
+ padding: '10px'
22
+ };
23
+
24
+ const onComposeClick = () => {
25
+ setIsComposing(true)
26
+ };
27
+
28
+ const onCloseCompose = () => {
29
+ setIsComposing(false);
30
+ };
31
+
32
+ const onSelectionChange = ({records}) => {
33
+ setSelectedEmail(records[0] || null)
34
+ };
35
+
36
+ return {
37
+ cn: [{
38
+ style: {...paneStyle, flex: '0 0 200px'},
39
+ cn: [{
40
+ module : Button,
41
+ handler: onComposeClick,
42
+ id : 'compose-button',
43
+ text : 'Compose',
44
+ style : {marginBottom: '10px', width: '100%'}
45
+ }, {
46
+ text : 'Folders'
47
+ }]
48
+ }, {
49
+ style: {...paneStyle, flex: '1 1 600px', padding: '0'},
50
+ cn: [{
51
+ module : GridContainer,
52
+ id : 'email-grid',
53
+ store : EmailsStore,
54
+ wrapperStyle: {height: '100%', width: '100%'},
55
+ body: {
56
+ selectionModel: {
57
+ module : RowModel,
58
+ listeners: {selectionChange: onSelectionChange}
59
+ }
60
+ },
61
+ columns: [
62
+ {dataField: 'sender', text: 'Sender', width: 150},
63
+ {dataField: 'title', text: 'Title', flex: 1, minWidth: 200},
64
+ {
65
+ cellAlign: 'right',
66
+ dataField: 'dateSent',
67
+ renderer : (({value}) => new Date(value).toLocaleDateString()),
68
+ text : 'Date',
69
+ width : 100
70
+ }
71
+ ]
72
+ }]
73
+ }, {
74
+ style: {...paneStyle, flex: '1 1 600px'},
75
+ cn: selectedEmail ? [
76
+ {tag: 'h2', text: selectedEmail.title},
77
+ {tag: 'p', text: `From: ${selectedEmail.sender}`},
78
+ {tag: 'div', style: {marginTop: '10px'}, text: selectedEmail.content}
79
+ ] : [{
80
+ text: 'Select an email to read'
81
+ }]
82
+ }, isComposing && {
83
+ module : ComposeView,
84
+ id : 'compose-view',
85
+ onClose: onCloseCompose
86
+ }]
87
+ }
88
+ }
89
+ });
@@ -1,7 +1,5 @@
1
- import BaseViewport from '../../../src/container/Viewport.mjs';
2
- import Component from '../../../src/component/Base.mjs';
3
- import TabContainer from '../../../src/tab/Container.mjs';
4
- import ViewportStateProvider from './ViewportStateProvider.mjs';
1
+ import BaseViewport from '../../../src/container/Viewport.mjs';
2
+ import MainView from './MainView.mjs';
5
3
 
6
4
  /**
7
5
  * @class Email.view.Viewport
@@ -14,42 +12,15 @@ class Viewport extends BaseViewport {
14
12
  * @protected
15
13
  */
16
14
  className: 'Email.view.Viewport',
17
- /*
15
+ /**
18
16
  * @member {Object} layout={ntype:'fit'}
19
17
  */
20
18
  layout: {ntype: 'fit'},
21
- /**
22
- * @member {Neo.state.Provider} stateProvider=ViewportStateProvider
23
- */
24
- stateProvider: ViewportStateProvider,
25
19
  /**
26
20
  * @member {Object[]} items
27
21
  */
28
22
  items: [{
29
- module: TabContainer,
30
- height: 300,
31
- width : 500,
32
- style : {flex: 'none', margin: '20px'},
33
-
34
- itemDefaults: {
35
- module: Component,
36
- cls : ['neo-examples-tab-component'],
37
- style : {padding: '20px'},
38
- },
39
-
40
- items: [{
41
- header: {
42
- iconCls: 'fa fa-home',
43
- text : 'Tab 1'
44
- },
45
- text: 'Welcome to your new Neo App.'
46
- }, {
47
- header: {
48
- iconCls: 'fa fa-play-circle',
49
- text : 'Tab 2'
50
- },
51
- text: 'Have fun creating something awesome!'
52
- }]
23
+ module: MainView
53
24
  }]
54
25
  }
55
26
  }
@@ -1,11 +1,11 @@
1
- import EmailStore from '../store/Emails.mjs';
2
- import Provider from '../../../src/state/Provider.mjs';
1
+ import EmailStore from '../store/Emails.mjs';
2
+ import StateProvider from '../../../src/state/Provider.mjs';
3
3
 
4
4
  /**
5
5
  * @class Email.view.ViewportStateProvider
6
6
  * @extends Neo.state.Provider
7
7
  */
8
- class ViewportStateProvider extends Provider {
8
+ class ViewportStateProvider extends StateProvider {
9
9
  static config = {
10
10
  /**
11
11
  * @member {String} className='Email.view.ViewportStateProvider'
@@ -14,6 +14,7 @@ class SideNav extends Store {
14
14
  className: 'Form.store.SideNav',
15
15
  /**
16
16
  * @member {Neo.data.Model} model=SideNavModel
17
+ * @reactive
17
18
  */
18
19
  model: SideNavModel
19
20
  }
@@ -22,6 +22,7 @@ class FormContainer extends BaseFormContainer {
22
22
  baseCls: ['form-form-container', 'neo-container'],
23
23
  /**
24
24
  * @member {Neo.controller.Component} controller=FormContainerController
25
+ * @reactive
25
26
  */
26
27
  controller: FormContainerController,
27
28
  /**
@@ -19,6 +19,7 @@ class FormPageContainer extends FormContainer {
19
19
  },
20
20
  /**
21
21
  * @member {Object} layout={ntype:'vbox'}
22
+ * @reactive
22
23
  */
23
24
  layout: {ntype: 'vbox'},
24
25
  /**
@@ -27,6 +28,7 @@ class FormPageContainer extends FormContainer {
27
28
  style: {overflow: 'auto'},
28
29
  /**
29
30
  * @member {String} tag='div'
31
+ * @reactive
30
32
  */
31
33
  tag: 'div' // using a div instead of a form tag
32
34
  }