<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>W3Tweaks</title><description>Free frontend development tutorials for CSS, JavaScript, HTML, PHP and more.</description><link>https://www.w3tweaks.com/</link><language>en-us</language><item><title>Promise.try &amp; Promise.withResolvers: Cleaner Async (Live Demos)</title><link>https://www.w3tweaks.com/javascript/javascript-promise-try-withresolvers/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-promise-try-withresolvers/</guid><description>Two small ES2026 promise utilities fix two long-standing annoyances. Promise.try runs any function — sync or async — and funnels a synchronous throw into .catch() instead of letting it escape and crash your app (which is exactly the class of bug that shows up in Sentry, Datadog, Rollbar every week). Promise.withResolvers hands you the promise and its resolve/reject in one line, so you can settle it from an event listener without the old closure dance — the killer use case being WebSocket request/response correlation. Live demos, plus TypeScript typing, runtime support (Node 22, Bun, Deno, Vercel Edge, Cloudflare Workers), and the anti-patterns you should skip.</description><pubDate>Thu, 27 Aug 2026 03:30:00 GMT</pubDate><category>javascript</category><category>promise.try</category><category>promise.withresolvers</category><category>promises</category><category>async await</category><category>error handling</category><category>deferred promise</category><category>es2025</category><category>es2026</category><category>microtask</category><category>event driven</category><category>websocket rpc</category><category>web workers</category><category>comlink</category><category>socket.io</category><category>typescript</category><category>node 22</category><category>bun</category><category>deno</category><category>sentry</category><category>datadog</category><category>vitest</category><category>playwright</category><category>openai</category><category>vercel ai sdk</category></item><item><title>The Viewport Meta Tag — Mobile-First, Safe Areas &amp; dvh</title><link>https://www.w3tweaks.com/html/viewport-meta-tag-mobile-first/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/viewport-meta-tag-mobile-first/</guid><description>One line of HTML decides whether your site renders at phone width or as a zoomed-out desktop page nobody can read. This guide covers the viewport meta tag properly — the accessibility rules that forbid disabling zoom (WCAG 1.4.4), viewport-fit=cover and safe-area-inset for notches, the keyboard-aware interactive-widget property, dvh/svh/lvh units that finally fix the 100vh mobile bug, framework integration (Next.js viewport export, Nuxt, SvelteKit, Astro), how the tag impacts Core Web Vitals (CLS, LCP, INP), foldable-device behavior, and iPad multitasking. Google&apos;s mobile-first indexing basically requires the tag; get it wrong and you tank your mobile rankings across every tier-1 market.</description><pubDate>Thu, 27 Aug 2026 00:30:00 GMT</pubDate><category>viewport meta tag</category><category>mobile-first</category><category>responsive design</category><category>width device-width</category><category>viewport-fit cover</category><category>safe-area-inset</category><category>dvh svh lvh</category><category>dynamic viewport units</category><category>100vh bug</category><category>user-scalable</category><category>interactive-widget</category><category>visualViewport</category><category>notch</category><category>wcag 1.4.4</category><category>mobile viewport</category><category>core web vitals</category><category>cls</category><category>inp</category><category>next.js viewport export</category><category>playwright mobile</category><category>browserstack</category><category>google mobile-first indexing</category><category>shopify mobile</category><category>foldable devices</category><category>ipad multitasking</category></item><item><title>CSS color-mix(): Native Color Blending That Retires Your Sass Pipeline</title><link>https://www.w3tweaks.com/css/css-color-mix-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-color-mix-explained/</guid><description>color-mix() blends two colors natively, at runtime, in the color space you choose — replacing Sass lighten(), darken(), mix(), rgba() and entire palette maps with a function that works on custom properties and recomputes when your brand color changes. This is why Tailwind 4 uses it under the hood, why Radix Colors and Open Props teams recommend it, and why Shopify Polaris / Auth0 / Intercom white-label systems can now ship one stylesheet per tenant instead of one per brand. This guide covers the syntax, color-space decisions, one-token palette generation, the silent oklch gamut trap, dark mode pairing with light-dark(), Figma-to-CSS handoff, and every sharp edge in between.</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><category>css</category><category>color-mix</category><category>oklch</category><category>color spaces</category><category>design tokens</category><category>theming</category><category>sass</category><category>palette generation</category><category>hue interpolation</category><category>relative color syntax</category><category>dark mode</category><category>accessibility</category><category>tailwind css 4</category><category>figma variables</category><category>radix colors</category><category>open props</category><category>material design 3</category><category>light-dark</category><category>white label</category><category>shopify polaris</category><category>panda css</category><category>vanilla extract</category><category>stylex</category><category>tokens studio</category></item><item><title>Array.fromAsync: Async Iterables to Arrays (With Live Race Demo)</title><link>https://www.w3tweaks.com/javascript/javascript-array-fromasync/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-array-fromasync/</guid><description>Array.fromAsync turns any async iterable — an async generator, a stream, a paginated API, an OpenAI/Anthropic streaming response — into an array with a single await. But it is not a drop-in Promise.all: it awaits each value sequentially and lazily, which is exactly right for rate-limited APIs and exactly wrong for 100 independent calls. This guide has a live race demo so you can watch sequential vs parallel fire in real time, plus AbortController cancellation, bounded-concurrency batching, TypeScript typing, and runtime support across Node 22, Bun, Deno, Vercel Edge, and Cloudflare Workers.</description><pubDate>Tue, 04 Aug 2026 03:00:00 GMT</pubDate><category>javascript</category><category>array.fromasync</category><category>async iterables</category><category>async generators</category><category>promise.all</category><category>async await</category><category>es2026</category><category>sequential</category><category>concurrency</category><category>streams</category><category>rate limiting</category><category>abortcontroller</category><category>typescript</category><category>node 22</category><category>bun</category><category>deno</category><category>vercel edge</category><category>cloudflare workers</category><category>openai streaming</category><category>vercel ai sdk</category><category>backpressure</category><category>p-limit</category><category>tanstack query</category><category>swr</category><category>prisma</category><category>supabase</category></item><item><title>CSS Subgrid: Nested Grids That Actually Align (The Card Fix)</title><link>https://www.w3tweaks.com/css/css-subgrid-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-subgrid-explained/</guid><description>For a decade, aligning content across sibling cards meant min-height hacks or JavaScript equalizers — nested grids can&apos;t see each other&apos;s tracks. Subgrid ends that: a grid item adopts its parent&apos;s track sizing, so titles, bodies, and buttons snap into shared rows no matter how content varies. This guide covers the card fix, form label alignment, pricing tables, subgrid + container queries, Tailwind and CSS Modules patterns, DevTools debugging across all three browsers, and the gotchas — no implicit tracks, the padding trap, and gap inheritance.</description><pubDate>Tue, 04 Aug 2026 02:30:00 GMT</pubDate><category>css</category><category>subgrid</category><category>css grid</category><category>grid-template-rows</category><category>grid-template-columns</category><category>card layout</category><category>form alignment</category><category>named grid lines</category><category>nested grid</category><category>layout</category><category>grid level 2</category><category>pricing table</category><category>container queries</category><category>tailwind subgrid</category><category>masonry</category><category>grid level 3</category><category>design system</category><category>storybook</category><category>figma</category></item><item><title>Web App Manifest — Make Your Site an Installable PWA</title><link>https://www.w3tweaks.com/html/web-app-manifest-installable-pwa/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/web-app-manifest-installable-pwa/</guid><description>A single JSON file turns your website into an installable app with its own icon, splash screen, and standalone window. This guide covers the required manifest fields, maskable icons and the safe zone, a custom install button, iOS caveats, and the four members that unlock the OS deep-integration nobody talks about — file_handlers, share_target, protocol_handlers, and launch_handler — plus how to ship your PWA into Google Play and the Microsoft Store.</description><pubDate>Tue, 04 Aug 2026 02:00:00 GMT</pubDate><category>web app manifest</category><category>pwa</category><category>progressive web app</category><category>manifest.json</category><category>installable</category><category>maskable icons</category><category>beforeinstallprompt</category><category>display standalone</category><category>apple-touch-icon</category><category>start_url</category><category>theme_color</category><category>display_override</category><category>service worker</category><category>add to home screen</category><category>web push ios</category><category>share_target</category><category>file_handlers</category><category>protocol_handlers</category><category>bubblewrap</category><category>pwabuilder</category><category>twa</category><category>launch_handler</category><category>pwa analytics</category></item><item><title>Resource Hints — preload, prefetch, preconnect &amp; Speculation Rules</title><link>https://www.w3tweaks.com/html/resource-hints-preload-prefetch-preconnect/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/resource-hints-preload-prefetch-preconnect/</guid><description>One line of HTML can tell the browser to resolve a DNS lookup, warm a connection, or fetch a critical file before the parser even finds it. But a font preload without crossorigin silently downloads twice, over-preloading delays your LCP, and rel=prerender is dead. This guide maps all five hints to network phases, covers the fetchpriority attribute in full, the direct LCP/INP Core Web Vitals impact (measurable in Search Console), CDN/edge auto-hints via 103 Early Hints, framework auto-hints for Next.js/Astro/Nuxt/SvelteKit, an audit of anti-patterns to remove, and the Speculation Rules API that replaced prerender.</description><pubDate>Tue, 28 Jul 2026 03:00:00 GMT</pubDate><category>resource hints</category><category>preload</category><category>prefetch</category><category>preconnect</category><category>dns-prefetch</category><category>modulepreload</category><category>speculation rules</category><category>fetchpriority</category><category>web performance</category><category>core web vitals</category><category>lcp optimization</category><category>early hints</category><category>crossorigin</category><category>prerender</category><category>page speed</category><category>cloudflare early hints</category><category>vercel prefetch</category><category>next.js link prefetch</category><category>cdn resource hints</category></item><item><title>JavaScript Iterator Helpers: Lazy map/filter/take (With Live Tracer)</title><link>https://www.w3tweaks.com/javascript/javascript-iterator-helpers/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-iterator-helpers/</guid><description>Chaining .map().filter() on an array processes every element and builds a throwaway array at each step. Iterator helpers do it lazily — they process only what you actually consume, which means you can run map/filter/take on an infinite sequence without crashing the tab. This guide has a live execution tracer, real bundle-size numbers vs lodash, the one-shot exhaustion gotcha, the async gap and what to do about it today, streaming fetch response bodies, TypeScript types, and the Iterator.from() vs .values() decision.</description><pubDate>Tue, 28 Jul 2026 02:30:00 GMT</pubDate><category>javascript</category><category>iterator helpers</category><category>iterators</category><category>lazy evaluation</category><category>generators</category><category>map filter take</category><category>es2025</category><category>es2026</category><category>infinite sequence</category><category>performance</category><category>lodash</category><category>async iterator helpers</category><category>fetch response streaming</category><category>typescript iterator</category><category>node 22 iterator helpers</category><category>Iterator.from</category></item><item><title>CSS Scroll-Driven Animations: scroll(), view() &amp; Zero JavaScript</title><link>https://www.w3tweaks.com/css/css-scroll-driven-animations-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-scroll-driven-animations-explained/</guid><description>Scroll-driven animations replace scroll listeners, IntersectionObserver reveals, and parallax libraries with pure CSS that runs off the main thread. Swap an animation&apos;s clock for a scroll position with animation-timeline, map it to an element&apos;s visibility with view() and animation-range, and ship it safely with the golden progressive-enhancement pattern. Plus horizontal-carousel timelines, view-timeline-inset for early/late triggering, @property-driven color and gradient scrubbing, and the direct INP/Core Web Vitals ranking benefit.</description><pubDate>Tue, 28 Jul 2026 02:00:00 GMT</pubDate><category>css</category><category>scroll-driven animations</category><category>animation-timeline</category><category>scroll()</category><category>view()</category><category>animation-range</category><category>parallax</category><category>scroll animations</category><category>intersection observer</category><category>performance</category><category>prefers-reduced-motion</category><category>@property scroll animation</category><category>horizontal scroll timeline</category><category>view-timeline-inset</category><category>gsap scrolltrigger alternative</category><category>inp core web vital</category></item><item><title>The Temporal API: Finally Fixing JavaScript Dates (With Live Playground)</title><link>https://www.w3tweaks.com/javascript/javascript-temporal-api/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-temporal-api/</guid><description>JavaScript&apos;s Date object has been broken for thirty years — mutable, zero-indexed months, and timezone handling that changes between browsers. The Temporal API fixes all of it. This guide has a live playground: watch Date mutate under you while Temporal stays frozen, pick the right type for any job, handle DST ambiguity with earlier/later/reject instead of silent wrong answers, plus a bundle-size showdown vs moment/date-fns/dayjs/Luxon, moment.js migration recipes, the definitive Instant-vs-ZonedDateTime storage pattern for backends, TypeScript patterns, and the Node.js/edge runtime support matrix.</description><pubDate>Tue, 21 Jul 2026 03:55:00 GMT</pubDate><category>javascript</category><category>temporal api</category><category>temporal</category><category>dates</category><category>timezones</category><category>zoneddatetime</category><category>plaindate</category><category>duration</category><category>es2026</category><category>date replacement</category><category>dst</category><category>moment.js migration</category><category>date-fns comparison</category><category>@js-temporal/polyfill</category><category>instant storage</category><category>node 24 temporal</category><category>cloudflare workers temporal</category><category>typescript temporal</category></item><item><title>CSS @layer: Cascade Layers That End the Specificity Wars</title><link>https://www.w3tweaks.com/css/css-cascade-layers-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-cascade-layers-explained/</guid><description>Cascade layers let you declare which groups of styles win — independent of selector specificity. A one-line @layer declaration replaces years of specificity hacks and !important escalation. This guide covers the full system: layer ordering, why unlayered styles beat every layer (the Tailwind v4 upgrade bug), the mind-bending !important reversal, taming third-party CSS with @import layer(), nested layers, revert-layer, Shadow DOM&apos;s independent layer graph, design system layer contracts for Radix/shadcn/MUI/Chakra, the empty-layer reservation pattern for code-split apps, and the migration path that can&apos;t break anything.</description><pubDate>Tue, 21 Jul 2026 03:45:00 GMT</pubDate><category>css</category><category>@layer</category><category>cascade layers</category><category>specificity</category><category>!important</category><category>tailwind</category><category>tailwind v4</category><category>css architecture</category><category>revert-layer</category><category>@import layer</category><category>third-party css</category><category>shadow dom layers</category><category>design system layers</category><category>empty layer reservation</category><category>@scope layers</category><category>css-in-js layers</category></item><item><title>Schema Markup &amp; Structured Data — JSON-LD That Actually Works</title><link>https://www.w3tweaks.com/html/schema-markup-structured-data-json-ld/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/schema-markup-structured-data-json-ld/</guid><description>Schema markup tells Google and AI engines exactly what your content means, not just what it says. This guide covers JSON-LD by type with required properties, the content-parity rule that keeps you off Google&apos;s manual-action list, the @graph entity pattern, sameAs for the Knowledge Graph, the current reality after FAQ and HowTo rich results were removed, plus Recipe/LocalBusiness/JobPosting deep-dives, the Merchant Listings shipping+returns update, the HowTo migration path, and the CMS-schema-drift trap that breaks WordPress sites.</description><pubDate>Tue, 21 Jul 2026 03:30:00 GMT</pubDate><category>schema markup</category><category>structured data</category><category>json-ld</category><category>rich results</category><category>article schema</category><category>faqpage schema</category><category>product schema</category><category>breadcrumblist</category><category>sameAs</category><category>knowledge graph</category><category>schema.org</category><category>rich snippets</category><category>ai overviews</category><category>entity seo</category><category>@graph</category><category>recipe schema</category><category>localbusiness schema</category><category>jobposting schema</category><category>merchant listings</category><category>howto migration</category><category>cms schema drift</category></item><item><title>Meta Tags for SEO &amp; Social — Open Graph, Twitter Cards &amp; SERP</title><link>https://www.w3tweaks.com/html/meta-tags-seo-open-graph-twitter-cards/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/meta-tags-seo-open-graph-twitter-cards/</guid><description>A dozen lines in the &lt;head&gt; decide whether your link shows a rich card with a wide image or a bare blue URL nobody clicks. This guide covers the SEO title and description, Open Graph and Twitter Card tags, the absolute-URL trap that silently breaks previews, pixel-width truncation, how to force a re-scrape when the old preview won&apos;t update, how Perplexity/ChatGPT/Google AI Overviews use your tags for citations, Article JSON-LD paired with meta, dynamic OG image generation, per-platform unfurl quirks (Discord/Slack/WhatsApp/iMessage/Bluesky/Mastodon), Google Discover eligibility, and the canonical + noindex conflict.</description><pubDate>Sat, 11 Jul 2026 03:00:00 GMT</pubDate><category>meta tags</category><category>open graph</category><category>twitter cards</category><category>og:image</category><category>seo meta tags</category><category>social sharing</category><category>summary_large_image</category><category>meta description</category><category>title tag</category><category>canonical url</category><category>robots meta</category><category>serp snippet</category><category>link preview</category><category>social card</category><category>charset viewport</category><category>ai search meta tags</category><category>google discover</category><category>article json-ld</category><category>vercel og image</category><category>hreflang</category><category>max-image-preview large</category></item><item><title>requestAnimationFrame: Smooth 60fps Animation (With Live FPS Demo)</title><link>https://www.w3tweaks.com/javascript/javascript-requestanimationframe-60fps/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-requestanimationframe-60fps/</guid><description>Every requestAnimationFrame tutorial claims it is smoother than setInterval, but none show it happening. This guide runs rAF and setInterval side by side with live FPS counters, then reveals the bug nobody demos: fixed-per-frame animation runs twice as fast on a 144Hz screen. Fix it live with delta time, cap the frame rate, kill the cancelAnimationFrame memory leak, plus WAAPI vs rAF decisions, the React useAnimationFrame hook, Chrome DevTools + Long Animation Frames API for INP debugging, IntersectionObserver-gated loops, and prefers-reduced-motion accessibility.</description><pubDate>Sat, 11 Jul 2026 02:30:00 GMT</pubDate><category>javascript</category><category>requestanimationframe</category><category>animation</category><category>60fps</category><category>delta time</category><category>cancelanimationframe</category><category>setinterval</category><category>frame rate</category><category>canvas</category><category>game loop</category><category>performance</category><category>144hz</category><category>web animations api</category><category>react useanimationframe</category><category>long animation frames</category><category>inp core web vital</category><category>intersection observer animation</category><category>prefers-reduced-motion</category><category>offscreencanvas worker</category></item><item><title>Native CSS Nesting: Sass Syntax With No Build Step (And One Big Trap)</title><link>https://www.w3tweaks.com/css/css-nesting-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-nesting-explained/</guid><description>Native CSS nesting brings Sass-style nested rules to the browser with zero build step — and it&apos;s Baseline in every evergreen browser. But it isn&apos;t a Sass clone: the parent selector gets wrapped in :is(), which silently changes specificity in ways that break Sass habits; &amp;__ concatenation doesn&apos;t exist; and bare compound selectors gain an unwanted space. This guide covers every &amp; placement, nesting at-rules inside components, the honest Sass migration map, plus @scope pairing, Tailwind v4 native output, @starting-style composition, the .vue/.svelte/.astro scoped-CSS interaction, and the &amp; + &amp; flow-content pattern.</description><pubDate>Sat, 11 Jul 2026 02:00:00 GMT</pubDate><category>css</category><category>css nesting</category><category>native nesting</category><category>&amp; selector</category><category>sass</category><category>scss</category><category>specificity</category><category>:is()</category><category>css architecture</category><category>preprocessor</category><category>migration</category><category>@scope nesting</category><category>tailwind v4 nesting</category><category>@starting-style nesting</category><category>vue scoped nesting</category><category>postcss-nesting</category><category>sibling flow content</category></item><item><title>CSS :has() Selector: The Parent Selector, Explained With Live Demos</title><link>https://www.w3tweaks.com/css/css-has-selector-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-has-selector-explained/</guid><description>For twenty years, a parent selector was the most requested CSS feature — and :has() finally delivered it. Style a card because it contains an image, select the element before a hovered one, restyle a grid by how many children it holds, build form validation and dark mode toggles with zero JavaScript. This guide covers every pattern plus the specificity trap, the no-nesting rule, the two-negatives (`:not(:has())` vs `:has(:not())`) confusion, CSS-only tabs, `&lt;details&gt;` accordions, state-machine buttons, the shadow-DOM scope boundary, and the performance constraints that matter.</description><pubDate>Sat, 04 Jul 2026 01:30:00 GMT</pubDate><category>css</category><category>:has()</category><category>parent selector</category><category>previous sibling</category><category>quantity queries</category><category>form validation</category><category>dark mode</category><category>css selectors</category><category>specificity</category><category>pseudo-class</category><category>css tabs no javascript</category><category>details accordion</category><category>shadow dom scope</category><category>state machine css</category><category>not has vs has not</category><category>tailwind has variant</category></item><item><title>The File System Access API — Save to Disk, Directories &amp; OPFS</title><link>https://www.w3tweaks.com/html/file-system-access-api-save-to-disk/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/file-system-access-api-save-to-disk/</guid><description>The File System Access API lets a web app edit a real file on disk and save changes back in place — the thing that makes an in-browser editor feel native. This guide covers open/save/Save-As, reading directories, atomic writes, persisting handles across sessions, OPFS with SQLite-WASM, the new File System Observer API for watching external changes, drag-drop into directory handles, keepExistingData for random-access edits, PWA file_handlers for OS-level &apos;Open with&apos;, and the honest Firefox/Safari fallback story.</description><pubDate>Sun, 28 Jun 2026 00:45:00 GMT</pubDate><category>file system access api</category><category>showOpenFilePicker</category><category>showSaveFilePicker</category><category>showDirectoryPicker</category><category>createWritable</category><category>FileSystemFileHandle</category><category>save to disk web app</category><category>origin private file system</category><category>OPFS</category><category>persist file handle</category><category>queryPermission</category><category>in-browser editor</category><category>atomic write</category><category>file system fallback</category><category>createSyncAccessHandle</category><category>file system observer</category><category>sqlite wasm opfs</category><category>keepExistingData</category><category>file_handlers manifest</category><category>isSameEntry</category><category>browser-fs-access</category></item><item><title>Polling vs WebSockets vs SSE: The Real-Time Guide</title><link>https://www.w3tweaks.com/javascript/javascript-polling-websockets-sse/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-polling-websockets-sse/</guid><description>Everyone defaults to WebSockets for real-time. Most shouldn&apos;t. This guide runs polling, WebSockets, and Server-Sent Events in a live side-by-side simulator so you can see polling waste requests, SSE stream over one HTTP connection, and WebSockets talk both ways. Plus Node.js ws server code, socket.io vs raw WS, LLM streaming with Fetch + ReadableStream, WebSocket authentication, serverless timeout limits (Vercel, Netlify, Cloudflare Workers), pub/sub scaling with Redis, jittered reconnection backoff, and the production bugs — proxy buffering, HTTP/1.1 six-connection limit, silent WebSocket death — that bite every team.</description><pubDate>Sun, 28 Jun 2026 00:30:00 GMT</pubDate><category>javascript</category><category>websockets</category><category>server-sent events</category><category>sse</category><category>polling</category><category>long polling</category><category>real-time</category><category>eventsource</category><category>websocket reconnection</category><category>llm streaming</category><category>http/2</category><category>socket.io</category><category>ws nodejs</category><category>websocket authentication</category><category>cloudflare durable objects</category><category>vercel sse timeout</category><category>redis pubsub</category><category>reconnection backoff</category><category>sticky sessions</category></item><item><title>The Clipboard API — Copy, Paste, Images &amp; the Safari Trap</title><link>https://www.w3tweaks.com/html/clipboard-api-copy-paste-images/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/clipboard-api-copy-paste-images/</guid><description>navigator.clipboard.writeText() is one line — but the moment you copy an image or await a fetch before writing, Safari rejects with NotAllowedError because the await broke the user gesture. This guide covers the whole API, the promise-value fix for Safari, ClipboardItem.supports, reading images, the iframe sandbox + Permissions-Policy gotcha that breaks copy in embeds, intercepting the copy event, pasting Excel/Sheets data, accessibility, and a full error-name cheat-sheet.</description><pubDate>Fri, 26 Jun 2026 00:30:00 GMT</pubDate><category>clipboard api</category><category>navigator.clipboard</category><category>writeText</category><category>readText</category><category>ClipboardItem</category><category>copy to clipboard</category><category>clipboard api safari</category><category>clipboard permissions</category><category>copy image javascript</category><category>async clipboard</category><category>clipboardchange</category><category>execCommand fallback</category><category>paste image</category><category>copy button</category><category>secure context</category><category>clipboard iframe sandbox</category><category>permissions-policy</category><category>paste from excel</category><category>clipboardData setData</category><category>clipboard accessibility</category><category>transient activation</category><category>notallowederror</category></item><item><title>Why this Is Undefined in JavaScript: The 4 Binding Rules</title><link>https://www.w3tweaks.com/javascript/javascript-this-is-undefined/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-this-is-undefined/</guid><description>this is undefined is the most-Googled JavaScript bug for a reason: this is decided by HOW a function is called, not where it&apos;s defined. This guide has a live resolver — pick a call site and watch this walk the four binding rules in priority order to its final value. Plus the same function getting six different this values, three classic context-loss bugs, ES module quirks, globalThis, event handlers, forEach thisArg, destructured methods, and TypeScript this parameters.</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><category>javascript</category><category>this</category><category>this binding</category><category>arrow functions</category><category>call apply bind</category><category>strict mode</category><category>method</category><category>context</category><category>setTimeout this</category><category>lost context</category><category>globalthis</category><category>es modules</category><category>event handler this</category><category>foreach thisarg</category><category>react class binding</category><category>destructured method</category><category>typescript this parameter</category></item><item><title>CSS clamp(): Fluid Typography, Spacing &amp; Layouts in One Line</title><link>https://www.w3tweaks.com/css/css-clamp-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-clamp-explained/</guid><description>The complete CSS clamp() guide — fluid typography with the rem + vw formula, the min/max/clamp family, line length with ch units, WCAG 200% zoom requirement, fluid spacing tokens, container query units (cqi), dynamic viewport units (dvw) for iOS, the var() inside clamp myth, fluid line-height, aspect-ratio + clamp, Tailwind v4 / Open Props built-ins, Utopia.fyi generator, and the min &gt; max gotcha.</description><pubDate>Thu, 25 Jun 2026 20:00:00 GMT</pubDate><category>css clamp</category><category>css clamp example</category><category>css clamp font-size</category><category>css fluid typography</category><category>css fluid typography formula</category><category>css clamp min max difference</category><category>fluid type scale</category><category>ch unit css</category><category>clamp css browser support</category><category>rem vs vw clamp</category><category>utopia.fyi fluid</category><category>container query units cqw</category><category>dynamic viewport units dvw</category><category>css fluid spacing tokens</category><category>fluid line-height</category><category>clamp aspect-ratio</category><category>no media queries</category></item><item><title>JavaScript Closures: Every Use Case Explained (Live Demos)</title><link>https://www.w3tweaks.com/javascript/javascript-closures-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-closures-explained/</guid><description>JavaScript closures explained with live, runnable demos. Backpack mental model, lexical scoping, the var-vs-let loop trap, 5 production patterns (counter, currying, memoize, once, module), the over-capture memory leak, stale closures in React useEffect and async setInterval, #private class fields vs closures, WeakMap memoization for object keys, interview questions (debounce/curry/compose), arrow vs regular vs .bind() for this, and WeakRef + using for cleanup.</description><pubDate>Sat, 13 Jun 2026 19:00:00 GMT</pubDate><category>javascript closures</category><category>javascript closure example</category><category>what is a closure javascript</category><category>javascript closure interview question</category><category>javascript closure memory leak</category><category>javascript closure counter</category><category>javascript currying closure</category><category>javascript memoize closure</category><category>module pattern javascript</category><category>var let closure loop</category><category>stale closure react</category><category>closure vs class javascript</category><category>private variables javascript</category><category>javascript closure async</category><category>lexical scope</category><category>weakmap memoization</category><category>private class fields</category><category>useeffect stale closure</category></item><item><title>Intersection Observer API: Scroll, Lazy Load &amp; Scrollspy</title><link>https://www.w3tweaks.com/html/intersection-observer-api-scroll-detection/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/intersection-observer-api-scroll-detection/</guid><description>The complete Intersection Observer API guide — threshold, rootMargin, isIntersecting vs intersectionRatio, scroll reveal, lazy load, infinite scroll, scrollspy. Plus CSS scroll-driven animations (animation-timeline: view()) as the modern alternative, content-visibility composition, IntersectionObserver v2 trackVisibility for ad viewability, the sticky header sentinel pattern, React useInView and Vue useIntersectionObserver hooks, Next.js/Astro SSR guards, jsdom polyfill, the Observer family comparison, takeRecords(), and Element.checkVisibility().</description><pubDate>Sat, 13 Jun 2026 18:00:00 GMT</pubDate><category>intersection observer api</category><category>intersection observer example</category><category>intersection observer threshold</category><category>intersection observer rootmargin</category><category>isintersecting vs intersectionratio</category><category>intersection observer not firing</category><category>scroll reveal javascript</category><category>lazy load images javascript</category><category>infinite scroll intersection observer</category><category>scrollspy javascript</category><category>intersection observer react</category><category>css scroll-driven animations</category><category>animation-timeline view</category><category>content-visibility auto</category><category>intersection observer v2 trackvisibility</category><category>intersection observer polyfill</category><category>intersection observer next.js</category><category>element.checkvisibility</category><category>sticky header sentinel</category></item><item><title>CSS pointer-events: inert, Click-Through, disabled &amp; SVG</title><link>https://www.w3tweaks.com/css/css-pointer-events-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-pointer-events-explained/</guid><description>The complete CSS pointer-events guide — click-through overlays, tooltip flicker fix, disabled button (with the inert-attribute alternative), child re-enable inside disabled parent, the ghost click trap, cursor:not-allowed vs pointer-events:none, SVG hit areas including bounding-box, dialog ::backdrop, map/canvas HUD overlays, transition-behavior: allow-discrete, and the touch-action manipulation companion.</description><pubDate>Sat, 13 Jun 2026 17:00:00 GMT</pubDate><category>css pointer-events</category><category>pointer-events: none</category><category>css click through overlay</category><category>css disabled button</category><category>css disabled vs pointer-events</category><category>cursor not-allowed vs pointer-events</category><category>css tooltip flicker fix</category><category>pointer-events svg fill stroke</category><category>touch-action manipulation</category><category>css inert attribute</category><category>css pointer-events transition</category><category>css ghost click</category><category>pointer-events bubbling</category><category>pointer-events keyboard accessibility</category><category>dialog backdrop</category><category>pointer-events bounding-box</category><category>transition-behavior allow-discrete</category></item><item><title>IndexedDB Tutorial: idb, Cursors, Bulk Insert &amp; Sync</title><link>https://www.w3tweaks.com/javascript/javascript-indexeddb-complete-guide/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-indexeddb-complete-guide/</guid><description>The complete IndexedDB tutorial — live demo, async/await with the idb library, bulk insert performance (100x faster), cross-tab sync via BroadcastChannel, Service Worker offline-first pattern, storing Blobs and Files, compound indexes, Dexie vs idb decision table, TypeScript DBSchema, transaction auto-close trap, version migrations, and Safari ITP eviction.</description><pubDate>Fri, 12 Jun 2026 20:30:00 GMT</pubDate><category>indexeddb tutorial</category><category>indexeddb example</category><category>indexeddb vs localstorage</category><category>indexeddb promise</category><category>indexeddb async await</category><category>idb library jake archibald</category><category>dexie.js example</category><category>indexeddb transaction auto close</category><category>transactioninactiveerror</category><category>indexeddb cursor</category><category>idbkeyrange</category><category>indexeddb version migration</category><category>navigator.storage.persist</category><category>indexeddb safari itp</category><category>indexeddb in service worker</category><category>indexeddb cross-tab sync</category><category>indexeddb broadcast channel</category><category>indexeddb bulk insert performance</category><category>indexeddb typescript</category></item><item><title>CSS :focus-visible: Keyboard Focus, WCAG &amp; inert</title><link>https://www.w3tweaks.com/css/css-focus-visible-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-focus-visible-explained/</guid><description>The complete CSS :focus-visible guide — :focus vs :focus-visible vs :focus-within, 8 visual patterns, the two-tone indicator, WCAG 2.4.7 + 2.4.11 compliance, forced-colors High Contrast Mode, the sticky-header scroll-padding-top fix, inert and &lt;dialog&gt; focus traps, :has(:focus-visible), accent-color, tabindex programmatic focus, cross-browser heuristic differences, mobile touch behavior, and the focus-visible polyfill.</description><pubDate>Fri, 12 Jun 2026 20:00:00 GMT</pubDate><category>css focus-visible</category><category>css focus-visible example</category><category>css focus-visible polyfill</category><category>css focus vs focus-visible</category><category>css focus-within example</category><category>css remove focus outline</category><category>css keyboard focus indicator</category><category>wcag 2.4.7 focus visible</category><category>wcag 2.4.11 focus appearance</category><category>css forced-colors active</category><category>css two-tone focus</category><category>css outline-offset</category><category>tabindex focus management</category><category>scroll-margin-top focus</category><category>css inert attribute</category><category>css :has focus-visible</category><category>css accent-color focus</category><category>dialog showmodal</category><category>a11y</category><category>keyboard navigation</category></item><item><title>Web Share API: navigator.share, Files &amp; Fallbacks</title><link>https://www.w3tweaks.com/html/web-share-api-native-sharing-files-fallbacks/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/web-share-api-native-sharing-files-fallbacks/</guid><description>The complete Web Share API guide — navigator.share + navigator.canShare for text, URLs and files, AbortError handling, the transient activation trap, Permissions-Policy headers, the text+url duplicate-link bug, iOS Safari vs Android Chrome quirks, PWA share targets with service worker file receivers, SSR-safe feature detection for Next.js/Astro, and the progressive 3-tier fallback chain.</description><pubDate>Fri, 12 Jun 2026 19:00:00 GMT</pubDate><category>web share api example</category><category>navigator.share javascript</category><category>navigator.canshare</category><category>web share api files</category><category>web share api aborterror</category><category>share api transient activation</category><category>navigator.share fallback</category><category>clipboard api fallback</category><category>pwa share target</category><category>web share api permissions policy</category><category>web share api ios safari</category><category>web share api browser support</category><category>share button javascript</category><category>duplicate url web share</category><category>ssr navigator.share</category><category>web share analytics</category><category>share target service worker</category></item><item><title>HTML5 Video Custom Controls: Media API, Captions &amp; PiP</title><link>https://www.w3tweaks.com/html/html-video-custom-controls-media-api/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/html-video-custom-controls-media-api/</guid><description>Build HTML5 video custom controls — Media API, TimeRanges buffered progress, textTracks captions, ::cue styling, Picture-in-Picture, Fullscreen with Safari quirks, Media Session API for Bluetooth/lock-screen, playsinline iOS fix, autoplay policy detection, codec selection (AV1/VP9/H.264), MediaError handling, IntersectionObserver autoplay, MediaCapabilities + requestVideoFrameCallback.</description><pubDate>Thu, 11 Jun 2026 18:45:00 GMT</pubDate><category>html5 video custom controls</category><category>html5 video javascript api</category><category>html5 video buffered progress bar</category><category>webvtt captions example</category><category>css ::cue styling</category><category>html5 video texttracks api</category><category>picture in picture javascript</category><category>html5 video fullscreen api</category><category>playsinline ios</category><category>media session api javascript</category><category>video.play returns promise</category><category>html5 video keyboard shortcuts</category><category>html5 video autoplay policy</category><category>hls.js dash.js mse</category><category>mediaerror handling</category><category>av1 vp9 h264 codec</category><category>requestvideoframecallback</category><category>mediacapabilities</category></item><item><title>CSS @supports: Feature Detection &amp; Progressive Enhancement</title><link>https://www.w3tweaks.com/css/css-supports-feature-detection/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-supports-feature-detection/</guid><description>The complete CSS @supports guide — feature queries, not/and/or operators, selector() for :has(), the new at-rule() function for @layer detection, Tailwind supports-[] arbitrary variant, OKLCH and View Transitions detection, the @supports inside @container pattern, CSS.supports() JavaScript API, and the double-negation gotcha.</description><pubDate>Thu, 11 Jun 2026 18:00:00 GMT</pubDate><category>css</category><category>css @supports examples</category><category>css @supports not</category><category>css @supports has selector</category><category>css feature query browser support</category><category>css.supports javascript api</category><category>@supports selector function</category><category>@supports vs @media</category><category>tailwind supports arbitrary variant</category><category>@supports container queries</category><category>css feature detection no javascript</category><category>@supports at-rule layer</category><category>@supports not working</category><category>css supports has fallback</category><category>modernizr alternative css</category><category>progressive enhancement</category><category>css fallback</category><category>CSS.supports</category></item><item><title>structuredClone: JavaScript Deep Copy (Stop JSON.parse)</title><link>https://www.w3tweaks.com/javascript/javascript-structuredclone-deep-copy/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-structuredclone-deep-copy/</guid><description>The complete guide to structuredClone() — JavaScript deep copy without JSON.parse(JSON.stringify()) limits. Live tester runs spread, JSON, structuredClone, and lodash cloneDeep across 9 data types. Plus the polyfill for structuredClone is not defined errors, Symbol-key drop, descriptor loss, Immer/Mutative for React state, benchmarks, and WinterCG runtime parity.</description><pubDate>Thu, 11 Jun 2026 17:30:00 GMT</pubDate><category>javascript</category><category>structuredclone javascript example</category><category>structuredclone vs json.parse</category><category>javascript deep copy object</category><category>javascript clone class instance</category><category>javascript clone map set</category><category>structuredclone datacloneerror</category><category>javascript circular reference clone</category><category>structuredclone browser support</category><category>lodash clonedeep alternative</category><category>javascript deep copy array</category><category>structuredclone typescript</category><category>structuredclone react</category><category>structuredclone is not defined</category><category>deep copy nested object javascript</category><category>javascript object spread deep copy</category></item><item><title>AbortController: Cancel Fetch Properly (With Live Demo)</title><link>https://www.w3tweaks.com/javascript/javascript-abortcontroller-cancel-fetch/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-abortcontroller-cancel-fetch/</guid><description>How to cancel a fetch request properly — with a live search-race demo. Type fast and watch stale requests get cancelled in real time. Covers AbortController vs AbortSignal, debounce+abort for autocomplete, AbortSignal.timeout() one-liners, AbortSignal.any() composition, AbortSignal.throwIfAborted(), React useEffect cleanup, the single-use trap, custom abort reasons, memory leaks with abort listeners, and the libraries (TanStack Query, SWR, Axios, ky) that handle signals automatically.</description><pubDate>Wed, 10 Jun 2026 19:30:00 GMT</pubDate><category>javascript</category><category>abortcontroller cancel fetch javascript</category><category>abortsignal timeout fetch</category><category>fetch timeout javascript example</category><category>cancel fetch request react useeffect</category><category>abort fetch on unmount</category><category>fetch race condition javascript</category><category>abortsignal.any browser support</category><category>throwifaborted abortsignal example</category><category>axios cancellation abortcontroller</category><category>debounce abort fetch search</category><category>fetch retry abort signal</category><category>what is abortcontroller javascript</category><category>abortcontroller vs abortsignal</category><category>react query abortsignal</category><category>abortcontroller node js</category><category>abortcontroller cloudflare workers</category></item><item><title>Native Lazy Loading: When loading=lazy Silently Fails</title><link>https://www.w3tweaks.com/html/native-lazy-loading-when-it-works-silently-fails/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/native-lazy-loading-when-it-works-silently-fails/</guid><description>loading=lazy looks foolproof — one attribute, defer offscreen images. But it produces no error when it fails. It silently delays your LCP if applied to the hero, does nothing on CSS backgrounds, causes layout shift without dimensions, hides images from Googlebot when paired with data-src libraries, and gets overridden silently by preload directives. Six silent failures plus WordPress auto-lazy, framework auto-lazy defaults, content-visibility, fetchpriority=low, NoScript fallback, AdSense iframes, and the picture+srcset+lazy combined pattern.</description><pubDate>Wed, 10 Jun 2026 19:00:00 GMT</pubDate><category>lazy loading</category><category>loading lazy not working</category><category>native lazy loading</category><category>img loading lazy</category><category>iframe loading lazy youtube</category><category>loading lazy vs eager</category><category>lazy loading background image css</category><category>intersection observer rootmargin</category><category>content-visibility auto example</category><category>facade pattern youtube</category><category>fetchpriority high lcp</category><category>fetchpriority low</category><category>lazy loading wordpress</category><category>data-src lazy loading seo</category><category>above the fold lazy loading</category><category>picture srcset lazy loading</category><category>preload as image lazy</category><category>lighthouse defer offscreen images</category></item><item><title>CSS Dark Mode: prefers-color-scheme, light-dark, OKLCH</title><link>https://www.w3tweaks.com/css/css-dark-mode-prefers-color-scheme/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-dark-mode-prefers-color-scheme/</guid><description>The complete CSS dark mode guide — prefers-color-scheme media query, the new light-dark() function with the color-scheme gotcha, OKLCH tokens with color-mix() for perceptual lightness scaling, Material 3 surface elevation, View Transitions API for the toggle animation, the SSR/SSG FOUC fix matrix (Next.js cookie pattern), Windows High Contrast Mode survival with forced-colors, meta theme-color for mobile chrome, Tailwind v4 @custom-variant dark, and cross-tab sync.</description><pubDate>Wed, 10 Jun 2026 17:00:00 GMT</pubDate><category>css</category><category>css dark mode toggle</category><category>prefers-color-scheme media query</category><category>css light-dark function</category><category>color-scheme css property</category><category>dark mode flash fix</category><category>css custom properties dark mode</category><category>oklch dark mode</category><category>view transition theme toggle</category><category>tailwind dark mode</category><category>forced-colors mode css</category><category>matchMedia dark mode javascript</category><category>dark mode localStorage</category><category>meta theme-color</category><category>surface elevation dark mode</category><category>css color-mix oklch</category><category>windows high contrast mode</category><category>SSR FOUC dark mode</category></item><item><title>Responsive Images &amp; Modern Formats: AVIF, WebP, JXL Guide</title><link>https://www.w3tweaks.com/html/responsive-images-modern-formats-avif-webp-picture-srcset-sizes/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/responsive-images-modern-formats-avif-webp-picture-srcset-sizes/</guid><description>The complete responsive images guide — AVIF vs WebP file sizes, where JPEG XL stands now (Chrome 145 flag + Safari 17 default + Firefox 152 pref), the picture element with srcset and sizes done right, the 100vw sizes mistake that doubles your downloads, fetchpriority for LCP with decoding=async, placeholder strategies (BlurHash vs ThumbHash), CSS image-set for backgrounds, and the image CDN auto-format pattern that skips picture entirely.</description><pubDate>Tue, 09 Jun 2026 20:30:00 GMT</pubDate><category>responsive images</category><category>avif vs webp</category><category>jpeg xl</category><category>picture element srcset sizes</category><category>html picture element example</category><category>fetchpriority high lcp image</category><category>img srcset sizes explained</category><category>what is w descriptor srcset</category><category>responsive image best practices</category><category>css image-set function</category><category>lazy loading images</category><category>imagesrcset preload</category><category>decoding async img</category><category>blurhash vs thumbhash</category><category>image cdn auto format</category><category>modern image formats</category><category>core web vitals images</category><category>LCP optimization</category><category>art direction picture media</category></item><item><title>CSS aspect-ratio Property: Complete Guide With Live Visualiser</title><link>https://www.w3tweaks.com/css/css-aspect-ratio-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-aspect-ratio-explained/</guid><description>CSS aspect-ratio is one line where the old padding-bottom hack needed five. It reserves space proportionally, eliminates layout shift, and works natively in every browser since 2021. This guide covers every value, the auto fallback for images, the gotchas with flexbox and content overflow, CSS custom-property patterns, Tailwind/Bootstrap equivalents, the @media (aspect-ratio) vs property disambiguation, view-transition interpolation, social-card cropping with object-position, and a complete common-ratios reference.</description><pubDate>Tue, 09 Jun 2026 19:00:00 GMT</pubDate><category>css</category><category>css aspect-ratio property</category><category>responsive 16:9 video css</category><category>css aspect-ratio auto</category><category>css aspect-ratio not working</category><category>css aspect-ratio padding hack</category><category>css aspect-ratio flexbox</category><category>css aspect-ratio image cls</category><category>css aspect-ratio container query</category><category>tailwind aspect ratio</category><category>css aspect-ratio vs object-fit</category><category>aspect-ratio media query</category><category>css golden ratio</category><category>css 1.91 1 og image</category><category>aspect-ratio polyfill</category><category>CSS variable aspect-ratio</category><category>object-fit object-position</category><category>view transitions aspect-ratio</category></item><item><title>Promise.all vs allSettled vs race vs any: Complete Guide</title><link>https://www.w3tweaks.com/javascript/javascript-promise-all-allsettled-race-any/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-promise-all-allsettled-race-any/</guid><description>Promise.all vs allSettled vs race vs any explained with a live visualiser. Set four promise durations and outcomes, then watch all four methods settle differently in real time. Plus the patterns competitors skip: AbortSignal.timeout + AbortSignal.any for modern timeouts, concurrency pools to cap parallel requests, TypeScript narrowing for allSettled, Promise.withResolvers and Promise.try, the unhandled-rejection traps, and the await-Promise.all vs serial-await interview question answered.</description><pubDate>Tue, 09 Jun 2026 18:30:00 GMT</pubDate><category>javascript</category><category>promise.all vs allsettled</category><category>promise.all error handling</category><category>javascript promise timeout</category><category>promise.race example</category><category>promise.any example</category><category>aggregateerror javascript</category><category>promise.all with async await</category><category>concurrent promises javascript</category><category>promise pool limit concurrency</category><category>abortcontroller fetch timeout</category><category>promise.allsettled typescript</category><category>promise.all parallel requests</category><category>promise.any vs promise.race</category><category>unhandled promise rejection allsettled</category><category>Promise.withResolvers</category><category>Promise.try</category><category>AbortSignal.timeout</category><category>AbortSignal.any</category></item><item><title>Service Worker Offline First: Complete Tutorial With Simulator</title><link>https://www.w3tweaks.com/javascript/service-workers-offline-first/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/service-workers-offline-first/</guid><description>This service worker offline first tutorial has an interactive simulator — pick a strategy, toggle offline, click Clear Cache, and watch cache-first / network-first / stale-while-revalidate behave live. Then handle the waiting trap with a New Version Available banner, queue offline POST writes with Background Sync, fix cache.addAll() atomicity, enable Navigation Preload for ~300ms cold-start savings, and work around iOS Safari quirks.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><category>javascript</category><category>pwa service worker</category><category>service worker offline first</category><category>service worker tutorial</category><category>service worker caching strategies</category><category>service worker register</category><category>service worker waiting</category><category>service worker not working</category><category>service worker update</category><category>skipwaiting clients claim</category><category>cache first strategy</category><category>network first strategy</category><category>stale while revalidate service worker</category><category>background sync api</category><category>navigation preload</category><category>cache.addAll atomicity</category><category>web push notifications</category><category>iOS Safari service worker</category><category>PWA manifest beforeinstallprompt</category><category>navigator.storage.persist</category><category>how to clear service worker</category><category>service worker scope</category></item><item><title>HTML Drag and Drop File Upload: The Complete Guide</title><link>https://www.w3tweaks.com/html/html-file-upload-drag-drop/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/html-file-upload-drag-drop/</guid><description>Most drag-drop tutorials stop before the dragleave flickering bug that breaks every drop zone with child elements. Many still say Fetch can&apos;t show upload progress — false since Chrome 105+ (ReadableStream + duplex: &apos;half&apos;). This guide covers the flicker counter fix, the modern Fetch + XHR upload progress comparison, folder uploads with webkitdirectory, image preview cleanup, magic byte detection, paste-from-clipboard, WCAG 2.5.7 dragging movements, drag-to-reorder, and the input.value reset gotcha.</description><pubDate>Mon, 08 Jun 2026 23:00:00 GMT</pubDate><category>html drag and drop file upload</category><category>html file upload example</category><category>html5 drag drop tutorial</category><category>dragleave fires multiple times</category><category>drag and drop not working mobile</category><category>javascript upload progress bar</category><category>fetch upload progress</category><category>javascript file upload validation</category><category>drag and drop reorder list javascript</category><category>input type file accept multiple</category><category>webkitdirectory upload folder</category><category>prevent default dragover</category><category>xhr abort upload</category><category>file system access api vs input</category><category>paste image upload javascript</category><category>FileReader</category><category>FormData</category><category>magic bytes file signature</category><category>URL.createObjectURL</category><category>WCAG 2.5.7 dragging movements</category></item><item><title>CSS mask: Fade, Reveal &amp; Shape Elements (Complete Guide)</title><link>https://www.w3tweaks.com/css/css-mask-property-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-mask-property-explained/</guid><description>CSS mask uses another image or gradient as a stencil for element visibility. Unlike clip-path&apos;s hard edges, mask creates soft fades, partial transparency, and graduated reveals. This guide covers the alpha vs luminance reality (not just black=visible), gradient masks, SVG icon recoloring with currentColor, scroll container edge fades, spotlight hover, wipe reveals, scroll-driven animation-timeline reveals, mask-composite + mask-border, and the -webkit-mask-composite naming mismatch that silently breaks Safari.</description><pubDate>Mon, 08 Jun 2026 21:30:00 GMT</pubDate><category>css</category><category>css mask image</category><category>css mask gradient</category><category>css mask vs clip-path</category><category>mask-composite source-over</category><category>css scroll fade gradient</category><category>css spotlight effect</category><category>css wipe reveal animation</category><category>css text mask gradient</category><category>webkit mask composite</category><category>mask-mode luminance</category><category>css fade edges scroll</category><category>css mask not working safari</category><category>css mask icon color change</category><category>mask-border</category><category>mask-type</category><category>currentColor SVG icon mask</category><category>scroll-driven mask reveal</category><category>animation-timeline view</category></item><item><title>CSS mix-blend-mode: Blend Text, Images &amp; Colors Like Photoshop</title><link>https://www.w3tweaks.com/css/css-mix-blend-mode-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-mix-blend-mode-explained/</guid><description>mix-blend-mode lets an element&apos;s pixels react to whatever is behind them — the same algorithms Photoshop uses. Remove white backgrounds from logos. Make text always readable (with the WCAG caveat nobody mentions). Build duotone photos in pure CSS or with Spotify-style SVG feColorMatrix. Plus the interaction matrix when mix-blend-mode silently stops working with opacity/filter/transform, plus-lighter/plus-darker (CSS Blending Level 2), animation behavior, glitch/chromatic-aberration patterns, and forced-colors fallbacks.</description><pubDate>Sun, 07 Jun 2026 21:30:00 GMT</pubDate><category>css</category><category>mix-blend-mode</category><category>css mix blend mode examples</category><category>blend modes</category><category>css blend modes list</category><category>background-blend-mode</category><category>background blend mode multiply</category><category>multiply</category><category>remove white background css</category><category>screen</category><category>screen blend mode css</category><category>overlay</category><category>css text on image readable</category><category>difference</category><category>mix blend mode difference</category><category>isolation</category><category>isolation isolate css</category><category>duotone</category><category>css duotone image</category><category>css duotone photo effect</category><category>Spotify duotone feColorMatrix</category><category>glassmorphism</category><category>css effects</category><category>css glitch effect</category><category>chromatic aberration</category><category>plus-lighter</category><category>plus-darker</category><category>mix blend mode not working</category><category>mix blend mode vs opacity</category><category>forced-colors mode</category><category>WCAG difference contrast</category></item><item><title>HTML contenteditable: Rich Text Editor Without Libraries</title><link>https://www.w3tweaks.com/html/html-contenteditable-rich-text-editor/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/html-contenteditable-rich-text-editor/</guid><description>Every contenteditable tutorial shows bold/italic buttons and stops before the #1 bug: clicking the toolbar destroys the editor selection and formatting applies to nothing. This guide covers the fix, the modern beforeinput + inputType replacement for execCommand, the brand-new EditContext API (Chrome 121+), CJK composition events, XSS-safe paste sanitization with DOMPurify and the native Sanitizer API, iOS autocorrect destroying inline formatting, image paste handling, caret restoration with TreeWalker, and the complete decision framework for when to ditch contenteditable for TipTap/ProseMirror.</description><pubDate>Sun, 07 Jun 2026 21:00:00 GMT</pubDate><category>contenteditable</category><category>rich text editor</category><category>execCommand</category><category>execcommand alternative</category><category>beforeinput</category><category>inputType</category><category>EditContext API</category><category>Selection API</category><category>Range</category><category>contenteditable placeholder</category><category>contenteditable placeholder css only</category><category>paste sanitize</category><category>DOMPurify</category><category>Sanitizer API</category><category>toolbar selection</category><category>queryCommandState</category><category>querycommandstate example</category><category>plaintext-only</category><category>contenteditable tutorial</category><category>html editor</category><category>wysiwyg</category><category>javascript wysiwyg editor from scratch</category><category>rich text editor vanilla javascript</category><category>html contenteditable example</category><category>contenteditable cursor position</category><category>contenteditable paste plain text only</category><category>contenteditable not working</category><category>contenteditable bold button not working</category><category>compositionstart</category><category>isComposing</category><category>TipTap</category><category>ProseMirror</category><category>Quill</category><category>iOS autocorrect contenteditable</category></item><item><title>JavaScript Web Workers: Keep the UI Smooth While Running Heavy Code</title><link>https://www.w3tweaks.com/javascript/javascript-web-workers/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-web-workers/</guid><description>Web Worker tutorials always need a separate worker.js file and a build tool. This one doesn&apos;t. Learn inline workers with Blob URLs (no separate file), a worker pool you build from scratch, transferable objects benchmark showing 100-300× speed difference, Comlink for ergonomic worker APIs, OffscreenCanvas for jank-free animations, SharedArrayBuffer + Atomics with the COOP/COEP headers you need, the structured clone gotchas, modern Vite/React syntax, and the exact threshold when workers hurt instead of help.</description><pubDate>Sun, 07 Jun 2026 20:30:00 GMT</pubDate><category>javascript</category><category>javascript web worker example</category><category>web workers</category><category>javascript worker thread</category><category>performance</category><category>ui freeze</category><category>postMessage</category><category>web worker postmessage example</category><category>transferable objects web worker</category><category>worker pool</category><category>web worker pool javascript</category><category>SharedArrayBuffer</category><category>sharedarraybuffer web worker example</category><category>blob url</category><category>inline worker</category><category>web worker without separate file</category><category>progress reporting</category><category>comlink</category><category>comlink web worker example</category><category>offscreencanvas</category><category>offscreencanvas web worker</category><category>service worker vs web worker</category><category>shared worker</category><category>structured clone</category><category>datacloneerror</category><category>partytown</category><category>atomics</category><category>crossoriginisolated</category><category>coop coep</category><category>vite web worker</category><category>react web worker</category></item><item><title>How to Add .env to .gitignore: The Complete Security Guide</title><link>https://www.w3tweaks.com/guide/add-env-to-gitignore-tutorial/</link><guid isPermaLink="true">https://www.w3tweaks.com/guide/add-env-to-gitignore-tutorial/</guid><description>The complete guide to adding .env to .gitignore. Covers the standard .env* block (Next.js / Vite / CRA), the rotate-FIRST recovery checklist, git filter-repo for rewriting history, GitHub Push Protection, gitleaks/TruffleHog pre-commit scanners, dotenvx encrypted-env, --skip-worktree vs --assume-unchanged, and the global gitignore pattern.</description><pubDate>Sun, 07 Jun 2026 19:00:00 GMT</pubDate><category>gitignore</category><category>env</category><category>env file</category><category>git security</category><category>secrets management</category><category>git filter-repo</category><category>github secret scanning</category><category>gitleaks</category><category>trufflehog</category><category>skip-worktree</category><category>assume-unchanged</category><category>dotenvx</category><category>doppler</category><category>sops</category><category>vault</category><category>env example</category><category>git rm cached</category><category>remove env from git history</category><category>env file already committed</category><category>gitignore env local</category><category>gitignore env file example</category><category>env file security best practices</category></item><item><title>JavaScript Memory Leak Fix: 6 Patterns + DevTools Walkthrough</title><link>https://www.w3tweaks.com/javascript/javascript-memory-leak-fix/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-memory-leak-fix/</guid><description>Every memory leak tutorial tells you to open DevTools without giving you actual leaks to practice on. This guide has 6 live triggerable leaks built into the demo — open DevTools alongside and watch memory grow in real time. Covers the three-snapshot technique, queryObjects() DevTools trick, observer-disconnect (ResizeObserver / IntersectionObserver), AbortController unified cleanup, performance.measureUserAgentSpecificMemory() for production, React useEffect cleanup, WeakMap/WeakRef + FinalizationRegistry caveats, and real KB-per-minute growth numbers.</description><pubDate>Sat, 06 Jun 2026 18:30:00 GMT</pubDate><category>javascript</category><category>memory leak</category><category>javascript memory leak detection</category><category>chrome devtools heap snapshot</category><category>devtools</category><category>heap snapshot</category><category>performance</category><category>garbage collection</category><category>weakmap</category><category>weakmap vs map memory</category><category>weakref</category><category>FinalizationRegistry</category><category>setinterval</category><category>clearInterval not working</category><category>detached dom</category><category>detached dom nodes chrome</category><category>react</category><category>react useeffect cleanup memory leak</category><category>closures</category><category>javascript memory leak closure</category><category>retained size</category><category>queryObjects</category><category>AbortController</category><category>ResizeObserver</category><category>IntersectionObserver</category><category>measureUserAgentSpecificMemory</category><category>performance.memory</category><category>node memory leak</category><category>javascript memory leak fix</category></item><item><title>Every HTML Input Type — Real-World Use Cases &amp; Mobile Keyboard Guide</title><link>https://www.w3tweaks.com/html/html-input-types-complete-guide/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/html-input-types-complete-guide/</guid><description>This is the complete HTML input types list with mobile keyboard hints, the pattern regex cookbook, enterkeyhint reference, autocomplete one-time-code for iOS, capture=environment for the rear camera, valueAsNumber/valueAsDate typed access, the datetime-local timezone offset trap, and linked date pickers. Most guides are reference lists — this one explains the decisions.</description><pubDate>Sat, 06 Jun 2026 18:30:00 GMT</pubDate><category>html input types</category><category>html input types list</category><category>inputmode</category><category>enterkeyhint</category><category>type number vs text</category><category>input date</category><category>input range</category><category>input search</category><category>input file</category><category>input color</category><category>datetime-local</category><category>datetime-local timezone offset</category><category>mobile keyboard</category><category>input type complete guide</category><category>html forms</category><category>inputmode numeric</category><category>inputmode numeric vs decimal</category><category>input range output element</category><category>linked date inputs</category><category>input pattern credit card</category><category>input type file preview</category><category>input type file preview multiple</category><category>input type color hex to rgb</category><category>input type tel pattern</category><category>html input enterkeyhint values</category><category>autocomplete one-time-code</category><category>WebOTP</category><category>capture environment</category><category>showOpenFilePicker</category><category>valueAsNumber</category><category>valueAsDate</category><category>datalist</category><category>spellcheck autocorrect autocapitalize</category></item><item><title>CSS filter &amp; backdrop-filter: The Complete Visual Guide</title><link>https://www.w3tweaks.com/css/css-filter-backdrop-filter/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-filter-backdrop-filter/</guid><description>CSS filter applies effects to an element — blur, grayscale, brightness, contrast, drop-shadow. CSS backdrop-filter applies those same effects to whatever is behind the element. This complete guide covers both properties, the filter-order gotcha, drop-shadow vs box-shadow, glassmorphism patterns (including Apple&apos;s Liquid Glass + dialog::backdrop modals), filter: url() for SVG-referenced effects like duotone and gooey blobs, prefers-reduced-transparency, @supports fallbacks, forced-colors mode, the iOS Safari fixed-position bug, and performance tiers.</description><pubDate>Sat, 06 Jun 2026 17:30:00 GMT</pubDate><category>css</category><category>filter</category><category>backdrop-filter</category><category>glassmorphism</category><category>blur</category><category>grayscale</category><category>drop-shadow</category><category>hue-rotate</category><category>css effects</category><category>frosted glass</category><category>visual effects</category><category>backdrop-filter safari</category><category>filter performance</category><category>backdrop-filter not working</category><category>frosted glass css</category><category>css filter examples</category><category>css filter hover effect</category><category>css duotone image</category><category>css blur background image</category><category>hue-rotate css color change</category><category>filter url</category><category>svg filter</category><category>liquid glass</category><category>prefers-reduced-transparency</category><category>dialog backdrop</category><category>gooey blob</category><category>forced-colors</category><category>css glassmorphism generator</category></item><item><title>Accessible Forms — Complex Fields for Screen Readers</title><link>https://www.w3tweaks.com/html/accessible-forms-complex-fields-screen-readers/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/accessible-forms-complex-fields-screen-readers/</guid><description>Over 50% of WCAG failures are form-related. This guide covers what others miss: the fieldset legend verbosity problem, aria-describedby with multiple IDs, aria-errormessage vs aria-describedby (with current screen-reader support data), the 5-step submit error pattern with validation timing, WCAG 2.2 form criteria (Redundant Entry, Accessible Authentication, Target Size), Label in Name + Voice Control, autocomplete + inputmode + enterkeyhint reference, forced-colors mode, role=status for success, when NOT to build a custom select, and a correct accessible password toggle.</description><pubDate>Fri, 05 Jun 2026 21:00:00 GMT</pubDate><category>accessible forms</category><category>screen reader</category><category>aria-describedby</category><category>aria-invalid</category><category>aria-errormessage</category><category>fieldset legend</category><category>aria-required</category><category>form error handling</category><category>autocomplete wcag</category><category>role group</category><category>password show hide</category><category>character counter aria</category><category>multi-step form</category><category>form accessibility</category><category>WCAG 1.3.5</category><category>WCAG 2.2</category><category>WCAG 2.5.3</category><category>aria-live forms</category><category>accessible form labels</category><category>aria-describedby example</category><category>aria-invalid accessibility</category><category>fieldset legend screen reader</category><category>wcag form errors</category><category>accessible password toggle</category><category>aria-required vs required</category><category>accessible form validation javascript</category><category>screen reader form error message</category><category>autocomplete wcag aa</category><category>label in name</category><category>voice control accessibility</category><category>forced colors</category><category>inputmode</category><category>enterkeyhint</category><category>role status</category><category>datalist accessibility</category></item><item><title>CSS clip-path: Create Any Shape — The Complete Guide</title><link>https://www.w3tweaks.com/css/css-clip-path-explained/</link><guid isPermaLink="true">https://www.w3tweaks.com/css/css-clip-path-explained/</guid><description>clip-path lets you cut any element into any shape — circles, hexagons, arrows, diagonals, chevrons — with pure CSS. No SVG files, no image masks, no extra HTML. This complete guide covers every value, animation patterns, the new shape()/rect()/xywh() functions, scroll-driven reveals with animation-timeline: view(), clip-path: url() for arbitrary SVG paths, the Clippy generator, hover/click area gotchas, @keyframes loops, and the wrong-tool bugs nobody demonstrates.</description><pubDate>Fri, 05 Jun 2026 20:30:00 GMT</pubDate><category>css</category><category>clip-path</category><category>css shapes</category><category>polygon</category><category>circle clip-path</category><category>css animations</category><category>reveal animation</category><category>diagonal section</category><category>shape function</category><category>css morphing</category><category>clip-path not working</category><category>inset clip-path</category><category>css clip-path generator</category><category>css clip-path triangle</category><category>clip-path image circle</category><category>clip-path hover effect</category><category>clip-path scroll reveal</category><category>clip-path responsive</category><category>clip-path browser support</category><category>clip-path vs mask</category><category>rect xywh</category><category>animation-timeline</category><category>svg clippath</category></item><item><title>JavaScript Debounce vs Throttle: Real Difference With Live Numbers</title><link>https://www.w3tweaks.com/javascript/javascript-debounce-vs-throttle/</link><guid isPermaLink="true">https://www.w3tweaks.com/javascript/javascript-debounce-vs-throttle/</guid><description>Every debounce vs throttle article says &apos;throttle fires 30-50 times, debounce fires once&apos; — but nobody shows it happening live. This tutorial has a firing-timeline visualiser that tracks every call with real millisecond timestamps, plus the leading edge pattern nobody explains, the rAF throttle nobody covers, the AbortController + debounce fetch pattern, React 18 useDeferredValue comparison, TypeScript signatures, and the wrong-tool bugs nobody demonstrates.</description><pubDate>Fri, 05 Jun 2026 19:30:00 GMT</pubDate><category>javascript</category><category>debounce</category><category>throttle</category><category>performance</category><category>events</category><category>scroll</category><category>input</category><category>requestanimationframe</category><category>react hooks</category><category>optimization</category><category>leading edge</category><category>debounce vs throttle react</category><category>javascript debounce scroll</category><category>react usedebounce hook</category><category>debounce typescript</category><category>abortcontroller</category><category>usedeferredvalue</category><category>page visibility api</category><category>passive event listeners</category><category>requestidlecallback</category><category>debounce input search</category><category>cancel debounced function</category></item><item><title>HTML Keyboard Navigation &amp; Focus Management: Complete Guide</title><link>https://www.w3tweaks.com/html/html-keyboard-navigation-focus-management/</link><guid isPermaLink="true">https://www.w3tweaks.com/html/html-keyboard-navigation-focus-management/</guid><description>Most focus management tutorials still teach a 50-line JavaScript focus trap that the HTML inert attribute replaces in one line. They show skip link patterns with Chrome&apos;s bug still in place. They never explain when you still need aria-hidden alongside inert. This guide covers tabindex 0 vs -1, focus-visible vs focus, the WCAG 2.2 numeric focus indicator rules, aria-hidden vs inert, nested modals, roving tabindex vs aria-activedescendant, enterkeyhint for mobile keyboards, and SPA route focus management.</description><pubDate>Thu, 04 Jun 2026 19:55:00 GMT</pubDate><category>keyboard navigation</category><category>focus management</category><category>tabindex</category><category>tabindex 0 vs -1</category><category>focus-visible</category><category>focus-within</category><category>skip link</category><category>focus trap</category><category>inert attribute</category><category>aria-hidden vs inert</category><category>roving tabindex</category><category>aria-activedescendant</category><category>WCAG 2.2</category><category>wcag 2.2 focus appearance</category><category>focus appearance</category><category>autofocus</category><category>accessibility</category><category>html keyboard</category><category>spa focus management</category><category>css focus ring</category><category>enterkeyhint</category><category>inputmode</category><category>shadow dom focus</category><category>delegatesfocus</category><category>user-valid</category><category>user-invalid</category><category>focusvisible option</category></item></channel></rss>