neo.mjs 10.0.0-beta.4 → 10.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/RELEASE_NOTES/v10.0.0-beta.4.md +2 -2
- 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/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 +8 -2
- 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 +1 -0
- 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/button/effect/MainContainer.mjs +207 -0
- package/examples/button/effect/app.mjs +6 -0
- package/examples/button/effect/index.html +11 -0
- package/examples/button/effect/neo-config.json +6 -0
- 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/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/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 +131 -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 +168 -0
- 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 +2 -0
- 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 -63
- package/learn/tutorials/Earthquakes.md +2 -0
- package/learn/tutorials/RSP.md +3 -1
- package/learn/tutorials/TodoList.md +103 -7
- package/package.json +6 -4
- 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 +377 -178
- package/src/Xhr.mjs +1 -0
- package/src/button/Base.mjs +13 -0
- package/src/button/Effect.mjs +449 -0
- 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 +14 -12
- package/src/collection/Filter.mjs +6 -0
- package/src/collection/Sorter.mjs +3 -0
- package/src/component/Base.mjs +156 -802
- 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 +34 -26
- 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 +193 -22
- package/src/core/Compare.mjs +4 -7
- package/src/core/Config.mjs +137 -33
- package/src/core/Effect.mjs +193 -0
- package/src/core/EffectBatchManager.mjs +67 -0
- package/src/core/EffectManager.mjs +60 -0
- package/src/core/IdGenerator.mjs +13 -44
- 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 +32 -0
- 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/component/Base.mjs +499 -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 +57 -63
- 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/column/Component.mjs +1 -1
- 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 +11 -1
- 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 +235 -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 +667 -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 +376 -457
- package/src/state/createHierarchicalDataProxy.mjs +138 -0
- 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 +77 -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 +7 -1
- package/src/util/VNode.mjs +7 -1
- package/src/util/vdom/TreeBuilder.mjs +129 -0
- package/src/vdom/Helper.mjs +44 -33
- package/src/vdom/VNode.mjs +5 -7
- package/src/worker/App.mjs +1 -5
- package/src/worker/Base.mjs +2 -0
- package/src/worker/Manager.mjs +2 -0
- package/src/worker/ServiceBase.mjs +6 -1
- package/test/siesta/siesta.js +36 -1
- package/test/siesta/tests/CollectionBase.mjs +10 -10
- package/test/siesta/tests/VdomCalendar.mjs +13 -9
- package/test/siesta/tests/VdomHelper.mjs +22 -59
- package/test/siesta/tests/config/AfterSetConfig.mjs +100 -0
- package/test/siesta/tests/{ReactiveConfigs.mjs → config/Basic.mjs} +58 -21
- package/test/siesta/tests/config/CircularDependencies.mjs +166 -0
- package/test/siesta/tests/config/CustomFunctions.mjs +69 -0
- package/test/siesta/tests/config/Hierarchy.mjs +94 -0
- package/test/siesta/tests/config/MemoryLeak.mjs +92 -0
- package/test/siesta/tests/config/MultiLevelHierarchy.mjs +85 -0
- package/test/siesta/tests/core/Effect.mjs +127 -0
- package/test/siesta/tests/core/EffectBatching.mjs +310 -0
- package/test/siesta/tests/neo/MixinStaticConfig.mjs +138 -0
- package/test/siesta/tests/state/Provider.mjs +537 -0
- package/test/siesta/tests/state/ProviderNestedDataConfigs.mjs +255 -0
- package/test/siesta/tests/state/createHierarchicalDataProxy.mjs +204 -0
- package/test/siesta/tests/vdom/VdomAsymmetricUpdates.mjs +366 -0
- package/test/siesta/tests/vdom/VdomRealWorldUpdates.mjs +249 -0
- package/learn/javascript/NewNode.md +0 -31
@@ -117,7 +117,7 @@ class MainContainer extends ConfigurationViewport {
|
|
117
117
|
|
118
118
|
store: store,
|
119
119
|
|
120
|
-
|
120
|
+
/*
|
121
121
|
* We are using data-binding.
|
122
122
|
* Here is an example for listener and controller
|
123
123
|
*/
|
@@ -180,7 +180,7 @@ class MainContainer extends ConfigurationViewport {
|
|
180
180
|
|
181
181
|
/**
|
182
182
|
*
|
183
|
-
* @param data
|
183
|
+
* @param {Object} data
|
184
184
|
*/
|
185
185
|
onRemoveDomButtonClick(data) {
|
186
186
|
let accordion = this.exampleComponent.items[0];
|
package/learn/Glossary.md
CHANGED
package/learn/benefits/Effort.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# Multi-Window Applications
|
2
|
+
|
3
|
+
## Unleashing Desktop-Class Experiences
|
2
4
|
|
3
5
|
Traditional web applications are often confined to a single browser window or tab, limiting user productivity and the
|
4
6
|
ability to manage complex workflows. Neo.mjs shatters this limitation by providing native, robust support for
|
package/learn/benefits/Quick.md
CHANGED
package/learn/benefits/Speed.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# Extreme Speed
|
2
|
+
|
1
3
|
The Neo.mjs architecture leverages web workers to run application logic, data processing,
|
2
4
|
and even parts of the rendering pipeline in parallel, on separate CPU cores.
|
3
5
|
This offloads heavy computations from the main thread, ensuring the UI remains responsive.
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# Neo.mjs vs Angular
|
2
|
+
|
3
|
+
Neo.mjs is a comprehensive JavaScript ecosystem for building high-performance, multi-threaded web applications. Unlike frameworks like Angular that require a complex, mandatory build process even for development, Neo.mjs is a self-contained system with **zero runtime dependencies**. It provides a complete, out-of-the-box solution that includes four distinct development and deployment environments, from a revolutionary zero-builds development mode to thread-optimized production bundles.
|
4
|
+
|
5
|
+
This article provides a focused comparison between the Neo.mjs ecosystem and Angular. While both are used to build modern user interfaces, they employ fundamentally different architectural and rendering strategies to achieve their goals. We will explore their approaches to **rendering, reactivity, and DOM updates**, highlighting the trade-offs between Angular's Main-Thread-bound, build-centric model and Neo.mjs's holistic, worker-based paradigm.
|
6
|
+
|
7
|
+
## Core Similarities: Building Modern UIs
|
8
|
+
|
9
|
+
Both Neo.mjs and Angular share common ground in building modern user interfaces:
|
10
|
+
|
11
|
+
* **Component-Based Architecture (with a distinction):** Both frameworks promote building UIs as a composition of reusable components. However, Neo.mjs extends this concept with `Neo.core.Base`, allowing any class-based entity (like controllers, models, or routers) to leverage the framework's powerful class system, even if they don't directly render UI. This contrasts with frameworks where non-visual logic might often be shoehorned into component structures.
|
12
|
+
* **Declarative UI:** Developers describe *what* the UI should look like for a given state, and the framework handles *how* to update the DOM.
|
13
|
+
* **Reactive Programming:** Both leverage reactive programming principles. Angular heavily uses RxJS for reactivity and change detection. Neo.mjs uses its own fine-grained reactivity system based on `Neo.core.Config` and `Effect`, which conceptually aligns with the "signals" pattern for highly efficient, granular updates.
|
14
|
+
* **Comprehensive & Opinionated Frameworks:** Both provide a structured and opinionated way to build applications, offering extensive out-of-the-box solutions. However, their *nature* of opinionation differs, as explored in "Framework Rigidity vs. Flexible Structure."
|
15
|
+
|
16
|
+
## Key Differences: Architectural & Rendering Strategies
|
17
|
+
|
18
|
+
This is where the two frameworks diverge significantly, each offering unique trade-offs and advantages.
|
19
|
+
|
20
|
+
### 1. Overall Architecture: Main Thread vs. Worker-Based
|
21
|
+
|
22
|
+
* **Angular: Main Thread Focused**
|
23
|
+
* Angular applications run predominantly on the Main JavaScript Thread of the browser. All component logic, change detection, VDOM reconciliation (if used), and direct DOM manipulation occur on this single thread.
|
24
|
+
* **Implication:** While Angular is highly optimized (e.g., with Ahead-of-Time (AOT) compilation and Ivy renderer), complex computations, large state updates, or extensive component trees can still block the Main Thread, leading to UI jank and unresponsiveness. Angular's change detection mechanism, even with optimizations, can become a bottleneck in very large applications.
|
25
|
+
|
26
|
+
* **Neo.mjs: Worker-Based (Main Thread + App Worker + VDom Worker)**
|
27
|
+
* Neo.mjs's defining feature is its multi-threaded architecture. Application logic (component instances, state, business logic, `vdomEffect`s) runs in a dedicated **App Worker**, separate from the Main Thread. The VDOM diffing occurs in a **VDom Worker**.
|
28
|
+
* Communication between workers and the Main Thread happens via asynchronous message passing.
|
29
|
+
* **Benefit:** This architecture keeps the Main Thread almost entirely free and responsive, preventing UI freezes even during heavy computations or complex application logic. It inherently leverages multi-core CPUs for parallel processing, leading to superior UI responsiveness and performance under heavy load.
|
30
|
+
|
31
|
+
### 2. Rendering Mechanism & Change Detection
|
32
|
+
|
33
|
+
* **Angular: Template-Based & Zone.js/Ivy Change Detection**
|
34
|
+
* Angular uses templates (HTML with Angular-specific syntax) to define UI. These templates are compiled into renderable instructions.
|
35
|
+
* **Change Detection:** Angular traditionally relies on Zone.js to monkey-patch asynchronous browser APIs, detecting when data changes and triggering a change detection cycle. The Ivy renderer further optimizes this by compiling templates into more efficient instructions.
|
36
|
+
* **VDOM:** Angular does not use a traditional Virtual DOM in the same way React does. Its Ivy renderer directly updates the DOM based on detected changes.
|
37
|
+
* **Performance Consideration (Two-Way Binding & Direct DOM Access):** Angular's two-way data binding, while convenient, inherently ties the application's data model directly to the DOM. This often leads to frequent DOM read/write operations. Since **DOM read/write access is significantly slower (often 20x or more) compared to pure JavaScript logic**, this can cause performance bottlenecks and UI jank in complex applications with many bindings, as each change detection cycle can trigger a cascade of expensive DOM manipulations on the Main Thread.
|
38
|
+
* **DOM Pollution:** Angular often adds numerous internal `data-set` attributes to the real DOM for its own tracking and debugging purposes. While functional, this can lead to a less clean and more verbose DOM structure.
|
39
|
+
* **Immutability Considerations:** While Angular doesn't enforce immutability, performance optimizations like `OnPush` change detection often benefit significantly from immutable data patterns. This can introduce a cognitive burden for developers to manage data immutably for optimal performance.
|
40
|
+
|
41
|
+
* **Neo.mjs: Off-Thread, Scoped VDOM & Atomic Insertion**
|
42
|
+
* Neo.mjs uses a Virtual DOM defined by plain JavaScript objects. The diffing process happens in a VDom Worker, keeping the Main Thread free.
|
43
|
+
* **Scoped VDOM (Encapsulation & Performance):** Neo.mjs's VDOM is **scoped by default**. When a parent component renders, its children are represented by simple `{componentId: '...'}` placeholders. This provides two key advantages: 1) **Performance:** A parent's update never processes the complex VDOM of its children, keeping update payloads extremely small. 2) **Encapsulation:** It is architecturally impossible for a parent to accidentally manipulate a child's internal VDOM structure, enforcing clear ownership.
|
44
|
+
* **Atomic Insertion:** For insertions, the Main Thread receives a VNode structure and uses `DomApiRenderer` to **build the entire new DOM subtree in memory**, completely detached from the live document. This fully constructed fragment is then inserted into the live DOM in a **single, atomic operation**.
|
45
|
+
* **Fine-Grained Reactivity vs. Zone.js:** Instead of Angular's Zone.js, which broadly detects changes, Neo.mjs uses a precise, `Effect`-based system. When a piece of state (`config`) changes, only the `createVdom` functions that *directly depend* on that state are re-executed, ensuring optimal performance by default.
|
46
|
+
|
47
|
+
### 3. Component Model & State Management
|
48
|
+
|
49
|
+
* **Angular: Modules, Components, Services, Dependency Injection**
|
50
|
+
* Angular applications are structured around NgModules, components (with templates and decorators), and services. Dependency Injection (DI) is a core concept for managing dependencies and state.
|
51
|
+
* **State Management:** Often relies on services for shared state, or third-party libraries like NgRx (RxJS-based state management).
|
52
|
+
|
53
|
+
* **Neo.mjs: Class-Based & Functional Components, State Providers**
|
54
|
+
* Neo.mjs offers a dual component model. Developers can use a robust class-based system (`Neo.component.Base`) for complex, stateful components, or leverage modern, lightweight functional components via the `defineComponent()` API.
|
55
|
+
* This functional approach uses hooks like `useConfig()` for state, providing a clean, declarative way to build UI while benefiting from Neo.mjs's underlying fine-grained reactivity.
|
56
|
+
* **State Management:** Features integrated state providers and a unified config system for managing and sharing bindable data across the component tree, often simplifying cross-component communication compared to traditional DI or prop passing.
|
57
|
+
|
58
|
+
### 4. Build Process & Development Workflow
|
59
|
+
|
60
|
+
* **Angular: Comprehensive CLI & Mandatory Build Process**
|
61
|
+
* Angular relies heavily on its CLI for scaffolding, development, and building. It has a mandatory and often complex build process (Webpack, TypeScript compilation, Ahead-of-Time (AOT) compilation) even for development.
|
62
|
+
* **Implication:** This leads to slower development server startup times, requires source maps for debugging transpiled and bundled code, and can introduce debugging challenges due to the abstraction layer between the source code and what runs in the browser. For Angular, a build step is an inherent part of the development workflow.
|
63
|
+
|
64
|
+
* **Neo.mjs: The Revolutionary Zero Builds Development Mode**
|
65
|
+
* Neo.mjs champions a **"zero builds" instant development mode** as its primary workflow. This means developers create and debug their applications entirely within this instant environment, leveraging native ES Modules, ES6 classes, and dynamic imports directly in the browser.
|
66
|
+
* **Benefit:** This offers unparalleled speed and debugging clarity. Code changes are reflected instantly without any compilation step. Developers work directly with the real code in the browser's dev tools, eliminating the need for source maps and vastly simplifying debugging. This is a fundamental departure from the build-centric development paradigm of Angular and most other modern frameworks.
|
67
|
+
* **Deployment Flexibility:** While development is zero-builds, Neo.mjs provides optimized build environments for deployment:
|
68
|
+
* **`dist/esm`:** Deploys as native ES Modules, preserving the dev mode's file structure for efficient modular loading in modern browsers.
|
69
|
+
* **`dist/production`:** Generates highly optimized, thread-specific bundles using Webpack for maximum compatibility and minification.
|
70
|
+
* **Dynamic Module Loading:** Neo.mjs uniquely supports dynamically loading code-based modules (even with arbitrary `import` statements) from different environments at runtime, a powerful feature for plugin architectures or user-generated code that most other frameworks struggle with due to their static build graphs.
|
71
|
+
|
72
|
+
### Other Considerations:
|
73
|
+
|
74
|
+
* **Framework Rigidity vs. Flexible Structure:** Angular is often perceived as a "straightjacket" due to its highly opinionated and prescriptive nature, dictating specific patterns (e.g., NgModules, decorators, strict DI) that can limit flexibility and make it challenging to deviate from "the Angular way." Neo.mjs, while also a comprehensive framework, offers a different kind of opinionation. Its core architectural choices (worker-based, unified config system, `Neo.core.Base` for any class-based entity) provide a robust structure, but within that structure, it offers significant flexibility (e.g., plain JS for VDOM, choice of functional or class components, integrated features reducing external dependencies), allowing developers more freedom without sacrificing consistency.
|
75
|
+
|
76
|
+
* **TypeScript:** Angular is built with TypeScript and strongly encourages its use. Neo.mjs is written in plain JavaScript but supports TypeScript usage.
|
77
|
+
* **Learning Curve:** Angular has a reputation for a steeper learning curve due to its opinionated structure, extensive concepts (modules, decorators, DI, RxJS), and reliance on its CLI. Neo.mjs also has an initial learning curve (especially its worker architecture), but its core concepts are often simpler once understood.
|
78
|
+
* **Ecosystem & Maturity:** Angular has a large, mature ecosystem backed by Google. Neo.mjs has a smaller but dedicated community, with a focus on framework-level solutions and integrated features.
|
79
|
+
* **Dependency Management (Batteries Included):** Angular projects often involve a large `node_modules` directory and can lead to complex dependency trees and version conflicts. Neo.mjs, in contrast, is a "batteries included" framework. It literally has zero real runtime dependencies outside of its own core. This native ES Module approach and integrated framework, significantly reduces this complexity, offering a much leaner and more controlled dependency management experience.
|
80
|
+
|
81
|
+
## Conclusion: Why Neo.mjs Offers Significant Technical Advantages Over Angular
|
82
|
+
|
83
|
+
While Angular is a powerful and widely adopted framework, Neo.mjs offers fundamental architectural advantages that can lead to superior technical performance and responsiveness, particularly in demanding applications:
|
84
|
+
|
85
|
+
* **Unblocked Main Thread & Inherent Performance:** Neo.mjs's unique worker-based architecture fundamentally shifts application logic off the Main Thread. This ensures the UI remains fluid and responsive, even during heavy computations, leading to inherently higher performance ceilings without the need for extensive manual optimizations.
|
86
|
+
* **Optimized & Precise DOM Updates:** Through off-Main-Thread VDOM diffing, sophisticated batching, and surgical direct DOM API updates, Neo.mjs achieves highly efficient and smooth visual updates, precisely targeting changes and avoiding unnecessary re-renders, often more granularly than Angular's zone-based change detection.
|
87
|
+
* **Linear Effort for Complexity:** Unlike frameworks where effort can grow exponentially with application complexity, Neo.mjs's unified config system, predictable component lifecycle, and modular design enable a more linear relationship between complexity and development effort, leading to faster development cycles and lower maintenance costs in the long run.
|
88
|
+
* **Streamlined Development Workflow:** The "zero builds" development mode and native ES Module approach offer a significantly faster and more transparent development experience compared to Angular's mandatory build process.
|
89
|
+
|
90
|
+
The choice between them depends on the specific application's needs. For applications where guaranteed Main Thread responsiveness, high performance under load, leveraging multi-core processing, and a streamlined development workflow are paramount, Neo.mjs presents a compelling and technically superior alternative.
|
@@ -0,0 +1,178 @@
|
|
1
|
+
# Neo.mjs vs Ext.js
|
2
|
+
|
3
|
+
Neo.mjs is a comprehensive JavaScript ecosystem for building high-performance, multi-threaded web applications. Unlike legacy frameworks like Ext.js that are architecturally bound to a single thread and a rigid, monolithic build system, Neo.mjs is a self-contained system with **zero runtime dependencies**. It provides a complete, out-of-the-box solution that includes four distinct development and deployment environments, from a revolutionary zero-builds development mode to thread-optimized production bundles.
|
4
|
+
|
5
|
+
This article provides a focused comparison between the Neo.mjs ecosystem and Ext.js. While both are designed for building complex enterprise-grade applications, they employ fundamentally different strategies to achieve their goals. We will explore their approaches to **architecture, rendering, component models, and development workflow**, highlighting the upgrade path from Ext.js's legacy model to Neo.mjs's modern, worker-based paradigm.
|
6
|
+
|
7
|
+
## A Look Back: Ext.js's Legacy and Current Landscape
|
8
|
+
|
9
|
+
Ext.js emerged in 2007 as a groundbreaking JavaScript framework, offering unparalleled capabilities for building rich,
|
10
|
+
enterprise-grade web applications. Its comprehensive component library, sophisticated class system, and robust data
|
11
|
+
management were truly innovative and years ahead of their time, establishing it as a dominant force in complex UI
|
12
|
+
development.
|
13
|
+
|
14
|
+
However, the landscape of web development has evolved at an unprecedented pace. While Ext.js continues to exist and
|
15
|
+
receive updates, the perception within the developer community, particularly over the last 5-7 years, has been one of
|
16
|
+
**stagnation and a significant lag in adopting modern web standards and paradigms**. The framework has struggled to
|
17
|
+
keep pace with the rapid advancements in JavaScript, browser capabilities, and developer expectations for performance
|
18
|
+
and workflow. This has often led to experienced solution engineers, including those with deep expertise in Ext.js
|
19
|
+
internals, being brought in to perform extensive performance tuning and framework-level debugging on large-scale
|
20
|
+
Ext.js implementations, highlighting the inherent challenges.
|
21
|
+
|
22
|
+
It is precisely this deep understanding of the limitations of existing frameworks, gained from extensive
|
23
|
+
experience with their large-scale implementations, that motivated the creation of Neo.mjs. **Crucially,
|
24
|
+
Neo.mjs was built from the ground up with a completely new and independent architecture**, representing a
|
25
|
+
deliberate and complete break from legacy constraints and ensuring a truly modern and unburdened foundation.
|
26
|
+
|
27
|
+
This context is important for understanding why many developers, who once relied on Ext.js for its power and
|
28
|
+
comprehensiveness, are now actively seeking modern alternatives that can deliver similar enterprise-grade capabilities
|
29
|
+
with contemporary performance, architecture, and development workflows. Neo.mjs, in contrast, has been built from the
|
30
|
+
ground up to embrace these modern advancements, offering a level of innovation and agility that directly addresses the
|
31
|
+
perceived stagnation in Ext.js's recent evolution.
|
32
|
+
|
33
|
+
## Core Similarities: Enterprise Application Development
|
34
|
+
|
35
|
+
Both Neo.mjs and Ext.js share common ground in building large-scale, enterprise-grade user interfaces:
|
36
|
+
|
37
|
+
* **Comprehensive Frameworks:** Both are full-fledged frameworks (not just libraries) providing a wide array of
|
38
|
+
features out-of-the-box, including a rich component library, data management, and application structure.
|
39
|
+
* **Class-Based Architecture:** Both heavily rely on a class-based object-oriented programming (OOP) model for
|
40
|
+
structuring applications. This includes a foundational `Base` class (`Ext.core.Base` in Ext.js, `Neo.core.Base`
|
41
|
+
in Neo.mjs) providing core functionalities like class creation, configuration management, and event systems.
|
42
|
+
* **Component-Based UI:** Both promote building UIs as a composition of reusable components.
|
43
|
+
* **Declarative UI (Initial Definition):** Both allow for declarative definition of UI components and
|
44
|
+
layouts for initial rendering. However, their approaches to *updating* the UI declaratively differ
|
45
|
+
significantly, as explored in the "Rendering Mechanism" section.
|
46
|
+
* **Data Management:** Both provide robust data management layers (Stores, Models) for handling application data.
|
47
|
+
|
48
|
+
## Key Differences: Modern Architecture & Performance
|
49
|
+
|
50
|
+
This is where the two frameworks diverge significantly, with Neo.mjs addressing many of the historical challenges and
|
51
|
+
limitations of Ext.js.
|
52
|
+
|
53
|
+
### 1. Overall Architecture: Main Thread Blocking vs. Worker-Based
|
54
|
+
|
55
|
+
* **Ext.js: Main Thread Bound & Synchronous Operations**
|
56
|
+
* Ext.js applications run entirely on the Main JavaScript Thread. All component rendering, layout calculations,
|
57
|
+
data processing, and event handling occur on this single thread.
|
58
|
+
* **Implication:** Ext.js applications, especially complex ones with large data sets or intricate layouts, are
|
59
|
+
prone to Main Thread blocking. This leads to UI freezes, unresponsiveness, and a poor user experience. Its
|
60
|
+
synchronous nature for many operations exacerbates this issue.
|
61
|
+
|
62
|
+
* **Neo.mjs: Worker-Based (Main Thread + App Worker + VDom Worker)**
|
63
|
+
* Neo.mjs's defining feature is its multi-threaded architecture. Application logic (component instances, state,
|
64
|
+
business logic, `vdomEffect`s) runs in a dedicated **App Worker**, separate from the Main Thread. The VDOM diffing
|
65
|
+
occurs in a **VDom Worker**.
|
66
|
+
* Communication between workers and the Main Thread happens via asynchronous message passing.
|
67
|
+
* **Benefit:** This architecture keeps the Main Thread almost entirely free and responsive, preventing UI freezes
|
68
|
+
even during heavy computations or complex application logic. It inherently leverages multi-core CPUs for parallel
|
69
|
+
processing, leading to superior UI responsiveness and performance under heavy load. This directly solves the Main
|
70
|
+
Thread blocking issues common in Ext.js.
|
71
|
+
|
72
|
+
### 2. Rendering Mechanism & DOM Interaction
|
73
|
+
|
74
|
+
* **Ext.js: Direct DOM Manipulation & String-Based Rendering**
|
75
|
+
* Ext.js components often directly manipulate the DOM. While it has its own rendering engine, it frequently relies
|
76
|
+
on generating HTML strings (`outerHTML`, `innerHTML`) and injecting them into the DOM. Its template system, often
|
77
|
+
using `x-template` or similar string-based approaches, typically results in **full DOM replacements** for updates,
|
78
|
+
rather than granular changes.
|
79
|
+
* **Performance Consideration:** Frequent direct DOM manipulations and string-based rendering can be inefficient and
|
80
|
+
lead to numerous browser reflows/repaints, especially for dynamic updates. The lack of granular updates means even
|
81
|
+
small data changes can trigger large, expensive DOM re-creations.
|
82
|
+
* **XSS Risk:** String-based rendering can introduce Cross-Site Scripting (XSS) vulnerabilities if not handled carefully.
|
83
|
+
|
84
|
+
* **Neo.mjs: Virtual DOM (Off-Main-Thread Diffing & Optimized Direct DOM API Updates)**
|
85
|
+
* Neo.mjs uses a Virtual DOM. Your `createVdom()` method (within functional components) returns a plain JavaScript
|
86
|
+
object representing the desired UI structure. **This VDOM is defined using simple nested JavaScript objects and
|
87
|
+
arrays, akin to a JSON-like description of the DOM. Crucially, Neo.mjs's VDOM objects are mutable.**
|
88
|
+
* **Off-Main-Thread Diffing:** The VDOM diffing process occurs in a dedicated **VDom Worker**, offloading this
|
89
|
+
computational work from the Main Thread.
|
90
|
+
* **Surgical Direct DOM API Updates (`Neo.main.DeltaUpdates` & `DomApiRenderer`):** The VDom Worker sends "deltas"
|
91
|
+
(minimal change instructions) to the Main Thread. `Neo.main.DeltaUpdates` then applies these changes using direct
|
92
|
+
DOM APIs. For inserting new subtrees, `DomApiRenderer` builds detached `DocumentFragments` and inserts them in a
|
93
|
+
single, atomic operation. For updates to existing nodes, `DeltaUpdates` directly manipulates attributes, classes,
|
94
|
+
styles, and content using native DOM methods.
|
95
|
+
* **Benefit:** This approach minimizes costly browser reflows/repaints, enhances security (by avoiding `innerHTML`
|
96
|
+
for updates), and ensures highly efficient, surgical DOM updates. Neo.mjs components are **completely decoupled
|
97
|
+
from the real DOM**, residing in the App Worker and never directly reading from or writing to the DOM.
|
98
|
+
|
99
|
+
### 3. Reactivity & Change Detection
|
100
|
+
|
101
|
+
* **Ext.js: Traditional Event-Driven & Explicit Setter-Based Updates**
|
102
|
+
* Ext.js relies on a traditional event-driven model for reactivity. Components fire events, and other components or
|
103
|
+
controllers listen to these events.
|
104
|
+
* **No True Reactivity:** Ext.js does not possess a modern, fine-grained reactivity system. Data changes are not
|
105
|
+
automatically propagated to the UI. Developers *must* explicitly call setter methods (e.g.,
|
106
|
+
`component.setTitle('New Title')`, `record.set('fieldName', 'newValue')`) to update values. Simply assigning a
|
107
|
+
new value to a property (e.g., `component.title = 'New Title'`) will **not** update the UI.
|
108
|
+
* **Change Detection:** Updates are often triggered manually or through specific framework mechanisms, which can
|
109
|
+
sometimes lead to developers needing to explicitly refresh components or views.
|
110
|
+
|
111
|
+
* **Neo.mjs: True, Fine-Grained Reactivity**
|
112
|
+
* Neo.mjs is built on a modern, fine-grained reactivity system powered by `Neo.core.Config` and `Neo.core.Effect`. When a reactive config or state changes, only the specific parts of the UI that depend on it are automatically updated.
|
113
|
+
* Developers can simply change a value (`this.myConfig = 'new value'`), and the UI updates automatically and efficiently. There is no need for manual event listeners or explicit setter calls to trigger UI changes. This dramatically simplifies development, reduces boilerplate, and eliminates a common source of bugs.
|
114
|
+
|
115
|
+
### 4. Development Workflow & Modern JavaScript
|
116
|
+
|
117
|
+
* **Ext.js: Legacy JavaScript & Build Tools**
|
118
|
+
* Ext.js's foundational architecture is rooted in pre-ES5 (conceptually ES4-like) paradigms, and it does not fully
|
119
|
+
leverage modern JavaScript capabilities. While newer versions support ES6+, the core framework still carries
|
120
|
+
significant legacy baggage.
|
121
|
+
* **Build Process:** Typically involves a complex build process with Sencha Cmd for compilation, minification,
|
122
|
+
and code splitting.
|
123
|
+
* **Debugging:** Debugging can be challenging due to the transpiled and often obfuscated code, requiring extensive
|
124
|
+
use of source maps.
|
125
|
+
|
126
|
+
* **Neo.mjs: Zero Builds Dev Mode & Native ES Modules**
|
127
|
+
* Neo.mjs champions a **"zero builds" instant development mode** as its primary workflow, leveraging native ES
|
128
|
+
Modules, ES6 classes, and dynamic imports directly in the browser.
|
129
|
+
* **Benefit:** This offers unparalleled speed and debugging clarity. Code changes are reflected instantly without
|
130
|
+
any compilation step. Developers work directly with the real code in the browser's dev tools, eliminating the
|
131
|
+
need for source maps and vastly simplifying debugging.
|
132
|
+
* **Deployment Flexibility:** Provides optimized build environments (`dist/esm`, `dist/production`) for deployment,
|
133
|
+
maintaining modularity or thread-specific bundling.
|
134
|
+
|
135
|
+
### 5. Component Model & Extensibility
|
136
|
+
|
137
|
+
* **Ext.js: Rich Component Library & XTypes**
|
138
|
+
* Ext.js provides an extremely rich and comprehensive set of UI components (grids, forms, charts, etc.) out-of-the-box.
|
139
|
+
Components are instantiated using `xtypes`.
|
140
|
+
* **Monolithic Design & No Lazy-Loading:** Ext.js components are often large, self-contained units not inherently
|
141
|
+
designed for granular, on-demand lazy-loading. Applications are typically bundled into large, monolithic
|
142
|
+
JavaScript files, impacting initial load times.
|
143
|
+
* **Extensibility:** Highly extensible through its class system, mixins, and plugins. However, its proprietary
|
144
|
+
class system and synchronous nature can limit the scope and performance of extensions, and debugging can be challenging.
|
145
|
+
* **Class-Based Only:** Ext.js is exclusively class-based. It does not natively support the modern functional
|
146
|
+
component paradigm, making it challenging to adopt contemporary UI development patterns.
|
147
|
+
|
148
|
+
* **Neo.mjs: A Modern, Dual Component Model**
|
149
|
+
* Neo.mjs offers a flexible, dual component model. Developers can use a powerful, full-featured class-based system (`Neo.component.Base`) that will feel familiar yet superior to Ext.js developers, or they can adopt a modern, lightweight functional component paradigm using the `defineComponent()` API with hooks.
|
150
|
+
* This provides a clear upgrade path and allows teams to choose the best tool for the job, from complex enterprise grids to simple, declarative UI functions. Its component library achieves feature parity with many of Ext.js's offerings, but with technically superior, modular, and more performant implementations.
|
151
|
+
* **Superior Extensibility:** Leveraging native ES Modules, a clean class hierarchy, mixins, and plugins, Neo.mjs offers a more modern and performant level of extensibility. The worker-based architecture enables extensions that run off the Main Thread, opening new possibilities for high-performance features without impacting UI responsiveness.
|
152
|
+
|
153
|
+
## Conclusion: Why Neo.mjs is a Modern Successor to Ext.js
|
154
|
+
|
155
|
+
While Ext.js has been a powerful tool for building enterprise applications, Neo.mjs offers fundamental architectural and
|
156
|
+
modern development advantages that directly address many of Ext.js's historical limitations, leading to superior technical
|
157
|
+
performance, responsiveness, and maintainability.
|
158
|
+
Notably, Neo.mjs being built on the latest fully supported ES features, ensures a truly modern and unburdened foundation.
|
159
|
+
|
160
|
+
Indeed, as members of the Neo.mjs community state, "Neo.mjs is what Sencha should have built, but were incapable of."
|
161
|
+
This sentiment is further reinforced by the belief that "Neo.mjs is the ideal framework to migrate to, coming from Ext.js."
|
162
|
+
|
163
|
+
* **Unblocked Main Thread & Inherent Performance:** Neo.mjs's worker-based architecture fundamentally shifts application
|
164
|
+
logic off the Main Thread, directly solving the UI blocking issues common in Ext.js applications.
|
165
|
+
* **Optimized & Precise DOM Updates:** By leveraging a VDom and surgical direct DOM API updates, Neo.mjs achieves highly
|
166
|
+
efficient and smooth visual updates, avoiding the performance pitfalls of frequent direct DOM manipulation
|
167
|
+
and string-based rendering.
|
168
|
+
* **Modern Reactivity:** Neo.mjs's fine-grained reactivity system provides precise and automatic updates, simplifying
|
169
|
+
state management and reducing the need for manual event handling compared to Ext.js's traditional event-driven model.
|
170
|
+
* **Streamlined Development Workflow:** The "zero builds" development mode and native ES Module approach offer a
|
171
|
+
significantly faster and more transparent development experience compared to Ext.js's often complex build
|
172
|
+
processes and legacy JavaScript.
|
173
|
+
* **Linear Effort for Complexity:** Neo.mjs's unified config system, predictable component lifecycle, and modular
|
174
|
+
design enable a more linear relationship between complexity and development effort, leading to faster development
|
175
|
+
cycles and lower maintenance costs in the long run.
|
176
|
+
|
177
|
+
For organizations and developers looking for a modern, performant, and maintainable framework to build complex
|
178
|
+
enterprise-grade web applications, Neo.mjs presents a compelling and technically superior successor to Ext.js.
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# Neo.mjs vs Next.js
|
2
|
+
|
3
|
+
Neo.mjs and Next.js are both powerful JavaScript frameworks, but they operate with fundamentally different architectural
|
4
|
+
philosophies and excel in distinct domains. This document aims to clarify their core strengths and illustrate how they
|
5
|
+
can be used in complementary ways, rather than as direct competitors.
|
6
|
+
|
7
|
+
* **Neo.mjs:** A comprehensive, multi-threaded frontend ecosystem designed for building highly performant, complex,
|
8
|
+
and interactive Single-Page Applications (SPAs) where Main Thread responsiveness is paramount.
|
9
|
+
* **Next.js:** A React framework specializing in Server-Side Rendering (SSR), Static Site Generation (SSG), and API
|
10
|
+
routes, primarily focused on delivering content-rich, SEO-optimized web experiences.
|
11
|
+
|
12
|
+
## 1. Core Philosophy & Architecture
|
13
|
+
|
14
|
+
### Neo.mjs: Client-Side, Multi-Threaded for UI Responsiveness
|
15
|
+
|
16
|
+
Neo.mjs is architected from the ground up to leverage a multi-threaded environment within the browser. Its core philosophy
|
17
|
+
is to offload computationally intensive tasks from the Main UI Thread to ensure a consistently responsive user experience.
|
18
|
+
|
19
|
+
* **App Worker:** Runs the application logic, state management, and component structure.
|
20
|
+
* **Main Thread:** Dedicated to rendering the virtual DOM and handling user events, kept almost entirely free.
|
21
|
+
* **Data Worker:** Manages data fetching and processing.
|
22
|
+
* **VDom Worker:** Handles virtual DOM diffing and patching.
|
23
|
+
|
24
|
+
This architecture guarantees that the main thread remains unblocked, resulting in smooth animations, fast user interactions,
|
25
|
+
and a highly performant application, especially for complex and data-intensive UIs.
|
26
|
+
|
27
|
+
### Next.js: Server-Side First for Content & SEO
|
28
|
+
|
29
|
+
Next.js is a React framework that extends React's capabilities with powerful server-side rendering and static site generation
|
30
|
+
features. Its primary goal is to improve performance and SEO by pre-rendering pages on the server or at build time.
|
31
|
+
|
32
|
+
* **Server-Side Rendering (SSR):** Pages are rendered on the server for each request, providing up-to-date content and
|
33
|
+
improving initial load times.
|
34
|
+
* **Static Site Generation (SSG):** Pages are generated at build time, resulting in extremely fast-loading static HTML
|
35
|
+
files, ideal for content that doesn't change frequently.
|
36
|
+
* **API Routes:** Built-in backend capabilities allow for creating serverless functions directly within the Next.js
|
37
|
+
project, simplifying full-stack development.
|
38
|
+
|
39
|
+
Next.js excels at building content-heavy websites, blogs, and e-commerce applications where initial page load time and
|
40
|
+
SEO are critical.
|
41
|
+
|
42
|
+
## 2. Primary Use Cases
|
43
|
+
|
44
|
+
Given their distinct architectures, Neo.mjs and Next.js naturally fit different primary use cases, though they can also
|
45
|
+
complement each other.
|
46
|
+
|
47
|
+
### Neo.mjs: Complex, Interactive SPAs & Enterprise Applications
|
48
|
+
|
49
|
+
Neo.mjs is ideally suited for applications that demand high levels of interactivity, real-time data processing, and
|
50
|
+
guaranteed UI responsiveness, even under heavy load.
|
51
|
+
|
52
|
+
* **Rich Data Dashboards:** Building complex dashboards with numerous interactive components, charts, and real-time updates.
|
53
|
+
* **Enterprise-Grade SPAs:** Large-scale business applications requiring robust architecture, high performance, and maintainability.
|
54
|
+
* **Interactive Tools & Editors:** Applications where user input directly manipulates complex UI elements or data structures.
|
55
|
+
* **Any application where Main Thread responsiveness is a critical non-functional requirement.**
|
56
|
+
|
57
|
+
### Neo.mjs: Multi-Window / Multi-Screen Applications
|
58
|
+
|
59
|
+
Neo.mjs's multi-threaded architecture extends naturally to support complex multi-window and multi-screen application scenarios.
|
60
|
+
This is a capability rarely found in other frameworks and offers significant advantages for specific use cases.
|
61
|
+
|
62
|
+
* **Shared Data & State:** Raw data and application state can be seamlessly shared and synchronized across multiple
|
63
|
+
connected browser windows or even different screens (e.g., a main application window and a separate pop-out dashboard
|
64
|
+
or control panel). This significantly reduces network traffic as data is fetched once and distributed locally.
|
65
|
+
* **Synchronized UI:** Changes in one window can instantly reflect in others, ensuring all connected views are fully in sync.
|
66
|
+
* **Component Tree Mobility:** Neo.mjs can move entire component trees (UI elements and their associated logic) between
|
67
|
+
different browser windows while maintaining the same underlying JavaScript instances. This enables dynamic, flexible
|
68
|
+
user interfaces where users can customize their workspace by arranging application parts across multiple displays.
|
69
|
+
* **Reduced Traffic:** With data and logic shared and synchronized locally, the need to re-fetch or re-process information
|
70
|
+
for each window is eliminated, leading to a more efficient and responsive user experience.
|
71
|
+
|
72
|
+
This capability is particularly valuable for enterprise applications, trading platforms, control centers, or any scenario
|
73
|
+
where users need to monitor and interact with complex data across multiple views simultaneously.
|
74
|
+
|
75
|
+
### Next.js: Content-Driven Websites & SEO-Critical Applications
|
76
|
+
|
77
|
+
Next.js is a leading choice for applications where content delivery, fast initial page loads, and search engine
|
78
|
+
optimization are paramount.
|
79
|
+
|
80
|
+
* **Marketing Websites & Blogs:** Delivering static or server-rendered content quickly and efficiently.
|
81
|
+
* **E-commerce Frontends:** Providing fast, SEO-friendly product pages and checkout flows.
|
82
|
+
* **Portfolios & Documentation Sites:** Static content that benefits from pre-rendering.
|
83
|
+
* **Applications requiring a robust backend for data fetching and API management.**
|
84
|
+
|
85
|
+
### Complementary Use Cases: The Best of Both Worlds
|
86
|
+
|
87
|
+
It's important to note that Neo.mjs and Next.js are not mutually exclusive. They can be used together to leverage their
|
88
|
+
respective strengths:
|
89
|
+
|
90
|
+
* **Next.js as a Content Shell:** Use Next.js to handle the public-facing, SEO-optimized content (e.g., landing pages,
|
91
|
+
blog posts). When a user navigates to a highly interactive section (e.g., a complex dashboard or a data visualization
|
92
|
+
tool), a Neo.mjs application can be seamlessly embedded or loaded as a separate SPA.
|
93
|
+
* **Next.js for API Backend:** Utilize Next.js's API Routes to build a robust backend for data fetching and business
|
94
|
+
logic, while a Neo.mjs application consumes these APIs to power its rich client-side UI.
|
95
|
+
|
96
|
+
## 3. Architectural Trade-offs
|
97
|
+
|
98
|
+
| Feature | Neo.mjs | Next.js |
|
99
|
+
| ----------------------- | --------------------------------------- | --------------------------------------- |
|
100
|
+
| **Primary Focus** | Client-Side UI Responsiveness | Server-Side Content Delivery & SEO |
|
101
|
+
| **Core Architecture** | Multi-Threaded (Worker-Based) | Single-Threaded (React + Node.js) |
|
102
|
+
| **Rendering Strategy** | Client-Side (Off-Main-Thread VDOM) | SSR, SSG, CSR (Main Thread React VDOM) |
|
103
|
+
| **Main Thread Impact** | Minimal (Logic in Workers) | Significant (All React/DOM work) |
|
104
|
+
| **SEO** | Requires pre-rendering solution | Built-in (SSR/SSG) |
|
105
|
+
| **Initial Load** | Fast for Returning Users (Client-side caching) | Fast for First-Time Users (SSR/SSG) |
|
106
|
+
| **Backend Integration** | Via standard APIs | Built-in API Routes |
|
107
|
+
| **Navigation Model** | Single-Page Application (SPA) | Page-Based (MPA with client-side routing) |
|
108
|
+
|
109
|
+
## Conclusion
|
110
|
+
|
111
|
+
Choosing between Neo.mjs and Next.js depends entirely on your application's primary requirements. If your goal is to
|
112
|
+
build a highly interactive, performant, and responsive client-side application that can handle complex UIs and heavy
|
113
|
+
data processing without blocking the Main Thread, Neo.mjs is the superior choice. Neo.mjs's architecture, leveraging
|
114
|
+
Service Workers for aggressive client-side caching of application code, results in near-instant load times for
|
115
|
+
returning users, significantly reducing network traffic as only raw data needs to be fetched from the backend.
|
116
|
+
Furthermore, its Single-Page Application (SPA) model ensures seamless navigation without full browser reloads, providing
|
117
|
+
a fluid and highly engaging user experience for interactive applications.
|
118
|
+
|
119
|
+
If your priority is delivering SEO-friendly, content-rich web pages with fast initial load times for first-time users,
|
120
|
+
and you prefer a React-based full-stack framework, Next.js is an excellent solution.
|
121
|
+
|
122
|
+
For many modern web projects, the most powerful approach might involve combining their strengths, using Next.js for
|
123
|
+
content delivery and API services, and embedding or integrating Neo.mjs for the most demanding
|
124
|
+
interactive client-side experiences.
|