The blog

Writing from the workshop

119 articles on the parts that actually hurt.

section
Your `margin-left` doesn't exist in Arabic. CSS logical properties fix that.
CSS

Your margin-left doesn't exist in Arabic. CSS logical properties fix that.

Physical CSS properties like `margin-left` and `padding-right` break silently when a layout needs to support right-to-left languages. Logical properties replace the physical axis with a writing-mode-aware model — one codebase, every direction.

Jul 17, 2026 · 5 min
Your CSS Grid cards look misaligned. `subgrid` is the fix you didn't know existed.
CSS

Your CSS Grid cards look misaligned. subgrid is the fix you didn't know existed.

CSS Grid controls your outer container, but its children can't participate in the same tracks. `subgrid` closes that gap — nested elements align to the parent grid's rows and columns without padding hacks, fixed heights, or JavaScript measurements.

Jul 16, 2026 · 4 min
Your `.sort()` is mutating state. JavaScript finally gave you the fix.
JavaScript

Your .sort() is mutating state. JavaScript finally gave you the fix.

The classic array methods — sort, reverse, splice — mutate the original array, silently breaking React state updates and surprising anyone who forgot to spread first. ES2023 added four immutable counterparts: toSorted, toReversed, toSpliced, and with.

Jul 15, 2026 · 5 min
You've been writing this `reduce` a hundred times. `Object.groupBy` does it in one.
JavaScript

You've been writing this reduce a hundred times. Object.groupBy does it in one.

Grouping an array by a key is one of the most common data transforms in frontend code. You've been wiring it by hand with `reduce` for years. `Object.groupBy` is the native version — no helper, no library, no ceremony.

Jul 14, 2026 · 4 min
JavaScript Event Loop Explained: The Complete Guide
JavaScript

JavaScript Event Loop Explained: The Complete Guide

Learn how the JavaScript event loop really works — call stack, microtasks, and macrotasks — with worked examples, edge cases, and a cheat sheet.

Jul 13, 2026 · 13 min
You reach for `Promise.all` for every concurrent request. Here's when to use the other three.
JavaScript

You reach for Promise.all for every concurrent request. Here's when to use the other three.

`Promise.all` fails the moment any one request fails. `allSettled`, `any`, and `race` each solve a different concurrency problem — dashboard partial results, CDN failover, and timeouts. Here's the taxonomy.

Jul 13, 2026 · 5 min
Your dropdown is a div. The browser has a native popover now.
JavaScript

Your dropdown is a div. The browser has a native popover now.

Custom dropdowns, tooltips, and menus built with stacked divs and click-outside listeners — the Popover API landed in every browser in 2024, and the baseline version is two HTML attributes.

Jul 12, 2026 · 4 min
Your TypeScript config objects are losing type information. `satisfies` fixes it.
TypeScript

Your TypeScript config objects are losing type information. satisfies fixes it.

Type annotations widen your object types and erase the precise values TypeScript inferred. The `satisfies` operator validates against a type without changing what TypeScript keeps — you get the check without the widening.

Jul 11, 2026 · 5 min
You've been deep-cloning objects with a JSON hack. `structuredClone` does it right.
JavaScript

You've been deep-cloning objects with a JSON hack. structuredClone does it right.

JSON.parse(JSON.stringify(obj)) silently corrupts Dates, Maps, Sets, and undefined values. structuredClone is the native replacement — no library, no import, no surprises.

Jul 10, 2026 · 4 min
You kept Sass for one reason. Native CSS nesting just ended it.
CSS

You kept Sass for one reason. Native CSS nesting just ended it.

CSS has supported nesting natively since 2023 — pseudo-classes, pseudo-elements, and @media queries nested inside the rules they belong to. No compiler required.

Jul 9, 2026 · 4 min
You can't transition a CSS variable. @property says otherwise.
CSS

You can't transition a CSS variable. @property says otherwise.

CSS custom properties are string substitution — the browser doesn't know a number from a color. Register one with @property and it gains a real type, an initial value, and the ability to animate.

Jul 8, 2026 · 5 min
Your scroll listener is doing CSS's job
CSS

Your scroll listener is doing CSS's job

Reading progress bars, reveal-on-scroll effects, parallax — you've been writing these in JavaScript. CSS scroll-driven animations bind them directly to scroll position, off the main thread, in a handful of lines.

Jul 6, 2026 · 5 min