There's no framework to leave behind in a vanilla JavaScript app. What you do have is state hiding all over the page, and finding it is most of the job.#react #javascript #webdev #refactoring #software #coding #development #engineering #inclusive #community
The State Is in the DOM: Taking a Vanilla JavaScript App to React
#react
In a jQuery app, nothing updates the total by itself. Every handler has to remember to do it, and the bugs live in the ones that forget.#react #jquery #javascript #webdev #software #coding #development #engineering #inclusive #community
Who Updates the Total? Taking a jQuery App to React
When scaling Next.js 15 and React 19 Server Components in heavy production environments, one of the...#react #javascript #webdev #architecture #software #coding #development #engineering #inclusive #community
React 19 useActionState: Preventing SSR State Pollution and Event Listener Memory Leaks
Nobody wakes up excited to fill out a form. I think that's the most honest starting point for this...#react #webdev #tailwindcss #ux #software #coding #development #engineering #inclusive #community
Forms That Feel Like Progress: Building Multi-Step Registration That Doesn't Feel Like Paperwork
Menavigasi Tech Stack Modern di Tahun 2026: Antara Efisiensi dan Hype Beberapa tahun...#react #go #postgres #ai #software #coding #development #engineering #inclusive #community
Menavigasi Tech Stack Modern di Tahun 2026: Antara Efisiensi dan Hype
When I started using shadcn/ui for Persian projects, I quickly ran into a problem: the components...#react #nextjs #typescript #backend #software #coding #development #engineering #inclusive #community
I Forked shadcn/ui to Build a Better RTL Experience
A Slack message popped up at 4 PM last Thursday. A junior developer was completely stuck on a simple...#css #frontend #designsystems #react #software #coding #development #engineering #inclusive #community
JSON design tokens are a massive frontend anti-pattern
I was three weeks out from a major release for a clinical HealthTech platform when we hit a wall that...#reactnative #skia #performance #react #software #coding #development #engineering #inclusive #community
The Hidden Performance Ceiling of React Native Skia in Production
How a React 19 PWA, Zustand and Firestore Security Rules replaced a custom API server — and still sync across devices on Firebase's free tier.#react #pwa #firebase #typescript #software #coding #development #engineering #inclusive #community
I Built a Serverless, Offline-First Exam Simulator for the Google Cloud Architect Cert (Beta)
Testing Accessibility with Fragment Refs
In my previous post, I introduced Fragment Refs. A reader pointed out that removing wrapper elements is nice, but accessibility needs careful testing. So let's actually test it.
1. What I want to check
Fragment Refs let you control a group of sibling DOM nodes without a wrapper element. Because the DOM structure stays flat, I want to check two things:
- Does
focus()move focus to the element I expected? - Does the tab order stay natural?
I did not test with a screen reader in this post.
2. Test setup
import { Fragment, useRef } from 'react';
function Sections({ posts }) {
const fragmentRef = useRef(null);
return (
<>
<button onClick={() => fragmentRef.current.focus()}>
Focus the first heading
</button>
<Fragment ref={fragmentRef}>
{posts.map((post) => (
<h2 key={post.id} tabIndex={0}>
{post.title}
</h2>
))}
</Fragment>
</>
);
}
I tested with React 19.3.0-canary-17eca7b0-20261006 in jsdom.
3. Results
CheckResultfocus() targetThe first <h2> (focusLast() moves focus to the last one)Tab orderNatural: button → h2 → h2 → h2, following DOM order
The DOM stays flat (<button>…</button><h2>…</h2><h2>…</h2>…), so no wrapper element appears in the tab order.
4. Pitfalls I found
- Elements without
tabIndexcan't receive focus, sofocus()skips them. If no child is focusable, nothing happens, and no error or warning is shown. - When the fragment has zero children,
focus()does nothing and doesn't throw. tabIndex={0}on a heading adds it to the tab order even though it isn't interactive. If you only need programmatic focus, usetabIndex={-1}:focus()still works, and the headings drop out of the tab order.
5. Conclusion
Fragment Refs keep the DOM flat, and in my tests focus() moved focus to the first focusable sibling and the tab order followed DOM order. The main risk is silent failure: if no child is focusable, focus() does nothing and reports nothing. So when the siblings are interactive, check that at least one child can actually receive focus. Screen reader behavior is not covered here and needs separate testing.#webdev #programming #react #frontend #software #coding #development #engineering #inclusive #community
React.js ~Testing Accesibility of Fragment Refs~
This is one of those bugs where the code looks completely reasonable, passes every manual test you'd...#nextjs #typescript #webdev #react #software #coding #development #engineering #inclusive #community
Your useEffect Search Bar Has a Race Condition, and It Only Shows Up When Users Type Fast
VIN lookup forms look simple: an input, a button, a result card. Under SSR (Next.js, Remix, or any...#typescript #webdev #react #cars #software #coding #development #engineering #inclusive #community
SSR/Hydration Pitfalls for VIN Decode Forms (Server Empty, Client Filled)