Skip to content

Form Validation Timing: From Blur to aria-invalid

I was building a signup form. The moment I focused the email field, an error popped up: “Invalid email format.” I hadn’t typed a single character yet. The password confirmation field was the opposite. I typed the whole password, submitted the form, and only then did it say “Passwords don’t match” — after I’d already finished typing. Then I hit submit, and seven error messages showed up all at once. ...

Published date: 2026-09-15 · Reading time: 19 min · Word count: 4028 words · Author: Isaac

Safari 27 Fixed top-level await — Retested, and Loading Doubled

Safari’s top-level await bug was reported back in July 2022 (WebKit bug 242740), and by October 2025 it had gotten bad enough that top-level await dropped to “Limited” on Baseline (the cross-browser support signal for web platform features). The fix merged in April 2026, shipped starting with Safari Technology Preview 243 in May, and on September 2 the WebKit team posted the postmortem: Fixing top-level await in Safari. ...

Published date: 2026-09-03 · Reading time: 13 min · Word count: 2557 words · Author: Isaac

?? vs ||: Why Your Zero Keeps Disappearing

The decisive difference between the nullish coalescing operator (??) and || — it's why 0 and empty strings get swallowed by defaults. Falsy traps, ??= assignment, optional chaining combos, and why mixing the two throws a SyntaxError.

Published date: 2026-07-14 · Updated 2026-07-17 · Reading time: 9 min · Word count: 1835 words · Author: Isaac

Promise.all vs Promise.allSettled: The Difference That Matters

One failing Promise can take down your entire dashboard. Compare Promise.all and Promise.allSettled with real-world examples, and learn when to use which.

Published date: 2026-04-08 · Updated 2026-07-17 · Reading time: 8 min · Word count: 1489 words · Author: Isaac

Function Declarations vs Expressions: Hoisting Explained

Learn the difference between function declarations and expressions, how hoisting works under the hood, and when to use arrow functions in practice.

Published date: 2026-04-04 · Reading time: 11 min · Word count: 2197 words · Author: Isaac

Improving Multilingual Blog UX: Building a Smart Language Suggestion Banner

Introduction Running a blog in both Korean and English revealed an interesting problem. When sharing blog links internationally, visitors often land on the Korean page. Those who can’t read Korean are confused, right? Similarly, when Korean readers click on English post links shared in Korean communities, they face the same issue. While there’s a language switcher button in the header, new visitors often struggle to find it. This isn’t user-friendly, and from an accessibility perspective, it’s not ideal either. ...

Published date: 2026-01-23 · Reading time: 9 min · Word count: 4166 words · Author: Isaac

Building a Dynamic Comment System on a Static Site: Giscus + GraphQL API

Introduction Blogs built with Static Site Generators (SSG) are incredibly fast and secure. However, adding dynamic features like comments requires careful consideration. This blog uses Giscus, a GitHub Discussions-based comment system, but there was one inconvenience. Comments only appear at the bottom of each post, making it difficult to see at a glance which articles have active discussions. So I built three features: Display comment counts in post lists - See which articles have ongoing conversations Show recent comments on the explore page - View recent blog activity at a glance Create an all comments page - Browse all comments in one place This article shares the process of bringing dynamic comment information to a static site using GitHub GraphQL API while maintaining optimal performance. ...

Published date: 2026-01-16 · Reading time: 10 min · Word count: 4901 words · Author: Isaac

Code Block Accessibility Improvement: Line Numbers That Screen Reader Users Can Choose

Introduction Recently, I started building and operating a blog using Hugo with the PaperMod theme. Using someone else’s theme has the advantage of quick setup, but not everything fits my needs perfectly. After customizing many parts to match my preferences, I noticed some issues with the code blocks. Line numbers were implemented with <table> tags. While this doesn’t violate accessibility guidelines, it felt not semantic. Moreover, I wondered: what’s the experience for screen reader users? I found a better approach using CSS Counters. ...

맨 위로