neo.mjs 9.16.0 → 10.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +127 -121
  2. package/ServiceWorker.mjs +2 -2
  3. package/apps/email/view/Viewport.mjs +2 -2
  4. package/apps/form/view/Viewport.mjs +1 -1
  5. package/apps/portal/index.html +1 -1
  6. package/apps/portal/view/examples/List.mjs +1 -1
  7. package/apps/portal/view/home/FooterContainer.mjs +1 -1
  8. package/apps/realworld2/view/HomeContainer.mjs +1 -1
  9. package/apps/route/view/center/CardAdministration.mjs +3 -3
  10. package/apps/route/view/center/CardAdministrationDenied.mjs +2 -2
  11. package/apps/route/view/center/CardContact.mjs +2 -2
  12. package/apps/route/view/center/CardHome.mjs +2 -2
  13. package/apps/route/view/center/CardSection1.mjs +2 -2
  14. package/apps/route/view/center/CardSection2.mjs +2 -2
  15. package/buildScripts/createApp.mjs +2 -2
  16. package/docs/app/view/classdetails/HeaderComponent.mjs +3 -3
  17. package/docs/app/view/classdetails/MembersList.mjs +43 -46
  18. package/docs/app/view/classdetails/SourceViewComponent.mjs +1 -1
  19. package/docs/app/view/classdetails/TutorialComponent.mjs +1 -1
  20. package/examples/component/toast/MainContainer.mjs +16 -16
  21. package/examples/component/wrapper/googleMaps/MarkerDialog.mjs +4 -4
  22. package/examples/fields/MainContainer.mjs +1 -1
  23. package/examples/panel/MainContainer.mjs +2 -2
  24. package/examples/tab/container/MainContainer.mjs +3 -3
  25. package/examples/tabs/MainContainer.mjs +2 -2
  26. package/examples/tabs/MainContainer2.mjs +3 -3
  27. package/examples/viewport/MainContainer.mjs +2 -2
  28. package/package.json +33 -5
  29. package/resources/data/deck/learnneo/pages/benefits/FourEnvironments.md +1 -1
  30. package/resources/data/deck/learnneo/pages/benefits/Introduction.md +4 -3
  31. package/resources/data/deck/learnneo/pages/guides/events/DomEvents.md +5 -5
  32. package/resources/data/deck/training/pages/2022-12-27T21-55-23-144Z.md +2 -2
  33. package/resources/data/deck/training/pages/2022-12-29T18-36-08-226Z.md +1 -1
  34. package/resources/data/deck/training/pages/2022-12-29T18-36-56-893Z.md +2 -2
  35. package/resources/data/deck/training/pages/2022-12-29T20-37-08-919Z.md +2 -2
  36. package/resources/data/deck/training/pages/2022-12-29T20-37-20-344Z.md +2 -2
  37. package/resources/data/deck/training/pages/2023-01-13T21-48-17-258Z.md +2 -2
  38. package/resources/data/deck/training/pages/2023-02-05T17-44-53-815Z.md +9 -9
  39. package/resources/data/deck/training/pages/2023-10-14T19-25-08-153Z.md +1 -1
  40. package/src/DefaultConfig.mjs +14 -2
  41. package/src/Main.mjs +15 -6
  42. package/src/button/Base.mjs +1 -1
  43. package/src/calendar/view/calendars/List.mjs +1 -1
  44. package/src/component/Base.mjs +11 -11
  45. package/src/component/Chip.mjs +1 -1
  46. package/src/component/Helix.mjs +3 -3
  47. package/src/component/Process.mjs +2 -2
  48. package/src/component/StatusBadge.mjs +2 -2
  49. package/src/component/Timer.mjs +1 -1
  50. package/src/component/Toast.mjs +2 -2
  51. package/src/container/Base.mjs +1 -1
  52. package/src/form/field/CheckBox.mjs +2 -2
  53. package/src/form/field/FileUpload.mjs +14 -14
  54. package/src/form/field/Range.mjs +1 -1
  55. package/src/form/field/Text.mjs +1 -1
  56. package/src/form/field/trigger/Base.mjs +2 -2
  57. package/src/form/field/trigger/SpinUpDown.mjs +2 -2
  58. package/src/grid/View.mjs +1 -1
  59. package/src/main/DeltaUpdates.mjs +442 -0
  60. package/src/main/DomAccess.mjs +13 -95
  61. package/src/main/render/DomApiRenderer.mjs +138 -0
  62. package/src/main/render/StringBasedRenderer.mjs +58 -0
  63. package/src/table/View.mjs +1 -1
  64. package/src/table/plugin/CellEditing.mjs +1 -1
  65. package/src/tree/Accordion.mjs +11 -11
  66. package/src/tree/List.mjs +12 -5
  67. package/src/vdom/Helper.mjs +179 -309
  68. package/src/vdom/VNode.mjs +47 -11
  69. package/src/vdom/domConstants.mjs +65 -0
  70. package/src/vdom/util/DomApiVnodeCreator.mjs +51 -0
  71. package/src/vdom/util/StringFromVnode.mjs +123 -0
  72. package/src/worker/mixin/RemoteMethodAccess.mjs +13 -1
  73. package/src/main/mixin/DeltaUpdates.mjs +0 -352
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img height="100"src="https://raw.githubusercontent.com/neomjs/pages/main/resources_pub/images/logo/neo_logo_text_primary.svg">
2
+ <img height="100"src="https://raw.githubusercontent.com/neomjs/pages/main/resources_pub/images/logo/neo_logo_text_primary.svg" alt="Neo.mjs Logo">
3
3
  </p>
4
4
  </br>
5
5
  <p align="center">
@@ -11,104 +11,114 @@
11
11
  <a href="./CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-green.svg?logo=GitHub&logoColor=white" alt="PRs Welcome"></a>
12
12
  </p>
13
13
 
14
- # Build Ultra-Fast, Scalable, and Extensible Web Apps :zap:
15
- :rocket: **Break Free from the Main Thread Experience True Multi-Threading**
14
+ # Build Ultra-Fast, Desktop-Like Web Apps. Period. :zap:
15
+ 🚀 **Break Free from UI Freezes Experience True Multithreading & Uncompromised Responsiveness.**
16
16
 
17
- Neo.mjs enables the creation of highly dynamic web applications by running everything **inside an App Worker**.
18
- From components and state providers to view controllers, everything operates within the worker,
19
- allowing the main thread to focus only on **DOM updates** and **delegating UI events**.
20
- This ensures **high performance, smooth reactivity**, and **extensibility** for both **multi-window** and **SPA applications**.
17
+ 💻 ***Neo.mjs v10 isn't an upgrade it's a new operating system for the web. Where others optimize at the margins, we reinvented the engine.***
18
+
19
+ Imagine web applications that never jank, no matter how complex the logic, how many real-time updates they handle, or how
20
+ many browser windows they span. Neo.mjs is engineered from the ground up to deliver **desktop-like fluidity and scalability**.
21
+ **While it excels for Single Page Apps (SPAs), Neo.mjs is simply the best option for browser-based multi-window applications**,
22
+ operating fundamentally different from traditional frameworks.
23
+
24
+ By leveraging a **pioneering Off-Main-Thread (OMT) architecture**, Neo.mjs ensures your UI remains butter-smooth, even during computationally intensive tasks like complex data processing or advanced graphics rendering. The main thread is kept free for one purpose: **flawless user interactions and seamless DOM updates.**
21
25
 
22
26
  <p align="center">
23
- <a href="https://youtu.be/pYfM28Pz6_0"><img height="316px" width="400px" src="https://raw.githubusercontent.com/neomjs/pages/master/resources_pub/images/neo33s.png"></a>
24
- <a href="https://youtu.be/aEA5333WiWY"><img height="316px" width="400px" src="https://raw.githubusercontent.com/neomjs/pages/master/resources_pub/images/neo-movie.png"></a>
27
+ <a href="https://youtu.be/pYfM28Pz6_0"><img height="316px" width="400px" src="https://raw.githubusercontent.com/neomjs/pages/master/resources_pub/images/neo33s.png" alt="Neo.mjs Performance Demo 1 (YouTube Video)"></a>
28
+ <a href="https://youtu.be/aEA5333WiWY"><img height="316px" width="400px" src="https://raw.githubusercontent.com/neomjs/pages/master/resources_pub/images/neo-movie.png" alt="Neo.mjs Performance Demo 2 (YouTube Video)"></a>
25
29
  </p>
26
30
 
27
31
  </br></br>
28
- ## 🔍 Why Neo.mjs?
29
- Neo is a worker thread-driven frontend framework designed to create multithreaded GUIs using JavaScript.
30
- By leveraging the **Off Main Thread (OMT) paradigm**, Neo ensures that your application’s UI remains responsive,
31
- even during computationally intensive tasks.
32
-
33
- Unlike traditional single-threaded frameworks, Neo distributes workloads across multiple threads, unlocking new levels of performance and scalability.
34
- Whether you’re building a small app or a large-scale enterprise solution, Neo’s architecture grows with your needs.
35
-
36
- Key Benefits of Neo.mjs
37
- 1. **Multithreading for Performance**:
38
- - Neo’s OMT paradigm moves tasks like data processing, state management, and rendering to worker threads, keeping the main thread free for rendering and user interactions.
39
- - This approach eliminates UI freezes and ensures a smooth user experience, even for complex applications.
40
- 2. **Declarative Class Configuration**:
41
- - Neo’s class config system allows you to define and manage classes in a clean, reusable way. This reduces boilerplate code and makes your codebase more maintainable.
42
- - With declarative configurations, you can focus on building features instead of wrestling with setup and initialization.
43
- 3. **Modular and Scalable Architecture**:
44
- - Neo’s modular design makes it easy to build scalable applications. Components are self-contained and reusable, promoting a clean separation of concerns.
45
- - Whether you’re building a small app or a large-scale enterprise solution, Neo’s architecture grows with your needs.
46
- 4. **Ease of Use**:
47
- - Neo’s intuitive API and comprehensive documentation make it easy to get started, even for developers new to multithreaded programming.
48
- - The framework’s design prioritizes developer productivity, allowing you to focus on solving real-world problems.
49
- 5. **Future-Proof Technology**:
50
- - Neo is built on modern web standards like JavaScript modules and worker threads, ensuring compatibility with the latest browser features.
51
- - By embracing the OMT paradigm, Neo is uniquely positioned to take advantage of future advancements in web development.
52
-
53
- ## Real-World Applications
54
-
55
- Neo is ideal for:
56
- - **Data-intensive applications**: Handle large datasets and complex calculations without compromising UI responsiveness.
57
- - **Real-time dashboards**: Build dynamic, real-time dashboards that update seamlessly.
58
- - **Enterprise solutions**: Scale your application to meet the demands of large organizations.
59
-
60
- **Why Choose Neo Over Traditional Frameworks?**
61
-
62
- Traditional single-threaded frameworks often struggle with performance bottlenecks, especially when handling complex UIs or large datasets.
63
- Neo’s **multithreaded architecture** addresses these challenges head-on, delivering a responsive and scalable solution for modern web applications.
64
-
65
- With Neo, you get:
66
- - **Responsive UIs**: No more UI freezes or janky animations.
67
- - 🚀 **Scalability**: Build applications that can handle increasing complexity without compromising performance.
68
- - 💻 **Developer Productivity**: Spend less time optimizing and more time building features.
69
- </br></br>
70
- ## 🌟 Key Features
71
- 🎭 **Actor Model**:</br>
72
- The App Worker acts as the central actor, handling application state and logic, independent of the main thread.
73
- This drives the OMT (off the main thread) paradigm into perfection,
74
- since it is keeping the main thread free for non-blocking DOM updates and UI interactions.
75
-
76
- <img src="./resources/images/workers-focus.svg">
77
-
78
- 🔄 **Reactive State Management**:</br>
79
- Built-in reactivity allows dynamic, efficient updates between components and state providers.
80
-
81
- **Instant JavaScript module based Development Mode**:</br>
82
- **Zero builds or transpilations** required. Run your app directly in the browser, modify reactive properties in real-time, and see instant updates.
83
- This gives you an **unmatched debugging experience**, saving time and reducing development costs.
84
- You can even build **entire apps inside the console** if you wish.
85
-
86
- 📊 **Hierarchical State Management**:</br>
87
- Seamlessly manage state between parent and child components with nested state providers.
88
- Each component binds to the state data from its **closest** provider,
89
- even combining data from multiple providers inside one binding.
90
-
91
- 🧩 **Clean Architecture**:</br>
92
- View controllers ensure a **separation of concerns**, isolating business logic from UI components for easier maintenance and testing.
93
-
94
- 🌐 **Multi-Window & SPAs**:</br>
95
- Easily build and manage complex, highly interactive applications that require multiple windows or traditional SPAs.
96
- No native shell required.
97
-
98
- 🌀 **Dynamic Component Management**:</br>
99
- Unmount, move, and remount components across the UI or even in separate browser windows
100
- — without losing the component’s state or logic. This **runtime flexibility** is a game-changer, **preserving JS instances** while still updating the UI dynamically.
101
-
102
- :dependabot: **No npm dependency hell**:</br>
103
- Neo.mjs apps do not need any dependencies at all, just some dev dependencies for tooling.
32
+ ## 🚀 Why Choose Neo.mjs? Solving the Toughest UI Challenges
33
+ Traditional single-threaded frontend frameworks often struggle with performance bottlenecks and UI freezes, especially for
34
+ large-scale, data-intensive, or real-time applications. Neo.mjs offers a fundamentally different solution, designed for
35
+ **uncompromising performance, enhanced security, and superior developer experience.**
36
+
37
+ 1. **Eliminate UI Freezes with True Multithreading**:
38
+ > *"The browser's main thread should be treated like a neurosurgeon: only perform precise, scheduled operations with zero distractions."*</br></br>
39
+ — Neo.mjs Core Philosophy
40
+
41
+ Neo.mjs's OMT architecture inherently prevents UI freezes. With v10's optimized rendering pipeline, your UI will remain even *more*
42
+ consistently responsive, even during intense data processing or complex graphics rendering. It achieves an astonishing
43
+ rate of **over 40,000 delta updates per second** in optimized environments. This translates to an engine with vast untapped
44
+ potential, limited only by user interaction, not the framework.
45
+
46
+ 2. **Unmatched Developer Experience: Transpilation-Free ESM**:
47
+ Say goodbye to complex build steps for development. Neo.mjs apps run **natively as ES Modules directly in the browser**.
48
+ This means **zero builds or transpilations** in dev mode, offering instant reloads and an **unmatched debugging experience**.
49
+ You modify code, and your app updates in real-time.
50
+
51
+ 3. **Inherent Security by Design**:
52
+ By prioritizing direct DOM API manipulation over string-based methods (like `innerHTML`), Neo.mjs fundamentally reduces
53
+ the attack surface for vulnerabilities like Cross-Site Scripting (XSS), building a more robust and secure application from the ground up.
54
+
55
+ 4. **Declarative, Consistent, & Reusable Architecture**:
56
+ Neo.mjs's unique **unified class config system** allows you to define components, layouts, and logic in a clean, declarative,
57
+ and highly consistent way. This significantly reduces boilerplate, improves maintainability, and makes complex UI composition surprisingly straightforward.
58
+
59
+ 5. **Scalability for Enterprise & Beyond**:
60
+ Whether building sophisticated enterprise dashboards, data-intensive Gen AI interfaces, or desktop-like multi-window applications,
61
+ Neo.mjs's modular, worker-driven architecture effortlessly scales. Components are persistent, stateful instances that can be unmounted,
62
+ moved, and even remounted across browser windows without losing their logic or state. This is key to preventing the "re-rendering madness"
63
+ common in other frameworks.
64
+
65
+ </br></br>
66
+ ## 📊 Real-World Win: Crushing UI Lag in Action
67
+ Imagine a developer building a stock trading app with live feeds updating every millisecond. Traditional frameworks often choke,
68
+ freezing the UI under the data flood. With Neo.mjs, the heavy lifting happens in worker threads, keeping the main thread free.
69
+ Traders get real-time updates with zero lag, and the app feels like a native desktop tool. Now, imagine extending this with
70
+ **multiple synchronized browser windows**, each displaying different real-time views, all remaining butter-smooth.
71
+ That’s Neo.mjs in action—solving problems others can’t touch.
72
+
73
+ </br></br>
74
+ ## 🌟 Key Features (and How They Supercharge Your App)
75
+
76
+ * **Persistent Component Instances**: Components maintain their state and logic even when their DOM is removed or moved.
77
+ No more wasteful re-creations just surgical, efficient updates.
78
+
79
+ * **Reactive State Management**: Built-in reactivity ensures dynamic, efficient updates between components and state providers,
80
+ all handled off the main thread.
81
+
82
+ * **Hierarchical State Management**: Seamlessly manage state between parent and child components with nested state providers.
83
+ Components intelligently bind to the closest provider, combining data for powerful, maintainable patterns.
84
+
85
+ * **Clean Architecture (MVVM-inspired)**: View controllers ensure a clear separation of concerns, isolating business logic
86
+ from UI components for easier maintenance, testing, and team collaboration.
87
+
88
+ * **Multi-Window & Single-Page Applications (SPAs)**: Easily build and manage complex applications that require multiple
89
+ browser windows or traditional SPAs, all powered by the same underlying multi-threaded architecture without requiring any native shell.
90
+
91
+ * **No npm Dependency Hell**: Neo.mjs apps run with **zero runtime dependencies**, just a few dev dependencies for tooling.
92
+ This means smaller bundles, fewer conflicts, and a simpler dependency graph.
93
+
94
+ * **Cutting-Edge Use Cases**: Ideal for **data-intensive applications, real-time dashboards, web-based IDEs, banking
95
+ applications, and complex multi-window Gen AI interfaces** where performance and responsiveness are non-negotiable.
96
+
97
+ <p align="center">
98
+ <img src="./resources/images/workers-focus.svg" alt="Neo.mjs Worker Architecture Diagram - Shows Main Thread, App Worker, VDom Worker, Canvas Worker, Data Worker, Service Worker, Backend connections.">
99
+ </p>
100
+ *Diagram: A high-level overview of Neo.mjs's multi-threaded architecture (Main Thread, App Worker, VDom Worker, Canvas Worker, Data Worker, Service Worker, Backend). Optional workers fade in on hover on neomjs.com.*
101
+
104
102
  </br></br>
105
- ## :bulb: Perfect for Complex Use Cases
106
- Need a **web-based IDE, banking dashboard**, or an **enterprise-grade multi-window app**? Neo.mjs is built for it.
103
+ ## 🔍 Neo.mjs vs. The Rest: Key Differentiators
104
+ Wondering how Neo.mjs stacks up against React, Angular, or Vue.js? Here’s the breakdown:
105
+
106
+ | Feature | Neo.mjs | React / Angular / Vue.js |
107
+ | :------------------------ | :--------------------------------------------- | :------------------------------------------ |
108
+ | **UI Responsiveness** | **Guaranteed smooth**: Heavy tasks off-main-thread; main thread free for UI. | **Prone to jank**: Main thread handles all logic + UI, easily blocked. |
109
+ | **Multithreading** | Native OMT architecture for core app logic, VDom, data, & graphics. | Single-threaded by default; requires complex workarounds (e.g., Web Workers for *specific* tasks). |
110
+ | **Dev Mode Experience** | **No transpilation, instant reloads**: Native ES Modules directly in browser. | Build tools (Webpack, Babel) required for dev; slower reloads. |
111
+ | **Component Persistence** | State survives DOM changes; instances move across windows. | Full re-renders common; state often lost on unmount unless managed externally. |
112
+ | **Security** | Direct DOM API, inherently XSS-resistant by design. | Relies heavily on careful string sanitization; higher XSS risk if not diligent. |
113
+ | **Multi-Window Apps** | Seamless, browser-native multi-window support. | Complex to achieve; hacky or unsupported natively. |
114
+ | **Bundle Size** | Zero runtime dependencies for lean apps. | Can be large with many third-party dependencies. |
115
+
116
+ **Neo.mjs Edge**: True multithreading, a no-build development mode, and a scalable, secure architecture combine to deliver a framework that's faster to build with and fundamentally faster and more stable to run.
107
117
 
108
118
  </br></br>
109
- ## 📦 Declarative Class Configuration
110
- Neo’s class config system allows you to define and manage classes in a declarative and reusable way.
111
- This simplifies class creation, reduces boilerplate code, and improves maintainability.
119
+ ## 📦 Declarative Class Configuration: Build Faster, Maintain Easier
120
+
121
+ Neo.mjs’s class config system allows you to define and manage classes in a declarative and reusable way. This simplifies class creation, reduces boilerplate code, and improves maintainability.
112
122
 
113
123
  ```javascript
114
124
  import Component from '../../src/component/Base.mjs';
@@ -116,65 +126,61 @@ import Component from '../../src/component/Base.mjs';
116
126
  class MyComponent extends Component {
117
127
  static config = {
118
128
  className : 'MyComponent',
119
- myConfig_ : 'defaultValue',
120
- domListeners: {
129
+ myConfig_ : 'defaultValue', // Reactive property
130
+ domListeners: { // Direct DOM event binding
121
131
  click: 'onClick'
122
132
  }
123
133
  }
124
134
 
135
+ // Automatically called when myConfig_ changes
125
136
  afterSetMyConfig(value, oldValue) {
126
- console.log('myConfig changed:', value, oldValue)
137
+ console.log('myConfig changed:', value, oldValue);
127
138
  }
128
139
 
140
+ // Handled in the App Worker, main thread remains free
129
141
  onClick(data) {
130
- console.log('Clicked!', data)
142
+ console.log('Clicked!', data);
131
143
  }
132
144
  }
133
145
 
134
146
  export default Neo.setupClass(MyComponent);
135
147
  ```
136
- With Neo.mjs’s class config system, you can:
137
148
 
138
- * Define default properties and methods in a clean, structured way.
139
- * Easily extend and reuse configurations across classes.
140
- * Keep your codebase organized and scalable.
141
-
142
- For more details, check out the <a href="https://neomjs.com/dist/production/apps/portal/index.html#/learn/gettingstarted.Config">Class Config System documentation</a>.
149
+ For more details, check out the [Class Config System documentation](https://neomjs.com/dist/production/apps/portal/index.html#/learn/gettingstarted.Config).
143
150
 
144
151
  </br></br>
145
- ## 🚀 Get Started
146
- Quick Start
152
+ ## 🚀 Jump In: Your First Neo.mjs App in Minutes
147
153
 
148
- Run the following command in your terminal, and your new Neo app will be created, the local web server will start, and your app will open in a new browser window:
154
+ Run this command:
149
155
 
150
156
  ```bash
151
157
  npx neo-app@latest
152
158
  ```
153
- This one-liner sets up everything you need to start building with Neo, including:
154
- - A new app workspace.
155
- - A pre-configured app shell.
156
- - A local development server.
157
- - Opening your app inside a new browser window
158
159
 
159
- :book: More details? Check out our <a href="./.github/GETTING_STARTED.md">Getting Started Guide</a>
160
+ This one-liner sets up everything you need to start building with Neo.mjs, including:
161
+
162
+ * A new app workspace.
163
+ * A pre-configured app shell.
164
+ * A local development server.
165
+ * Launching your app in a new browser window—all in one go.
160
166
 
161
- :student: Make sure to dive into the <a href="https://neomjs.com/dist/production/apps/portal/#/learn/gettingstarted.Setup">Learning Section</a>
167
+ :book: More details? Check out our [Getting Started Guide](./.github/GETTING_STARTED.md)
162
168
 
163
- :brain: The most advanced tutorial to help you with getting up to speed is this one:
164
- <a href="https://neomjs.com/dist/production/apps/portal/#/learn/tutorials.Earthquakes">Earthquakes Tutorial</a>
169
+ :student: Make sure to dive into the [Learning Section](https://neomjs.com/dist/production/apps/portal/#/learn/gettingstarted.Setup)
165
170
 
166
171
  Next steps:
167
- * :star: **Explore exciting Examples here**: <a href="https://neomjs.com/dist/production/apps/portal/#/examples">Neo.mjs Examples</a>
168
- * Many more are included inside the repos <a href="https://github.com/neomjs/neo/tree/dev/apps">apps</a>
169
- & <a href="https://github.com/neomjs/neo/tree/dev/examples">examples</a> folders.
170
- * :blue_book: All Blog Posts are listed here: <a href="https://neomjs.com/dist/production/apps/portal/#/blog">Neo.mjs Blog</a>
171
- </br></br>
172
- ## :handshake: Join the Community
173
172
 
174
- :speech_balloon: Have questions? Join our <a href="https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA">Slack channel</a> and connect with other developers.
173
+ * :star: **Experience stunning Demos & Examples here**: [Neo.mjs Examples Portal](https://neomjs.com/dist/production/apps/portal/#/examples)
174
+ * Many more are included inside the repos [apps](https://github.com/neomjs/neo/tree/dev/apps)
175
+ & [examples](https://github.com/neomjs/neo/tree/dev/examples) folders.
176
+ * :blue_book: All Blog Posts are listed here: [Neo.mjs Blog](https://neomjs.com/dist/production/apps/portal/#/blog)
177
+
178
+ </br></br>
179
+ ## :handshake: Join the Community
175
180
 
176
- :hammer_and_wrench: Want to contribute? Check out our <a href="https://github.com/neomjs/neo/blob/dev/CONTRIBUTING.md">Contributing Guide</a>.
181
+ :speech_balloon: Have questions? Join our [Slack channel](https://join.slack.com/t/neomjs/shared_invite/zt-6c50ueeu-3E1~M4T9xkNnb~M_prEEOA) and connect with other developers.
177
182
 
183
+ :hammer_and_wrench: Want to contribute? Check out our [Contributing Guide](https://github.com/neomjs/neo/blob/dev/CONTRIBUTING.md).
178
184
 
179
185
  </br></br>
180
- Copyright (c) 2015 - today, <a href="https://www.linkedin.com/in/tobiasuhlig/">Tobias Uhlig</a>
186
+ Copyright (c) 2015 - today, [Tobias Uhlig](https://www.linkedin.com/in/tobiasuhlig/)
package/ServiceWorker.mjs CHANGED
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='9.16.0'
23
+ * @member {String} version='10.0.0-alpha.2'
24
24
  */
25
- version: '9.16.0'
25
+ version: '10.0.0-alpha.2'
26
26
  }
27
27
 
28
28
  /**
@@ -42,13 +42,13 @@ class Viewport extends BaseViewport {
42
42
  iconCls: 'fa fa-home',
43
43
  text : 'Tab 1'
44
44
  },
45
- vdom: {innerHTML: 'Welcome to your new Neo App.'}
45
+ vdom: {html: 'Welcome to your new Neo App.'}
46
46
  }, {
47
47
  header: {
48
48
  iconCls: 'fa fa-play-circle',
49
49
  text : 'Tab 2'
50
50
  },
51
- vdom: {innerHTML: 'Have fun creating something awesome!'}
51
+ vdom: {html: 'Have fun creating something awesome!'}
52
52
  }]
53
53
  }]
54
54
  }
@@ -29,7 +29,7 @@ class Viewport extends BaseViewport {
29
29
 
30
30
  items: [{
31
31
  flex: 'none',
32
- vdom: {tag: 'h1', innerHTML: 'Nested Forms'}
32
+ vdom: {tag: 'h1', html: 'Nested Forms'}
33
33
  }, {
34
34
  module : SideNavList,
35
35
  reference: 'side-nav',
@@ -16,7 +16,7 @@
16
16
  "@type": "Organization",
17
17
  "name": "Neo.mjs"
18
18
  },
19
- "datePublished": "2025-06-14",
19
+ "datePublished": "2025-06-18",
20
20
  "publisher": {
21
21
  "@type": "Organization",
22
22
  "name": "Neo.mjs"
@@ -163,7 +163,7 @@ class List extends BaseList {
163
163
  createSourceLink(record) {
164
164
  let vdom = {
165
165
  tag : 'a',
166
- cls : ['fab fa-github', 'neo-github-image'],
166
+ cls : ['fab', 'fa-github', 'neo-github-image'],
167
167
  href : record.sourceUrl,
168
168
  target: '_blank'
169
169
  };
@@ -107,7 +107,7 @@ class FooterContainer extends Container {
107
107
  }, {
108
108
  module: Component,
109
109
  cls : ['neo-version'],
110
- html : 'v9.16.0'
110
+ html : 'v10.0.0-alpha.2'
111
111
  }]
112
112
  }],
113
113
  /**
@@ -60,7 +60,7 @@ class HomeContainer extends Container {
60
60
  cls : ['neo-examples-tab-component'],
61
61
  header: {iconCls: 'fa fa-user-ninja', text: 'Your Feed'},
62
62
  style : {padding: '20px'},
63
- vdom : {innerHTML: 'todo'}
63
+ vdom : {html: 'todo'}
64
64
  }, {
65
65
  module: PreviewList,
66
66
  header: {iconCls: 'fa fa-globe-europe', text: 'Global Feed'}
@@ -17,14 +17,14 @@ class CardAdministration extends Container {
17
17
  username_: '',
18
18
 
19
19
  vdom: {
20
- tag: 'h1',
21
- innerHTML: 'Access Granted.'
20
+ tag : 'h1',
21
+ html: 'Access Granted.'
22
22
  }
23
23
  }
24
24
 
25
25
 
26
26
  afterSetUsername(value, oldValue) {
27
- this.vdom.innerHTML = `Access Granted to ${this.username}.`;
27
+ this.vdom.html = `Access Granted to ${this.username}.`;
28
28
  }
29
29
  }
30
30
 
@@ -15,8 +15,8 @@ class CardAdministrationDenied extends Container {
15
15
  baseCls: ['route_card_simple_page','neo-container'],
16
16
 
17
17
  vdom: {
18
- tag: 'h1',
19
- innerHTML: 'Access Denied.'
18
+ tag : 'h1',
19
+ html: 'Access Denied.'
20
20
  }
21
21
  }
22
22
  }
@@ -16,8 +16,8 @@ class CardContact extends Container {
16
16
 
17
17
  items: [
18
18
  { cls : ['route_card_simple_page'], vdom: { cn: [
19
- {tag: 'h1',innerHTML: 'Contact' },
20
- {tag: 'a', href: 'https://github.com/neomjs/neo', target: '_blank', innerHTML: 'please visit https://github.com/neomjs/neo'}
19
+ {tag: 'h1', html: 'Contact' },
20
+ {tag: 'a', href: 'https://github.com/neomjs/neo', target: '_blank', html: 'please visit https://github.com/neomjs/neo'}
21
21
  ] } }
22
22
  ]
23
23
  }
@@ -15,8 +15,8 @@ class CardHome extends Container {
15
15
  baseCls: ['route_card_simple_page','neo-container'],
16
16
 
17
17
  vdom: {
18
- tag: 'h1',
19
- innerHTML: 'This is the landing page of the example.'
18
+ tag : 'h1',
19
+ html: 'This is the landing page of the example.'
20
20
  }
21
21
  }
22
22
  }
@@ -15,8 +15,8 @@ class CardSection1 extends Container {
15
15
  baseCls: ['route_card_simple_page','neo-container'],
16
16
 
17
17
  vdom: {
18
- tag: 'h1',
19
- innerHTML: 'This is section 1 of the example.'
18
+ tag : 'h1',
19
+ html: 'This is section 1 of the example.'
20
20
  }
21
21
  }
22
22
  }
@@ -15,8 +15,8 @@ class CardSection2 extends Container {
15
15
  baseCls: ['route_card_simple_page','neo-container'],
16
16
 
17
17
  vdom: {
18
- tag: 'h1',
19
- innerHTML: 'This is section 2 of the example.'
18
+ tag : 'h1',
19
+ html: 'This is section 2 of the example.'
20
20
  }
21
21
 
22
22
  }
@@ -234,13 +234,13 @@ if (programOpts.info) {
234
234
  " iconCls: 'fa fa-home',",
235
235
  " text : 'Tab 1'",
236
236
  " },",
237
- " vdom: {innerHTML: 'Welcome to your new Neo App.'}",
237
+ " vdom: {html: 'Welcome to your new Neo App.'}",
238
238
  " }, {",
239
239
  " header: {",
240
240
  " iconCls: 'fa fa-play-circle',",
241
241
  " text : 'Tab 2'",
242
242
  " },",
243
- " vdom: {innerHTML: 'Have fun creating something awesome!'}",
243
+ " vdom: {html: 'Have fun creating something awesome!'}",
244
244
  " }]",
245
245
  " }]",
246
246
  " }",
@@ -64,12 +64,12 @@ class HeaderComponent extends Component {
64
64
  }
65
65
  }
66
66
 
67
- me.vdom.cn[0].innerHTML = singleton ? (className + ' → Singleton') : className;
67
+ me.vdom.cn[0].html = singleton ? (className + ' → Singleton') : className;
68
68
 
69
69
  if (record.description) {
70
70
  me.vdom.cn.push({
71
- cls : ['neo-docs-header-description'],
72
- innerHTML: record.description
71
+ cls : ['neo-docs-header-description'],
72
+ html: record.description
73
73
  })
74
74
  }
75
75