The Sanitizer API landed in Firefox 148, along with element.setHTML().
This lets you fully configure how HTML strings are cleaned as they're parsed.
hacks.mozilla.org/2026/02/good...
The Sanitizer API landed in Firefox 148, along with element.setHTML().
This lets you fully configure how HTML strings are cleaned as they're parsed.
hacks.mozilla.org/2026/02/good...
Interesting. It seems like there's a selector for everything but the `state`, thought it can probably be created as well.
An issue we had with the `state` is that it *must* be passed for every navigation, otherwise it's deleted by the Router. Kind of annoying.
We also tried with a custom LocationStrategy. In that case the `id` is saved in the `history.state` upon navigation.
It works but it affects every route in the app, not just the `/books` sub-tree. Maybe it can be modified further to only "affect" a specific route.
It's a client requirement because of GDPR. In the example I mention `book-id` but in the projects it's another `id` which is more sensitive. So it must not be part of the URL (and the browser's history).
Hey @angular.dev I need your help. 🙏
I have the following URL structure and want to remove <book-id> from it BUT keep the "deep-links" - I should still be able to access `/book/<book-id>` without exposing the `<book-id>` in the URL. Do you have any suggestion?
#angular
The refresh part is a requirement too, sadly.
We looked at `state` too but couldn't solve the major use-cases (e.g. sub-route navigation, refresh, etc) without throwing some `sessionStorage` in. So it kind of diminishes its purpose.
What we have until now is using `sessionStorage` or creating a custom `LocationStrategy`. What else can be used?
Hey @angular.dev I need your help. 🙏
I have the following URL structure and want to remove <book-id> from it BUT keep the "deep-links" - I should still be able to access `/book/<book-id>` without exposing the `<book-id>` in the URL. Do you have any suggestion?
#angular
Congrats 🎉. Thanks for all your work on Angular. All the best in the future.
Wow, wow, wow 🎉🚀
My book, Accessibility For Everyone, is now free and online as a website.
accessibilityforeveryone.site
The book was first published by A Book Apart in 2017 but it holds up! It covers web accessibility for designers, developers, content folks, and really everyone who works in tech.
Headline: Developer Tool State Management Visualization Main Container: A dark-mode interface showing a logic flow. A central resource block titled myRsrc is highlighted with a gold border. Internal Flow: Inside the resource, an extRequest node (red) feeds into loadEffect (purple), state (red), and stream (blue). These converge into green terminal nodes: status (showing "resolved"), value (showing "next_val"), and isLoading (showing "false"). External Context: Above the resource is a parent node rsrcParam with the string "rsrc_param". To the left, unrelated nodes for zippy and counter are visible. Inspector Window: A small UI overlay in the bottom right summarizes the "myRsrc" state, confirming the type is resource, the status is resolved, and the current value is "next_val".
Debugging just got a major upgrade. We’ve officially launched Resource Visualization in Angular DevTools. Now you can gain even deeper insights into your app's lifecycle and dependencies directly in your browser.
See it in action and check out the details here: github.com/angular/angu...
A code snippet demonstrating the use of the JavaScript spread operator within Angular's @let syntax. The code defines a baseModel object, then creates an upgradedModel using {...baseModel} to inherit properties like make, model, and year, while adding a new "radio" property. The HTML below outputs both lists to show the merged data. Code snippet: @let baseModel = { make: 'Best Cars', model: 'ng-21', year: 2026 }; @let upgradedModel = {...baseModel, radio: 'Premium Sound System' }; <p>Base Model Details:</p> <ul> <li>Make: {{ baseModel.make }}</li> <li>Model: {{ baseModel.model }}</li> <li>Year: {{ baseModel.year }}</li> </ul> <p>Upgraded Model Details:</p> <ul> <li>Make: {{ upgradedModel.make }}</li> <li>Model: {{ upgradedModel.model }}</li> <li>Year: {{ upgradedModel.year }}</li> <li>Radio: {{ upgradedModel.radio }}</li> </ul>
Spread syntax in Angular templates! Use the ... operator in:
▶️ Object literals: {a: 1, ...foo}
▶️ Array literals: [1, ...foo]
▶️ Function calls: fn(1, ...foo)
It’s powered by Angular’s "pure function" system, ensuring objects aren't re-created unless data changes. Keep it clean, keep it fast! 🚀
Angular 21.1 is officially here! 🚀
This update brings: ✅ Multi-case @switch matching ✅ Spread syntax in templates ✅ isActive() Signals for routing ✅ Updated [formField] for Signal Forms
Upgrade now: ng update @angular/core @angular/cli and tell us your favorite new feature! 🛠️
So you're saying:
1. Master the "Rules"
("You know the rules and so do I.")
2. High-Intent Focus
("A full commitment's what I'm thinking of.")
3. Transparency & Reporting
("I just wanna tell you how I'm feeling / Gotta make you understand.")
... and many more 😂😂
🚀 What's new in #Angular v21.1? ✨
✅ ... spread operator in templates
🚦 trailing slash router config
✨ Experimental Navigation API
🚀 Signal Forms renaming and new features
Our detailed blog post is live 👉 blog.ninja-squad.com/2026/01/15/w...
The Navigation API is newly baseline! The web now has sensible, low-level routing for navigations.
CSS anchor positioning is newly baseline! This opens the door for lots of new creative CSS.
It's a huge feature, but here are the basics.
Firefox 147 just landed & it's pretty huge in terms of web features:
🎉 CSS anchor positioning
🎉 The navigation API
🎉 View transition types
🎉 Brotli support in Compression/DecompressionStream
🎉 CSS module imports
And more!
https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/147
I wish you all the best. Hopefully 45 days will not feel that long.
Happy new year! 🎉
Let's start the year with a short run 🏃♂️
Progress is made in small steps 😊
📢 Announcing NgRx 21: Celebrating a 10 Year Journey with a fresh new look and ngrx/signals/events
🎊 10 Year Anniversary
🎨 New Documentation Website
⚓ Stable Events Plugin
And more!
✍️ by @timdeschryver.dev
dev.to/ngrx/announc...
Latest status 😃 It was a config issue. After upgrading Vitest to latest I still got the errors. But then removed a suspicious config setting... and it works now :)
HTML invoker commands are newly baseline! Here's how they work…
So far everything works in the ATL repo. I guess I'll first need to upgrade my project to later versions of dependencies. Am still on Angular v20 and Vitest v2 😬 Upgrade might fix it.
Will try to make a repro. Though the current example apps in the repo are based on Jest/Karma. My issue occurs in Vitest. Will probably need to use the current PR as a playground :)
Hey @timdeschryver.dev Do you happen to have an ATL example of a spec that tests a component that uses an `effect`? I get some error saying that required input is not defined 🤔
Just updated our project to @nx.dev v22.2.x. Now eagerly waiting for 22.3.x and support for Angular v21 🎉
Nx singlehandedly updated Storybook to v10.1, added Vitest configs, and updated a bunch of related deps. Impressive! 🚀