<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>HTML + CSS + JavaScript</title>
	<atom:link href="https://htmlcssjavascript.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://htmlcssjavascript.com</link>
	<description>Let&#039;s Build the Web We Want</description>
	<lastBuildDate>Wed, 21 Oct 2026 18:59:57 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>When the Web Was Actively Trying to Kill You: A Field Guide to Early Front-End Lore</title>
		<link>https://htmlcssjavascript.com/web/when-the-web-was-actively-trying-to-kill-you-a-field-guide-to-early-front-end-lore/</link>
					<comments>https://htmlcssjavascript.com/web/when-the-web-was-actively-trying-to-kill-you-a-field-guide-to-early-front-end-lore/#respond</comments>
		
		<dc:creator><![CDATA[Rob Larsen]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 18:59:31 +0000</pubDate>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[h5bp]]></category>
		<category><![CDATA[philosophy]]></category>
		<guid isPermaLink="false">https://htmlcssjavascript.com/?p=11522</guid>

					<description><![CDATA[In the ongoing retrospective series I have kicked off on LinkedIn and YouTube about the maturation of the web platform, I am going to be focusing on how Boston and Cambridge served as ground zero for modern front-end engineering between 2008 and 2013. We will talk about the launch of HTML5 Boilerplate, the transition to [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In the ongoing retrospective series I have kicked off on LinkedIn and YouTube about the maturation of the web platform, I am going to be focusing on how Boston and Cambridge served as ground zero for modern front-end engineering between 2008 and 2013.</p>



<p class="wp-block-paragraph">We will talk about the launch of HTML5 Boilerplate, the transition to automated build systems, and the moments JavaScript went from a despised browser toy to an enterprise-grade discipline.</p>



<p class="wp-block-paragraph">Before you can fully appreciate why we spent so much energy building those tools, you have to understand the hostile operating environment we were trying to escape.</p>



<p class="wp-block-paragraph">If you entered front-end engineering in the last decade, you grew up believing browsers are cooperative runtimes. You think a rendering engine is broken if a CSS flexbox rule behaves unexpectedly on mobile Safari.</p>



<p class="wp-block-paragraph">Let me take you back to an era when the web platform was pure trench warfare.</p>



<h4 class="wp-block-heading">1. Table Layouts and the Load-Bearing Spacer GIF</h4>



<p class="wp-block-paragraph">Before CSS layouts stabilized, we did not align elements with math or anything approaching an elegant solution. We built layouts through structural abuse. If a client needed a header, a navigation sidebar, and a three-column content area, that meant nesting <code>&lt;table></code> tags seven layers deep.</p>



<p class="wp-block-paragraph">To prevent empty table cells from collapsing, every commercial website on earth carried an invisible architectural wedge: the transparent one-pixel GIF (<code>spacer.gif</code>). You set its width and height explicitly in HTML attributes to physically pry open cells like a car jack. Miss one closing tag, and the entire page shattered into disconnected tiles.</p>



<h4 class="wp-block-heading">2. DHTML and the ActiveX Precursor to AJAX</h4>



<p class="wp-block-paragraph">In the late nineties and early 2000s, &#8220;Dynamic HTML&#8221; was the buzzword. In practice, DHTML was just marketing speak for Netscape and Microsoft waging open warfare inside your script files.</p>



<p class="wp-block-paragraph">Netscape 4 gave us <code>document.layers</code>. Internet Explorer gave us <code>document.all</code>. If you wanted an element to move across the screen, you sniffed the user-agent string and maintained two parallel codebases in the same file.</p>



<p class="wp-block-paragraph">Asynchronous data loading was even wilder. Back in August 2008, I wrote an article titled <em><a href="https://htmlcssjavascript.com/web/some-internet-explorer-innovations-you-probably-forgot-about-while-waiting-for-ie6-to-die/" data-type="post" data-id="4743">&#8220;Some Internet Explorer Innovations You Probably Forgot About While Waiting for IE6 to Die.&#8221;</a></em> It hit the front page of Digg(? Slashdot? One of those.) My argument was straightforward: despite everything IE got wrong, Microsoft effectively invented AJAX.</p>



<p class="wp-block-paragraph">Before <code>fetch()</code> or standardized <code>XMLHttpRequest</code>, you did not invoke a native browser API. In Internet Explorer, you initialized an actual Windows COM component: <code>new ActiveXObject("Microsoft.XMLHTTP")</code>. You had to wake up the underlying Windows operating system just to update a fragment of text without triggering a full page reload.</p>



<h4 class="wp-block-heading">3. The Mark of the Web</h4>



<p class="wp-block-paragraph">Local development during the Windows XP Service Pack 2 era came with its own brand of security theater. If you opened a local HTML file directly from your hard drive that contained any JavaScript, Internet Explorer threw an aggressive yellow warning banner across the viewport and froze script execution.</p>



<p class="wp-block-paragraph">The official Microsoft workaround was a magic comment pasted at the very top of your HTML:</p>



<p class="wp-block-paragraph"><code>&lt;!-- saved from url=(0014)about:internet --&gt;</code></p>



<p class="wp-block-paragraph">The <code>14</code> represented the exact character count of <code>about:internet</code>. If your character count was off by one, the parser disregarded the directive and your local scripts remained locked down.</p>



<h4 class="wp-block-heading">4. The Occult Arts: <code>hasLayout</code>, <code>zoom: 1</code>, and DirectX Filters</h4>



<p class="wp-block-paragraph">Once CSS finally took over layout, Internet Explorer 6 introduced developers to <code>hasLayout</code>. It was an undocumented internal engine flag. If an element lacked layout, margins doubled on floats, background colors vanished, and containers refused to contain their children.</p>



<p class="wp-block-paragraph">To fix it, we resorted to superstition. You injected <code>zoom: 1</code> or <code>height: 1%</code> into your stylesheets. The properties had no logical business being there, but they tricked Trident into setting that internal flag to true.</p>



<p class="wp-block-paragraph">Transparent PNGs were worse. IE6 rendered 24-bit alpha channels as solid matte-gray or baby-blue blocks. In a 2006 tutorial I published on cross-browser PNG transparency, the only viable solution was running proprietary Microsoft DirectX filters:</p>



<p class="wp-block-paragraph"><code>filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png', sizingMethod='crop');</code></p>



<p class="wp-block-paragraph">It destroyed scrolling performance, broke hyperlink click targets, and required <code>hasLayout</code> to be toggled on just to render the graphic.</p>



<h4 class="wp-block-heading">Why We Built What We Built</h4>



<p class="wp-block-paragraph">We did not invent modern front-end tooling because we were bored and wanted complex build pipelines. We built automated builds, linting, reset sheets, and boilerplates because we spent our twenties writing duct tape around runtimes that actively fought us.</p>



<p class="wp-block-paragraph">The next time your build step throws a type warning or a CSS grid gap requires a minor fallback, take a breath. It beats debugging <code>spacer.gif</code> and toggling <code>zoom: 1</code> at 2:00 AM.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://htmlcssjavascript.com/web/when-the-web-was-actively-trying-to-kill-you-a-field-guide-to-early-front-end-lore/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TypeScript Won. Now It&#8217;s Giving Up Its Superpowers.</title>
		<link>https://htmlcssjavascript.com/web/typescript-won-now-its-giving-up-its-superpowers/</link>
					<comments>https://htmlcssjavascript.com/web/typescript-won-now-its-giving-up-its-superpowers/#respond</comments>
		
		<dc:creator><![CDATA[Rob Larsen]]></dc:creator>
		<pubDate>Tue, 13 Oct 2026 16:49:43 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[typescript]]></category>
		<guid isPermaLink="false">https://htmlcssjavascript.com/?p=11518</guid>

					<description><![CDATA[When you spin up a greenfield project on a Tuesday afternoon, a build step feels like a completely reasonable trade-off. You install a bundler, configure a transpiler, sprinkle in a few TypeScript-specific conveniences, and marvel at the developer ergonomics. Having the compiler quietly invent runtime JavaScript out of thin air to support an enum, a [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading"></h1>



<p class="wp-block-paragraph">When you spin up a greenfield project on a Tuesday afternoon, a build step feels like a completely reasonable trade-off.</p>



<p class="wp-block-paragraph">You install a bundler, configure a transpiler, sprinkle in a few TypeScript-specific conveniences, and marvel at the developer ergonomics. Having the compiler quietly invent runtime JavaScript out of thin air to support an <code>enum</code>, a runtime <code>namespace</code>, or constructor parameter properties feels downright luxurious. You get the strict typing of an enterprise language, the compiler sweeps the sawdust under the rug, and your local watch task hums along in 200 milliseconds.</p>



<p class="wp-block-paragraph">Then&#8230; you get to enterprise scale. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f923.png" alt="🤣" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">Suddenly, it isn&#8217;t one developer tinkering on a tidy side-project. It&#8217;s four hundred engineers distributed across eight time zones committing to a multi-gigabyte monorepo.</p>



<p class="wp-block-paragraph">That &#8220;harmless&#8221; build step isn&#8217;t a frictionless 200ms background blip anymore. It’s an eight-minute CI pipeline bottleneck. </p>



<p class="wp-block-paragraph">At enterprise scale, the build step stops being a convenience and starts being a multi-million-dollar operational tax. Every second added to a build is multiplied by every developer, every pull request, every CI job, and every environment.</p>



<p class="wp-block-paragraph">Which is why the recent discussion of <strong>native type-stripping</strong> and flags like <code>erasableSyntaxOnly: true</code> isn&#8217;t an academic purist argument. It is pure, ruthless pragmatism.</p>



<p class="wp-block-paragraph">When Node can simply load a <code>.ts</code> file, delete the type annotations and execute standard JavaScript immediately your local feedback loop approaches zero. But to get that speed, you have to give up the runtime compiler magic that makes the &#8220;superset&#8221; features of TypeScript work.</p>



<p class="wp-block-paragraph">The biggest beneficiary of this shift has been the humble object literal. If you haven’t made the shift yet, Axel Rauschmayer wrote a <a href="https://www.google.com/url?sa=E&amp;source=gmail&amp;q=https://2ality.com/2020/01/typescript-enums.html" target="_blank" rel="noopener">fantastic, definitive breakdown of replacing TypeScript enums with <code>as const</code> object literals</a>. By freezing a plain JavaScript object and deriving your union types via <code>keyof typeof</code>, you get all the autocomplete, refactoring safety, and strict checking of an enum—except it&#8217;s just raw, native ECMAScript that runs anywhere without a compiler generating IIFEs behind your back.</p>



<h3 class="wp-block-heading">The Inflection Point for ECMAScript</h3>



<p class="wp-block-paragraph">This shift does more than just rescue CI budgets; it marks a genuine inflection point for the ECMAScript specification itself.</p>



<p class="wp-block-paragraph">For the better part of a decade, TypeScript was the web&#8217;s de facto R&amp;D lab. The TC39 committee could watch Microsoft test language features in the wild to see what resonated with developers. But the lesson of the erasable syntax movement is forcing a deeper question: <strong>what was TypeScript doing that the ECMAScript spec itself should have absorbed?</strong></p>



<p class="wp-block-paragraph">We already saw the answer with classes, optional chaining, and nullish coalescing—features proven in TypeScript before landing in the formal JavaScript standard. The next frontier is the <a target="_blank" rel="noopener" href="https://github.com/tc39/proposal-type-annotations">Type Annotations proposal</a>, which aims to formally reserve type syntax in the ECMAScript grammar itself so browsers and runtimes can treat types as ignored comments by default.</p>



<p class="wp-block-paragraph">If ECMAScript formally standardizes native type ignore spaces, the concept of a mandatory transpile-to-JS build step for day-to-day web development begins to evaporate entirely.</p>



<p class="wp-block-paragraph">The convenience of language extensions was never an illusion. They helped bring static typing to an entire generation of JavaScript developers. But as our systems scaled from side projects to platforms, every non-erasable feature acquired a cost. The future increasingly looks like a world where types remain, build steps shrink, and the JavaScript that ships is little more than the JavaScript we wrote in the first place.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://htmlcssjavascript.com/web/typescript-won-now-its-giving-up-its-superpowers/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The Superset Trap: Why Node’s Native TypeScript is Going to Break Enterprise Brains</title>
		<link>https://htmlcssjavascript.com/web/the-superset-trap-why-nodes-native-typescript-is-going-to-break-enterprise-brains/</link>
					<comments>https://htmlcssjavascript.com/web/the-superset-trap-why-nodes-native-typescript-is-going-to-break-enterprise-brains/#respond</comments>
		
		<dc:creator><![CDATA[Rob Larsen]]></dc:creator>
		<pubDate>Thu, 08 Oct 2026 15:04:42 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[typescript]]></category>
		<guid isPermaLink="false">https://htmlcssjavascript.com/?p=11516</guid>

					<description><![CDATA[If you spend your time in open-source mailing lists or arguing about AST transformations on social media, the recent push toward &#8220;erasable syntax&#8221; makes total sense. I’ve been a proponent of TypeScript for a long time. In the early days, whenever someone brought up enum, for example, I remember having conversations along the lines of: [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading"></h1>



<p class="wp-block-paragraph">If you spend your time in open-source mailing lists or arguing about AST transformations on social media, the recent push toward &#8220;erasable syntax&#8221; makes total sense.</p>



<p class="wp-block-paragraph">I’ve been a proponent of TypeScript for a long time. In the early days, whenever someone brought up <code>enum</code>, for example, I remember having conversations along the lines of: <em>&#8220;Oh, enum? That’s not real. That gets magically transformed into real JavaScript behind your back.&#8221;</em></p>



<p class="wp-block-paragraph">And then I’d get a sparkle in wondering what IIFE monstrosity the compiler invented just to make it work. (I have to shout out Ben Alman, who was right here in our ridiculous Boston front-end scene when he popularized the term &#8220;IIFE&#8221; back in 2010. Little did Ben know the TypeScript compiler would end up weaponizing his naming contribution to haunt us sixteen years later.)</p>



<p class="wp-block-paragraph">Back then, we loved pulling back the curtain. Do people even know what a polyfill is anymore? I have my doubts.</p>



<p class="wp-block-paragraph">The thing is, most developers writing code for a living don&#8217;t live in that world.</p>



<p class="wp-block-paragraph"><em>&#8220;AST what?&#8221;</em></p>



<p class="wp-block-paragraph">In the enterprise trenches, where teams were dragged out of desktop software and backend services into the chaotic swamp of modern web development, TypeScript wasn&#8217;t viewed as a lightweight annotation layer. It was viewed as a sanctuary.</p>



<p class="wp-block-paragraph">Anders Hejlsberg designed C#, and then he designed TypeScript. To millions of backend engineers, TypeScript felt like fruit from the very same design tree. The mental model was simple: TypeScript was the bigger circle in the Venn diagram—the &#8220;typed superset&#8221; Microsoft explicitly sold us. You wrote <code>enum</code>, you wrote <code>namespace</code>, you wrote constructor parameter properties, and you trusted the compiler magic to handle the messy JavaScript plumbing underneath.</p>



<p class="wp-block-paragraph">And for a decade, that compact worked fine. The build toolchain absorbed the weirdness, emitted runtime IIFEs, and everyone went about their day.</p>



<p class="wp-block-paragraph">Then the enterprise joined the chorus asking for the holy grail: <em>“Can Node please just run TypeScript natively?”</em></p>



<p class="wp-block-paragraph">We got what we asked for. Node will execute your <code>.ts</code> files. But it does so with a massive asterisk that is going to bewilder anyone who learned TypeScript as &#8220;C# for the browser&#8221;: <strong>Node only strips types. It does not compile your bespoke runtime features.</strong></p>



<p class="wp-block-paragraph">The moment you run a raw TypeScript file in Node without a build step, that comfortable superset abstraction collapses. You have an <code>enum</code> sitting in an enterprise shared-utility file? Crash. A clever <code>namespace</code>? Crash.</p>



<p class="wp-block-paragraph">Nobody in a corporate sprint planning meeting thought about the distinction between <em>type-stripping</em> and <em>transpilation</em>. They just assumed native TypeScript meant the engine would run their TypeScript code. Period.</p>



<p class="wp-block-paragraph">Which brings us to <code>erasableSyntaxOnly: true</code>.</p>



<p class="wp-block-paragraph">JSON</p>



<pre class="wp-block-code"><code>{
  "compilerOptions": {
    "erasableSyntaxOnly": true
  }
}
</code></pre>



<p class="wp-block-paragraph">This flag is essentially the antidote to a decade of superset marketing. It forces the compiler to yell at you the second you write syntax that can&#8217;t be deleted with an eraser. Try to write an <code>enum</code>? It breaks in your editor before it can blow up your server.</p>



<p class="wp-block-paragraph">It is a fascinating full-circle moment. For ten years, teams embraced TypeScript precisely because it felt like a richer, more familiar programming language than JavaScript. Now, if we want the dream of zero-build native execution, we have to teach those same teams that the extra features they loved were actually technical debt in disguise.</p>



<p class="wp-block-paragraph">Fun times.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://htmlcssjavascript.com/web/the-superset-trap-why-nodes-native-typescript-is-going-to-break-enterprise-brains/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Governing the Generative Drift: Why We Need the Assumptions &#038; Constraints Manifest (ACM)</title>
		<link>https://htmlcssjavascript.com/web/why-we-need-the-acm/</link>
					<comments>https://htmlcssjavascript.com/web/why-we-need-the-acm/#respond</comments>
		
		<dc:creator><![CDATA[Rob Larsen]]></dc:creator>
		<pubDate>Tue, 08 Sep 2026 16:45:18 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://htmlcssjavascript.com/?p=11510</guid>

					<description><![CDATA[A couple of weeks ago, I talked about the &#8220;Happy Path Trap&#8221;—how LLMs create massive Day 1 velocity while burying teams in silent Day 2 architectural debt. During that discussion, I pitched an idea: What if we required an Assumptions &#38; Constraints Manifest (ACM) in every AI-assisted PR to make hidden trade-offs visible? Since I’m [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Launching ACM v1.1 (Assumptions and Constraints Manifest)" width="500" height="375" src="https://www.youtube.com/embed/klsM_6d-G2s?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">A couple of weeks ago, I talked about the &#8220;Happy Path Trap&#8221;—how LLMs create massive Day 1 velocity while burying teams in silent Day 2 architectural debt.</p>



<p class="wp-block-paragraph">During that discussion, I pitched an idea: What if we required an Assumptions &amp; Constraints Manifest (ACM) in every AI-assisted PR to make hidden trade-offs visible?</p>



<p class="wp-block-paragraph">Since I’m not one to wait around for someone else to build tooling I want to use, I spent the last few days building it out.</p>



<p class="wp-block-paragraph">Today, I’m open-sourcing ACM v1.1—a formal spec and developer toolkit designed to audit architectural boundaries, not just syntax.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> What’s in the toolkit:<br>Typed Contracts &amp; Proof Obligations: Requires the PR to explicitly state guarantees around concurrency, idempotency, and scaling—citing exact line numbers and locking mechanisms.</p>



<p class="wp-block-paragraph">Automated Generation: Drop-in .cursorrules and PR templates that prompt Cursor, Claude, and Copilot to generate manifests automatically during code creation.</p>



<p class="wp-block-paragraph">CI/CD Linter: An open-source CLI linter (@roblarsen/acm-cli) and GitHub Action to validate manifests and gate PRs automatically in your pipeline.</p>



<p class="wp-block-paragraph">Instead of spending 45 minutes playing digital archaeology on AI-generated diffs, reviewers can audit explicit boundaries in 30 seconds.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f517.png" alt="🔗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Get Started<br>GitHub: <a href="https://github.com/roblarsen/ACM">github.com/roblarsen/ACM</a></p>



<p class="wp-block-paragraph">CLI: npx @roblarsen/acm-cli</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://htmlcssjavascript.com/web/why-we-need-the-acm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Weekly Web Dev Quick Hits</title>
		<link>https://htmlcssjavascript.com/web/weekly-web-dev-quick-hits/</link>
					<comments>https://htmlcssjavascript.com/web/weekly-web-dev-quick-hits/#respond</comments>
		
		<dc:creator><![CDATA[Rob Larsen]]></dc:creator>
		<pubDate>Tue, 11 Aug 2026 17:37:45 +0000</pubDate>
				<category><![CDATA[Web]]></category>
		<guid isPermaLink="false">https://htmlcssjavascript.com/?p=11492</guid>

					<description><![CDATA[A couple quick hits while I rev the content engine back up over here! CSS Weaponized at Black Hat 2026: Security researcher Gareth Heyes dropped a research paper showing how CSS alone can break out of webmail sanitizers. Without a single line of JavaScript, malicious stylesheets in Gmail and Outlook were manipulated to spoof UI [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>A couple quick hits while I rev the content engine back up over here!</p>
<ul>
<li>
    <strong><a href="https://beeble.com/en/blog/how-a-css-border-escape-compromised-the-world-s-most-trusted-webmail-interfaces" target="_blank" rel="noopener">CSS Weaponized at Black Hat 2026</a>:</strong> Security researcher Gareth Heyes dropped a research paper showing how CSS alone can break out of webmail sanitizers. Without a single line of JavaScript, malicious stylesheets in Gmail and Outlook were manipulated to spoof UI elements, capture keystrokes, and steal tokens. Stripping <code>&lt;script&gt;</code> tags isn&#8217;t cutting it anymore, apparently.
  </li>
<li>
    <strong><a href="https://css-tricks.com/2026-state-of-css-devs-surveys/" target="_blank" rel="noopener">The 2026 State of CSS Results Are In</a>:</strong> The survey numbers show <code>:has()</code> leading as the most used newer feature, while Anchor Positioning holds the crown as the &#8220;favorite feature we wish had better browser support.&#8221; On the workflow front, 80% of developers report using AI for less than half of their CSS work. It turns out layout still needs humans!
  </li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://htmlcssjavascript.com/web/weekly-web-dev-quick-hits/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
