-
Notifications
You must be signed in to change notification settings - Fork 0
feat: initial work for 25.11 release blog #691
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
EHandtkeBasis
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldnt the folder be 2026-01-16 now?
| title: What's new in version 25.11? | ||
| description: Get to know the features, fixes, and functionality new in webforJ version 25.11. | ||
| slug: whats-new-v25.11 | ||
| date: 2025-01-16 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| date: 2025-01-16 | |
| date: 2026-01-26 |
|
|
||
| <!--  --> | ||
|
|
||
| The new year brings a new version of webforJ - introducing version 25.11! This release brings polished animations, AI-ready components, and faster ways to prototype. The new View Transitions API adds smooth animations to route navigation with a single annotation. JBang integration lets you run webforJ apps from a single file - no project setup required. Two new components join the library: Avatar for user profiles and MarkdownViewer for streaming content with progressive rendering, perfect for AI chat interfaces. Round it out with a `Debouncer` utility, a minify plugin for smaller builds, improved Spring Boot integration, and additions to our docs and demos. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| The new year brings a new version of webforJ - introducing version 25.11! This release brings polished animations, AI-ready components, and faster ways to prototype. The new View Transitions API adds smooth animations to route navigation with a single annotation. JBang integration lets you run webforJ apps from a single file - no project setup required. Two new components join the library: Avatar for user profiles and MarkdownViewer for streaming content with progressive rendering, perfect for AI chat interfaces. Round it out with a `Debouncer` utility, a minify plugin for smaller builds, improved Spring Boot integration, and additions to our docs and demos. | |
| The new year brings a new version of webforJ: introducing version 25.11! This release brings polished animations, AI-ready components, and faster ways to prototype. The new View Transitions API adds smooth animations to route navigation with a single annotation. [JBang](https://www.jbang.dev/) integration lets you run webforJ apps from a single file, no project setup required. Two new components join the library: `Avatar` for user profiles and `MarkdownViewer` for streaming content with progressive rendering, perfect for AI chat interfaces. Round it out with a `Debouncer` utility, a minify plugin for smaller builds, improved Spring Boot integration, and additions to our docs and demos. |
|
|
||
| ## View Transitions API for animated route navigation | ||
|
|
||
| Changing views is an incredibly common occurrence in apps, often made more visually appealing by adding transitions. Before, these transitions required complex CSS - now, with this release, webforJ introduces experimental support for the browser's native [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API), bringing smooth animations to navigation with minimal effort. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| Changing views is an incredibly common occurrence in apps, often made more visually appealing by adding transitions. Before, these transitions required complex CSS - now, with this release, webforJ introduces experimental support for the browser's native [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API), bringing smooth animations to navigation with minimal effort. | |
| Changing views is an incredibly common occurrence in apps, often made more visually appealing by adding transitions. Before, these transitions required complex CSS. Now, with this release, webforJ introduces experimental support for the browser's native [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API), bringing smooth animations to navigation with minimal effort. |
|
|
||
| <!-- <video src={require('./transitions.mp4').default} autoPlay muted loop playsInline style={{width: '100%', borderRadius: '8px', marginBottom: '1rem'}}></video> --> | ||
|
|
||
| The simplest approach, and the one used in the above video is the `@RouteTransition` annotation: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| The simplest approach, and the one used in the above video is the `@RouteTransition` annotation: | |
| The simplest approach, used in the above video, is the `@RouteTransition` annotation: |
| } | ||
| ``` | ||
|
|
||
| That's it - the router handles the animation automatically when navigating to or from this view. Built-in transitions include `FADE`, `SLIDE_LEFT`, `SLIDE_RIGHT`, `SLIDE_UP`, `SLIDE_DOWN`, `ZOOM`, and `ZOOM_OUT`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| That's it - the router handles the animation automatically when navigating to or from this view. Built-in transitions include `FADE`, `SLIDE_LEFT`, `SLIDE_RIGHT`, `SLIDE_UP`, `SLIDE_DOWN`, `ZOOM`, and `ZOOM_OUT`. | |
| That's it! The router handles the animation automatically when navigating to or from this view. Built-in transitions include `FADE`, `SLIDE_LEFT`, `SLIDE_RIGHT`, `SLIDE_UP`, `SLIDE_DOWN`, `ZOOM`, and `ZOOM_OUT`. |
|
|
||
| The new **RouteRegistryProvider SPI** opens the door. It's a "Service Provider Interface" that lets frameworks plug in their own route discovery logic. When you call `RouteRegistry.ofPackage()`, webforJ now checks for registered providers first. If one exists (like Spring's implementation), it delegates discovery to that provider. Otherwise, it falls back to standard classpath scanning. | ||
|
|
||
| For most developers, this is invisible - routes just work. But if you're building framework integrations or need custom route registration logic, you now have a clean extension point. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| For most developers, this is invisible - routes just work. But if you're building framework integrations or need custom route registration logic, you now have a clean extension point. | |
| For most developers, this is invisible. Routes just work. But if you're building framework integrations or need custom route registration logic, you now have a clean extension point. |
|
|
||
| ## Spring Boot starter simplification | ||
|
|
||
| A small but welcome change: the `webforj-spring-boot-starter` now includes webforJ as a transitive dependency. Previously you needed to declare both the starter and the core library separately. Now just add the starter and you're done - one dependency instead of two. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| A small but welcome change: the `webforj-spring-boot-starter` now includes webforJ as a transitive dependency. Previously you needed to declare both the starter and the core library separately. Now just add the starter and you're done - one dependency instead of two. | |
| A small but welcome change: the `webforj-spring-boot-starter` now includes webforJ as a transitive dependency. Previously you needed to declare both the starter and the core library separately. Now just add the starter and you're done—one dependency instead of two. |
|
|
||
| Mentioned at the beginning of our article, GhostAI is a full-featured AI chat application built with Spring AI and Google Gemini. The interface mirrors the ChatGPT experience: streaming responses render progressively in the `MarkdownViewer` with syntax-highlighted code blocks, while the input field offers predictive ghost text suggestions that you can accept with Tab. Conversation history persists across messages, and MCP server integration enables real-time documentation queries. | ||
|
|
||
| This demo pulls together many of the new 25.11 features - MarkdownViewer's progressive rendering, TextField's ghost text API, and the `Debouncer` utility - into a cohesive application. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| This demo pulls together many of the new 25.11 features - MarkdownViewer's progressive rendering, TextField's ghost text API, and the `Debouncer` utility - into a cohesive application. | |
| This demo pulls together many of the new 25.11 features—MarkdownViewer's progressive rendering, TextField's ghost text API, and the `Debouncer` utility—into a cohesive application. |
|
|
||
| A Pomodoro-style timer that demonstrates Progressive Web App capabilities in webforJ. Install it to your desktop or mobile device using the `@AppProfile` annotation, receive native notifications when your focus session ends, and watch the app badge update in real-time to show remaining minutes. | ||
|
|
||
| For Java developers accustomed to server-side rendering, this demo shows how webforJ bridges the gap to modern web platform features - installable apps, push notifications, and badge APIs - without writing JavaScript. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| For Java developers accustomed to server-side rendering, this demo shows how webforJ bridges the gap to modern web platform features - installable apps, push notifications, and badge APIs - without writing JavaScript. | |
| For Java developers accustomed to server-side rendering, this demo shows how webforJ bridges the gap to modern web platform features such as installable apps, push notifications, and badge APIs, without writing JavaScript. |
|
|
||
| ### REST Pagination | ||
|
|
||
| A practical comparison of two pagination strategies for REST API data. The first tab uses `CollectionRepository` to fetch all 100 customers upfront and paginate client-side - simple and fast for small datasets. The second tab uses `DelegatingRepository` to lazy-load 15 records at a time as you navigate - essential for large datasets where loading everything would be impractical. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| A practical comparison of two pagination strategies for REST API data. The first tab uses `CollectionRepository` to fetch all 100 customers upfront and paginate client-side - simple and fast for small datasets. The second tab uses `DelegatingRepository` to lazy-load 15 records at a time as you navigate - essential for large datasets where loading everything would be impractical. | |
| A practical comparison of two pagination strategies for REST API data. The first tab uses `CollectionRepository` to fetch all 100 customers upfront and paginate client-side, simple and fast for small datasets. The second tab uses `DelegatingRepository` to lazy-load 15 records at a time as you navigate, essential for large datasets where loading everything would be impractical. |
|
|
||
| ## View Transitions API for animated route navigation | ||
|
|
||
| Changing views is an incredibly common occurrence in apps, often made more visually appealing by adding transitions. Before, these transitions required complex CSS. Now, webforJ introduces experimental support for the browser's native [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API), bringing smooth animations to navigation with minimal effort. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
complex javascript not css
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we should link the webforj view transitions docs instead of the MDN one
|
|
||
| As always, see the [GitHub release overview](https://github.com/webforj/webforj/releases/tag/25.11) for a more comprehensive list of changes. Highlighted below are some of the most exciting additions: | ||
|
|
||
| ## View Transitions API for animated route navigation |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This section mixes view transitions and route transitions, which can be confusing. Route transitions are based on the webforj View Transition API, and we need to make that clear. We should start by explaining the new view transition API and show it in action (Use list order demo). After that, we can explain the route transition API and show the video.
|
|
||
| <video src="https://cdn.webforj.com/webforj-documentation/blogs/webforj-v25.11/jbang.mov" autoPlay muted loop playsInline style={{width: '100%', borderRadius: '8px', marginBottom: '1rem'}}></video> | ||
|
|
||
| ```java |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The code does not run. Please use the demo I shared in the jbang PR.
| *The video above showcases the MarkdownViewer rendering streamed output from an AI chatbot in real time.* | ||
|
|
||
| :::tip AI Autocompletion | ||
| Notice the text area in the demo? It features AI-powered autocompletion that suggests text as you type. This ghost text functionality is also available in the TextField and TextArea components - see [TextField documentation](/docs/components/fields/text-field) for details on enabling suggestions in your own apps. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the feature is available only in TextArea not TextField
|
|
||
| *The video above showcases the MarkdownViewer rendering streamed output from an AI chatbot in real time.* | ||
|
|
||
| :::tip AI Autocompletion |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Link text is wrong and the link is broken, link text area Predicted text section please
| See the [Minify plugin docs](/docs/configuration/minifier-plugin) for setup instructions and configuration options. | ||
| ::: | ||
|
|
||
| ## Route Registry Provider SPI |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's remove
|
|
||
| The new **RouteRegistryProvider SPI** lets frameworks like Spring plug in their own route discovery logic. For most developers, this is invisible—routes just work. But if you're building framework integrations, you now have a clean extension point. | ||
|
|
||
| ## Spring Boot starter simplification |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's remove
|
|
||
| Each `append()` call adds content to the stream. Auto-scroll keeps the latest content visible—smart enough to pause when users scroll up. Code blocks get syntax highlighting automatically. The API includes `setRenderSpeed()`, `stop()`, `flush()`, and `whenRenderComplete()` for full control. | ||
|
|
||
| ## `Debouncer` utility |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's remove
| ```java | ||
| // Auto-generated initials from name | ||
| Avatar avatar = new Avatar("John Doe"); // Shows "JD" | ||
|
|
||
| // With a profile image | ||
| Avatar avatar = new Avatar("Jane Smith"); | ||
| avatar.add(new Img("https://example.com/profile.jpg")); | ||
| ``` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| ```java | |
| // Auto-generated initials from name | |
| Avatar avatar = new Avatar("John Doe"); // Shows "JD" | |
| // With a profile image | |
| Avatar avatar = new Avatar("Jane Smith"); | |
| avatar.add(new Img("https://example.com/profile.jpg")); | |
| ``` | |
| ```java | |
| // Auto-generated initials from name | |
| Avatar initialsAvatar = new Avatar("John Doe"); // Shows "JD" | |
| // With a profile image | |
| Avatar imageAvatar = new Avatar("Jane Smith"); | |
| avatar.add(new Img("https://example.com/profile.jpg")); |
Minor suggestion: since these are ostensibly in the same file, give the avatars unique names that describe their function.
No description provided.