<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jenny Akhi</title>
    <description>The latest articles on DEV Community by Jenny Akhi (@jenny_akhi_aade503c2764f6).</description>
    <link>https://dev.to/jenny_akhi_aade503c2764f6</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3988884%2F83908596-a358-4603-80a9-9ba33ef114f5.jpg</url>
      <title>DEV Community: Jenny Akhi</title>
      <link>https://dev.to/jenny_akhi_aade503c2764f6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jenny_akhi_aade503c2764f6"/>
    <language>en</language>
    <item>
      <title>Stop Bloating Your JS Bundle: Mastering Zero-Runtime CSS with traceless-style ⚡</title>
      <dc:creator>Jenny Akhi</dc:creator>
      <pubDate>Thu, 18 Jun 2026 20:32:10 +0000</pubDate>
      <link>https://dev.to/jenny_akhi_aade503c2764f6/stop-bloating-your-js-bundle-mastering-zero-runtime-css-with-traceless-style-19p5</link>
      <guid>https://dev.to/jenny_akhi_aade503c2764f6/stop-bloating-your-js-bundle-mastering-zero-runtime-css-with-traceless-style-19p5</guid>
      <description>&lt;p&gt;Let's cut the fluff. If you are still shipping massive JavaScript bundles just to calculate CSS styles in the browser, you are bottlenecking your Core Web Vitals. Let's look at how to handle styling at compile time, completely stripping out the runtime overhead.&lt;/p&gt;

&lt;p&gt;​The entry point for this architecture in traceless-style is the tl.create API. It accepts a single argument: an object where the keys are arbitrary names you choose, and the values are literal style definitions.&lt;br&gt;
​Here is exactly what defining a component looks like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;javascript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;import { tl } from "traceless-style"; &lt;br&gt;
const $ = tl.create({ &lt;br&gt;
  card: { &lt;br&gt;
    display: "flex", &lt;br&gt;
    flexDirection: "column", &lt;br&gt;
    padding: "1rem", &lt;br&gt;
    background: "#ffffff", &lt;br&gt;
    borderRadius: "8px", &lt;br&gt;
    boxShadow: "0 1px 3px rgba(0,0,0,0.1)", &lt;br&gt;
    _hover: { &lt;br&gt;
      boxShadow: "0 4px 12px rgba(0,0,0,0.15)", &lt;br&gt;
    },&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;title: { &lt;br&gt;
    fontSize: "1.25rem", &lt;br&gt;
    fontWeight: 600, &lt;br&gt;
    marginBottom: "0.5rem"&lt;/p&gt;

&lt;p&gt;What makes this powerful is what happens next. A strict literal-only AST parser locates the tl.create call at build time, validates properties against a strict allowlist, and hashes each property-value pair into an 8-character base36 class name.&lt;br&gt;
​After compilation, the object above is entirely stripped from your bundle and replaced with pure string hashes:`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;javascript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;// After compilation:&lt;br&gt;
const $ = { &lt;br&gt;
  card: "tl12abcd34 tl56efgh78 tl9ab0c1d2 tl3e4f5g6h tl7i8j9k0l tlmnopqrst tluvwxyz12", &lt;br&gt;
  title: "tl34567890 tlabcdefgh tlijklmnop", &lt;br&gt;
};&lt;br&gt;
&lt;/code&gt;Because the compiler needs to know every value at compile time to emit the matching CSS rule, dynamic variables are strictly rejected. If you try to pass color: myColor or use a template literal, the parser will throw a ParseError. If you need dynamic values, you use compile-time resolved design tokens (tl.defineTokens), not runtime JavaScript.&lt;br&gt;
​You also get full composition and built-in variants as standard object keys. Pseudo-classes, breakpoints, and dark mode overrides are handled instantly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;javascript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tl.create({ &lt;br&gt;
  myStyle: { &lt;br&gt;
    color: "white", &lt;br&gt;
    _hover: { color: "lightblue" }, &lt;br&gt;
    sm: { padding: "0.5rem" }, // breakpoint &lt;br&gt;
    _dark: { background: "black" }, // dark mode override&lt;br&gt;
    "&amp;amp;:nth-child(odd)": { background: "#f0f0f0" }, // raw selector pass-through&lt;br&gt;
  }, &lt;br&gt;
});&lt;br&gt;
&lt;/code&gt;Pre-compile it, hash it, and ship zero runtime. Have you migrated your frontend stack to strict build-time styling yet? &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/sparkgoldentech/traceless-style/blob/main/docs/api/create.md" rel="noopener noreferrer"&gt;https://github.com/sparkgoldentech/traceless-style/blob/main/docs/api/create.md&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>performance</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Why are we still shipping CSS parser code to the browser?</title>
      <dc:creator>Jenny Akhi</dc:creator>
      <pubDate>Thu, 18 Jun 2026 03:26:27 +0000</pubDate>
      <link>https://dev.to/jenny_akhi_aade503c2764f6/why-are-we-still-shipping-css-parser-code-to-the-browser-3f23</link>
      <guid>https://dev.to/jenny_akhi_aade503c2764f6/why-are-we-still-shipping-css-parser-code-to-the-browser-3f23</guid>
      <description>&lt;p&gt;Serious question to all frontend developers: Why do we still accept bundle bloat and LCP lag just for dynamic styling?&lt;br&gt;
​If we can achieve the exact same dynamic flexibility using a 10ms build-time scanner with 0ms runtime architecture, why hasn't zero-runtime become the absolute industry standard yet?&lt;br&gt;
​What are the actual trade-offs that keep you using heavy runtime CSS-in-JS libraries in 2026? Let’s discuss.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>css</category>
      <category>webdev</category>
      <category>performance</category>
    </item>
    <item>
      <title>traceless-style vs Tailwind vs StyleX vs styled-components — an honest comparison</title>
      <dc:creator>Jenny Akhi</dc:creator>
      <pubDate>Wed, 17 Jun 2026 10:46:31 +0000</pubDate>
      <link>https://dev.to/jenny_akhi_aade503c2764f6/traceless-style-vs-tailwind-vs-stylex-vs-styled-components-an-honest-comparison-1kb8</link>
      <guid>https://dev.to/jenny_akhi_aade503c2764f6/traceless-style-vs-tailwind-vs-stylex-vs-styled-components-an-honest-comparison-1kb8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftzpqvbb4bfvkwvs0az92.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftzpqvbb4bfvkwvs0az92.jpg" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
Every CSS-in-JS and atomic CSS library makes different tradeoffs. This post compares traceless-style, Tailwind, StyleX, and styled-components across the dimensions that matter for a real project.&lt;/p&gt;

&lt;p&gt;All information below is drawn from the official documentation of each library.&lt;/p&gt;

&lt;h2&gt;
  
  
  The comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;traceless-style&lt;/th&gt;
&lt;th&gt;StyleX&lt;/th&gt;
&lt;th&gt;Tailwind&lt;/th&gt;
&lt;th&gt;styled-components&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runtime cost&lt;/td&gt;
&lt;td&gt;None (fallback hash only)&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;High (hash + insertRule per render)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Atomic CSS&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build-time deduplication&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Babel plugin required&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arbitrary CSS values&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No (config-only)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in WCAG contrast validation&lt;/td&gt;
&lt;td&gt;Yes (build-time, halts build)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto dark mode derivation&lt;/td&gt;
&lt;td&gt;Yes (WCAG-compliant)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Plugin-based&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto RTL (compile-time)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Plugin-based&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Design tokens + TypeScript safety&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (config)&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server Components&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Partially&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VS Code extension&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WCAG 2.2 §2.4.13 focus checks&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What traceless-style is not
&lt;/h2&gt;

&lt;p&gt;The docs are explicit about this and it matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not a Tailwind replacement.&lt;/strong&gt; Tailwind ships a fixed utility vocabulary (&lt;code&gt;bg-red-500&lt;/code&gt;, &lt;code&gt;px-4&lt;/code&gt;). traceless-style accepts arbitrary CSS values (&lt;code&gt;background: "red"&lt;/code&gt;, &lt;code&gt;padding: "1rem"&lt;/code&gt;). There is no shorthand utility syntax.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a styled-components replacement.&lt;/strong&gt; There is no template-tag DSL, no &lt;code&gt;styled.button&lt;/code&gt; API. Styles attach to elements via &lt;code&gt;className=&lt;/code&gt; only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a CSS-in-JS library in the traditional sense.&lt;/strong&gt; Nothing runs at render time except a deterministic hash used as a runtime fallback for SSR and non-bundled test environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When traceless-style is the right choice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You have an accessibility compliance requirement (Section 508, EN 301 549) and want to automate WCAG enforcement instead of relying on manual audits.&lt;/li&gt;
&lt;li&gt;You want zero runtime cost and don't want a Babel plugin in your build chain.&lt;/li&gt;
&lt;li&gt;You want auto dark mode and auto RTL without managing two stylesheets or writing every property twice.&lt;/li&gt;
&lt;li&gt;You're starting a new project and want design-token TypeScript safety from day one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;traceless-style
npx traceless-style init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docs: &lt;a href="https://traceless-style.dev" rel="noopener noreferrer"&gt;https://traceless-style.dev&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/sparkgoldentech/traceless-style" rel="noopener noreferrer"&gt;https://github.com/sparkgoldentech/traceless-style&lt;/a&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
    </item>
  </channel>
</rss>
