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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (468) hide show
  1. package/.github/RELEASE_NOTES/v10.0.0-beta.5.md +70 -0
  2. package/.github/RELEASE_NOTES/v10.0.0-beta.6.md +48 -0
  3. package/.github/epic-functional-components.md +498 -0
  4. package/.github/ticket-asymmetric-vdom-updates.md +122 -0
  5. package/README.md +0 -3
  6. package/ServiceWorker.mjs +2 -2
  7. package/apps/colors/store/Colors.mjs +1 -0
  8. package/apps/colors/view/GridContainer.mjs +3 -0
  9. package/apps/colors/view/HeaderToolbar.mjs +2 -0
  10. package/apps/colors/view/Viewport.mjs +3 -0
  11. package/apps/covid/view/FooterContainer.mjs +3 -0
  12. package/apps/covid/view/GalleryContainer.mjs +2 -0
  13. package/apps/covid/view/GalleryContainerController.mjs +1 -0
  14. package/apps/covid/view/HeaderContainer.mjs +2 -0
  15. package/apps/covid/view/HelixContainer.mjs +2 -0
  16. package/apps/covid/view/HelixContainerController.mjs +1 -0
  17. package/apps/covid/view/MainContainer.mjs +3 -0
  18. package/apps/covid/view/TableContainer.mjs +3 -0
  19. package/apps/covid/view/TableContainerController.mjs +1 -0
  20. package/apps/covid/view/WorldMapContainer.mjs +2 -0
  21. package/apps/covid/view/country/Gallery.mjs +3 -0
  22. package/apps/covid/view/country/Helix.mjs +8 -0
  23. package/apps/covid/view/country/HistoricalDataTable.mjs +1 -0
  24. package/apps/covid/view/country/Table.mjs +2 -0
  25. package/apps/covid/view/mapboxGl/Component.mjs +1 -0
  26. package/apps/covid/view/mapboxGl/Container.mjs +2 -0
  27. package/apps/email/EPIC_PLAN.md +58 -0
  28. package/apps/email/neo-config.json +2 -2
  29. package/apps/email/store/Emails.mjs +11 -1
  30. package/apps/email/view/ComposeView.mjs +44 -0
  31. package/apps/email/view/MainView.mjs +89 -0
  32. package/apps/email/view/Viewport.mjs +4 -33
  33. package/apps/email/view/ViewportStateProvider.mjs +3 -3
  34. package/apps/form/store/SideNav.mjs +1 -0
  35. package/apps/form/view/FormContainer.mjs +1 -0
  36. package/apps/form/view/FormPageContainer.mjs +2 -0
  37. package/apps/form/view/SideNavList.mjs +1 -0
  38. package/apps/form/view/Viewport.mjs +3 -0
  39. package/apps/portal/childapps/preview/MainContainer.mjs +1 -0
  40. package/apps/portal/index.html +1 -1
  41. package/apps/portal/store/BlogPosts.mjs +2 -0
  42. package/apps/portal/store/Content.mjs +1 -0
  43. package/apps/portal/store/ContentSections.mjs +1 -0
  44. package/apps/portal/store/Examples.mjs +1 -0
  45. package/apps/portal/view/HeaderToolbar.mjs +1 -0
  46. package/apps/portal/view/Viewport.mjs +5 -0
  47. package/apps/portal/view/ViewportController.mjs +8 -2
  48. package/apps/portal/view/about/Container.mjs +2 -0
  49. package/apps/portal/view/about/MemberContainer.mjs +7 -0
  50. package/apps/portal/view/blog/Container.mjs +2 -0
  51. package/apps/portal/view/blog/List.mjs +2 -0
  52. package/apps/portal/view/examples/List.mjs +1 -0
  53. package/apps/portal/view/examples/TabContainer.mjs +4 -0
  54. package/apps/portal/view/home/ContentBox.mjs +3 -0
  55. package/apps/portal/view/home/FeatureSection.mjs +8 -0
  56. package/apps/portal/view/home/FooterContainer.mjs +4 -1
  57. package/apps/portal/view/home/MainContainer.mjs +2 -0
  58. package/apps/portal/view/home/parts/AfterMath.mjs +2 -0
  59. package/apps/portal/view/home/parts/BaseContainer.mjs +1 -0
  60. package/apps/portal/view/home/parts/Colors.mjs +4 -0
  61. package/apps/portal/view/home/parts/Features.mjs +2 -0
  62. package/apps/portal/view/home/parts/Helix.mjs +5 -0
  63. package/apps/portal/view/home/parts/How.mjs +4 -0
  64. package/apps/portal/view/home/parts/MainNeo.mjs +1 -0
  65. package/apps/portal/view/home/parts/References.mjs +2 -0
  66. package/apps/portal/view/learn/ContentComponent.mjs +11 -5
  67. package/apps/portal/view/learn/ContentTreeList.mjs +2 -0
  68. package/apps/portal/view/learn/CubeLayoutButton.mjs +1 -0
  69. package/apps/portal/view/learn/MainContainer.mjs +4 -0
  70. package/apps/portal/view/learn/PageContainer.mjs +2 -0
  71. package/apps/portal/view/learn/PageSectionsContainer.mjs +3 -0
  72. package/apps/portal/view/learn/PageSectionsList.mjs +1 -0
  73. package/apps/portal/view/services/Component.mjs +1 -0
  74. package/apps/realworld/api/Base.mjs +1 -0
  75. package/apps/realworld/view/HeaderComponent.mjs +4 -0
  76. package/apps/realworld/view/HomeComponent.mjs +7 -0
  77. package/apps/realworld/view/MainContainer.mjs +2 -0
  78. package/apps/realworld/view/MainContainerController.mjs +2 -0
  79. package/apps/realworld/view/article/CommentComponent.mjs +3 -0
  80. package/apps/realworld/view/article/Component.mjs +17 -10
  81. package/apps/realworld/view/article/CreateCommentComponent.mjs +2 -0
  82. package/apps/realworld/view/article/CreateComponent.mjs +5 -0
  83. package/apps/realworld/view/article/PreviewComponent.mjs +9 -0
  84. package/apps/realworld/view/article/TagListComponent.mjs +2 -0
  85. package/apps/realworld/view/user/ProfileComponent.mjs +7 -0
  86. package/apps/realworld/view/user/SettingsComponent.mjs +5 -0
  87. package/apps/realworld/view/user/SignUpComponent.mjs +3 -0
  88. package/apps/realworld2/api/Base.mjs +1 -0
  89. package/apps/realworld2/view/FooterComponent.mjs +1 -0
  90. package/apps/realworld2/view/HeaderToolbar.mjs +3 -0
  91. package/apps/realworld2/view/HomeContainer.mjs +1 -0
  92. package/apps/realworld2/view/MainContainer.mjs +2 -0
  93. package/apps/realworld2/view/MainContainerController.mjs +1 -0
  94. package/apps/realworld2/view/article/Helix.mjs +1 -0
  95. package/apps/realworld2/view/article/PreviewComponent.mjs +9 -0
  96. package/apps/realworld2/view/article/PreviewList.mjs +1 -0
  97. package/apps/realworld2/view/article/TagListComponent.mjs +2 -0
  98. package/apps/route/view/CenterContainer.mjs +1 -0
  99. package/apps/route/view/MainView.mjs +1 -0
  100. package/apps/sharedcovid/childapps/sharedcovidchart/MainContainer.mjs +1 -0
  101. package/apps/sharedcovid/childapps/sharedcovidgallery/MainContainer.mjs +1 -0
  102. package/apps/sharedcovid/childapps/sharedcovidhelix/MainContainer.mjs +1 -0
  103. package/apps/sharedcovid/childapps/sharedcovidmap/MainContainer.mjs +1 -0
  104. package/apps/sharedcovid/view/FooterContainer.mjs +3 -0
  105. package/apps/sharedcovid/view/GalleryContainer.mjs +2 -0
  106. package/apps/sharedcovid/view/GalleryContainerController.mjs +1 -0
  107. package/apps/sharedcovid/view/HeaderContainer.mjs +2 -0
  108. package/apps/sharedcovid/view/HelixContainer.mjs +2 -0
  109. package/apps/sharedcovid/view/HelixContainerController.mjs +1 -0
  110. package/apps/sharedcovid/view/MainContainer.mjs +3 -0
  111. package/apps/sharedcovid/view/TableContainer.mjs +3 -0
  112. package/apps/sharedcovid/view/TableContainerController.mjs +1 -0
  113. package/apps/sharedcovid/view/WorldMapContainer.mjs +2 -0
  114. package/apps/sharedcovid/view/country/Gallery.mjs +3 -0
  115. package/apps/sharedcovid/view/country/Helix.mjs +8 -0
  116. package/apps/sharedcovid/view/country/HistoricalDataTable.mjs +1 -0
  117. package/apps/sharedcovid/view/country/Table.mjs +2 -0
  118. package/apps/sharedcovid/view/mapboxGl/Component.mjs +1 -0
  119. package/apps/sharedcovid/view/mapboxGl/Container.mjs +2 -0
  120. package/apps/shareddialog/childapps/shareddialog2/view/MainContainer.mjs +2 -0
  121. package/apps/shareddialog/view/DemoDialog.mjs +2 -0
  122. package/apps/shareddialog/view/MainContainer.mjs +2 -0
  123. package/apps/shareddialog/view/MainContainerController.mjs +1 -0
  124. package/buildScripts/addReactiveTags.mjs +191 -0
  125. package/buildScripts/checkReactiveTags.mjs +160 -0
  126. package/docs/app/store/Api.mjs +1 -0
  127. package/docs/app/store/Examples.mjs +1 -0
  128. package/docs/app/view/ApiTreeList.mjs +1 -0
  129. package/docs/app/view/ContentTabContainer.mjs +2 -0
  130. package/docs/app/view/ExamplesTreeList.mjs +2 -0
  131. package/docs/app/view/HeaderContainer.mjs +3 -0
  132. package/docs/app/view/MainContainer.mjs +5 -0
  133. package/docs/app/view/classdetails/HeaderComponent.mjs +1 -0
  134. package/docs/app/view/classdetails/MainContainer.mjs +3 -0
  135. package/docs/app/view/classdetails/MembersList.mjs +5 -0
  136. package/docs/app/view/classdetails/SourceViewComponent.mjs +2 -0
  137. package/examples/ConfigurationViewport.mjs +14 -8
  138. package/examples/calendar/weekview/MainContainer.mjs +4 -0
  139. package/examples/component/coronaGallery/CountryGallery.mjs +2 -0
  140. package/examples/component/coronaGallery/CountryStore.mjs +1 -0
  141. package/examples/component/coronaGallery/Viewport.mjs +3 -0
  142. package/examples/component/coronaGallery/ViewportController.mjs +1 -0
  143. package/examples/component/coronaHelix/CountryHelix.mjs +7 -0
  144. package/examples/component/coronaHelix/MainContainer.mjs +1 -0
  145. package/examples/component/gallery/ImageStore.mjs +1 -0
  146. package/examples/component/helix/ImageStore.mjs +1 -0
  147. package/examples/component/helix/Viewport.mjs +3 -0
  148. package/examples/component/helix/ViewportController.mjs +1 -0
  149. package/examples/component/multiWindowCoronaGallery/childapp/Viewport.mjs +1 -0
  150. package/examples/component/multiWindowHelix/childapp/Viewport.mjs +1 -0
  151. package/examples/component/wrapper/googleMaps/MapComponent.mjs +2 -0
  152. package/examples/core/config/MainContainer.mjs +2 -0
  153. package/examples/dialog/DemoDialog.mjs +2 -0
  154. package/examples/dialog/MainContainer.mjs +1 -0
  155. package/examples/form/field/color/MainStore.mjs +1 -0
  156. package/examples/functional/defineComponent/Component.mjs +18 -0
  157. package/examples/functional/defineComponent/MainContainer.mjs +41 -0
  158. package/examples/functional/defineComponent/app.mjs +6 -0
  159. package/examples/functional/defineComponent/index.html +11 -0
  160. package/examples/functional/defineComponent/neo-config.json +6 -0
  161. package/examples/functional/hostComponent/Component.mjs +32 -0
  162. package/examples/functional/hostComponent/MainContainer.mjs +48 -0
  163. package/examples/functional/hostComponent/app.mjs +6 -0
  164. package/examples/functional/hostComponent/index.html +11 -0
  165. package/examples/functional/hostComponent/neo-config.json +6 -0
  166. package/examples/grid/animatedRowSorting/Viewport.mjs +1 -1
  167. package/examples/grid/bigData/ControlsContainer.mjs +3 -0
  168. package/examples/grid/bigData/GridContainer.mjs +4 -2
  169. package/examples/grid/bigData/MainContainer.mjs +2 -0
  170. package/examples/grid/bigData/MainModel.mjs +1 -0
  171. package/examples/grid/bigData/MainStore.mjs +3 -0
  172. package/examples/grid/cellEditing/MainContainer.mjs +1 -1
  173. package/examples/grid/container/MainContainer.mjs +1 -1
  174. package/examples/grid/covid/GridContainer.mjs +3 -0
  175. package/examples/grid/covid/MainContainer.mjs +2 -0
  176. package/examples/grid/covid/Store.mjs +1 -0
  177. package/examples/grid/nestedRecordFields/EditUserDialog.mjs +3 -0
  178. package/examples/grid/nestedRecordFields/Viewport.mjs +3 -1
  179. package/examples/list/animate/List.mjs +4 -0
  180. package/examples/list/animate/MainContainer.mjs +2 -0
  181. package/examples/list/circle/MainStore.mjs +1 -0
  182. package/examples/list/color/MainStore.mjs +1 -0
  183. package/examples/preloadingAssets/view/MainContainer.mjs +2 -0
  184. package/examples/stateProvider/advanced/MainContainer.mjs +1 -0
  185. package/examples/stateProvider/dialog/EditUserDialog.mjs +2 -0
  186. package/examples/stateProvider/dialog/MainContainer.mjs +1 -0
  187. package/examples/stateProvider/extendedClass/MainContainer.mjs +2 -0
  188. package/examples/stateProvider/inline/MainContainer.mjs +1 -0
  189. package/examples/stateProvider/inlineNoStateProvider/MainContainer.mjs +1 -0
  190. package/examples/stateProvider/inlineNoStateProvider/MainContainerController.mjs +2 -0
  191. package/examples/stateProvider/multiWindow/EditUserDialog.mjs +3 -0
  192. package/examples/stateProvider/multiWindow/MainContainer.mjs +1 -0
  193. package/examples/stateProvider/multiWindow/Viewport.mjs +1 -0
  194. package/examples/stateProvider/nestedData/MainContainer.mjs +1 -0
  195. package/examples/stateProvider/table/MainContainer.mjs +1 -0
  196. package/examples/table/covid/MainContainer.mjs +2 -0
  197. package/examples/table/covid/Store.mjs +1 -0
  198. package/examples/table/covid/TableContainer.mjs +3 -0
  199. package/examples/table/nestedRecordFields/EditUserDialog.mjs +3 -0
  200. package/examples/table/nestedRecordFields/Viewport.mjs +1 -0
  201. package/examples/todoList/version1/MainComponent.mjs +1 -1
  202. package/examples/toolbar/breadcrumb/view/MainContainer.mjs +2 -0
  203. package/examples/toolbar/paging/store/Users.mjs +1 -0
  204. package/examples/toolbar/paging/view/AddUserDialog.mjs +3 -0
  205. package/examples/toolbar/paging/view/MainContainer.mjs +3 -0
  206. package/examples/treeAccordion/MainContainer.mjs +2 -2
  207. package/examples/worker/task/MainContainer.mjs +1 -0
  208. package/learn/Glossary.md +1 -0
  209. package/learn/UsingTheseTopics.md +1 -0
  210. package/learn/benefits/ConfigSystem.md +2 -0
  211. package/learn/benefits/Effort.md +1 -0
  212. package/learn/benefits/Features.md +1 -0
  213. package/learn/benefits/FormsEngine.md +1 -0
  214. package/learn/benefits/FourEnvironments.md +2 -0
  215. package/learn/benefits/Introduction.md +2 -0
  216. package/learn/benefits/MultiWindow.md +3 -1
  217. package/learn/benefits/OffTheMainThread.md +2 -0
  218. package/learn/benefits/Quick.md +2 -0
  219. package/learn/benefits/RPCLayer.md +2 -0
  220. package/learn/benefits/Speed.md +2 -0
  221. package/learn/comparisons/NeoVsAngular.md +90 -0
  222. package/learn/comparisons/NeoVsExtJs.md +178 -0
  223. package/learn/comparisons/NeoVsNextJs.md +124 -0
  224. package/learn/comparisons/NeoVsReact.md +95 -0
  225. package/learn/comparisons/NeoVsSolid.md +78 -0
  226. package/learn/comparisons/NeoVsVue.md +92 -0
  227. package/learn/comparisons/Overview.md +46 -0
  228. package/learn/gettingstarted/ComponentModels.md +2 -0
  229. package/learn/gettingstarted/Config.md +2 -0
  230. package/learn/gettingstarted/DescribingTheUI.md +2 -0
  231. package/learn/gettingstarted/Events.md +2 -0
  232. package/learn/gettingstarted/Extending.md +2 -0
  233. package/learn/gettingstarted/References.md +2 -0
  234. package/learn/gettingstarted/Setup.md +3 -2
  235. package/learn/gettingstarted/Workspaces.md +2 -0
  236. package/learn/guides/datahandling/Collections.md +1 -0
  237. package/learn/guides/datahandling/Records.md +1 -0
  238. package/learn/guides/datahandling/StateProviders.md +130 -16
  239. package/learn/guides/datahandling/Tables.md +1 -1
  240. package/learn/guides/fundamentals/ConfigSystemDeepDive.md +1 -0
  241. package/learn/guides/fundamentals/DeclarativeComponentTreesVsImperativeVdom.md +2 -0
  242. package/learn/guides/fundamentals/DeclarativeVDOMWithEffects.md +10 -8
  243. package/learn/guides/fundamentals/ExtendingNeoClasses.md +1 -0
  244. package/learn/guides/fundamentals/InstanceLifecycle.md +3 -1
  245. package/learn/guides/fundamentals/MainThreadAddons.md +2 -0
  246. package/learn/guides/specificfeatures/Mixins.md +3 -1
  247. package/learn/guides/specificfeatures/MultiWindow.md +3 -1
  248. package/learn/guides/specificfeatures/PortalApp.md +2 -0
  249. package/learn/guides/uibuildingblocks/ComponentsAndContainers.md +2 -0
  250. package/learn/guides/uibuildingblocks/CustomComponents.md +2 -0
  251. package/learn/guides/uibuildingblocks/Layouts.md +2 -0
  252. package/learn/guides/uibuildingblocks/WorkingWithVDom.md +2 -0
  253. package/learn/guides/userinteraction/Forms.md +2 -0
  254. package/learn/guides/userinteraction/events/CustomEvents.md +2 -1
  255. package/learn/guides/userinteraction/events/DomEvents.md +2 -0
  256. package/learn/javascript/ClassFeatures.md +4 -3
  257. package/learn/javascript/Classes.md +10 -13
  258. package/learn/javascript/Overrides.md +10 -6
  259. package/learn/javascript/Super.md +12 -8
  260. package/learn/tree.json +71 -64
  261. package/learn/tutorials/Earthquakes.md +2 -0
  262. package/learn/tutorials/RSP.md +3 -1
  263. package/learn/tutorials/TodoList.md +103 -7
  264. package/package.json +6 -4
  265. package/resources/scss/src/apps/email/ComposeView.scss +16 -0
  266. package/resources/scss/src/apps/email/MainView.scss +5 -0
  267. package/resources/scss/src/apps/portal/learn/ContentComponent.scss +5 -4
  268. package/src/DefaultConfig.mjs +12 -2
  269. package/src/Main.mjs +1 -0
  270. package/src/Neo.mjs +217 -166
  271. package/src/Xhr.mjs +1 -0
  272. package/src/button/Base.mjs +13 -0
  273. package/src/button/Effect.mjs +16 -2
  274. package/src/button/Split.mjs +2 -0
  275. package/src/calendar/store/Calendars.mjs +1 -0
  276. package/src/calendar/store/Colors.mjs +1 -0
  277. package/src/calendar/store/Events.mjs +1 -0
  278. package/src/calendar/view/DayComponent.mjs +2 -0
  279. package/src/calendar/view/EditEventContainer.mjs +4 -1
  280. package/src/calendar/view/MainContainer.mjs +13 -0
  281. package/src/calendar/view/MainContainerStateProvider.mjs +14 -28
  282. package/src/calendar/view/SettingsContainer.mjs +1 -0
  283. package/src/calendar/view/YearComponent.mjs +16 -0
  284. package/src/calendar/view/calendars/ColorsList.mjs +2 -0
  285. package/src/calendar/view/calendars/Container.mjs +2 -0
  286. package/src/calendar/view/calendars/EditContainer.mjs +1 -0
  287. package/src/calendar/view/month/Component.mjs +11 -0
  288. package/src/calendar/view/settings/GeneralContainer.mjs +1 -0
  289. package/src/calendar/view/settings/MonthContainer.mjs +1 -0
  290. package/src/calendar/view/settings/WeekContainer.mjs +1 -0
  291. package/src/calendar/view/settings/YearContainer.mjs +1 -0
  292. package/src/calendar/view/week/Component.mjs +15 -1
  293. package/src/calendar/view/week/TimeAxisComponent.mjs +4 -0
  294. package/src/code/LivePreview.mjs +51 -23
  295. package/src/collection/Base.mjs +7 -10
  296. package/src/collection/Filter.mjs +6 -0
  297. package/src/collection/Sorter.mjs +3 -0
  298. package/src/component/Base.mjs +104 -771
  299. package/src/component/Canvas.mjs +1 -0
  300. package/src/component/Chip.mjs +4 -0
  301. package/src/component/Circle.mjs +14 -0
  302. package/src/component/Clock.mjs +4 -0
  303. package/src/component/DateSelector.mjs +12 -0
  304. package/src/component/Gallery.mjs +11 -0
  305. package/src/component/Helix.mjs +24 -0
  306. package/src/component/Label.mjs +1 -0
  307. package/src/component/Legend.mjs +3 -0
  308. package/src/component/MagicMoveText.mjs +4 -0
  309. package/src/component/Progress.mjs +3 -0
  310. package/src/component/Splitter.mjs +3 -0
  311. package/src/component/StatusBadge.mjs +6 -0
  312. package/src/component/Timer.mjs +4 -0
  313. package/src/component/Toast.mjs +6 -0
  314. package/src/component/Video.mjs +1 -0
  315. package/src/component/mwc/Button.mjs +7 -0
  316. package/src/component/mwc/TextField.mjs +9 -0
  317. package/src/component/wrapper/AmChart.mjs +2 -0
  318. package/src/component/wrapper/GoogleMaps.mjs +3 -0
  319. package/src/component/wrapper/MapboxGL.mjs +5 -0
  320. package/src/component/wrapper/MonacoEditor.mjs +12 -0
  321. package/src/container/Accordion.mjs +2 -0
  322. package/src/container/Base.mjs +7 -3
  323. package/src/container/Panel.mjs +1 -0
  324. package/src/container/Viewport.mjs +1 -0
  325. package/src/controller/Application.mjs +1 -0
  326. package/src/controller/Base.mjs +1 -0
  327. package/src/controller/Component.mjs +1 -0
  328. package/src/core/Base.mjs +55 -3
  329. package/src/core/Compare.mjs +4 -7
  330. package/src/core/Config.mjs +65 -52
  331. package/src/core/Effect.mjs +79 -13
  332. package/src/core/EffectBatchManager.mjs +18 -19
  333. package/src/core/EffectManager.mjs +25 -3
  334. package/src/core/IdGenerator.mjs +13 -44
  335. package/src/data/Model.mjs +2 -0
  336. package/src/data/Store.mjs +7 -0
  337. package/src/data/connection/WebSocket.mjs +2 -0
  338. package/src/date/DayViewComponent.mjs +2 -0
  339. package/src/date/SelectorContainer.mjs +14 -0
  340. package/src/dialog/Base.mjs +8 -0
  341. package/src/draggable/DragZone.mjs +5 -0
  342. package/src/draggable/tree/DragZone.mjs +1 -0
  343. package/src/filter/BooleanContainer.mjs +2 -0
  344. package/src/filter/NumberContainer.mjs +3 -0
  345. package/src/filter/ToggleOperatorsButton.mjs +2 -0
  346. package/src/form/Fieldset.mjs +6 -0
  347. package/src/form/field/Base.mjs +7 -0
  348. package/src/form/field/CheckBox.mjs +18 -0
  349. package/src/form/field/Chip.mjs +1 -0
  350. package/src/form/field/ComboBox.mjs +8 -0
  351. package/src/form/field/Country.mjs +1 -0
  352. package/src/form/field/Currency.mjs +2 -0
  353. package/src/form/field/Date.mjs +4 -0
  354. package/src/form/field/Display.mjs +1 -0
  355. package/src/form/field/Email.mjs +1 -0
  356. package/src/form/field/FileUpload.mjs +7 -0
  357. package/src/form/field/Hidden.mjs +1 -0
  358. package/src/form/field/Number.mjs +7 -0
  359. package/src/form/field/Password.mjs +1 -0
  360. package/src/form/field/Phone.mjs +3 -0
  361. package/src/form/field/Picker.mjs +2 -0
  362. package/src/form/field/Radio.mjs +1 -0
  363. package/src/form/field/Range.mjs +3 -0
  364. package/src/form/field/Search.mjs +2 -0
  365. package/src/form/field/Text.mjs +32 -0
  366. package/src/form/field/TextArea.mjs +7 -0
  367. package/src/form/field/Time.mjs +6 -0
  368. package/src/form/field/Url.mjs +3 -0
  369. package/src/form/field/ZipCode.mjs +2 -0
  370. package/src/form/field/trigger/Base.mjs +3 -0
  371. package/src/form/field/trigger/Clear.mjs +2 -0
  372. package/src/form/field/trigger/CopyToClipboard.mjs +2 -0
  373. package/src/form/field/trigger/Date.mjs +1 -0
  374. package/src/form/field/trigger/Picker.mjs +1 -0
  375. package/src/form/field/trigger/Search.mjs +1 -0
  376. package/src/form/field/trigger/SpinDown.mjs +2 -0
  377. package/src/form/field/trigger/SpinUp.mjs +1 -0
  378. package/src/form/field/trigger/Time.mjs +2 -0
  379. package/src/functional/_export.mjs +6 -0
  380. package/src/functional/component/Base.mjs +499 -0
  381. package/src/functional/defineComponent.mjs +102 -0
  382. package/src/functional/useConfig.mjs +52 -0
  383. package/src/functional/useEvent.mjs +43 -0
  384. package/src/grid/Body.mjs +20 -1
  385. package/src/grid/Container.mjs +50 -60
  386. package/src/grid/ScrollManager.mjs +2 -0
  387. package/src/grid/VerticalScrollbar.mjs +2 -0
  388. package/src/grid/column/Base.mjs +2 -0
  389. package/src/grid/header/Button.mjs +7 -0
  390. package/src/grid/header/Toolbar.mjs +6 -0
  391. package/src/grid/plugin/AnimateRows.mjs +2 -0
  392. package/src/layout/Base.mjs +3 -0
  393. package/src/layout/Card.mjs +1 -0
  394. package/src/layout/Cube.mjs +11 -1
  395. package/src/layout/Fit.mjs +1 -0
  396. package/src/layout/Flexbox.mjs +7 -0
  397. package/src/layout/Form.mjs +2 -0
  398. package/src/layout/Grid.mjs +1 -0
  399. package/src/layout/HBox.mjs +1 -0
  400. package/src/layout/VBox.mjs +1 -0
  401. package/src/list/Base.mjs +13 -0
  402. package/src/list/Chip.mjs +1 -0
  403. package/src/list/Circle.mjs +2 -0
  404. package/src/list/Color.mjs +1 -0
  405. package/src/list/plugin/Animate.mjs +2 -0
  406. package/src/main/DeltaUpdates.mjs +1 -0
  407. package/src/main/DomEvents.mjs +2 -0
  408. package/src/main/addon/CloneNode.mjs +1 -0
  409. package/src/main/addon/Cookie.mjs +1 -0
  410. package/src/main/addon/GoogleMaps.mjs +1 -0
  411. package/src/main/addon/LocalStorage.mjs +1 -0
  412. package/src/main/addon/MapboxGL.mjs +1 -0
  413. package/src/main/addon/Markdown.mjs +1 -0
  414. package/src/main/addon/Navigator.mjs +1 -0
  415. package/src/main/addon/Popover.mjs +1 -0
  416. package/src/main/addon/Stylesheet.mjs +1 -0
  417. package/src/main/addon/WindowPosition.mjs +1 -0
  418. package/src/manager/Component.mjs +0 -71
  419. package/src/manager/VDomUpdate.mjs +235 -0
  420. package/src/menu/List.mjs +6 -0
  421. package/src/menu/Model.mjs +1 -0
  422. package/src/menu/Panel.mjs +3 -0
  423. package/src/menu/Store.mjs +1 -0
  424. package/src/mixin/DomEvents.mjs +130 -0
  425. package/src/mixin/VdomLifecycle.mjs +667 -0
  426. package/src/plugin/Base.mjs +1 -0
  427. package/src/plugin/Resizable.mjs +2 -0
  428. package/src/selection/Model.mjs +15 -18
  429. package/src/selection/grid/BaseModel.mjs +1 -0
  430. package/src/sitemap/Component.mjs +1 -0
  431. package/src/state/Provider.mjs +98 -70
  432. package/src/state/createHierarchicalDataProxy.mjs +39 -25
  433. package/src/tab/Container.mjs +6 -0
  434. package/src/tab/Strip.mjs +1 -0
  435. package/src/tab/header/Button.mjs +2 -0
  436. package/src/tab/header/EffectButton.mjs +2 -0
  437. package/src/tab/header/Toolbar.mjs +1 -0
  438. package/src/table/Body.mjs +3 -0
  439. package/src/table/Container.mjs +10 -0
  440. package/src/table/header/Button.mjs +8 -0
  441. package/src/table/header/Toolbar.mjs +5 -0
  442. package/src/table/plugin/CellEditing.mjs +1 -0
  443. package/src/toolbar/Base.mjs +4 -0
  444. package/src/toolbar/Breadcrumb.mjs +3 -0
  445. package/src/toolbar/Paging.mjs +5 -0
  446. package/src/tooltip/Base.mjs +2 -0
  447. package/src/tree/List.mjs +3 -0
  448. package/src/util/HashHistory.mjs +1 -0
  449. package/src/util/KeyNavigation.mjs +2 -0
  450. package/src/util/Matrix.mjs +1 -0
  451. package/src/util/VDom.mjs +7 -1
  452. package/src/util/VNode.mjs +7 -1
  453. package/src/util/vdom/TreeBuilder.mjs +129 -0
  454. package/src/vdom/Helper.mjs +35 -23
  455. package/src/vdom/VNode.mjs +4 -6
  456. package/src/worker/App.mjs +1 -0
  457. package/src/worker/Base.mjs +2 -0
  458. package/src/worker/Manager.mjs +2 -0
  459. package/src/worker/ServiceBase.mjs +6 -1
  460. package/test/siesta/siesta.js +5 -2
  461. package/test/siesta/tests/VdomCalendar.mjs +13 -9
  462. package/test/siesta/tests/core/Effect.mjs +10 -14
  463. package/test/siesta/tests/core/EffectBatching.mjs +25 -37
  464. package/test/siesta/tests/state/ProviderNestedDataConfigs.mjs +255 -0
  465. package/test/siesta/tests/state/createHierarchicalDataProxy.mjs +42 -55
  466. package/test/siesta/tests/vdom/VdomAsymmetricUpdates.mjs +366 -0
  467. package/test/siesta/tests/vdom/VdomRealWorldUpdates.mjs +249 -0
  468. package/learn/javascript/NewNode.md +0 -31
package/src/Neo.mjs CHANGED
@@ -293,11 +293,195 @@ Neo = globalThis.Neo = Object.assign({
293
293
  return instance
294
294
  },
295
295
 
296
+ /**
297
+ * Defines a reactive configuration property on a target object (prototype or instance).
298
+ * This method creates getters and setters that fully participate in Neo.mjs's reactive config system,
299
+ * including lifecycle hooks.
300
+ *
301
+ * @param {Neo.core.Base} target - The instance or prototype on which to define the config.
302
+ * @param {String} key - The name of the config property (without the '_' suffix).
303
+ * @param {*} [initialValue] - The initial value for the config.
304
+ */
305
+ createConfig(target, key, initialValue) {
306
+ if (Neo.hasPropertySetter(target, key)) {
307
+ throw(
308
+ `Invalid config in ${target.className}: '${key}_'. The config '${key}' is already defined as reactive by a parent class.
309
+ To override the default value, use '${key}' (without the underscore) in your static config.
310
+ If you intended to create custom logic, use the 'beforeGet${Neo.capitalize(key)}()', 'beforeSet${Neo.capitalize(key)}()', and 'afterSet${Neo.capitalize(key)}()' hooks instead of redefining the config.`
311
+ )
312
+ }
313
+
314
+ const
315
+ _key = '_' + key,
316
+ uKey = key[0].toUpperCase() + key.slice(1),
317
+ beforeGet = 'beforeGet' + uKey,
318
+ beforeSet = 'beforeSet' + uKey,
319
+ afterSet = 'afterSet' + uKey;
320
+
321
+ Neo[getSetCache] ??= {};
322
+
323
+ if (!Neo[getSetCache][key]) {
324
+ // Public Descriptor
325
+ Neo[getSetCache][key] = {
326
+ get() {
327
+ let me = this,
328
+ config = me.getConfig(key),
329
+ hasNewKey = Object.hasOwn(me[configSymbol], key),
330
+ newKey = me[configSymbol][key],
331
+ value = hasNewKey ? newKey : me[_key];
332
+
333
+ if (value instanceof Date) {
334
+ value = new Date(value.valueOf());
335
+ }
336
+ // new, explicit opt-in path
337
+ else if (config.cloneOnGet) {
338
+ const {cloneOnGet} = config;
339
+
340
+ if (cloneOnGet === 'deep') {
341
+ value = Neo.clone(value, true, true);
342
+ } else if (cloneOnGet === 'shallow') {
343
+ const type = Neo.typeOf(value);
344
+
345
+ if (type === 'Array') {
346
+ value = [...value];
347
+ } else if (type === 'Object') {
348
+ value = {...value};
349
+ }
350
+ }
351
+ }
352
+ // legacy behavior
353
+ else if (Array.isArray(value)) {
354
+ value = [...value];
355
+ }
356
+
357
+ if (hasNewKey) {
358
+ me[key] = value; // We do want to trigger the setter => beforeSet, afterSet
359
+ value = me[_key]; // Return the value parsed by the setter
360
+ delete me[configSymbol][key]
361
+ }
362
+
363
+ if (typeof me[beforeGet] === 'function') {
364
+ value = me[beforeGet](value)
365
+ }
366
+
367
+ return value
368
+ },
369
+ set(value) {
370
+ if (value === undefined) return;
371
+
372
+ const config = this.getConfig(key);
373
+ if (!config) return;
374
+
375
+ let me = this,
376
+ oldValue = config.get(), // Get the old value from the Config instance
377
+ {EffectBatchManager} = Neo.core,
378
+ isNewBatch = !EffectBatchManager?.isBatchActive();
379
+
380
+ // If a config change is not triggered via `core.Base#set()`, honor changes inside hooks.
381
+ isNewBatch && EffectBatchManager?.startBatch();
382
+
383
+ // 1. Prevent infinite loops:
384
+ // Immediately remove the pending value from the configSymbol to prevent a getter from
385
+ // recursively re-triggering this setter.
386
+ delete me[configSymbol][key];
387
+
388
+ switch (config.clone) {
389
+ case 'deep':
390
+ value = Neo.clone(value, true, true);
391
+ break;
392
+ case 'shallow':
393
+ value = Neo.clone(value, false, true);
394
+ break;
395
+ }
396
+
397
+ // 2. Create a temporary state for beforeSet hooks:
398
+ // Set the new value directly on the private backing property. This allows any beforeSet
399
+ // hook to access the new value of this and other configs within the same `set()` call.
400
+ me[_key] = value;
401
+
402
+ if (typeof me[beforeSet] === 'function') {
403
+ value = me[beforeSet](value, oldValue);
404
+
405
+ // If they don't return a value, that means no change
406
+ if (value === undefined) {
407
+ // Restore the original value if the update is canceled.
408
+ me[_key] = oldValue;
409
+ isNewBatch && EffectBatchManager?.endBatch();
410
+ return
411
+ }
412
+ }
413
+
414
+ // 3. Restore state for change detection:
415
+ // Revert the private backing property to its original value. This is crucial for the
416
+ // `config.set()` method to correctly detect if the value has actually changed.
417
+ me[_key] = oldValue;
418
+
419
+ // 4. Finalize the change:
420
+ // The config.set() method performs the final check and, if the value changed,
421
+ // triggers afterSet hooks and notifies subscribers.
422
+ if (config.set(value)) {
423
+ me[afterSet]?.(value, oldValue);
424
+ me.afterSetConfig?.(key, value, oldValue)
425
+ }
426
+
427
+ isNewBatch && EffectBatchManager?.endBatch()
428
+ }
429
+ };
430
+
431
+ // Private Descriptor
432
+ Neo[getSetCache][_key] = {
433
+ get() {
434
+ return this.getConfig(key)?.get()
435
+ },
436
+ set(value) {
437
+ this.getConfig(key)?.setRaw(value)
438
+ }
439
+ }
440
+ }
441
+
442
+ Object.defineProperty(target, key, Neo[getSetCache][key]);
443
+ Object.defineProperty(target, _key, Neo[getSetCache][_key]);
444
+
445
+ if (initialValue !== undefined) {
446
+ target[key] = initialValue
447
+ }
448
+ },
449
+
296
450
  /**
297
451
  *
298
452
  */
299
453
  emptyFn() {},
300
454
 
455
+ /**
456
+ * Ensures a class is assigned to the Neo namespace only once, preventing duplicates.
457
+ * This is a lightweight version of `Neo.setupClass` for simple classes
458
+ * that do not extend `Neo.core.Base`.
459
+ * It follows a "first one wins" strategy.
460
+ *
461
+ * @param {Function|Object} module - The class constructor or singleton object to register.
462
+ * @param {String} classPath - The fully qualified name (e.g., 'Neo.core.Config').
463
+ * @param {Function} [onFirst] - An optional callback that runs only the first time the class is registered.
464
+ * @returns {Function|Object} The class or singleton from the Neo namespace (either the existing one or the newly set one).
465
+ */
466
+ gatekeep(module, classPath, onFirst) {
467
+ const existingClass = Neo.ns(classPath, false);
468
+
469
+ if (existingClass) {
470
+ return existingClass
471
+ }
472
+
473
+ const
474
+ nsArray = classPath.split('.'),
475
+ className = nsArray.pop(),
476
+ parentNs = Neo.ns(nsArray, true);
477
+
478
+ parentNs[className] = module;
479
+
480
+ onFirst?.(module);
481
+
482
+ return parentNs[className]
483
+ },
484
+
301
485
  /**
302
486
  * Checks if there is a set method for a given property key inside the prototype chain
303
487
  * @memberOf module:Neo
@@ -480,27 +664,39 @@ Neo = globalThis.Neo = Object.assign({
480
664
  },
481
665
 
482
666
  /**
483
- * Updates the global Neo.config object across all active workers and connected browser windows.
484
- *
485
- * This is the unified entry point for changing global framework configurations.
486
- * The framework automatically handles the complex multi-threaded and multi-window
487
- * synchronization (via App Workers and Shared Workers, if active), ensuring
488
- * consistency across the entire application without boilerplate.
667
+ * This is the final and most critical step in the Neo.mjs class creation process.
668
+ * It is called at the end of every class module definition.
489
669
  *
490
- * You can pass a partial config object to update specific keys.
491
- * For nested objects, Neo.mjs performs a deep merge to preserve existing properties.
670
+ * `setupClass` performs several key operations:
671
+ * 1. **Mixed-Environment Gatekeeper:** It first checks if the class's namespace already exists.
672
+ * If it does, it immediately returns the existing class. This is the crucial "first comes wins"
673
+ * strategy that enables Neo.mjs to safely combine environments. For example, a bundled
674
+ * `dist/production` app can dynamically load an unbundled module from `dist/esm` at runtime.
675
+ * If that module imports a class already present in the main bundle, this check ensures the
676
+ * original, bundled class is used, preventing conflicts and maintaining application integrity.
677
+ * 1. **Configuration Merging:** It traverses the prototype chain to merge `static config`
678
+ * objects from parent classes into the current class, creating a unified `config`.
679
+ * 2. **Applying Overwrites:** It calls the static `applyOverwrites()` method on the class,
680
+ * allowing the global `Neo.overwrites` object to modify the class's default prototype
681
+ * configs. This is a key mechanism for external theming and configuration.
682
+ * 3. **Reactive Getter/Setter Generation:** For any config ending with an underscore (e.g., `myConfig_`),
683
+ * it automatically generates the corresponding public getter and setter. This enables optional
684
+ * lifecycle hooks that are called automatically if implemented on the class:
685
+ * - `beforeGetMyConfig(value)`
686
+ * - `beforeSetMyConfig(newValue, oldValue)`
687
+ * - `afterSetMyConfig(newValue, oldValue)`
688
+ * 4. **Prototype-based Configs:** Non-reactive configs (without an underscore) are set
689
+ * directly on the prototype for memory efficiency.
690
+ * 5. **Mixin Application:** It processes the `mixins` config to blend in functionality from
691
+ * other classes.
692
+ * 6. **Namespace Registration:** It registers the class in the global `Neo` namespace.
693
+ * 7. **Singleton Instantiation:** If the class is configured as a singleton, it creates the
694
+ * single instance.
492
695
  *
493
696
  * @memberOf module:Neo
494
- * @function setGlobalConfig
495
- * @param {Object} config The partial or full Neo.config object with changes to apply.
496
- */
497
-
498
- /**
499
- * Internally used at the end of each class / module definition
500
- * @memberOf module:Neo
501
697
  * @template T
502
- * @param {T} cls
503
- * @returns {T}
698
+ * @param {T} cls The class constructor to process.
699
+ * @returns {T} The processed and finalized class constructor or singleton instance.
504
700
  */
505
701
  setupClass(cls) {
506
702
  let baseConfig = null,
@@ -574,7 +770,7 @@ Neo = globalThis.Neo = Object.assign({
574
770
  if (isReactive) {
575
771
  delete cfg[key]; // Remove original key with underscore
576
772
  cfg[baseKey] = value; // Use the potentially modified value
577
- autoGenerateGetSet(element, baseKey)
773
+ Neo.createConfig(element, baseKey)
578
774
  }
579
775
  // This part handles non-reactive configs (including those that were descriptors)
580
776
  // If no property setter exists, define it directly on the prototype.
@@ -695,7 +891,8 @@ Neo = globalThis.Neo = Object.assign({
695
891
  * @returns {String|null}
696
892
  */
697
893
  typeOf(item) {
698
- if (item === null || item === undefined) {
894
+ // Return null for null or undefined
895
+ if (item == null) {
699
896
  return null
700
897
  }
701
898
 
@@ -762,152 +959,6 @@ function applyMixins(cls, mixins, classConfig) {
762
959
  cls.prototype.mixins = mixinClasses // todo: we should do a deep merge
763
960
  }
764
961
 
765
- /**
766
- * Creates get / set methods for class configs ending with an underscore
767
- * @param {Neo.core.Base} proto
768
- * @param {String} key
769
- * @private
770
- * @tutorial 02_ClassSystem
771
- */
772
- function autoGenerateGetSet(proto, key) {
773
- if (Neo.hasPropertySetter(proto, key)) {
774
- throw('Config ' + key + '_ (' + proto.className + ') already has a set method, use beforeGet, beforeSet & afterSet instead')
775
- }
776
-
777
- const
778
- _key = '_' + key,
779
- uKey = key[0].toUpperCase() + key.slice(1),
780
- beforeGet = 'beforeGet' + uKey,
781
- beforeSet = 'beforeSet' + uKey,
782
- afterSet = 'afterSet' + uKey;
783
-
784
- if (!Neo[getSetCache]) {
785
- Neo[getSetCache] = {}
786
- }
787
-
788
- if (!Neo[getSetCache][key]) {
789
- // Public Descriptor
790
- Neo[getSetCache][key] = {
791
- get() {
792
- let me = this,
793
- config = me.getConfig(key),
794
- hasNewKey = Object.hasOwn(me[configSymbol], key),
795
- newKey = me[configSymbol][key],
796
- value = hasNewKey ? newKey : me[_key];
797
-
798
- if (value instanceof Date) {
799
- value = new Date(value.valueOf());
800
- }
801
- // new, explicit opt-in path
802
- else if (config.cloneOnGet) {
803
- const {cloneOnGet} = config;
804
-
805
- if (cloneOnGet === 'deep') {
806
- value = Neo.clone(value, true, true);
807
- } else if (cloneOnGet === 'shallow') {
808
- const type = Neo.typeOf(value);
809
-
810
- if (type === 'Array') {
811
- value = [...value];
812
- } else if (type === 'Object') {
813
- value = {...value};
814
- }
815
- }
816
- }
817
- // legacy behavior
818
- else if (Array.isArray(value)) {
819
- value = [...value];
820
- }
821
-
822
- if (hasNewKey) {
823
- me[key] = value; // We do want to trigger the setter => beforeSet, afterSet
824
- value = me[_key]; // Return the value parsed by the setter
825
- delete me[configSymbol][key]
826
- }
827
-
828
- if (typeof me[beforeGet] === 'function') {
829
- value = me[beforeGet](value)
830
- }
831
-
832
- return value
833
- },
834
- set(value) {
835
- if (value === undefined) return;
836
-
837
- const config = this.getConfig(key);
838
- if (!config) return;
839
-
840
- let me = this,
841
- oldValue = config.get(), // Get the old value from the Config instance
842
- {EffectBatchManager} = Neo.core,
843
- isNewBatch = !EffectBatchManager?.isBatchActive();
844
-
845
- // If a config change is not triggered via `core.Base#set()`, honor changes inside hooks.
846
- isNewBatch && EffectBatchManager?.startBatch();
847
-
848
- // 1. Prevent infinite loops:
849
- // Immediately remove the pending value from the configSymbol to prevent a getter from
850
- // recursively re-triggering this setter.
851
- delete me[configSymbol][key];
852
-
853
- switch (config.clone) {
854
- case 'deep':
855
- value = Neo.clone(value, true, true);
856
- break;
857
- case 'shallow':
858
- value = Neo.clone(value, false, true);
859
- break;
860
- }
861
-
862
- // 2. Create a temporary state for beforeSet hooks:
863
- // Set the new value directly on the private backing property. This allows any beforeSet
864
- // hook to access the new value of this and other configs within the same `set()` call.
865
- me[_key] = value;
866
-
867
- if (typeof me[beforeSet] === 'function') {
868
- value = me[beforeSet](value, oldValue);
869
-
870
- // If they don't return a value, that means no change
871
- if (value === undefined) {
872
- // Restore the original value if the update is canceled.
873
- me[_key] = oldValue;
874
- isNewBatch && EffectBatchManager?.endBatch();
875
- return
876
- }
877
- }
878
-
879
- // 3. Restore state for change detection:
880
- // Revert the private backing property to its original value. This is crucial for the
881
- // `config.set()` method to correctly detect if the value has actually changed.
882
- me[_key] = oldValue;
883
-
884
- // 4. Finalize the change:
885
- // The config.set() method performs the final check and, if the value changed,
886
- // triggers afterSet hooks and notifies subscribers.
887
- if (config.set(value)) {
888
- me[afterSet]?.(value, oldValue);
889
- me.afterSetConfig?.(key, value, oldValue)
890
- }
891
-
892
- isNewBatch && EffectBatchManager?.endBatch()
893
- }
894
- };
895
-
896
- // Private Descriptor
897
- Neo[getSetCache][_key] = {
898
- get() {
899
- return this.getConfig(key)?.get()
900
- },
901
- set(value) {
902
- this.getConfig(key)?.setRaw(value)
903
- }
904
- }
905
- }
906
-
907
- Object.defineProperty(proto, key, Neo[getSetCache][key]);
908
- Object.defineProperty(proto, _key, Neo[getSetCache][_key])
909
- }
910
-
911
962
  /**
912
963
  * @param {Boolean} create
913
964
  * @param {Object} current
@@ -973,7 +1024,7 @@ function mixinProperty(proto, mixinProto, classConfig) {
973
1024
 
974
1025
  // Reactive neo configs, or public class fields defined via get() AND set()
975
1026
  if (descriptor.get && descriptor.set) {
976
- autoGenerateGetSet(proto, key);
1027
+ Neo.createConfig(proto, key);
977
1028
 
978
1029
  const mixinClassConfig = mixinProto.constructor.config;
979
1030
 
package/src/Xhr.mjs CHANGED
@@ -20,6 +20,7 @@ class Xhr extends XhrConnection {
20
20
  /**
21
21
  * @member {Object} remote={app:['promiseRequest','promiseJson','setDefaultHeaders']}
22
22
  * @protected
23
+ * @reactive
23
24
  */
24
25
  remote: {
25
26
  app: [
@@ -34,10 +34,12 @@ class Button extends Component {
34
34
  ntype: 'button',
35
35
  /**
36
36
  * @member {String} badgePosition_='top-right'
37
+ * @reactive
37
38
  */
38
39
  badgePosition_: 'top-right',
39
40
  /**
40
41
  * @member {String|null} badgeText_=null
42
+ * @reactive
41
43
  */
42
44
  badgeText_: null,
43
45
  /**
@@ -53,6 +55,7 @@ class Button extends Component {
53
55
  * Shortcut for domListeners={click:handler}
54
56
  * A string based value assumes that the handlerFn lives inside a controller.Component
55
57
  * @member {Function|String|null} handler_=null
58
+ * @reactive
56
59
  */
57
60
  handler_: null,
58
61
  /**
@@ -65,17 +68,20 @@ class Button extends Component {
65
68
  /**
66
69
  * The CSS class to use for an icon, e.g. 'fa fa-home'
67
70
  * @member {String|null} [iconCls_=null]
71
+ * @reactive
68
72
  */
69
73
  iconCls_: null,
70
74
  /**
71
75
  * The color to use for an icon, e.g. '#ff0000' [optional]
72
76
  * @member {String|null} iconColor_=null
77
+ * @reactive
73
78
  */
74
79
  iconColor_: null,
75
80
  /**
76
81
  * The position of the icon in case iconCls has a value.
77
82
  * Valid values are: 'top', 'right', 'bottom', 'left'
78
83
  * @member {String} iconPosition_='left'
84
+ * @reactive
79
85
  */
80
86
  iconPosition_: 'left',
81
87
  /**
@@ -84,11 +90,13 @@ class Button extends Component {
84
90
  * Or a configuration object which adds custom configuration to the menu to be
85
91
  * created and includes an `items` property to define the menu items.
86
92
  * @member {Object|Object[]|null} menu_=null
93
+ * @reactive
87
94
  */
88
95
  menu_: null,
89
96
  /**
90
97
  * The pressed state of the Button
91
98
  * @member {Boolean} pressed_=false
99
+ * @reactive
92
100
  */
93
101
  pressed_: false,
94
102
  /**
@@ -96,26 +104,31 @@ class Button extends Component {
96
104
  * Use route for internal navigation and url for external links. Do not use both on the same instance.
97
105
  * Transforms the button tag into an a tag [optional]
98
106
  * @member {String|null} route_=null
107
+ * @reactive
99
108
  */
100
109
  route_: null,
101
110
  /**
102
111
  * The text displayed on the button [optional]
103
112
  * @member {String|null} text=null
113
+ * @reactive
104
114
  */
105
115
  text: null,
106
116
  /**
107
117
  * Transforms the button tag into an a tag [optional]
108
118
  * @member {String|null} url_=null
119
+ * @reactive
109
120
  */
110
121
  url_: null,
111
122
  /**
112
123
  * If url is set, applies the target attribute on the top level vdom node [optional]
113
124
  * @member {String} urlTarget_='_blank'
125
+ * @reactive
114
126
  */
115
127
  urlTarget_: '_blank',
116
128
  /**
117
129
  * True adds an expanding circle on click
118
130
  * @member {Boolean} useRippleEffect_=true
131
+ * @reactive
119
132
  */
120
133
  useRippleEffect_: true,
121
134
  /**
@@ -35,10 +35,12 @@ class EffectButton extends Component {
35
35
  ntype: 'effect-button',
36
36
  /**
37
37
  * @member {String} badgePosition_='top-right'
38
+ * @reactive
38
39
  */
39
40
  badgePosition_: 'top-right',
40
41
  /**
41
42
  * @member {String|null} badgeText_=null
43
+ * @reactive
42
44
  */
43
45
  badgeText_: null,
44
46
  /**
@@ -47,6 +49,7 @@ class EffectButton extends Component {
47
49
  baseCls: ['neo-button'],
48
50
  /**
49
51
  * @member {String[]} cls=[]
52
+ * @reactive
50
53
  */
51
54
  cls: [],
52
55
  /**
@@ -58,6 +61,7 @@ class EffectButton extends Component {
58
61
  * Shortcut for domListeners={click:handler}
59
62
  * A string based value assumes that the handlerFn lives inside a controller.Component
60
63
  * @member {Function|String|null} handler_=null
64
+ * @reactive
61
65
  */
62
66
  handler_: null,
63
67
  /**
@@ -70,17 +74,20 @@ class EffectButton extends Component {
70
74
  /**
71
75
  * The CSS class to use for an icon, e.g. 'fa fa-home'
72
76
  * @member {String|null} [iconCls_=null]
77
+ * @reactive
73
78
  */
74
79
  iconCls_: null,
75
80
  /**
76
81
  * The color to use for an icon, e.g. '#ff0000' [optional]
77
82
  * @member {String|null} iconColor_=null
83
+ * @reactive
78
84
  */
79
85
  iconColor_: null,
80
86
  /**
81
87
  * The position of the icon in case iconCls has a value.
82
88
  * Valid values are: 'top', 'right', 'bottom', 'left'
83
89
  * @member {String} iconPosition_='left'
90
+ * @reactive
84
91
  */
85
92
  iconPosition_: 'left',
86
93
  /**
@@ -89,11 +96,13 @@ class EffectButton extends Component {
89
96
  * Or a configuration object which adds custom configuration to the menu to be
90
97
  * created and includes an `items` property to define the menu items.
91
98
  * @member {Object|Object[]|null} menu_=null
99
+ * @reactive
92
100
  */
93
101
  menu_: null,
94
102
  /**
95
103
  * The pressed state of the Button
96
104
  * @member {Boolean} pressed_=false
105
+ * @reactive
97
106
  */
98
107
  pressed_: false,
99
108
  /**
@@ -101,25 +110,30 @@ class EffectButton extends Component {
101
110
  * Use route for internal navigation and url for external links. Do not use both on the same instance.
102
111
  * Transforms the button tag into an a tag [optional]
103
112
  * @member {String|null} route_=null
113
+ * @reactive
104
114
  */
105
115
  route_: null,
106
116
  /**
107
117
  * @member {String} tag='button'
118
+ * @reactive
108
119
  */
109
120
  tag: 'button',
110
121
  /**
111
122
  * Transforms the button tag into an a tag [optional]
112
123
  * @member {String|null} url_=null
124
+ * @reactive
113
125
  */
114
126
  url_: null,
115
127
  /**
116
128
  * If url is set, applies the target attribute on the top level vdom node [optional]
117
129
  * @member {String} urlTarget_='_blank'
130
+ * @reactive
118
131
  */
119
132
  urlTarget_: '_blank',
120
133
  /**
121
134
  * True adds an expanding circle on click
122
135
  * @member {Boolean} useRippleEffect_=true
136
+ * @reactive
123
137
  */
124
138
  useRippleEffect_: true
125
139
  }
@@ -160,11 +174,11 @@ class EffectButton extends Component {
160
174
  * @protected
161
175
  */
162
176
  createVdomEffect() {
163
- return new Effect({fn: () => {
177
+ return new Effect(() => {
164
178
  // The effect's only job is to get the config and trigger an update.
165
179
  this._vdom = this.getVdomConfig();
166
180
  this.update();
167
- }});
181
+ })
168
182
  }
169
183
 
170
184
  /**
@@ -20,6 +20,7 @@ class Split extends Button {
20
20
  ntype: 'split-button',
21
21
  /**
22
22
  * @member {Boolean} hideTriggerButton_=false
23
+ * @reactive
23
24
  */
24
25
  hideTriggerButton_: false,
25
26
  /**
@@ -38,6 +39,7 @@ class Split extends Button {
38
39
  /**
39
40
  * The CSS class to use for the SplitButton icon, e.g. 'fa fa-home'
40
41
  * @member {String} triggerButtonCls_='fa fa-caret-down'
42
+ * @reactive
41
43
  */
42
44
  triggerButtonIconCls_: 'fa fa-caret-down',
43
45
  /**
@@ -18,6 +18,7 @@ class Calendars extends Store {
18
18
  keyProperty: 'id',
19
19
  /**
20
20
  * @member {Neo.data.Model} model=Calendar
21
+ * @reactive
21
22
  */
22
23
  model: Calendar,
23
24
  /**
@@ -29,6 +29,7 @@ class Colors extends Store {
29
29
  keyProperty: 'id',
30
30
  /**
31
31
  * @member {Neo.data.Model} model=Color
32
+ * @reactive
32
33
  */
33
34
  model: Color
34
35
  }
@@ -19,6 +19,7 @@ class Events extends Store {
19
19
  keyProperty: 'id',
20
20
  /**
21
21
  * @member {Neo.data.Model} model=Event
22
+ * @reactive
22
23
  */
23
24
  model: Event,
24
25
  /**