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
package/src/Neo.mjs
CHANGED
@@ -293,11 +293,197 @@ Neo = globalThis.Neo = Object.assign({
|
|
293
293
|
return instance
|
294
294
|
},
|
295
295
|
|
296
|
+
/**
|
297
|
+
* Defines a reactive configuration property on a target object (prototype or instance).
|
298
|
+
* This method creates getters and setters that fully participate in Neo.mjs's reactive config system,
|
299
|
+
* including lifecycle hooks.
|
300
|
+
*
|
301
|
+
* @param {Neo.core.Base} target - The instance or prototype on which to define the config.
|
302
|
+
* @param {String} key - The name of the config property (without the '_' suffix).
|
303
|
+
* @param {*} [initialValue] - The initial value for the config.
|
304
|
+
*/
|
305
|
+
createConfig(target, key, initialValue) {
|
306
|
+
if (Neo.hasPropertySetter(target, key)) {
|
307
|
+
throw(
|
308
|
+
`Invalid config in ${target.className}: '${key}_'. The config '${key}' is already defined as reactive by a parent class.
|
309
|
+
To override the default value, use '${key}' (without the underscore) in your static config.
|
310
|
+
If you intended to create custom logic, use the 'beforeGet${Neo.capitalize(key)}()', 'beforeSet${Neo.capitalize(key)}()', and 'afterSet${Neo.capitalize(key)}()' hooks instead of redefining the config.`
|
311
|
+
)
|
312
|
+
}
|
313
|
+
|
314
|
+
const
|
315
|
+
_key = '_' + key,
|
316
|
+
uKey = key[0].toUpperCase() + key.slice(1),
|
317
|
+
beforeGet = 'beforeGet' + uKey,
|
318
|
+
beforeSet = 'beforeSet' + uKey,
|
319
|
+
afterSet = 'afterSet' + uKey;
|
320
|
+
|
321
|
+
Neo[getSetCache] ??= {};
|
322
|
+
|
323
|
+
if (!Neo[getSetCache][key]) {
|
324
|
+
// Public Descriptor
|
325
|
+
Neo[getSetCache][key] = {
|
326
|
+
get() {
|
327
|
+
let me = this,
|
328
|
+
config = me.getConfig(key),
|
329
|
+
hasNewKey = Object.hasOwn(me[configSymbol], key),
|
330
|
+
newKey = me[configSymbol][key],
|
331
|
+
value = hasNewKey ? newKey : me[_key];
|
332
|
+
|
333
|
+
if (value instanceof Date) {
|
334
|
+
value = new Date(value.valueOf());
|
335
|
+
}
|
336
|
+
// new, explicit opt-in path
|
337
|
+
else if (config.cloneOnGet) {
|
338
|
+
const {cloneOnGet} = config;
|
339
|
+
|
340
|
+
if (cloneOnGet === 'deep') {
|
341
|
+
value = Neo.clone(value, true, true);
|
342
|
+
} else if (cloneOnGet === 'shallow') {
|
343
|
+
const type = Neo.typeOf(value);
|
344
|
+
|
345
|
+
if (type === 'Array') {
|
346
|
+
value = [...value];
|
347
|
+
} else if (type === 'Object') {
|
348
|
+
value = {...value};
|
349
|
+
}
|
350
|
+
}
|
351
|
+
}
|
352
|
+
// legacy behavior
|
353
|
+
else if (Array.isArray(value)) {
|
354
|
+
value = [...value];
|
355
|
+
}
|
356
|
+
|
357
|
+
if (hasNewKey) {
|
358
|
+
me[key] = value; // We do want to trigger the setter => beforeSet, afterSet
|
359
|
+
value = me[_key]; // Return the value parsed by the setter
|
360
|
+
delete me[configSymbol][key]
|
361
|
+
}
|
362
|
+
|
363
|
+
if (typeof me[beforeGet] === 'function') {
|
364
|
+
value = me[beforeGet](value)
|
365
|
+
}
|
366
|
+
|
367
|
+
return value
|
368
|
+
},
|
369
|
+
set(value) {
|
370
|
+
if (value === undefined) return;
|
371
|
+
|
372
|
+
const config = this.getConfig(key);
|
373
|
+
if (!config) return;
|
374
|
+
|
375
|
+
let me = this,
|
376
|
+
oldValue = config.get(), // Get the old value from the Config instance
|
377
|
+
{EffectManager} = Neo.core,
|
378
|
+
isNewBatch = !EffectManager?.isPaused();
|
379
|
+
|
380
|
+
// If a config change is not triggered via `core.Base#set()`, honor changes inside hooks.
|
381
|
+
isNewBatch && EffectManager?.pause();
|
382
|
+
|
383
|
+
try {
|
384
|
+
// 1. Prevent infinite loops:
|
385
|
+
// Immediately remove the pending value from the configSymbol to prevent a getter from
|
386
|
+
// recursively re-triggering this setter.
|
387
|
+
delete me[configSymbol][key];
|
388
|
+
|
389
|
+
switch (config.clone) {
|
390
|
+
case 'deep':
|
391
|
+
value = Neo.clone(value, true, true);
|
392
|
+
break;
|
393
|
+
case 'shallow':
|
394
|
+
value = Neo.clone(value, false, true);
|
395
|
+
break;
|
396
|
+
}
|
397
|
+
|
398
|
+
// 2. Create a temporary state for beforeSet hooks:
|
399
|
+
// Set the new value directly on the private backing property. This allows any beforeSet
|
400
|
+
// hook to access the new value of this and other configs within the same `set()` call.
|
401
|
+
me[_key] = value;
|
402
|
+
|
403
|
+
if (typeof me[beforeSet] === 'function') {
|
404
|
+
value = me[beforeSet](value, oldValue);
|
405
|
+
|
406
|
+
// If they don't return a value, that means no change
|
407
|
+
if (value === undefined) {
|
408
|
+
// Restore the original value if the update is canceled.
|
409
|
+
me[_key] = oldValue;
|
410
|
+
return
|
411
|
+
}
|
412
|
+
}
|
413
|
+
|
414
|
+
// 3. Restore state for change detection:
|
415
|
+
// Revert the private backing property to its original value. This is crucial for the
|
416
|
+
// `config.set()` method to correctly detect if the value has actually changed.
|
417
|
+
me[_key] = oldValue;
|
418
|
+
|
419
|
+
// 4. Finalize the change:
|
420
|
+
// The config.set() method performs the final check and, if the value changed,
|
421
|
+
// triggers afterSet hooks and notifies subscribers.
|
422
|
+
if (config.set(value)) {
|
423
|
+
me[afterSet]?.(value, oldValue);
|
424
|
+
me.afterSetConfig?.(key, value, oldValue)
|
425
|
+
}
|
426
|
+
} finally {
|
427
|
+
// End the batch only if this setter started it.
|
428
|
+
isNewBatch && EffectManager?.resume()
|
429
|
+
}
|
430
|
+
}
|
431
|
+
};
|
432
|
+
|
433
|
+
// Private Descriptor
|
434
|
+
Neo[getSetCache][_key] = {
|
435
|
+
get() {
|
436
|
+
return this.getConfig(key)?.get()
|
437
|
+
},
|
438
|
+
set(value) {
|
439
|
+
this.getConfig(key)?.setRaw(value)
|
440
|
+
}
|
441
|
+
}
|
442
|
+
}
|
443
|
+
|
444
|
+
Object.defineProperty(target, key, Neo[getSetCache][key]);
|
445
|
+
Object.defineProperty(target, _key, Neo[getSetCache][_key]);
|
446
|
+
|
447
|
+
if (initialValue !== undefined) {
|
448
|
+
target[key] = initialValue
|
449
|
+
}
|
450
|
+
},
|
451
|
+
|
296
452
|
/**
|
297
453
|
*
|
298
454
|
*/
|
299
455
|
emptyFn() {},
|
300
456
|
|
457
|
+
/**
|
458
|
+
* Ensures a class is assigned to the Neo namespace only once, preventing duplicates.
|
459
|
+
* This is a lightweight version of `Neo.setupClass` for simple classes
|
460
|
+
* that do not extend `Neo.core.Base`.
|
461
|
+
* It follows a "first one wins" strategy.
|
462
|
+
*
|
463
|
+
* @param {Function|Object} module - The class constructor or singleton object to register.
|
464
|
+
* @param {String} classPath - The fully qualified name (e.g., 'Neo.core.Config').
|
465
|
+
* @param {Function} [onFirst] - An optional callback that runs only the first time the class is registered.
|
466
|
+
* @returns {Function|Object} The class or singleton from the Neo namespace (either the existing one or the newly set one).
|
467
|
+
*/
|
468
|
+
gatekeep(module, classPath, onFirst) {
|
469
|
+
const existingClass = Neo.ns(classPath, false);
|
470
|
+
|
471
|
+
if (existingClass) {
|
472
|
+
return existingClass
|
473
|
+
}
|
474
|
+
|
475
|
+
const
|
476
|
+
nsArray = classPath.split('.'),
|
477
|
+
className = nsArray.pop(),
|
478
|
+
parentNs = Neo.ns(nsArray, true);
|
479
|
+
|
480
|
+
parentNs[className] = module;
|
481
|
+
|
482
|
+
onFirst?.(module);
|
483
|
+
|
484
|
+
return parentNs[className]
|
485
|
+
},
|
486
|
+
|
301
487
|
/**
|
302
488
|
* Checks if there is a set method for a given property key inside the prototype chain
|
303
489
|
* @memberOf module:Neo
|
@@ -480,27 +666,39 @@ Neo = globalThis.Neo = Object.assign({
|
|
480
666
|
},
|
481
667
|
|
482
668
|
/**
|
483
|
-
*
|
484
|
-
*
|
485
|
-
* This is the unified entry point for changing global framework configurations.
|
486
|
-
* The framework automatically handles the complex multi-threaded and multi-window
|
487
|
-
* synchronization (via App Workers and Shared Workers, if active), ensuring
|
488
|
-
* consistency across the entire application without boilerplate.
|
669
|
+
* This is the final and most critical step in the Neo.mjs class creation process.
|
670
|
+
* It is called at the end of every class module definition.
|
489
671
|
*
|
490
|
-
*
|
491
|
-
*
|
672
|
+
* `setupClass` performs several key operations:
|
673
|
+
* 1. **Mixed-Environment Gatekeeper:** It first checks if the class's namespace already exists.
|
674
|
+
* If it does, it immediately returns the existing class. This is the crucial "first comes wins"
|
675
|
+
* strategy that enables Neo.mjs to safely combine environments. For example, a bundled
|
676
|
+
* `dist/production` app can dynamically load an unbundled module from `dist/esm` at runtime.
|
677
|
+
* If that module imports a class already present in the main bundle, this check ensures the
|
678
|
+
* original, bundled class is used, preventing conflicts and maintaining application integrity.
|
679
|
+
* 1. **Configuration Merging:** It traverses the prototype chain to merge `static config`
|
680
|
+
* objects from parent classes into the current class, creating a unified `config`.
|
681
|
+
* 2. **Applying Overwrites:** It calls the static `applyOverwrites()` method on the class,
|
682
|
+
* allowing the global `Neo.overwrites` object to modify the class's default prototype
|
683
|
+
* configs. This is a key mechanism for external theming and configuration.
|
684
|
+
* 3. **Reactive Getter/Setter Generation:** For any config ending with an underscore (e.g., `myConfig_`),
|
685
|
+
* it automatically generates the corresponding public getter and setter. This enables optional
|
686
|
+
* lifecycle hooks that are called automatically if implemented on the class:
|
687
|
+
* - `beforeGetMyConfig(value)`
|
688
|
+
* - `beforeSetMyConfig(newValue, oldValue)`
|
689
|
+
* - `afterSetMyConfig(newValue, oldValue)`
|
690
|
+
* 4. **Prototype-based Configs:** Non-reactive configs (without an underscore) are set
|
691
|
+
* directly on the prototype for memory efficiency.
|
692
|
+
* 5. **Mixin Application:** It processes the `mixins` config to blend in functionality from
|
693
|
+
* other classes.
|
694
|
+
* 6. **Namespace Registration:** It registers the class in the global `Neo` namespace.
|
695
|
+
* 7. **Singleton Instantiation:** If the class is configured as a singleton, it creates the
|
696
|
+
* single instance.
|
492
697
|
*
|
493
698
|
* @memberOf module:Neo
|
494
|
-
* @function setGlobalConfig
|
495
|
-
* @param {Object} config The partial or full Neo.config object with changes to apply.
|
496
|
-
*/
|
497
|
-
|
498
|
-
/**
|
499
|
-
* Internally used at the end of each class / module definition
|
500
|
-
* @memberOf module:Neo
|
501
699
|
* @template T
|
502
|
-
* @param {T} cls
|
503
|
-
* @returns {T}
|
700
|
+
* @param {T} cls The class constructor to process.
|
701
|
+
* @returns {T} The processed and finalized class constructor or singleton instance.
|
504
702
|
*/
|
505
703
|
setupClass(cls) {
|
506
704
|
let baseConfig = null,
|
@@ -574,7 +772,7 @@ Neo = globalThis.Neo = Object.assign({
|
|
574
772
|
if (isReactive) {
|
575
773
|
delete cfg[key]; // Remove original key with underscore
|
576
774
|
cfg[baseKey] = value; // Use the potentially modified value
|
577
|
-
|
775
|
+
Neo.createConfig(element, baseKey)
|
578
776
|
}
|
579
777
|
// This part handles non-reactive configs (including those that were descriptors)
|
580
778
|
// If no property setter exists, define it directly on the prototype.
|
@@ -695,7 +893,8 @@ Neo = globalThis.Neo = Object.assign({
|
|
695
893
|
* @returns {String|null}
|
696
894
|
*/
|
697
895
|
typeOf(item) {
|
698
|
-
|
896
|
+
// Return null for null or undefined
|
897
|
+
if (item == null) {
|
699
898
|
return null
|
700
899
|
}
|
701
900
|
|
@@ -762,152 +961,6 @@ function applyMixins(cls, mixins, classConfig) {
|
|
762
961
|
cls.prototype.mixins = mixinClasses // todo: we should do a deep merge
|
763
962
|
}
|
764
963
|
|
765
|
-
/**
|
766
|
-
* Creates get / set methods for class configs ending with an underscore
|
767
|
-
* @param {Neo.core.Base} proto
|
768
|
-
* @param {String} key
|
769
|
-
* @private
|
770
|
-
* @tutorial 02_ClassSystem
|
771
|
-
*/
|
772
|
-
function autoGenerateGetSet(proto, key) {
|
773
|
-
if (Neo.hasPropertySetter(proto, key)) {
|
774
|
-
throw('Config ' + key + '_ (' + proto.className + ') already has a set method, use beforeGet, beforeSet & afterSet instead')
|
775
|
-
}
|
776
|
-
|
777
|
-
const
|
778
|
-
_key = '_' + key,
|
779
|
-
uKey = key[0].toUpperCase() + key.slice(1),
|
780
|
-
beforeGet = 'beforeGet' + uKey,
|
781
|
-
beforeSet = 'beforeSet' + uKey,
|
782
|
-
afterSet = 'afterSet' + uKey;
|
783
|
-
|
784
|
-
if (!Neo[getSetCache]) {
|
785
|
-
Neo[getSetCache] = {}
|
786
|
-
}
|
787
|
-
|
788
|
-
if (!Neo[getSetCache][key]) {
|
789
|
-
// Public Descriptor
|
790
|
-
Neo[getSetCache][key] = {
|
791
|
-
get() {
|
792
|
-
let me = this,
|
793
|
-
config = me.getConfig(key),
|
794
|
-
hasNewKey = Object.hasOwn(me[configSymbol], key),
|
795
|
-
newKey = me[configSymbol][key],
|
796
|
-
value = hasNewKey ? newKey : me[_key];
|
797
|
-
|
798
|
-
if (value instanceof Date) {
|
799
|
-
value = new Date(value.valueOf());
|
800
|
-
}
|
801
|
-
// new, explicit opt-in path
|
802
|
-
else if (config.cloneOnGet) {
|
803
|
-
const {cloneOnGet} = config;
|
804
|
-
|
805
|
-
if (cloneOnGet === 'deep') {
|
806
|
-
value = Neo.clone(value, true, true);
|
807
|
-
} else if (cloneOnGet === 'shallow') {
|
808
|
-
const type = Neo.typeOf(value);
|
809
|
-
|
810
|
-
if (type === 'Array') {
|
811
|
-
value = [...value];
|
812
|
-
} else if (type === 'Object') {
|
813
|
-
value = {...value};
|
814
|
-
}
|
815
|
-
}
|
816
|
-
}
|
817
|
-
// legacy behavior
|
818
|
-
else if (Array.isArray(value)) {
|
819
|
-
value = [...value];
|
820
|
-
}
|
821
|
-
|
822
|
-
if (hasNewKey) {
|
823
|
-
me[key] = value; // We do want to trigger the setter => beforeSet, afterSet
|
824
|
-
value = me[_key]; // Return the value parsed by the setter
|
825
|
-
delete me[configSymbol][key]
|
826
|
-
}
|
827
|
-
|
828
|
-
if (typeof me[beforeGet] === 'function') {
|
829
|
-
value = me[beforeGet](value)
|
830
|
-
}
|
831
|
-
|
832
|
-
return value
|
833
|
-
},
|
834
|
-
set(value) {
|
835
|
-
if (value === undefined) return;
|
836
|
-
|
837
|
-
const config = this.getConfig(key);
|
838
|
-
if (!config) return;
|
839
|
-
|
840
|
-
let me = this,
|
841
|
-
oldValue = config.get(), // Get the old value from the Config instance
|
842
|
-
{EffectBatchManager} = Neo.core,
|
843
|
-
isNewBatch = !EffectBatchManager?.isBatchActive();
|
844
|
-
|
845
|
-
// If a config change is not triggered via `core.Base#set()`, honor changes inside hooks.
|
846
|
-
isNewBatch && EffectBatchManager?.startBatch();
|
847
|
-
|
848
|
-
// 1. Prevent infinite loops:
|
849
|
-
// Immediately remove the pending value from the configSymbol to prevent a getter from
|
850
|
-
// recursively re-triggering this setter.
|
851
|
-
delete me[configSymbol][key];
|
852
|
-
|
853
|
-
switch (config.clone) {
|
854
|
-
case 'deep':
|
855
|
-
value = Neo.clone(value, true, true);
|
856
|
-
break;
|
857
|
-
case 'shallow':
|
858
|
-
value = Neo.clone(value, false, true);
|
859
|
-
break;
|
860
|
-
}
|
861
|
-
|
862
|
-
// 2. Create a temporary state for beforeSet hooks:
|
863
|
-
// Set the new value directly on the private backing property. This allows any beforeSet
|
864
|
-
// hook to access the new value of this and other configs within the same `set()` call.
|
865
|
-
me[_key] = value;
|
866
|
-
|
867
|
-
if (typeof me[beforeSet] === 'function') {
|
868
|
-
value = me[beforeSet](value, oldValue);
|
869
|
-
|
870
|
-
// If they don't return a value, that means no change
|
871
|
-
if (value === undefined) {
|
872
|
-
// Restore the original value if the update is canceled.
|
873
|
-
me[_key] = oldValue;
|
874
|
-
isNewBatch && EffectBatchManager?.endBatch();
|
875
|
-
return
|
876
|
-
}
|
877
|
-
}
|
878
|
-
|
879
|
-
// 3. Restore state for change detection:
|
880
|
-
// Revert the private backing property to its original value. This is crucial for the
|
881
|
-
// `config.set()` method to correctly detect if the value has actually changed.
|
882
|
-
me[_key] = oldValue;
|
883
|
-
|
884
|
-
// 4. Finalize the change:
|
885
|
-
// The config.set() method performs the final check and, if the value changed,
|
886
|
-
// triggers afterSet hooks and notifies subscribers.
|
887
|
-
if (config.set(value)) {
|
888
|
-
me[afterSet]?.(value, oldValue);
|
889
|
-
me.afterSetConfig?.(key, value, oldValue)
|
890
|
-
}
|
891
|
-
|
892
|
-
isNewBatch && EffectBatchManager?.endBatch()
|
893
|
-
}
|
894
|
-
};
|
895
|
-
|
896
|
-
// Private Descriptor
|
897
|
-
Neo[getSetCache][_key] = {
|
898
|
-
get() {
|
899
|
-
return this.getConfig(key)?.get()
|
900
|
-
},
|
901
|
-
set(value) {
|
902
|
-
this.getConfig(key)?.setRaw(value)
|
903
|
-
}
|
904
|
-
}
|
905
|
-
}
|
906
|
-
|
907
|
-
Object.defineProperty(proto, key, Neo[getSetCache][key]);
|
908
|
-
Object.defineProperty(proto, _key, Neo[getSetCache][_key])
|
909
|
-
}
|
910
|
-
|
911
964
|
/**
|
912
965
|
* @param {Boolean} create
|
913
966
|
* @param {Object} current
|
@@ -973,7 +1026,7 @@ function mixinProperty(proto, mixinProto, classConfig) {
|
|
973
1026
|
|
974
1027
|
// Reactive neo configs, or public class fields defined via get() AND set()
|
975
1028
|
if (descriptor.get && descriptor.set) {
|
976
|
-
|
1029
|
+
Neo.createConfig(proto, key);
|
977
1030
|
|
978
1031
|
const mixinClassConfig = mixinProto.constructor.config;
|
979
1032
|
|
package/src/Xhr.mjs
CHANGED
package/src/button/Base.mjs
CHANGED
@@ -34,10 +34,12 @@ class Button extends Component {
|
|
34
34
|
ntype: 'button',
|
35
35
|
/**
|
36
36
|
* @member {String} badgePosition_='top-right'
|
37
|
+
* @reactive
|
37
38
|
*/
|
38
39
|
badgePosition_: 'top-right',
|
39
40
|
/**
|
40
41
|
* @member {String|null} badgeText_=null
|
42
|
+
* @reactive
|
41
43
|
*/
|
42
44
|
badgeText_: null,
|
43
45
|
/**
|
@@ -53,6 +55,7 @@ class Button extends Component {
|
|
53
55
|
* Shortcut for domListeners={click:handler}
|
54
56
|
* A string based value assumes that the handlerFn lives inside a controller.Component
|
55
57
|
* @member {Function|String|null} handler_=null
|
58
|
+
* @reactive
|
56
59
|
*/
|
57
60
|
handler_: null,
|
58
61
|
/**
|
@@ -65,17 +68,20 @@ class Button extends Component {
|
|
65
68
|
/**
|
66
69
|
* The CSS class to use for an icon, e.g. 'fa fa-home'
|
67
70
|
* @member {String|null} [iconCls_=null]
|
71
|
+
* @reactive
|
68
72
|
*/
|
69
73
|
iconCls_: null,
|
70
74
|
/**
|
71
75
|
* The color to use for an icon, e.g. '#ff0000' [optional]
|
72
76
|
* @member {String|null} iconColor_=null
|
77
|
+
* @reactive
|
73
78
|
*/
|
74
79
|
iconColor_: null,
|
75
80
|
/**
|
76
81
|
* The position of the icon in case iconCls has a value.
|
77
82
|
* Valid values are: 'top', 'right', 'bottom', 'left'
|
78
83
|
* @member {String} iconPosition_='left'
|
84
|
+
* @reactive
|
79
85
|
*/
|
80
86
|
iconPosition_: 'left',
|
81
87
|
/**
|
@@ -84,11 +90,13 @@ class Button extends Component {
|
|
84
90
|
* Or a configuration object which adds custom configuration to the menu to be
|
85
91
|
* created and includes an `items` property to define the menu items.
|
86
92
|
* @member {Object|Object[]|null} menu_=null
|
93
|
+
* @reactive
|
87
94
|
*/
|
88
95
|
menu_: null,
|
89
96
|
/**
|
90
97
|
* The pressed state of the Button
|
91
98
|
* @member {Boolean} pressed_=false
|
99
|
+
* @reactive
|
92
100
|
*/
|
93
101
|
pressed_: false,
|
94
102
|
/**
|
@@ -96,26 +104,31 @@ class Button extends Component {
|
|
96
104
|
* Use route for internal navigation and url for external links. Do not use both on the same instance.
|
97
105
|
* Transforms the button tag into an a tag [optional]
|
98
106
|
* @member {String|null} route_=null
|
107
|
+
* @reactive
|
99
108
|
*/
|
100
109
|
route_: null,
|
101
110
|
/**
|
102
111
|
* The text displayed on the button [optional]
|
103
112
|
* @member {String|null} text=null
|
113
|
+
* @reactive
|
104
114
|
*/
|
105
115
|
text: null,
|
106
116
|
/**
|
107
117
|
* Transforms the button tag into an a tag [optional]
|
108
118
|
* @member {String|null} url_=null
|
119
|
+
* @reactive
|
109
120
|
*/
|
110
121
|
url_: null,
|
111
122
|
/**
|
112
123
|
* If url is set, applies the target attribute on the top level vdom node [optional]
|
113
124
|
* @member {String} urlTarget_='_blank'
|
125
|
+
* @reactive
|
114
126
|
*/
|
115
127
|
urlTarget_: '_blank',
|
116
128
|
/**
|
117
129
|
* True adds an expanding circle on click
|
118
130
|
* @member {Boolean} useRippleEffect_=true
|
131
|
+
* @reactive
|
119
132
|
*/
|
120
133
|
useRippleEffect_: true,
|
121
134
|
/**
|
package/src/button/Effect.mjs
CHANGED
@@ -35,10 +35,12 @@ class EffectButton extends Component {
|
|
35
35
|
ntype: 'effect-button',
|
36
36
|
/**
|
37
37
|
* @member {String} badgePosition_='top-right'
|
38
|
+
* @reactive
|
38
39
|
*/
|
39
40
|
badgePosition_: 'top-right',
|
40
41
|
/**
|
41
42
|
* @member {String|null} badgeText_=null
|
43
|
+
* @reactive
|
42
44
|
*/
|
43
45
|
badgeText_: null,
|
44
46
|
/**
|
@@ -47,6 +49,7 @@ class EffectButton extends Component {
|
|
47
49
|
baseCls: ['neo-button'],
|
48
50
|
/**
|
49
51
|
* @member {String[]} cls=[]
|
52
|
+
* @reactive
|
50
53
|
*/
|
51
54
|
cls: [],
|
52
55
|
/**
|
@@ -58,6 +61,7 @@ class EffectButton extends Component {
|
|
58
61
|
* Shortcut for domListeners={click:handler}
|
59
62
|
* A string based value assumes that the handlerFn lives inside a controller.Component
|
60
63
|
* @member {Function|String|null} handler_=null
|
64
|
+
* @reactive
|
61
65
|
*/
|
62
66
|
handler_: null,
|
63
67
|
/**
|
@@ -70,17 +74,20 @@ class EffectButton extends Component {
|
|
70
74
|
/**
|
71
75
|
* The CSS class to use for an icon, e.g. 'fa fa-home'
|
72
76
|
* @member {String|null} [iconCls_=null]
|
77
|
+
* @reactive
|
73
78
|
*/
|
74
79
|
iconCls_: null,
|
75
80
|
/**
|
76
81
|
* The color to use for an icon, e.g. '#ff0000' [optional]
|
77
82
|
* @member {String|null} iconColor_=null
|
83
|
+
* @reactive
|
78
84
|
*/
|
79
85
|
iconColor_: null,
|
80
86
|
/**
|
81
87
|
* The position of the icon in case iconCls has a value.
|
82
88
|
* Valid values are: 'top', 'right', 'bottom', 'left'
|
83
89
|
* @member {String} iconPosition_='left'
|
90
|
+
* @reactive
|
84
91
|
*/
|
85
92
|
iconPosition_: 'left',
|
86
93
|
/**
|
@@ -89,11 +96,13 @@ class EffectButton extends Component {
|
|
89
96
|
* Or a configuration object which adds custom configuration to the menu to be
|
90
97
|
* created and includes an `items` property to define the menu items.
|
91
98
|
* @member {Object|Object[]|null} menu_=null
|
99
|
+
* @reactive
|
92
100
|
*/
|
93
101
|
menu_: null,
|
94
102
|
/**
|
95
103
|
* The pressed state of the Button
|
96
104
|
* @member {Boolean} pressed_=false
|
105
|
+
* @reactive
|
97
106
|
*/
|
98
107
|
pressed_: false,
|
99
108
|
/**
|
@@ -101,25 +110,30 @@ class EffectButton extends Component {
|
|
101
110
|
* Use route for internal navigation and url for external links. Do not use both on the same instance.
|
102
111
|
* Transforms the button tag into an a tag [optional]
|
103
112
|
* @member {String|null} route_=null
|
113
|
+
* @reactive
|
104
114
|
*/
|
105
115
|
route_: null,
|
106
116
|
/**
|
107
117
|
* @member {String} tag='button'
|
118
|
+
* @reactive
|
108
119
|
*/
|
109
120
|
tag: 'button',
|
110
121
|
/**
|
111
122
|
* Transforms the button tag into an a tag [optional]
|
112
123
|
* @member {String|null} url_=null
|
124
|
+
* @reactive
|
113
125
|
*/
|
114
126
|
url_: null,
|
115
127
|
/**
|
116
128
|
* If url is set, applies the target attribute on the top level vdom node [optional]
|
117
129
|
* @member {String} urlTarget_='_blank'
|
130
|
+
* @reactive
|
118
131
|
*/
|
119
132
|
urlTarget_: '_blank',
|
120
133
|
/**
|
121
134
|
* True adds an expanding circle on click
|
122
135
|
* @member {Boolean} useRippleEffect_=true
|
136
|
+
* @reactive
|
123
137
|
*/
|
124
138
|
useRippleEffect_: true
|
125
139
|
}
|
@@ -160,11 +174,11 @@ class EffectButton extends Component {
|
|
160
174
|
* @protected
|
161
175
|
*/
|
162
176
|
createVdomEffect() {
|
163
|
-
return new Effect(
|
177
|
+
return new Effect(() => {
|
164
178
|
// The effect's only job is to get the config and trigger an update.
|
165
179
|
this._vdom = this.getVdomConfig();
|
166
180
|
this.update();
|
167
|
-
}
|
181
|
+
})
|
168
182
|
}
|
169
183
|
|
170
184
|
/**
|
package/src/button/Split.mjs
CHANGED
@@ -20,6 +20,7 @@ class Split extends Button {
|
|
20
20
|
ntype: 'split-button',
|
21
21
|
/**
|
22
22
|
* @member {Boolean} hideTriggerButton_=false
|
23
|
+
* @reactive
|
23
24
|
*/
|
24
25
|
hideTriggerButton_: false,
|
25
26
|
/**
|
@@ -38,6 +39,7 @@ class Split extends Button {
|
|
38
39
|
/**
|
39
40
|
* The CSS class to use for the SplitButton icon, e.g. 'fa fa-home'
|
40
41
|
* @member {String} triggerButtonCls_='fa fa-caret-down'
|
42
|
+
* @reactive
|
41
43
|
*/
|
42
44
|
triggerButtonIconCls_: 'fa fa-caret-down',
|
43
45
|
/**
|