Accessibility
WordPress Accessibility Issues That Are Getting Sites Sued in 2026
In our analysis of 1,025 websites, color contrast failures were the single most common issue — appearing on 58% of sites. Missing alt text, broken link text, and undersized tap targets followed closely. The pattern is consistent across industries. And WordPress sites are no exception.
This article breaks down the most common WordPress-specific accessibility failures, why they happen, and exactly how to fix them.
WebAIM: Screen Reader User Survey #11 Results
In July-August 2026, WebAIM surveyed preferences of screen reader users. We received 1780 valid responses. This was a follow-up to 10 previous surveys conducted between January 2009 and January 2024.
Understanding aria-valuemin and aria-valuemax
This article explains aria-valuemin and aria-valuemax in plain language. It shows how assistive technology can understand the boundaries of a range control.
CSS
Our CSS isn’t opinionated enough
For as long as I can remember, styling classes has always been pushed as “best practice” for writing CSS. Avoid IDs because they’re too specific. Avoid styling tags directly because it’s too broad.
You can’t get away from it. It’s even baked into most of the linting tools we use every day. It’s sensible advice, but I do think it has quietly trained several generations of developers to build things that look correct, yet communicate no semantics.
Fallbacks for CSS progress()
The new CSS progress() function calculates where a value sits between a start and end bound, returning a unitless number between 0 and 1.
While we wait for browser support to grow, we can manually calculate progress and use its underlying mechanics.
CSS does your tooltip positioning now
CSS can now handle tooltip and dropdown positioning without JavaScript. Learn how anchor positioning, popovers, and anchor-size() simplify UI.
Counting Elements in CSS: Using Sibling-Count and Hacks
You might think you can answer that with sibling-count() until you find out that it counts siblings and not children. We can always rely on :has() to create quantity queries selectors (I have a nice tool for that), but we cannot get the number of items as a value.
There is a proposal for children-count(), but it’s still in discussion, so we are far from any implementation. Until we get an official release, let’s do it.
Bringing Microsoft Internet Explorer’s proprietary “Interpage Transitions” back to Modern Browsers using the View Transition API
Back in late 2024, I started working on a fun end-of-year side project named ie-page-transitions. It”s a CSS + JS library that brings back Microsoft Internet Explorer’s proprietary “Interpage Transitions” to modern browsers, powered by the View Transition API. After sitting unfinished for a while, I finally got all 23 classic effects over the finish line and published the project on page-transitions.style.
JavaScript
React Forms and React.memo: Understanding What Actually Re-Renders
Controlled inputs, uncontrolled forms, validation, and practical render optimization in React.
LittleJS - Make games in the browser
LittleJS is a fast, lightweight, and fully open source HTML5 game engine designed for simplicity and performance. Its small footprint is packed with a comprehensive feature set including 2D and 3D rendering, physics, particles, sound, and input handling. The code is very clean and well documented with many examples to get you started quickly.
flight-indicators: SVG flight instruments for React
Modern SVG flight instruments for React, with no runtime dependencies.
- Thirteen instruments: Attitude, Heading, Airspeed, Altimeter, Vertical speed, Turn coordinator, VOR / CDI, Wind / runway, Fuel, Flaps, Angle of attack, Engine monitor and a custom Data panel for any readouts you like
- Pure SVG with no image files, so instruments stay sharp at any size and work with any bundler
- Written in TypeScript and ships its type declarations
- Ships ESM and CommonJS builds, works with server-side rendering, and is marked
"use client"for the Next.js App Router - Smooth CSS animation; the heading and roll take the shortest way round (359° → 1° moves 2°, not 358°)
- Bad input (
NaN,undefined, out of range) is clamped instead of breaking the drawing - Accessible: each instrument is an
role="img"with a live text label (e.g. "Altimeter: 12340 feet, 29.92 inHg")
Demo here.
2D Vehicle Physics Prototype
One weekend in late August 1996, I wrote a 2D physics simulation which later became the basis of the vehicle system in the eventually popular game "Grand Theft Auto" aka "GTA".
It began as a little wireframe demo written in GFA BASIC on my Atari ST home computer (and was later ported to C for use in the actual game).
I have recreated it here in JavaScript for its 30th anniversary in a slightly prettier, "remastered" form, for anyone who is interested in seeing or playing it.
Testing an iframe’s postMessage Handler
In this article I will build a small widget that asks its parent page to resize it, then attack it three ways. The messages will come from the wrong origin, from a sibling frame on the right origin, and with data that passes every naive check. Each attack gets a control in the demo, and the hardened handler logs whether the message was rejected, accepted, or clamped, with a reason.
Video.js v10 is GA
Video.js 10.0.0 is stable: a ground-up rebuild bringing together Video.js, Plyr, Vidstack, Media Chrome, and Mux Player, now with a redesigned install flow, Shadcn skin support, and an official skill for coding agents.
Miscellaneous
RuneIcons - Beautiful Icons for Your Next Project
An open-source icon library where every glyph comes in five styles: outline, duotone, fill, pixelated and glass. Reshape any path in the browser, then copy it out as SVG or JSX. Apache 2.0 licensed.
The 13 software engineering laws
Presents 13 “laws” as mental models for understanding why software projects and teams behave the way they do.
CVS Paid $20.5 Million for Code It Probably Forgot Was There
No breach. No hackers. Just the same tracking pixels sitting on almost every website on the internet, including, very likely, yours.
Frutjam - Accessible, CSS-Only Tailwind CSS Component Library for Fast Development
Free Tailwind v4 component library. 65+ CSS-only components, WCAG AA/AAA, zero JavaScript. Works with Django, HTMX, Laravel, React, and any stack.
Viewport Lab - Open-source multi-device responsive review and QA workspace for Chrome & Chromium browsers
Keep real websites alive inside multiple viewports with zero-reload geometry changes, deterministic QA audits, and an optional local MCP bridge for AI agents.
- Persistent Previews (Zero-Reload Invariant): Resizing, rotating, switching shells, adjusting workspace resolution, changing layouts, or zooming never unmounts or reloads the active website iframes.
- Side-by-Side Multi-Device Review: Preview up to 5 concurrent viewports simultaneously with accurate pixel ratios (Apple, Google, Samsung, Tablets, Laptops/Desktops, and Custom viewports).
- One-Click PNG Screenshots: Instantly capture and download pixel-perfect PNGs of any device or the complete review canvas directly from the UI.
- Local Dev Friendly: Smart URL normalizer detects
localhost, LAN IPs (192.168.x.x,10.x.x.x), and dev domains (.local,.test) without forcing HTTPS, plus auto-saved recent URL history. - Crisp vs. Fit Scaling:
- Crisp: Maximizes 1:1 pixel sharpness within the visible canvas.
- Fit: Proportionally scales all active viewports so the entire device fleet is visible at a glance.
- Deterministic Responsive QA Checks: Instantly detect horizontal layout overflow, clipped text, touch targets smaller than 44×44px, missing image
altattributes, and unlabelled form controls — no AI hallucinations, purely deterministic. - CSS Breakpoint Discovery Ruler: Automatically parses stylesheets on the previewed page and places interactive pins on an inspection ruler for every
@media (min-width / max-width)breakpoint. - Responsive Sweep Slider: Scrub continuously across 240px to 1440px to catch layout shifts and breaking points in real time.
- Declarative Compatibility Mode: Safely bypasses
X-Frame-Optionsandframe-ancestorsCSP headers on preview subframes using Manifest V3declarativeNetRequestsession rules — without compromising top-level browser security. - Synchronized Navigation & Smooth Scroll: Relative lockstep navigation with 60/120fps
requestAnimationFramethrottled scroll synchronization, echo suppression, and trailing alignment. - Local Workspaces: Save and restore complex device setups directly in
chrome.storage.local. - Optional Local MCP Bridge: Connect Claude Code, Antigravity, Cursor, or any Model Context Protocol agent to inspect, sweep, click, fill, or screenshot viewports on
127.0.0.1. - 100% Local & Auditable: Zero remote scripts, zero CDNs, zero analytics, zero backend.
Upfling.host · Instant Static Site Hosting
Upload HTML, CSS, and JS, or drag a whole folder. Get a live website with SSL on a shareable URL in seconds. No setup, no config, no code.