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.
- package/.github/RELEASE_NOTES/v10.0.0-beta.1.md +20 -0
- package/.github/RELEASE_NOTES/v10.0.0-beta.2.md +73 -0
- package/.github/RELEASE_NOTES/v10.0.0-beta.3.md +39 -0
- package/.github/RELEASE_NOTES/v10.0.0-beta.5.md +70 -0
- package/.github/RELEASE_NOTES/v10.0.0-beta.6.md +48 -0
- package/.github/RELEASE_NOTES/v10.0.0.md +52 -0
- package/.github/epic-functional-components.md +498 -0
- package/.github/ticket-asymmetric-vdom-updates.md +122 -0
- package/README.md +0 -3
- package/ServiceWorker.mjs +2 -2
- package/apps/colors/store/Colors.mjs +1 -0
- package/apps/colors/view/GridContainer.mjs +3 -0
- package/apps/colors/view/HeaderToolbar.mjs +2 -0
- package/apps/colors/view/Viewport.mjs +3 -0
- package/apps/covid/view/FooterContainer.mjs +3 -0
- package/apps/covid/view/GalleryContainer.mjs +2 -0
- package/apps/covid/view/GalleryContainerController.mjs +1 -0
- package/apps/covid/view/HeaderContainer.mjs +2 -0
- package/apps/covid/view/HelixContainer.mjs +2 -0
- package/apps/covid/view/HelixContainerController.mjs +1 -0
- package/apps/covid/view/MainContainer.mjs +3 -0
- package/apps/covid/view/TableContainer.mjs +3 -0
- package/apps/covid/view/TableContainerController.mjs +1 -0
- package/apps/covid/view/WorldMapContainer.mjs +2 -0
- package/apps/covid/view/country/Gallery.mjs +3 -0
- package/apps/covid/view/country/Helix.mjs +8 -0
- package/apps/covid/view/country/HistoricalDataTable.mjs +1 -0
- package/apps/covid/view/country/Table.mjs +2 -0
- package/apps/covid/view/mapboxGl/Component.mjs +1 -0
- package/apps/covid/view/mapboxGl/Container.mjs +2 -0
- package/apps/email/EPIC_PLAN.md +58 -0
- package/apps/email/neo-config.json +2 -2
- package/apps/email/store/Emails.mjs +11 -1
- package/apps/email/view/ComposeView.mjs +44 -0
- package/apps/email/view/MainView.mjs +89 -0
- package/apps/email/view/Viewport.mjs +4 -33
- package/apps/email/view/ViewportStateProvider.mjs +3 -3
- package/apps/form/store/SideNav.mjs +1 -0
- package/apps/form/view/FormContainer.mjs +1 -0
- package/apps/form/view/FormPageContainer.mjs +2 -0
- package/apps/form/view/SideNavList.mjs +1 -0
- package/apps/form/view/Viewport.mjs +3 -0
- package/apps/portal/childapps/preview/MainContainer.mjs +1 -0
- package/apps/portal/index.html +1 -1
- package/apps/portal/store/BlogPosts.mjs +2 -0
- package/apps/portal/store/Content.mjs +1 -0
- package/apps/portal/store/ContentSections.mjs +1 -0
- package/apps/portal/store/Examples.mjs +1 -0
- package/apps/portal/view/HeaderToolbar.mjs +1 -0
- package/apps/portal/view/Viewport.mjs +5 -0
- package/apps/portal/view/ViewportController.mjs +11 -3
- package/apps/portal/view/about/Container.mjs +2 -0
- package/apps/portal/view/about/MemberContainer.mjs +7 -0
- package/apps/portal/view/blog/Container.mjs +2 -0
- package/apps/portal/view/blog/List.mjs +2 -0
- package/apps/portal/view/examples/List.mjs +29 -19
- package/apps/portal/view/examples/TabContainer.mjs +4 -0
- package/apps/portal/view/home/ContentBox.mjs +3 -0
- package/apps/portal/view/home/FeatureSection.mjs +8 -0
- package/apps/portal/view/home/FooterContainer.mjs +4 -1
- package/apps/portal/view/home/MainContainer.mjs +2 -0
- package/apps/portal/view/home/parts/AfterMath.mjs +2 -0
- package/apps/portal/view/home/parts/BaseContainer.mjs +1 -0
- package/apps/portal/view/home/parts/Colors.mjs +4 -0
- package/apps/portal/view/home/parts/Features.mjs +2 -0
- package/apps/portal/view/home/parts/Helix.mjs +5 -0
- package/apps/portal/view/home/parts/How.mjs +4 -0
- package/apps/portal/view/home/parts/MainNeo.mjs +1 -0
- package/apps/portal/view/home/parts/References.mjs +2 -0
- package/apps/portal/view/learn/ContentComponent.mjs +11 -5
- package/apps/portal/view/learn/ContentTreeList.mjs +2 -0
- package/apps/portal/view/learn/CubeLayoutButton.mjs +1 -0
- package/apps/portal/view/learn/MainContainer.mjs +4 -0
- package/apps/portal/view/learn/PageContainer.mjs +2 -0
- package/apps/portal/view/learn/PageSectionsContainer.mjs +3 -0
- package/apps/portal/view/learn/PageSectionsList.mjs +1 -0
- package/apps/portal/view/services/Component.mjs +1 -0
- package/apps/realworld/api/Base.mjs +1 -0
- package/apps/realworld/view/HeaderComponent.mjs +4 -0
- package/apps/realworld/view/HomeComponent.mjs +7 -0
- package/apps/realworld/view/MainContainer.mjs +2 -0
- package/apps/realworld/view/MainContainerController.mjs +2 -0
- package/apps/realworld/view/article/CommentComponent.mjs +3 -0
- package/apps/realworld/view/article/Component.mjs +17 -10
- package/apps/realworld/view/article/CreateCommentComponent.mjs +2 -0
- package/apps/realworld/view/article/CreateComponent.mjs +5 -0
- package/apps/realworld/view/article/PreviewComponent.mjs +9 -0
- package/apps/realworld/view/article/TagListComponent.mjs +2 -0
- package/apps/realworld/view/user/ProfileComponent.mjs +7 -0
- package/apps/realworld/view/user/SettingsComponent.mjs +5 -0
- package/apps/realworld/view/user/SignUpComponent.mjs +3 -0
- package/apps/realworld2/api/Base.mjs +1 -0
- package/apps/realworld2/view/FooterComponent.mjs +1 -0
- package/apps/realworld2/view/HeaderToolbar.mjs +3 -0
- package/apps/realworld2/view/HomeContainer.mjs +1 -0
- package/apps/realworld2/view/MainContainer.mjs +2 -0
- package/apps/realworld2/view/MainContainerController.mjs +1 -0
- package/apps/realworld2/view/article/Helix.mjs +1 -0
- package/apps/realworld2/view/article/PreviewComponent.mjs +9 -0
- package/apps/realworld2/view/article/PreviewList.mjs +1 -0
- package/apps/realworld2/view/article/TagListComponent.mjs +2 -0
- package/apps/route/view/CenterContainer.mjs +1 -0
- package/apps/route/view/MainView.mjs +1 -0
- package/apps/sharedcovid/childapps/sharedcovidchart/MainContainer.mjs +1 -0
- package/apps/sharedcovid/childapps/sharedcovidgallery/MainContainer.mjs +1 -0
- package/apps/sharedcovid/childapps/sharedcovidhelix/MainContainer.mjs +1 -0
- package/apps/sharedcovid/childapps/sharedcovidmap/MainContainer.mjs +1 -0
- package/apps/sharedcovid/view/FooterContainer.mjs +3 -0
- package/apps/sharedcovid/view/GalleryContainer.mjs +2 -0
- package/apps/sharedcovid/view/GalleryContainerController.mjs +1 -0
- package/apps/sharedcovid/view/HeaderContainer.mjs +2 -0
- package/apps/sharedcovid/view/HelixContainer.mjs +2 -0
- package/apps/sharedcovid/view/HelixContainerController.mjs +1 -0
- package/apps/sharedcovid/view/MainContainer.mjs +3 -0
- package/apps/sharedcovid/view/TableContainer.mjs +3 -0
- package/apps/sharedcovid/view/TableContainerController.mjs +1 -0
- package/apps/sharedcovid/view/WorldMapContainer.mjs +2 -0
- package/apps/sharedcovid/view/country/Gallery.mjs +3 -0
- package/apps/sharedcovid/view/country/Helix.mjs +8 -0
- package/apps/sharedcovid/view/country/HistoricalDataTable.mjs +1 -0
- package/apps/sharedcovid/view/country/Table.mjs +2 -0
- package/apps/sharedcovid/view/mapboxGl/Component.mjs +1 -0
- package/apps/sharedcovid/view/mapboxGl/Container.mjs +2 -0
- package/apps/shareddialog/childapps/shareddialog2/view/MainContainer.mjs +2 -0
- package/apps/shareddialog/view/DemoDialog.mjs +2 -0
- package/apps/shareddialog/view/MainContainer.mjs +2 -0
- package/apps/shareddialog/view/MainContainerController.mjs +1 -0
- package/buildScripts/addReactiveTags.mjs +191 -0
- package/buildScripts/checkReactiveTags.mjs +160 -0
- package/docs/app/store/Api.mjs +1 -0
- package/docs/app/store/Examples.mjs +1 -0
- package/docs/app/view/ApiTreeList.mjs +1 -0
- package/docs/app/view/ContentTabContainer.mjs +2 -0
- package/docs/app/view/ExamplesTreeList.mjs +2 -0
- package/docs/app/view/HeaderContainer.mjs +3 -0
- package/docs/app/view/MainContainer.mjs +5 -0
- package/docs/app/view/classdetails/HeaderComponent.mjs +1 -0
- package/docs/app/view/classdetails/MainContainer.mjs +3 -0
- package/docs/app/view/classdetails/MembersList.mjs +5 -0
- package/docs/app/view/classdetails/SourceViewComponent.mjs +2 -0
- package/examples/ConfigurationViewport.mjs +14 -8
- package/examples/calendar/weekview/MainContainer.mjs +4 -0
- package/examples/component/coronaGallery/CountryGallery.mjs +2 -0
- package/examples/component/coronaGallery/CountryStore.mjs +1 -0
- package/examples/component/coronaGallery/Viewport.mjs +3 -0
- package/examples/component/coronaGallery/ViewportController.mjs +1 -0
- package/examples/component/coronaHelix/CountryHelix.mjs +7 -0
- package/examples/component/coronaHelix/MainContainer.mjs +1 -0
- package/examples/component/gallery/ImageStore.mjs +1 -0
- package/examples/component/helix/ImageStore.mjs +1 -0
- package/examples/component/helix/Viewport.mjs +3 -0
- package/examples/component/helix/ViewportController.mjs +1 -0
- package/examples/component/multiWindowCoronaGallery/childapp/Viewport.mjs +1 -0
- package/examples/component/multiWindowHelix/childapp/Viewport.mjs +1 -0
- package/examples/component/wrapper/googleMaps/MapComponent.mjs +2 -0
- package/examples/core/config/MainContainer.mjs +2 -0
- package/examples/dialog/DemoDialog.mjs +2 -0
- package/examples/dialog/MainContainer.mjs +1 -0
- package/examples/form/field/color/MainStore.mjs +1 -0
- package/examples/functional/button/base/MainContainer.mjs +207 -0
- package/examples/functional/button/base/app.mjs +6 -0
- package/examples/functional/button/base/index.html +11 -0
- package/examples/functional/button/base/neo-config.json +6 -0
- package/examples/functional/defineComponent/Component.mjs +18 -0
- package/examples/functional/defineComponent/MainContainer.mjs +41 -0
- package/examples/functional/defineComponent/app.mjs +6 -0
- package/examples/functional/defineComponent/index.html +11 -0
- package/examples/functional/defineComponent/neo-config.json +6 -0
- package/examples/functional/hostComponent/Component.mjs +32 -0
- package/examples/functional/hostComponent/MainContainer.mjs +48 -0
- package/examples/functional/hostComponent/app.mjs +6 -0
- package/examples/functional/hostComponent/index.html +11 -0
- package/examples/functional/hostComponent/neo-config.json +6 -0
- package/examples/grid/animatedRowSorting/Viewport.mjs +1 -1
- package/examples/grid/bigData/ControlsContainer.mjs +3 -0
- package/examples/grid/bigData/GridContainer.mjs +4 -2
- package/examples/grid/bigData/MainContainer.mjs +2 -0
- package/examples/grid/bigData/MainModel.mjs +1 -0
- package/examples/grid/bigData/MainStore.mjs +3 -0
- package/examples/grid/cellEditing/MainContainer.mjs +1 -1
- package/examples/grid/container/MainContainer.mjs +1 -1
- package/examples/grid/covid/GridContainer.mjs +3 -0
- package/examples/grid/covid/MainContainer.mjs +2 -0
- package/examples/grid/covid/Store.mjs +1 -0
- package/examples/grid/nestedRecordFields/EditUserDialog.mjs +3 -0
- package/examples/grid/nestedRecordFields/Viewport.mjs +3 -1
- package/examples/list/animate/List.mjs +4 -0
- package/examples/list/animate/MainContainer.mjs +2 -0
- package/examples/list/circle/MainStore.mjs +1 -0
- package/examples/list/color/MainStore.mjs +1 -0
- package/examples/preloadingAssets/view/MainContainer.mjs +2 -0
- package/examples/stateProvider/advanced/MainContainer.mjs +1 -0
- package/examples/stateProvider/dialog/EditUserDialog.mjs +2 -0
- package/examples/stateProvider/dialog/MainContainer.mjs +1 -0
- package/examples/stateProvider/extendedClass/MainContainer.mjs +2 -0
- package/examples/stateProvider/inline/MainContainer.mjs +1 -0
- package/examples/stateProvider/inlineNoStateProvider/MainContainer.mjs +1 -0
- package/examples/stateProvider/inlineNoStateProvider/MainContainerController.mjs +2 -0
- package/examples/stateProvider/multiWindow/EditUserDialog.mjs +3 -0
- package/examples/stateProvider/multiWindow/MainContainer.mjs +1 -0
- package/examples/stateProvider/multiWindow/Viewport.mjs +1 -0
- package/examples/stateProvider/nestedData/MainContainer.mjs +1 -0
- package/examples/stateProvider/table/MainContainer.mjs +1 -0
- package/examples/table/covid/MainContainer.mjs +2 -0
- package/examples/table/covid/Store.mjs +1 -0
- package/examples/table/covid/TableContainer.mjs +3 -0
- package/examples/table/nestedRecordFields/EditUserDialog.mjs +3 -0
- package/examples/table/nestedRecordFields/Viewport.mjs +1 -0
- package/examples/todoList/version1/MainComponent.mjs +1 -1
- package/examples/toolbar/breadcrumb/view/MainContainer.mjs +2 -0
- package/examples/toolbar/paging/store/Users.mjs +1 -0
- package/examples/toolbar/paging/view/AddUserDialog.mjs +3 -0
- package/examples/toolbar/paging/view/MainContainer.mjs +3 -0
- package/examples/treeAccordion/MainContainer.mjs +2 -2
- package/examples/worker/task/MainContainer.mjs +1 -0
- package/learn/Glossary.md +1 -0
- package/learn/UsingTheseTopics.md +1 -0
- package/learn/benefits/ConfigSystem.md +2 -0
- package/learn/benefits/Effort.md +1 -0
- package/learn/benefits/Features.md +1 -0
- package/learn/benefits/FormsEngine.md +1 -0
- package/learn/benefits/FourEnvironments.md +2 -0
- package/learn/benefits/Introduction.md +2 -0
- package/learn/benefits/MultiWindow.md +3 -1
- package/learn/benefits/OffTheMainThread.md +2 -0
- package/learn/benefits/Quick.md +2 -0
- package/learn/benefits/RPCLayer.md +2 -0
- package/learn/benefits/Speed.md +2 -0
- package/learn/blog/v10-deep-dive-functional-components.md +293 -0
- package/learn/blog/v10-deep-dive-reactivity.md +522 -0
- package/learn/blog/v10-deep-dive-state-provider.md +432 -0
- package/learn/blog/v10-deep-dive-vdom-revolution.md +194 -0
- package/learn/blog/v10-post1-love-story.md +383 -0
- package/learn/comparisons/NeoVsAngular.md +90 -0
- package/learn/comparisons/NeoVsExtJs.md +178 -0
- package/learn/comparisons/NeoVsNextJs.md +124 -0
- package/learn/comparisons/NeoVsReact.md +95 -0
- package/learn/comparisons/NeoVsSolid.md +78 -0
- package/learn/comparisons/NeoVsVue.md +92 -0
- package/learn/comparisons/Overview.md +46 -0
- package/learn/gettingstarted/ComponentModels.md +2 -0
- package/learn/gettingstarted/Config.md +2 -0
- package/learn/gettingstarted/DescribingTheUI.md +2 -0
- package/learn/gettingstarted/Events.md +2 -0
- package/learn/gettingstarted/Extending.md +2 -0
- package/learn/gettingstarted/References.md +2 -0
- package/learn/gettingstarted/Setup.md +3 -2
- package/learn/gettingstarted/Workspaces.md +2 -0
- package/learn/guides/datahandling/Collections.md +1 -0
- package/learn/guides/datahandling/Records.md +1 -0
- package/learn/guides/datahandling/StateProviders.md +130 -16
- package/learn/guides/datahandling/Tables.md +1 -1
- package/learn/guides/fundamentals/ConfigSystemDeepDive.md +1 -0
- package/learn/guides/fundamentals/DeclarativeComponentTreesVsImperativeVdom.md +2 -0
- package/learn/guides/fundamentals/DeclarativeVDOMWithEffects.md +10 -8
- package/learn/guides/fundamentals/ExtendingNeoClasses.md +1 -0
- package/learn/guides/fundamentals/InstanceLifecycle.md +3 -1
- package/learn/guides/fundamentals/MainThreadAddons.md +2 -0
- package/learn/guides/specificfeatures/Mixins.md +3 -1
- package/learn/guides/specificfeatures/MultiWindow.md +3 -1
- package/learn/guides/specificfeatures/PortalApp.md +2 -0
- package/learn/guides/uibuildingblocks/ComponentsAndContainers.md +2 -0
- package/learn/guides/uibuildingblocks/CustomComponents.md +2 -0
- package/learn/guides/uibuildingblocks/Layouts.md +2 -0
- package/learn/guides/uibuildingblocks/WorkingWithVDom.md +28 -2
- package/learn/guides/userinteraction/Forms.md +2 -0
- package/learn/guides/userinteraction/events/CustomEvents.md +2 -1
- package/learn/guides/userinteraction/events/DomEvents.md +2 -0
- package/learn/javascript/ClassFeatures.md +4 -3
- package/learn/javascript/Classes.md +10 -13
- package/learn/javascript/Overrides.md +10 -6
- package/learn/javascript/Super.md +12 -8
- package/learn/tree.json +71 -64
- package/learn/tutorials/Earthquakes.md +2 -0
- package/learn/tutorials/RSP.md +3 -1
- package/learn/tutorials/TodoList.md +103 -7
- package/package.json +8 -6
- package/resources/scss/src/apps/email/ComposeView.scss +16 -0
- package/resources/scss/src/apps/email/MainView.scss +5 -0
- package/resources/scss/src/apps/portal/learn/ContentComponent.scss +5 -4
- package/src/DefaultConfig.mjs +12 -2
- package/src/Main.mjs +1 -0
- package/src/Neo.mjs +219 -166
- package/src/Xhr.mjs +1 -0
- package/src/button/Base.mjs +13 -0
- package/src/button/Effect.mjs +16 -2
- package/src/button/Split.mjs +2 -0
- package/src/calendar/store/Calendars.mjs +1 -0
- package/src/calendar/store/Colors.mjs +1 -0
- package/src/calendar/store/Events.mjs +1 -0
- package/src/calendar/view/DayComponent.mjs +2 -0
- package/src/calendar/view/EditEventContainer.mjs +4 -1
- package/src/calendar/view/MainContainer.mjs +13 -0
- package/src/calendar/view/MainContainerStateProvider.mjs +14 -28
- package/src/calendar/view/SettingsContainer.mjs +1 -0
- package/src/calendar/view/YearComponent.mjs +16 -0
- package/src/calendar/view/calendars/ColorsList.mjs +2 -0
- package/src/calendar/view/calendars/Container.mjs +2 -0
- package/src/calendar/view/calendars/EditContainer.mjs +1 -0
- package/src/calendar/view/month/Component.mjs +11 -0
- package/src/calendar/view/settings/GeneralContainer.mjs +1 -0
- package/src/calendar/view/settings/MonthContainer.mjs +1 -0
- package/src/calendar/view/settings/WeekContainer.mjs +1 -0
- package/src/calendar/view/settings/YearContainer.mjs +1 -0
- package/src/calendar/view/week/Component.mjs +15 -1
- package/src/calendar/view/week/TimeAxisComponent.mjs +4 -0
- package/src/code/LivePreview.mjs +51 -23
- package/src/collection/Base.mjs +7 -10
- package/src/collection/Filter.mjs +6 -0
- package/src/collection/Sorter.mjs +3 -0
- package/src/component/Abstract.mjs +412 -0
- package/src/component/Base.mjs +48 -1077
- package/src/component/Canvas.mjs +1 -0
- package/src/component/Chip.mjs +4 -0
- package/src/component/Circle.mjs +14 -0
- package/src/component/Clock.mjs +4 -0
- package/src/component/DateSelector.mjs +12 -0
- package/src/component/Gallery.mjs +11 -0
- package/src/component/Helix.mjs +24 -0
- package/src/component/Label.mjs +1 -0
- package/src/component/Legend.mjs +3 -0
- package/src/component/MagicMoveText.mjs +4 -0
- package/src/component/Progress.mjs +3 -0
- package/src/component/Splitter.mjs +3 -0
- package/src/component/StatusBadge.mjs +6 -0
- package/src/component/Timer.mjs +4 -0
- package/src/component/Toast.mjs +6 -0
- package/src/component/Video.mjs +1 -0
- package/src/component/mwc/Button.mjs +7 -0
- package/src/component/mwc/TextField.mjs +9 -0
- package/src/component/wrapper/AmChart.mjs +2 -0
- package/src/component/wrapper/GoogleMaps.mjs +3 -0
- package/src/component/wrapper/MapboxGL.mjs +5 -0
- package/src/component/wrapper/MonacoEditor.mjs +12 -0
- package/src/container/Accordion.mjs +2 -0
- package/src/container/Base.mjs +7 -3
- package/src/container/Panel.mjs +1 -0
- package/src/container/Viewport.mjs +1 -0
- package/src/controller/Application.mjs +1 -0
- package/src/controller/Base.mjs +1 -0
- package/src/controller/Component.mjs +1 -0
- package/src/core/Base.mjs +86 -33
- package/src/core/Compare.mjs +4 -7
- package/src/core/Config.mjs +65 -52
- package/src/core/Effect.mjs +86 -24
- package/src/core/EffectManager.mjs +117 -8
- package/src/core/IdGenerator.mjs +13 -44
- package/src/core/Observable.mjs +69 -65
- package/src/data/Model.mjs +2 -0
- package/src/data/Store.mjs +7 -0
- package/src/data/connection/WebSocket.mjs +2 -0
- package/src/date/DayViewComponent.mjs +2 -0
- package/src/date/SelectorContainer.mjs +14 -0
- package/src/dialog/Base.mjs +8 -0
- package/src/draggable/DragZone.mjs +5 -0
- package/src/draggable/tree/DragZone.mjs +1 -0
- package/src/filter/BooleanContainer.mjs +2 -0
- package/src/filter/NumberContainer.mjs +3 -0
- package/src/filter/ToggleOperatorsButton.mjs +2 -0
- package/src/form/Fieldset.mjs +6 -0
- package/src/form/field/Base.mjs +7 -0
- package/src/form/field/CheckBox.mjs +18 -0
- package/src/form/field/Chip.mjs +1 -0
- package/src/form/field/ComboBox.mjs +8 -0
- package/src/form/field/Country.mjs +1 -0
- package/src/form/field/Currency.mjs +2 -0
- package/src/form/field/Date.mjs +4 -0
- package/src/form/field/Display.mjs +1 -0
- package/src/form/field/Email.mjs +1 -0
- package/src/form/field/FileUpload.mjs +7 -0
- package/src/form/field/Hidden.mjs +1 -0
- package/src/form/field/Number.mjs +7 -0
- package/src/form/field/Password.mjs +1 -0
- package/src/form/field/Phone.mjs +3 -0
- package/src/form/field/Picker.mjs +2 -0
- package/src/form/field/Radio.mjs +1 -0
- package/src/form/field/Range.mjs +3 -0
- package/src/form/field/Search.mjs +2 -0
- package/src/form/field/Text.mjs +43 -5
- package/src/form/field/TextArea.mjs +7 -0
- package/src/form/field/Time.mjs +6 -0
- package/src/form/field/Url.mjs +3 -0
- package/src/form/field/ZipCode.mjs +2 -0
- package/src/form/field/trigger/Base.mjs +3 -0
- package/src/form/field/trigger/Clear.mjs +2 -0
- package/src/form/field/trigger/CopyToClipboard.mjs +2 -0
- package/src/form/field/trigger/Date.mjs +1 -0
- package/src/form/field/trigger/Picker.mjs +1 -0
- package/src/form/field/trigger/Search.mjs +1 -0
- package/src/form/field/trigger/SpinDown.mjs +2 -0
- package/src/form/field/trigger/SpinUp.mjs +1 -0
- package/src/form/field/trigger/Time.mjs +2 -0
- package/src/functional/_export.mjs +6 -0
- package/src/functional/button/Base.mjs +384 -0
- package/src/functional/component/Base.mjs +405 -0
- package/src/functional/defineComponent.mjs +102 -0
- package/src/functional/useConfig.mjs +52 -0
- package/src/functional/useEvent.mjs +43 -0
- package/src/grid/Body.mjs +20 -1
- package/src/grid/Container.mjs +50 -60
- package/src/grid/ScrollManager.mjs +2 -0
- package/src/grid/VerticalScrollbar.mjs +2 -0
- package/src/grid/column/Base.mjs +2 -0
- package/src/grid/header/Button.mjs +7 -0
- package/src/grid/header/Toolbar.mjs +6 -0
- package/src/grid/plugin/AnimateRows.mjs +2 -0
- package/src/layout/Base.mjs +3 -0
- package/src/layout/Card.mjs +1 -0
- package/src/layout/Cube.mjs +18 -4
- package/src/layout/Fit.mjs +1 -0
- package/src/layout/Flexbox.mjs +7 -0
- package/src/layout/Form.mjs +2 -0
- package/src/layout/Grid.mjs +1 -0
- package/src/layout/HBox.mjs +1 -0
- package/src/layout/VBox.mjs +1 -0
- package/src/list/Base.mjs +13 -0
- package/src/list/Chip.mjs +1 -0
- package/src/list/Circle.mjs +2 -0
- package/src/list/Color.mjs +1 -0
- package/src/list/plugin/Animate.mjs +2 -0
- package/src/main/DeltaUpdates.mjs +1 -0
- package/src/main/DomEvents.mjs +2 -0
- package/src/main/addon/CloneNode.mjs +1 -0
- package/src/main/addon/Cookie.mjs +1 -0
- package/src/main/addon/GoogleMaps.mjs +1 -0
- package/src/main/addon/LocalStorage.mjs +1 -0
- package/src/main/addon/MapboxGL.mjs +1 -0
- package/src/main/addon/Markdown.mjs +1 -0
- package/src/main/addon/Navigator.mjs +1 -0
- package/src/main/addon/Popover.mjs +1 -0
- package/src/main/addon/Stylesheet.mjs +1 -0
- package/src/main/addon/WindowPosition.mjs +1 -0
- package/src/manager/Component.mjs +0 -71
- package/src/manager/VDomUpdate.mjs +320 -0
- package/src/menu/List.mjs +6 -0
- package/src/menu/Model.mjs +1 -0
- package/src/menu/Panel.mjs +3 -0
- package/src/menu/Store.mjs +1 -0
- package/src/mixin/DomEvents.mjs +130 -0
- package/src/mixin/VdomLifecycle.mjs +670 -0
- package/src/plugin/Base.mjs +1 -0
- package/src/plugin/Resizable.mjs +2 -0
- package/src/selection/Model.mjs +15 -18
- package/src/selection/grid/BaseModel.mjs +1 -0
- package/src/sitemap/Component.mjs +1 -0
- package/src/state/Provider.mjs +129 -87
- package/src/state/createHierarchicalDataProxy.mjs +39 -25
- package/src/tab/Container.mjs +6 -0
- package/src/tab/Strip.mjs +1 -0
- package/src/tab/header/Button.mjs +2 -0
- package/src/tab/header/EffectButton.mjs +2 -0
- package/src/tab/header/Toolbar.mjs +1 -0
- package/src/table/Body.mjs +3 -0
- package/src/table/Container.mjs +10 -0
- package/src/table/header/Button.mjs +8 -0
- package/src/table/header/Toolbar.mjs +5 -0
- package/src/table/plugin/CellEditing.mjs +1 -0
- package/src/toolbar/Base.mjs +4 -0
- package/src/toolbar/Breadcrumb.mjs +3 -0
- package/src/toolbar/Paging.mjs +5 -0
- package/src/tooltip/Base.mjs +2 -0
- package/src/tree/List.mjs +3 -0
- package/src/util/HashHistory.mjs +1 -0
- package/src/util/KeyNavigation.mjs +2 -0
- package/src/util/Matrix.mjs +1 -0
- package/src/util/VDom.mjs +18 -5
- package/src/util/VNode.mjs +7 -1
- package/src/util/vdom/TreeBuilder.mjs +105 -0
- package/src/vdom/Helper.mjs +35 -23
- package/src/vdom/VNode.mjs +4 -6
- package/src/worker/App.mjs +1 -0
- package/src/worker/Base.mjs +2 -0
- package/src/worker/Manager.mjs +2 -0
- package/src/worker/ServiceBase.mjs +6 -1
- package/src/worker/mixin/RemoteMethodAccess.mjs +1 -6
- package/test/siesta/siesta.js +17 -2
- package/test/siesta/tests/VdomCalendar.mjs +19 -15
- package/test/siesta/tests/VdomHelper.mjs +7 -7
- package/test/siesta/tests/classic/Button.mjs +113 -0
- package/test/siesta/tests/core/Effect.mjs +10 -14
- package/test/siesta/tests/core/EffectBatching.mjs +72 -79
- package/test/siesta/tests/functional/Button.mjs +113 -0
- package/test/siesta/tests/state/ProviderNestedDataConfigs.mjs +314 -0
- package/test/siesta/tests/state/createHierarchicalDataProxy.mjs +42 -55
- package/test/siesta/tests/vdom/Advanced.mjs +14 -8
- package/test/siesta/tests/vdom/VdomAsymmetricUpdates.mjs +366 -0
- package/test/siesta/tests/vdom/VdomRealWorldUpdates.mjs +249 -0
- package/test/siesta/tests/vdom/layout/Cube.mjs +11 -7
- package/test/siesta/tests/vdom/table/Container.mjs +9 -5
- package/learn/javascript/NewNode.md +0 -31
- package/src/core/EffectBatchManager.mjs +0 -68
@@ -0,0 +1,20 @@
|
|
1
|
+
## Neo.mjs v10.0.0-beta.1 Release Notes
|
2
|
+
|
3
|
+
We are excited to announce the release of Neo.mjs v10.0.0-beta.1, bringing significant architectural improvements, enhanced developer experience, and various stability fixes.
|
4
|
+
|
5
|
+
### Key Highlights:
|
6
|
+
|
7
|
+
* **Asynchronous Initialization with `initAsync()`**: The `core.Base` class now includes a powerful `async initAsync()` method, allowing asynchronous code to be executed outside of the traditional constructor chain, leveraging the microtask queue. This is a crucial improvement for registering **Remote Method Access** earlier in the application lifecycle, effectively eliminating a previously observed 4ms delay caused by reliance on the macro task queue.
|
8
|
+
* **Enhanced `main.addon.Base`**: The `main.addon.Base` class has received substantial enhancements to dynamically load files based on the new `initAsync` mechanism and properly respect the new `isReady_` configuration.
|
9
|
+
* **Revamped Learning Content Structure**: The entire Learning Content has been reorganized and moved into a new `learn` top-level repository folder.
|
10
|
+
* **Improved Learning Content Rendering**: The comprehensive Learning Content has been significantly enhanced to render more beautifully across different viewing environments. This was achieved by adopting standard Markdown fenced code blocks with info strings (e.g., ````javascript live-preview````). This ensures native syntax highlighting and excellent readability when viewed directly on the GitHub repository. Simultaneously, Neo.mjs's `ContentComponent.mjs` is now capable of dynamically processing these blocks for interactive features (such as `live-preview` and `neo-component` instantiation) and specialized styling (like `readonly` code blocks) within the Neo.mjs website. Specific SCSS adjustments in `ContentComponent.scss` further guarantee consistent and correct rendering of various code block types, including plain text/directory structures, by utilizing precise selectors like `:not(.hljs)` to prevent conflicts with Highlight.js and maintain visual integrity.
|
11
|
+
* **Grid and Table Refactoring Polish**: The extensive refactoring of `grid.View` to `grid.Body` and `table.View` to `table.Body` has been thoroughly polished and is now considered fully stable.
|
12
|
+
* **Delta Generation Fix**: A critical glitch within the v10 delta generation logic has been fixed, significantly reducing the amount of created deltas and ensuring that changes applied to the DOM are once again minimized to the bare essential.
|
13
|
+
|
14
|
+
## Try it out here
|
15
|
+
|
16
|
+
`dist/esm`:
|
17
|
+
https://neomjs.com/dist/esm/apps/portal/
|
18
|
+
|
19
|
+
`dist/production`:
|
20
|
+
https://neomjs.com/dist/production/apps/portal/
|
@@ -0,0 +1,73 @@
|
|
1
|
+
## Neo.mjs v10.0.0-beta.2 Release Notes
|
2
|
+
|
3
|
+
This beta release brings significant enhancements across documentation, core framework capabilities, and **a major focus on improving component rendering performance and security**, alongside an enhanced developer experience.
|
4
|
+
|
5
|
+
### Documentation & Learning Content
|
6
|
+
|
7
|
+
We've made substantial updates to the `learn` section to provide clearer, more comprehensive guidance:
|
8
|
+
|
9
|
+
* **Enhanced Benefits Guides**:
|
10
|
+
* **Forms Engine**: Improved introduction, detailed benefits, and business value connections for state management, unmounted
|
11
|
+
* validation, and nested/lazy-loaded forms.
|
12
|
+
* **Multi-Window Applications**: Expanded use cases and clearer explanations of seamless data/state sharing.
|
13
|
+
* **Quick Application Development**: Detailed how property lifecycle hooks, elegant state management, and powerful debugging
|
14
|
+
* contribute to rapid development.
|
15
|
+
* **Effort vs. Complexity**: Refined explanation of Neo.mjs's linear scaling of effort with complexity, including the initial learning curve.
|
16
|
+
* **Speed**: Improved introduction highlighting web worker benefits for performance.
|
17
|
+
* **Features Summary**: Updated with direct links to detailed benefit guides for easier navigation.
|
18
|
+
* **New RPC Layer Guide**: A dedicated guide (`learn/benefits/RPCLayer.md`) explaining the RPC layer's role in seamless
|
19
|
+
* communication across Web Workers, Main Threads, and backend services, including practical examples.
|
20
|
+
* **Updated Glossary**: The `learn/Glossary.md` has been significantly expanded and polished
|
21
|
+
* **Instance Lifecycle Guide**: New comprehensive guide (`learn/guides/InstanceLifecycle.md`) detailing the synchronous and
|
22
|
+
asynchronous phases of component creation and destruction, including `constructor()` vs. `construct()` and `isReady` concepts.
|
23
|
+
* **Main Thread Addons Guide**: Enhanced with visualizations for remote method access and explanations of `interceptRemotes` for
|
24
|
+
automatic method caching.
|
25
|
+
* **Learning Path Refinements**: The `learn/tree.json` structure has been reordered to provide a more logical learning progression for
|
26
|
+
guides.
|
27
|
+
* **Code Block Improvements**: Various formatting and rendering fixes for code blocks across documentation.
|
28
|
+
|
29
|
+
### Core Framework & Features
|
30
|
+
|
31
|
+
* **Remote Method Interception for Addons**: `addon.Base` now intercepts remote calls that arrive before an addon is fully
|
32
|
+
`isReady`, enabling more robust asynchronous initialization for addon methods.
|
33
|
+
* **New Class Hierarchy Manager**: Introduction of `manager.ClassHierarchy` (`#6876`), a new core manager that provides robust
|
34
|
+
class hierarchy information, including memoized `isA()` queries and integration into `Neo.Main` and other workers.
|
35
|
+
|
36
|
+
### Rendering & Components
|
37
|
+
|
38
|
+
* **Enhanced VDom Security & Performance (DomApiRenderer Integration)**: A major internal refactoring has been completed to
|
39
|
+
replace `html` with `text` on VDom node properties across
|
40
|
+
hundreds of components (`app/*`, `Neo.*`, `component.*`, `form.field.FileUpload`, `Neo.calendar.view.*`, `Portal.view.*`). This
|
41
|
+
significant change leverages the `DomApiRenderer` introduced in v10 to:
|
42
|
+
* **Improve Security**: By defaulting to `text` content, Neo.mjs now inherently prevents Cross-Site Scripting (XSS) vulnerabilities
|
43
|
+
by escaping HTML, making applications more secure by design.
|
44
|
+
* **Boost Performance**: Direct text manipulation is generally more performant than parsing and injecting HTML, leading to faster
|
45
|
+
and more efficient DOM updates.
|
46
|
+
* **`component.Base` `text_` Config**: Added a new `text_` config to `component.Base` for direct text content management.
|
47
|
+
* **Grid/Table Rendering**: `grid.Body` and `table.Body` now support the `text` property in `applyRendererOutput()`, offering an
|
48
|
+
alternative to `html` for rendering.
|
49
|
+
|
50
|
+
### Internal Improvements & Refactoring
|
51
|
+
|
52
|
+
* **`main.DeltaUpdates` Enhanced Initialization**: The `main.DeltaUpdates` module now utilizes `initAsync()`, a significant
|
53
|
+
improvement for its initialization process, alongside updated JSDoc comments.
|
54
|
+
* Minor code cleanups and method reordering in `vdom.Helper`.
|
55
|
+
* Minor fixes in `component.MagicMoveText` and `Portal.view.learn.ContentComponent`.
|
56
|
+
|
57
|
+
---
|
58
|
+
|
59
|
+
This release focuses heavily on improving the learning experience and solidifying core architectural patterns. We encourage you to explore the updated documentation and leverage the new features for more robust and performant applications.
|
60
|
+
|
61
|
+
All changes in 1 commit: https://github.com/neomjs/neo/commit/ee8ccd1943a4fc198ec440dcb44146c9f1787193
|
62
|
+
|
63
|
+
### Call To Action
|
64
|
+
|
65
|
+
We're excited for you to dive into the enhanced learning experience!
|
66
|
+
|
67
|
+
* **Explore the New Guides**: Discover the power of Neo.mjs by exploring updated sections like
|
68
|
+
* [Main Thread Addons Guide](
|
69
|
+
https://neomjs.com/dist/esm/apps/portal/#/learn/guides.MainThreadAddons)
|
70
|
+
* [Forms Engine benefits](https://neomjs.com/dist/esm/apps/portal/#/learn/benefits.FormsEngine)
|
71
|
+
* [Glossary](https://neomjs.com/dist/esm/apps/portal/#/learn/Glossary).
|
72
|
+
* **Share Your Feedback**: Your input is invaluable! Please let us know what you think, report any issues, or suggest further
|
73
|
+
improvements via [GitHub Issues](https://github.com/neomjs/neo/issues) or our [Slack Channel](https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA).
|
@@ -0,0 +1,39 @@
|
|
1
|
+
## Neo.mjs v10.0.0-beta.3 Release Notes
|
2
|
+
|
3
|
+
This beta release significantly expands our learning resources, introducing **seven new comprehensive guides** designed to accelerate developer onboarding and mastery of the neo.mjs framework. We've also invested in enhancing the overall styling and user experience of the learning section.
|
4
|
+
|
5
|
+
### Documentation & Learning Content
|
6
|
+
|
7
|
+
We are excited to announce a major update to the `learn` section, with seven new guides to provide in-depth knowledge on key neo.mjs concepts.
|
8
|
+
|
9
|
+
**For the optimal learning experience, including live code previews and interactive examples, we strongly recommend viewing these guides on our website: [neomjs.com#/learn](https://neomjs.com/dist/production/apps/portal/index.html#/learn)**
|
10
|
+
|
11
|
+
* **New In-Depth Guides**:
|
12
|
+
* **Collections**: A comprehensive guide to understanding and utilizing neo.mjs collections for efficient data management.
|
13
|
+
* **Custom Components**: Learn how to create your own custom components to build modular and reusable UI elements.
|
14
|
+
* **Extending neo.mjs Classes**: A guide to extending the framework's core classes to add custom functionality and behavior.
|
15
|
+
* **Forms**: Learn how to build powerful and flexible forms with the neo.mjs forms engine.
|
16
|
+
* **Layouts**: A guide to using layouts to create responsive and adaptive user interfaces.
|
17
|
+
* **Records**: An in-depth look at working with data records, a fundamental aspect of the neo.mjs data package.
|
18
|
+
* **ComboBox Field**: A dedicated guide to the versatile ComboBox field, covering its configuration and use cases.
|
19
|
+
* **Enhanced Learning Experience**:
|
20
|
+
* The styling of the learning section has been improved for displaying code blocks inside headlines and code blocks inside lists.
|
21
|
+
---
|
22
|
+
|
23
|
+
This release is focused on empowering developers with the knowledge and resources needed to build exceptional applications with neo.mjs. We encourage you to explore the new guides and see how they can help you in your projects.
|
24
|
+
|
25
|
+
All changes in 1 commit: https://github.com/neomjs/neo/commit/c68a0c9fab1d5578bbd5120ba97bbd7707093b7c
|
26
|
+
|
27
|
+
### Call To Action
|
28
|
+
|
29
|
+
We're excited for you to dive into the enhanced learning experience!
|
30
|
+
|
31
|
+
* **Explore the New Guides**: Discover the power of Neo.mjs by exploring the new guides on our website:
|
32
|
+
* [Collections](https://neomjs.com/dist/esm/apps/portal/#/learn/guides.Collections)
|
33
|
+
* [Custom Components](https://neomjs.com/dist/esm/apps/portal/#/learn/guides.CustomComponents)
|
34
|
+
* [Extending neo.mjs Classes](https://neomjs.com/dist/esm/apps/portal/#/learn/guides.ExtendingNeoClasses)
|
35
|
+
* [Forms](https://neomjs.com/dist/esm/apps/portal/#/learn/guides.Forms)
|
36
|
+
* [Layouts](https://neomjs.com/dist/esm/apps/portal/#/learn/guides.Layouts)
|
37
|
+
* [Records](https://neomjs.com/dist/esm/apps/portal/#/learn/guides.Records)
|
38
|
+
* [ComboBox Field](https://neomjs.com/dist/esm/apps/portal/#/learn/guides.form_fields.ComboBox)
|
39
|
+
* **Share Your Feedback**: Your input is invaluable! Please let us know what you think, report any issues, or suggest further improvements via [GitHub Issues](https://github.com/neomjs/neo/issues) or our [Slack Channel](https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA).
|
@@ -0,0 +1,70 @@
|
|
1
|
+
## Neo.mjs v10.0.0-beta.5 Release Notes
|
2
|
+
|
3
|
+
This beta release dramatically expands on the reactive programming model introduced in beta.4, delivering a powerful, end-to-end **Effect-Based Reactivity System**. This new system provides a declarative and highly efficient way to manage component state, create reactive data transformations, and build dynamic user interfaces with minimal boilerplate.
|
4
|
+
|
5
|
+
This release also includes significant enhancements to the framework's mixin system and state providers, further improving code organization and state management capabilities.
|
6
|
+
|
7
|
+
### Core Framework & Features
|
8
|
+
|
9
|
+
A core philosophy of Neo.mjs is to provide developers with powerful, flexible options. This release reinforces that principle by dramatically enhancing the framework's reactive core. These new features provide a more direct, declarative way to manage state and build UIs—offering a familiar entry point for developers from other ecosystems—while seamlessly integrating with the established power and productivity of Neo.mjs's declarative component tree architecture.
|
10
|
+
|
11
|
+
The pace of innovation in this release is a testament to the power and flexibility of the new architecture. The features introduced in this beta represent a quantum leap forward, enabling development patterns that are more declarative, more powerful, and more intuitive than ever before.
|
12
|
+
|
13
|
+
#### 1. The New Effect-Based Reactivity System
|
14
|
+
|
15
|
+
The core of this release is a new suite of classes (`core.Effect`, `core.EffectManager`, `core.BatchEffectManager`) that enable true "spreadsheet-style" reactivity. An "Effect" is a function that automatically re-runs whenever any of its reactive dependencies change.
|
16
|
+
|
17
|
+
* **Automatic Dependency Tracking**: The framework now automatically tracks which reactive configs are accessed within an Effect. You declare a config as reactive by adding a trailing underscore in the `static config` block (e.g., `myValue_`), and then access it without the underscore (`this.myValue`). You no longer need to manually subscribe to changes; the dependency graph is built and maintained for you.
|
18
|
+
* **Arbitrary Cross-Instance Bindings**: Since bindings are now powered by `core.Effect`, they can depend on any reactive config from any `core.Base` instance—not just components or state provider `data`. This allows for creating powerful, arbitrary data flows between any part of your application (e.g., binding a component's property to a data store's `count`).
|
19
|
+
```javascript
|
20
|
+
// A component can now bind its text to its provider's data AND a store's count
|
21
|
+
bind: {
|
22
|
+
text: data => `${data.title}: ${myStore.count} items`
|
23
|
+
}
|
24
|
+
```
|
25
|
+
* **Synchronous Batching (`core.BatchEffectManager`)**: Multiple state changes can be batched together into a single, atomic update. This prevents "glitching" (where the UI updates multiple times for a single user action) and ensures that effects run only once with the final, consistent state.
|
26
|
+
* **Foundation for Declarative VDOM**: The new Effect system lays the groundwork for a truly declarative component model. As a proof-of-concept, a new `button.Effect` class was created to demonstrate that a component's VDOM can now be generated by a single, reactive function that automatically re-runs when its state dependencies change. This powerful new paradigm, which will be fully realized in the upcoming **[Functional Components](https://github.com/neomjs/neo/issues/6992)** epic, will make component rendering logic more readable, centralized, and easily extensible.
|
27
|
+
* **Lifecycle-Aware Subscriptions**: A new `core.Base#observeConfig()` method provides a safe, convenient way to subscribe to config changes, automatically handling the cleanup of subscriptions when a component is destroyed to prevent memory leaks.
|
28
|
+
|
29
|
+
#### 2. Architectural Evolution: State Management Overhaul
|
30
|
+
|
31
|
+
`state.Provider` has been completely rewritten to be more powerful, explicit, and performant, leveraging the new Effect-based reactivity core. This is a significant architectural evolution from the previous version.
|
32
|
+
|
33
|
+
**The Old System:** Bindings received a single, implicitly merged `data` object, which was a combination of all state providers in the component's hierarchy.
|
34
|
+
|
35
|
+
**The New System:** The new model is more explicit and powerful, providing clearer data flow and eliminating "magic".
|
36
|
+
|
37
|
+
* **Reactive Data Proxies**: The `data` object of a provider is now a deep Proxy. You can now trigger reactive updates simply by direct assignment (`myProvider.data.foo = 'new value'`), and any component bound to that data will update automatically.
|
38
|
+
* **Intelligent Hierarchical Data Access**: The `data` object passed to bindings and formulas is now a smart proxy. It provides a unified view of the data from the entire provider hierarchy. When you read a property (`data.someValue`), the proxy intelligently searches up the component tree to find the closest provider that owns it. When you write a property using `myProvider.setData('someValue', ...)`, it intelligently finds the correct provider in the hierarchy that already owns the property and updates it there, preventing accidental name collisions and making state updates safe and predictable.
|
39
|
+
* **Formulas**: State providers now support formulas—functions that derive their value from other state properties (e.g., `fullName: data => `${data.firstName} ${data.lastName}``). These formulas are themselves reactive and will automatically re-calculate when their dependencies change.
|
40
|
+
* **Two-Way Bindings**: Two-way data bindings kept the same power as before, powered by the original config system.
|
41
|
+
|
42
|
+
#### 3. Enhanced Class System
|
43
|
+
|
44
|
+
* **Automatic Static Config Merging for Mixins**: The framework's mixin system is now significantly more powerful. Previously limited to methods, mixins can now contribute to the `static config` of a class. The configs are intelligently merged with a clear order of precedence:
|
45
|
+
1. The target class's own `static config` always has the highest priority.
|
46
|
+
2. For conflicting configs between mixins, the mixin that appears *earlier* in the `mixins` array wins.
|
47
|
+
3. Mixins on a base class take precedence over mixins on an extended class.
|
48
|
+
* **Granular Cloning Strategies**: The reactive config system now features `clone` and `cloneOnGet` descriptor flags, providing fine-grained control over how and when config values are cloned. This is critical for performance tuning and handling complex data types.
|
49
|
+
|
50
|
+
### New Learning Content
|
51
|
+
|
52
|
+
* **New Guide: "Declarative VDOM with Effects"**: A new guide has been added to the documentation to explain the principles of the new reactivity system and demonstrate how to build components using an Effect-based approach.
|
53
|
+
|
54
|
+
### Quality & Stability
|
55
|
+
* This release includes a comprehensive suite of new unit tests covering the Effect-based reactivity system, the `state.Provider`, and the enhanced `static config` merging. This ensures the stability and correctness of these foundational new features and helps prevent future regressions.
|
56
|
+
|
57
|
+
---
|
58
|
+
|
59
|
+
All changes combined in 1 commit: https://github.com/neomjs/neo/commit/2105ea95b8b498c73d9c54f6bffe8de8704dfe0d
|
60
|
+
|
61
|
+
This release represents a major leap forward for the Neo.mjs framework, providing a state-of-the-art reactive programming model that is both powerful and easy to use.
|
62
|
+
|
63
|
+
### Call To Action
|
64
|
+
|
65
|
+
We are incredibly excited for you to explore these new capabilities.
|
66
|
+
|
67
|
+
* **Explore Effects**: Try creating your own effects to manage component logic and state.
|
68
|
+
* **Leverage State Providers**: Experiment with the new Proxy-based data objects and formulas in `state.Provider`.
|
69
|
+
* **Read the New Guide**: Check out the [Declarative VDOM with Effects guide](https://github.com/neomjs/neo/blob/dev/learn/guides/fundamentals/DeclarativeVDOMWithEffects.md) to get started with the new paradigm.
|
70
|
+
* **Share Your Feedback**: Your insights are invaluable. Please share your experiences and report any issues via [GitHub Issues](https://github.com/neomjs/neo/issues) or our [Slack Channel](https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA).
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Neo.mjs v10.0.0-beta.6 Release Notes
|
2
|
+
|
3
|
+
This release represents a monumental leap forward, introducing a deeply re-architected reactivity system and a revolutionary VDOM engine that enables surgical, high-performance updates. Building on the foundation of `beta.5`, this version delivers a state-of-the-art developer experience with a new config system, synchronous batched effects, and the official debut of Functional Components.
|
4
|
+
|
5
|
+
## ✨ Highlights
|
6
|
+
|
7
|
+
### 🚀 Hyper-Optimized VDOM Update Engine
|
8
|
+
|
9
|
+
While Neo.mjs has long used a "scoped" VDOM model, this release introduces a revolutionary **update aggregation and orchestration engine**. This new architecture dramatically enhances performance in complex, real-world scenarios (#7076, #7077).
|
10
|
+
|
11
|
+
- **Centralized Orchestration:** The new **`Neo.manager.VDomUpdate`** singleton acts as a central orchestrator, intelligently merging multiple, simultaneous update requests from different components into a single, atomic transaction.
|
12
|
+
- **Combined & Asymmetric Payloads:** Imagine a toolbar and one of its ten buttons both change state in the same event loop. The new VDOM engine can now generate a **single, minimal, asymmetric VDOM payload** containing the toolbar's structure and *only* the updated button's new content. This results in one hyper-efficient update instead of multiple, potentially conflicting ones.
|
13
|
+
- **Key Benefits:** This new model drastically reduces worker traffic, minimizes payload size, and guarantees state integrity for all callbacks, even during complex, overlapping updates.
|
14
|
+
|
15
|
+
### 🧠 Fine-Grained Reactivity & The New Config System
|
16
|
+
|
17
|
+
The core of this release is a new, more powerful way to define and manage reactive state.
|
18
|
+
|
19
|
+
- **`@reactive` Decorator:** We have introduced a new `@reactive` decorator (or a `_` suffix as a non-decorator alternative) to explicitly flag configs as reactive. This improves code clarity and makes the developer's intent clear.
|
20
|
+
- **`Neo.createConfig()`:** The logic for creating reactive configs has been separated from the class system's `setupClass()`. The new `Neo.createConfig()` method allows for the creation of **named, instance-level reactive configs**, providing unparalleled flexibility for dynamic state management.
|
21
|
+
|
22
|
+
### ⚡�� Synchronous Effects & Atomic Batching
|
23
|
+
|
24
|
+
The effect system has been re-engineered for maximum control and performance.
|
25
|
+
|
26
|
+
- **Synchronous by Default:** Effects now run synchronously by default, providing a more predictable execution flow. The `lazy: true` option is still available for cases where initial execution needs to be deferred.
|
27
|
+
- **`EffectManager.pause()`:** The `EffectManager` can now be paused, giving developers fine-grained control over when dependency tracking is active.
|
28
|
+
- **Atomic Batching:** The `EffectBatchManager` ensures that all updates triggered by a single, top-level operation (like `setData()`) are collected, de-duplicated, and executed in a single, atomic batch.
|
29
|
+
|
30
|
+
### 💻 Functional Components & Unified VDOM Lifecycle
|
31
|
+
|
32
|
+
This release officially introduces a new, modern paradigm for building UIs in Neo.mjs, supported by a unified lifecycle.
|
33
|
+
|
34
|
+
- **New `VdomLifecycle` Mixin:** The core VDOM lifecycle logic has been extracted from `component.Base` into the new **`Neo.mixin.VdomLifecycle`**. This major architectural improvement allows both class-based and functional components to share the exact same robust and predictable lifecycle.
|
35
|
+
- **Declarative UI:** Create components as pure functions using the new `defineComponent` method. Manage state effortlessly with reactive hooks like `useConfig`.
|
36
|
+
- **Real-World Example:** The new **Email Application** (`apps/email/view/MainView.mjs`) is built entirely with functional components, serving as a comprehensive showcase of this new architecture.
|
37
|
+
|
38
|
+
### 📦 Core Enhancements & Stability
|
39
|
+
|
40
|
+
- **Enhanced Mixin System:** Mixins are now a first-class citizen for composing component features. They can now contribute directly to the `static config` of a class, including both reactive and non-reactive properties, which are intelligently merged with the class's own configs (#6905).
|
41
|
+
- **Improved Update Stability:** A small but critical change to `updateVdom()` now prevents it from queuing any updates before a component is fully constructed (`isConstructed` is true). This eliminates a whole class of potential race conditions and ensures updates only happen when a component is in a valid rendering state.
|
42
|
+
- **`Neo.gatekeep()`:** A new `Neo.gatekeep()` method has been introduced to standardize how singleton and module exports are handled, improving consistency and preventing duplicate instantiations (#7081, #7072).
|
43
|
+
|
44
|
+
### 📚 New Content & Developer Experience
|
45
|
+
|
46
|
+
- **Enhanced Live Previews:** The LivePreview engine has been overhauled to fully support functional components and modern JavaScript (#7069, #7073).
|
47
|
+
- **New Framework Comparisons:** The documentation now includes new, in-depth comparison articles against other popular frameworks (like React) to better highlight the unique architectural advantages of Neo.mjs.
|
48
|
+
- **New Tests & Learning Content:** This release is backed by a massive suite of new tests covering all aspects of the new reactivity model and VDOM engine. The learning content has also been significantly expanded.
|
@@ -0,0 +1,52 @@
|
|
1
|
+
### Neo.mjs v10.0.0 Stable Release Notes
|
2
|
+
|
3
|
+
This release brings significant enhancements and refactorings, improving performance, reactivity, and the overall developer experience.
|
4
|
+
|
5
|
+
#### Core Framework Improvements
|
6
|
+
|
7
|
+
* **Reactive Core Refactoring (`core.Observable`):**
|
8
|
+
* Architectural refactoring of `core.Observable` to a fully reactive mixin (`#7090`).
|
9
|
+
* **Modernized `core.Observable`:** Refactored `core.Observable` to align with the reactive config system. This involved converting the `listeners` property to a reactive `listeners_` config, eliminating manual initialization, and establishing true encapsulation using a module-scoped `Symbol` (`eventMapSymbol`) for internal event registry management. A bug in `removeListener` related to incorrect state access was also fixed. (`#7090`)
|
10
|
+
* Listeners are now managed as a reactive config within `core.Observable` (`#7089`).
|
11
|
+
* **Effect Management System:**
|
12
|
+
* **Foundational Refactoring of Effect Management:** The core reactivity system has been refactored and unified under a single `Neo.core.EffectManager` (`#7085`). This introduces a clear distinction between:
|
13
|
+
* **Execution Batching (`pause()` / `resume()`):** Replaced the old `isPaused` flag with a numeric `pauseCounter` for robust, nested batching of UI updates. Effects are queued and executed only when the counter is zero.
|
14
|
+
* **Dependency Tracking Suppression (`pauseTracking()` / `resumeTracking()`):** A new mechanism (`isTrackingPaused` flag) to temporarily stop active effects from collecting new dependencies, solving self-dependency issues.
|
15
|
+
* The `EffectBatchManager` singleton has been completely removed, and its functionality absorbed by the enhanced `EffectManager`. This results in a more predictable, robust, and resilient reactive system.
|
16
|
+
* **State Management:**
|
17
|
+
* **State Provider Refactoring & Deep Merging:**
|
18
|
+
* Refactored `state.Provider`'s `internalSetData()` method to support intuitive deep-merging of nested objects, allowing dynamic creation of new, fully reactive data structures at runtime. This resolves inconsistent behavior and aligns with expected merge operations. (`#7099`)
|
19
|
+
* **Enhanced Reactivity & Atomic Updates:** `state.Provider` now features "Reactivity Bubbling," where changes to leaf properties recursively update parent objects, correctly triggering effects on intermediate data objects. Public `setData()` and `setDataAtSameLevel()` methods are now wrapped with `Neo.batch()` (leveraging the new `EffectManager`'s batching capabilities) to ensure all reactive updates are collected, de-duplicated, and executed atomically, preventing race conditions and improving performance. A new test suite (`ProviderNestedDataConfigs.mjs`) validates this functionality.
|
20
|
+
* Moved all state provider related logic (configs like `bind`, `modelData`, `stateProvider_`, `data_`, `parentComponent_`, and methods like `getStateProvider()`, `getState()`, `setState()`, `beforeGetData()`, `getConfigInstanceByNtype()`, along with lifecycle logic and two-way binding logic) from `src/component/Base.mjs` to `src/component/Abstract.mjs`. This makes state providers available to both classic class-based components and modern functional components. (`#7100`)
|
21
|
+
* **Component Base Classes:**
|
22
|
+
* **Common Abstract Base Class:** Introduced `Neo.component.Abstract` as a new common base class for both `Neo.component.Base` (classic) and `Neo.functional.component.Base` (functional) components. This refactoring centralizes shared logic (e.g., `set()`, `destroy()`, `mountedPromise`, core configs, `DomEvents`, `Observable`, `VdomLifecycle` mixins), improving code reusability, enhancing consistency, and simplifying maintenance by removing duplicated code. (`#7089`)
|
23
|
+
* Removed redundant `createBindings()` calls from `onConstructed` (`#7101`).
|
24
|
+
|
25
|
+
#### Functional Components
|
26
|
+
|
27
|
+
* **VDOM Reconciliation:** Enhanced Functional Component VDOM Reconciliation (`#7086`).
|
28
|
+
* **Lifecycle Hook:** Introduced a new `beforeUpdate()` lifecycle method to `Neo.functional.component.Base` (`#7084`). This hook executes after all state changes from a reactive `Effect` have been processed and just before `updateVdom()`. It provides a predictable entry point for pre-render logic and allows conditionally canceling a VDOM update by returning `false`.
|
29
|
+
* **Functional Button Component:** Introduced a new `Neo.functional.button.Base` component (`#7087`). This component serves as a key UI element built using the functional component paradigm, demonstrating integration with the reactive VDOM system and leveraging automatic VDOM node ID generation for efficient diffing. A dedicated test suite and demo application were created.
|
30
|
+
* `functional.button.Base`: `beforeSetBadgePosition()`, `beforeSetIconPosition()` now use constructor access for future class extensions.
|
31
|
+
|
32
|
+
#### VDOM & Rendering
|
33
|
+
|
34
|
+
* `util.vdom.TreeBuilder`: Improvements to `buildTree()`: Refactored `getVdomTree` and `getVnodeTree` into a single, DRY method (`#7098`).
|
35
|
+
* `util.VDom`: `syncVdomIds()` enhanced for future-proofing and improved filtering.
|
36
|
+
* `manager.VDomUpdate`: Significantly enhanced JSDoc comments and method order/cleanup.
|
37
|
+
|
38
|
+
#### Other Enhancements & Fixes
|
39
|
+
|
40
|
+
* **Dependencies:** Updated FontAwesome to v7.
|
41
|
+
* **Examples Website:** Fixed flakiness on Safari (`#7102`).
|
42
|
+
* **Tests:** All 770 unit tests now pass successfully, including a significant number of new tests added since beta.6.
|
43
|
+
* `form.field.Text`: `onInputValueChange()` intent made clearer.
|
44
|
+
* `Portal.view.ViewportController`: Cube-layout timing adjustments.
|
45
|
+
* `core.core.EffectManager`: Optimized `Neo.batch` usage.
|
46
|
+
* Removed obsolete `onNeoConfigChange()` calls from tests.
|
47
|
+
* Updated `test/siesta/tests/vdom/layout/Cube.mjs` to match current `VdomHelper.create()` signature.
|
48
|
+
|
49
|
+
#### Documentation Updates
|
50
|
+
|
51
|
+
* The `learn/guides/datahandling/StateProviders.md` guide has been updated to accurately describe the new deep-merge behavior of state providers.
|
52
|
+
* Code examples in the `learn/blog/v10-deep-dive-state-provider.md` blog post have been updated to demonstrate the intuitive API usage.
|