<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Joyce Hanson on Medium]]></title>
        <description><![CDATA[Stories by Joyce Hanson on Medium]]></description>
        <link>https://medium.com/@fuego?source=rss-ab94b33db812------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*XRZLWu_tDGcFtr_7iKzZkg.jpeg</url>
            <title>Stories by Joyce Hanson on Medium</title>
            <link>https://medium.com/@fuego?source=rss-ab94b33db812------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 02:41:41 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@fuego/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Refactoring the button component]]></title>
            <link>https://medium.com/@fuego/refactoring-the-button-component-297fe6f9902d?source=rss-ab94b33db812------2</link>
            <guid isPermaLink="false">https://medium.com/p/297fe6f9902d</guid>
            <category><![CDATA[button]]></category>
            <category><![CDATA[tokenization]]></category>
            <category><![CDATA[variables]]></category>
            <category><![CDATA[design-systems]]></category>
            <category><![CDATA[figma]]></category>
            <dc:creator><![CDATA[Joyce Hanson]]></dc:creator>
            <pubDate>Thu, 07 Aug 2025 20:29:10 GMT</pubDate>
            <atom:updated>2025-08-08T07:05:02.892Z</atom:updated>
            <content:encoded><![CDATA[<p>A behind-the-scenes look at how I reduced Edifire UI’s button component from 432 variants to just 32 using parametric logic, slot-based design, and Figma properties. This case study explores the thinking, tooling, and cleanup strategy behind a scalable, token-driven system built solo and made for open source.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pt8V2x8qBSo0MvTOk0sytQ.png" /><figcaption>Specifications and tokens of the Primary button</figcaption></figure><h3>How i reduced my button variants from 432 to 32 in My Solo Design System , Edifire UI</h3><p>When I started building Edifire UI, a personal design system built from the ground up, I thought I was being thorough. After all, what’s a design system without a button component that can handle every edge case and visual preference?</p><p>I created states for hover, focus, disabled, and loading. I accounted for size variations, different icon placements, tones, hierarchies based on importance.</p><p>It seemed comprehensive at first, just a simple frame with a label. Maybe an icon. Maybe two. Then came sizes, colors, states, icon alignments, theme modes. Before I knew it, my tidy component panel had morphed into a scrollable list of 432 button variants.</p><p>It was chaos… but it was my creative little chaos :D</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*088Rp1_pYWEWPFnCKn49UA.gif" /></figure><figure><img alt="Booleans and different properties from the button variant" src="https://cdn-images-1.medium.com/max/454/1*Dw76OYeDbhyz2GSZXy0qUA.png" /><figcaption>Figma component properties panel for the old button component</figcaption></figure><h3>Setting the scene</h3><p>Edifire UI started as a personal project, to build a scalable, visually balanced design system I could reuse across side projects and eventually release for others to use. I wanted it to be minimal, flexible, and fully tokenized.</p><p>The button, being the most frequently used component in any UI kit, was naturally one of the first elements I tackled. I approached it with a mindset of “account for everything.” And that’s exactly what I did. In this case, I think I must have over-accounted 432 times.</p><h3>“Did it break?”: When Flexibility Becomes Fatigue</h3><p>This wasn’t a visual failure. Nothing was broken, misaligned, or technically wrong. But something felt heavy. My build-up felt bloated.</p><p>I wasn’t getting error messages. I wasn’t struggling to make the component work. What I was struggling with was the mental load of navigating it. I had unknowingly recreated one of the most common and least discussed problems in design systems: <strong>Variant Overload</strong>.</p><p>In Figma, the component panel had become a scroll-fest. Every time I needed a simple button, I found myself buried in nested menus and 5-syllable variant names. It was like trying to order a coffee and being handed a menu with 400+ combinations, each with a slightly different name.</p><p>Even though Figma handled it just fine, but I realised component overload is a quiet killer in many design systems.</p><h3>The inspiration</h3><p>I came across a talk by the Uber design systems team. They were walking through how they reduced their badge component from dozens of rigid variants to just a few highly dynamic configurations, by switching to a parametric design model.</p><p>Their badge could take on any shape, tone, or status, without bloating the variant list. It used just a handful of props like tone, size, icon, and text, powered by tokens and context-aware logic. It was simple, smart, and scalable.<br>This stuck with me.</p><p>So when I looked back at my own button, I began to see it not as a static set of visual options, but as a parametric system waiting to be unlocked. Oh my buttons waited with eager expectation for their rebirth.</p><p>That mindset, that shift from how it looks to how it behaves, became the catalyst for rethinking everything.</p><h3>The Audit: Mapping the Mess</h3><p>I took a step back and mapped every possible combination I had created.</p><p>I mapped out the anatomy of the buttons including its different sizes, so i can identify what property to turn into a parametric variable.</p><p>I tracked the following elements:</p><p>• Button size</p><p>• Font size</p><p>• Font height</p><p>• Spacing between elements</p><p>• Vertical padding</p><p>• Horizontal padding</p><p>• Corner radius</p><figure><img alt="Size and font tokens of the button component" src="https://cdn-images-1.medium.com/max/1024/1*E5K3auFeO_fnrF9ofq-jRw.png" /><figcaption>Size and font tokens of the button component</figcaption></figure><figure><img alt="Spacing and Corner radius tokens of the button component" src="https://cdn-images-1.medium.com/max/1024/1*jhZibQOjTc3CmvuAnKS6tA.png" /><figcaption>Spacing and Corner radius tokens of the button component</figcaption></figure><h3>The Rebuild</h3><p>This time i approached the button like a developer might approach a component API.</p><p>I then broke down the visual and functional aspects into properties that could be toggled and scaled. I created a collection of token variables for the identified properties and then assigned the variables to the button component while maintaining both light and dark mode.</p><p>Instead of hundreds of rigid variants, I created one core structure with 32 intelligent configurations. Each decision was driven by 1 question:</p><p>“Will this reduce mental load for anyone using it, including future me?”</p><figure><img alt="Variables of the tokens" src="https://cdn-images-1.medium.com/max/1024/1*I6u2hgD5l7iFRx5CXihCVA.png" /><figcaption>Variables of the tokens for the new button</figcaption></figure><h3>The Outcome: From Bloat to Brilliance</h3><p>Reducing 432 variants to 32 wasn’t just about decluttering. It created space for speed, focus, and consistency.</p><p>• Faster performance in Figma</p><p>• Less chance to reduce or override</p><p>• Easy theming with token hooks</p><p>• Predictable behavior across different sizes</p><p>Now when I need a button, I toggle a few properties. That’s it. No overly long list of variants and properties, No visual/mental fatigue.</p><p>Now talk about scalability!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*pwARH3hMOHRlDTC7rDHAPw.gif" /><figcaption>Testing out the new button</figcaption></figure><figure><img alt="Properties of the new button" src="https://cdn-images-1.medium.com/max/470/1*modtyjjnHtxbq-qlKw1vNg.png" /><figcaption>Properties panel of the new button</figcaption></figure><figure><img alt="Variants of the new button component" src="https://cdn-images-1.medium.com/max/1024/1*NzprHiSq13C4pLR8399-KA.png" /><figcaption>Variants of the new button component</figcaption></figure><figure><img alt="Appearance panel in Figma, where the button’s size is being controlled" src="https://cdn-images-1.medium.com/max/906/1*-sIjGd31ybzISUL1lWVVLg.png" /><figcaption>Appearance panel in Figma, where the button’s size is being controlled</figcaption></figure><h3>Accessibility</h3><p>Reducing complexity was the goal, but not at the cost of usability. From the very start, I treated accessibility as a core design input. Here’s how it shaped the button rebuild:</p><p>Every color token, whether text, or background, was tested to meet WCAG contrast standards in both light and dark mode. If it didn’t pass, it didn’t make the cut.</p><figure><img alt="Using the Contrast plugin oon Figma to test the contrast" src="https://cdn-images-1.medium.com/max/595/1*j6IN586V7w8RYC1bv5Z5YA.avif" /><figcaption>Using the Contrast plugin oon Figma to test the contrast</figcaption></figure><h3>What I Learned</h3><p>Working on Edifire UI gave me full control, but also full responsibility. I couldn’t rely on team reviews or shared standards. The system had to be resilient by design.</p><p>Here’s what this process taught me:</p><p>• A component should feel like a tool, not a trap.</p><p>• Flexibility comes from constraint, not chaos.</p><p>• Designing alone means future you becomes your toughest stakeholder.</p><p>• Component logic is more powerful than visual stacking.</p><p>• Design systems are about decision reduction, not just reusability.</p><p>• Tokens, slots, and props are your best friends.</p><p>• If something starts to look heavy, it’s time to refactor.</p><h3>What’s next</h3><p>The button refactor was just the first step in shaping Edifire UI into a system that’s thoughtful, scalable, and genuinely enjoyable to use.</p><p>Next, I’m applying the same approach to modals, dropdowns, tabs, and inputs, where logic not layering, leads the design.</p><p>Edifire is going open source. When it does, it won’t just be a collection of UI parts.</p><p>Build small. Think in systems. Reduce friction. Leave room to grow.</p><p>I’m also focused on bridging the gap between design and development so others can use the system right out of the box. I plan to include the React code snippets of the components in Edifire UI directly on the file using Figma MCP and Cursor.</p><figure><img alt="Before and after shots of the button component" src="https://cdn-images-1.medium.com/max/1024/1*r2dIGvLdwL1WXl5DSzhNhQ.png" /><figcaption>Before and after shots of the button component</figcaption></figure><figure><img alt="Dark and light mode view of the button variants" src="https://cdn-images-1.medium.com/max/1024/1*eZ9XdVsUuo2x8daclUWsXw.png" /><figcaption>Dark and light mode image of the button variants</figcaption></figure><p>Inspired by Uber’s “Parametric Components” approach</p><p>Watch here: <a href="https://youtu.be/-z9JX8Lz5lI?si=9l5XZCbpWZF0OQee">https://youtu.be/-z9JX8Lz5lI?si=9l5XZCbpWZF0OQee</a></p><p>In this talk, Uber shares how they reduced the badge component by switching from permutations to parametric controls using tokens and props.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=297fe6f9902d" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>