<?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/"
    xmlns:georss="http://www.georss.org/georss"
    xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
  >
    <channel>
      <title>Piccalilli - Design topic archive</title>
      <link>https://piccalil.li/</link>
      <atom:link href="https://piccalil.li/category/design.xml" rel="self" type="application/rss+xml" />
      <description>We are Piccalilli. A publication dedicated to providing high quality educational content to level up your front-end skills.</description>
      <language>en-GB</language>
      <copyright>Piccalilli - Design topic archive 2026</copyright>
      <docs>https://www.rssboard.org/rss-specification</docs>
      <pubDate>Tue, 07 Apr 2026 01:02:02 GMT</pubDate>
      <lastBuildDate>Tue, 07 Apr 2026 01:02:02 GMT</lastBuildDate>

      
      <item>
        <title>The open source design stack</title>
        <link>https://piccalil.li/blog/the-open-source-design-stack/?ref=design-category-rss-feed</link>
        <dc:creator><![CDATA[Scott Riley]]></dc:creator>
        <pubDate>Thu, 05 Feb 2026 11:55:00 GMT</pubDate>
        <guid isPermaLink="true">https://piccalil.li/blog/the-open-source-design-stack/?ref=design-category-rss-feed</guid>
        <description><![CDATA[<div><h2>FYI</h2>
<p>Scott and Piccalilli are not affiliated with any of the products mentioned in this article. They’re nice tools that we recommend trying out, but we gain nothing from any links or signups. We also haven’t consulted with any of the mentioned products in the process of putting this post together.</p>
</div>
<p>Design tooling is in a pretty weird place right now. On the one hand, we’ve evolved from the struggle bus days of trying to wrangle Adobe products into doing something useful, and design tools have never felt more robust and seamless than they do right now.</p>
<p>On the other hand, SaaS has turned the web into a clusterfuck of aspiring monopolies, subscription models, yearly price hikes and AI pivots that literally no one asked for. Design tooling has not avoided such a fate.</p>
<p>We have, ostensibly, one ‘serious’ option when it comes to professional design work: use Figma, and go fuck yourself. This article could easily be 2,000 words of anti-Figma diatribe, and while that would definitely make me feel better, it wouldn’t really be useful, and in a shocking turn of events, I am trying my best to write something useful.</p>
<p>With the incessant push for profit, growth and shareholder appeasement, picking tools from a small pot of SaaS options that we’ve somehow convinced ourselves are the only viable solutions on the market is an increasingly frustrating exercise.</p>
<p>This is even more stark when we look at the relatively slim pickings we have when it comes to our design tools. Figma’s aforementioned chokehold on the industry leaves us beholden to whatever decisions eventually trickle down from the boardroom obsession with money above all else. Recent releases of their abysmal AI tooling and <a href="https://uxdesign.cc/figma-sites-when-accessibility-is-an-afterthought-070ba3b41553">their</a> <a href="https://forum.figma.com/ask-the-community-7/figmasite-is-bad-42173">frankly irredeemable</a> ‘Sites’ offering show us that these decisions don’t always benefit us.</p>
<p>When I was putting the plan together for the <a href="https://piccalil.li/mindful-design?utm_medium=author-promo">Mindful Design course</a> (which feels like a decade ago at this point, wild that it’s been less than a year) I desperately wanted to avoid using Figma. Not only would I be implicitly advocating for any tool shown or used in the course, I’d also be asking people to use them themselves and, subsequently, pay for them.</p>
<p>This was honestly a weird position to be in. Up until that point I hadn’t really considered how much I was locked in to the Figma ecosystem. All my early stage design work was in FigJam, and the idea there was an alternative to Figma for large-scale prototypes and product design was something I never really reckoned with to any serious degree.</p>
<p></p>
<p>Nevertheless, the goal was simple: find a set of tools that were either open source, free, or affordable that also wouldn’t require compromising on quality, and allow for industry-standard output. I decided early on that if I couldn’t create something I would be happy putting in front of a client, then it was out of contention.</p>
<p>With that in mind, the first few months of planning the course revolved around breaking out of the Figma ecosystem and putting as many free and open source tools to the test as we could. Now, the fact this article <em>exists</em> shows that we succeeded on that front, but what I honestly didn’t expect was that the experience would be so good (and honestly quite liberating) that I’d actually be switching my whole design setup to free and open source tools.</p>
<h2>Open source isn’t perfect</h2>
<p>One last bit of exposition-dumping before we dive in to the wonderful world of not paying SaaS leeches a monthly fee to be rooted in an extractive ecosystem: <strong>open source is not a silver bullet</strong>. Open source tools aren’t charities, they’re not inherently democratised, and they often come with their own sets of problems and frustrations. As most developers can attest to, as liberating as open source tooling can be, it can just as easily lead to infuriatingly fragmented and inconsistent setups.</p>
<p>Open source also does not guarantee ethics. Many open source projects are funded and in many cases owned by for-profit companies, many of whom are actually fucking horrible and use their contributions to free and open source offerings to essentially FOSS-wash their reputation. Yes, I’m looking at you, Vercel and Meta.</p>
<p>This was yet another consideration when I was trying out tools: are they owned or maintained by complete pricks? If so, maybe don’t use them.</p>
<p>I’m saying this now, because I know for everyone with a rose-tinted view who sees Free and Open Source (FOSS) as purely altruistic philanthropy, there’s someone on the other side ready to be contrarian and ‘well actually’ about how, for example, React is open source, and is funded by the same people who ushered in a brand new flavour of mindfuck technocratic capitalism.</p>
<p>With all that in mind, let’s drag me away kicking and screaming from the political discourse and into that previously promised writing of something useful.</p>
<p></p>
<h2>The design ‘stack’</h2>
<p>Confession time: I’ve branded myself as a full-stack designer for a while now. I like the term full-stack developer and I like applying it to my role as ‘a designer who is a little bit shit at everything’. While your development ‘stack’ might include back-end and front-end frameworks (or good old HTML and CSS), the design ‘stack’ I believe includes everything from early stage research to final prototyping and hand-over, and arguably into more ‘front of the front-end’ things like design tokens and coded components.</p>
<p>When I talk about an open source design stack, then, I’m talking about using free and open source tools to assist with every stage of a design process. I’m going to break the rest of this article into the various stages of the design process, and the tools I like to use to be a little bit shit at everything there.</p>
<h2>Planning and briefing</h2>
<p>Every good project should start with a few words. I don’t really care if that’s a couple of sentences explaining an idea or a meticulous, multi-page spec document that covers all the bases. One of the worst things I think anyone can do is try and draw their idea out in rectangles before they can even explain that idea succinctly in words.</p>
<p>A good brief, good early stage documentation, and a place to write down any ideas that come to mind throughout your project are all essential. So, in a rather anticlimactic turn of events, the first thing we’re going to look for is something we can write words in.</p>
<h3>Scott’s favourite: AFFiNE</h3>
<p><a href="https://affine.pro/">AFFiNE</a> (laborious casing aside) is basically a better, FOSS version of Notion. You can self-host or use their pretty generous free hosted version. Alternatively, if you don’t need cloud sync or collaboration, you can use it purely with local IndexedDB storage.</p>
<p>Their heavily-marketed AI assistant is a paid monthly extra and doesn’t come as part of the standard offering, which is fantastic, because you can fucking ignore it forever.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/affine.png" alt="A screenshot of the ‘AFFiNE’ interface, showing a whiteboard-style infinite canvas, with a text post on the left and two connected sticky notes on the right, illustrating how the product can be used to write text and visually brainstorm at the same time." /></p>
<p>It’s an interesting spin on Notion’s collaborative, block-based document + centralised database structure in that they’ve just randomly slapped a whiteboarding tool into the app. Because why the fuck not? (Okay, it’s actually really good, and you can absolutely use it for all your brainstorming needs.)</p>
<p>I still really like Notion and I found it hard to break away at first, but given that I rarely need/want my data stored in a cloud DB, I was quickly enamoured with Affine's no-sign-in, no-cloud-storage offering.</p>
<p>Other tools in this space include <a href="https://github.com/AppFlowy-IO/AppFlowy">Appflowy</a> and <a href="https://docmost.com/">Docmost</a>.</p>
<h2>Research and synthesis</h2>
<p>If you don’t start your projects with at least a bit of observational research you absolutely should. If you do start your projects with research, do more. Thanks.</p>
<p>I split research into two broad themes, <em>conducting</em> and <em>synthesis</em>. For <em>conducting</em> research, the main goal is capturing raw data. For me, that’s almost always simply recordings of my observational research sessions.</p>
<p>Where the ‘magic’ of a research phase lies in in the <em>synthesis</em> phase. This is where we take all of our raw data and collate it in a way that actually makes sense, informs our problem space, and helps us make decisions. Think things like affinity maps, empathy maps, and Object Orientated User Experience (OOUX) boards.</p>
<h3>Scott’s favourite for conducting: Jitsi Meet</h3>
<p>My requirements for conducting research are pretty minimal: can I talk to another human and record that conversation? With that in mind, 99% of my remote research sessions have been Google Meet calls, because it’s kinda just the default, innit?</p>
<p>However, recently I’ve had success with <a href="https://meet.jit.si/">Jitsi Meet</a>, which is essentially Google Meet without the Google shenanigans. I don’t know what more to say here: you start a call, you invite someone else to that call, and you talk to them.</p>
<p>I don’t like recording calls to the cloud, so all my calls are recorded and saved locally via <a href="https://obsproject.com/">OBS</a>.</p>
<h3>Scott’s favourite for synthesis: tldraw</h3>
<p>Okay, noticing a theme now, apparently normal casing is rare in open source tool naming. Aside from that, <a href="https://www.tldraw.com/">tldraw</a> (often stylised as <em>tl;draw</em> which I kinda love) is a <em>fantastic</em> whiteboarding tool out the box.</p>
<p>Heading to <a href="https://www.tldraw.com/">tldraw.com</a> will get you straight into a gorgeous whiteboarding experience, but the tldraw project is far more than that, essentially positioning itself as an '<a href="https://github.com/tldraw/tldraw">infinite canvas SDK</a>'. Essentially, the whiteboarding tool is the 'flagship demo' for the possibilities of the SDK, and we can use it for free. Lucky us.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/tldraw.png" alt="Screenshot of the tldraw interface. An infinite canvas whiteboard, containing a 2x2 ranking grid workshop. The screen is split into four quadrants, and several sticky notes are placed into each quadrant." /></p>
<p>I have to give a big shoutout here to <a href="https://excalidraw.com/">Excalidraw</a> as well. Another fantastic infinite-canvas whiteboarding tool, with my favourite approach to onboarding I think I’ve ever seen. Similar to Affine, everything is saved locally to browser storage, something I’m a huge, huge fan of.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/excalidraw.png" alt="Screenshot of the Excalidraw interface. An empty state is show, will various onboarding ‘helper’ text placed close to the UI elements they’re describing, including ‘Pick a tool &amp; start drawing!’ below the tool UI, ‘Shortcuts &amp; help’ near a help icon, and ‘Export, preferences, languages, …’ near a menu icon. The centre of the screen shows options for ‘Open’, ‘Help’, ‘Live collaboration’, and ‘Sign up’." /></p>
<h2>Prototypes</h2>
<p>As much as I love writing and whiteboarding tools, I think we can all acknowledge that the main character of the design process is your prototyping tool. I’m including digital wireframes in this, too, because the only true wireframes are done on A3 paper with the chunkiest fucking Sharpie you can find.</p>
<p>The supposedly flagship part of our process requires a tool capable of matching the lofty standards of <em>[checks notes]</em> being able to draw the correct rectangles.</p>
<h3>Scott’s fav: HTML and CSS</h3>
<p>I am once again <a href="https://piccalil.li/blog/the-time-for-designers-to-learn-to-code-is-now/">begging you to learn how to code</a>. For me, the best tool for designing things that will eventually live in the browser, is the browser itself. HTML and CSS are not hard to learn. People just massively over-complicate front-end tooling these days. If you can learn how to use Figma's acid trip of a variables panel, you can learn the basics of semantic HTML and how to style it with CSS.</p>
<h3>Scott’s (other) fav: Penpot</h3>
<p>Okay, probably the 'real' answer here, and the design tool that I am most excited by and most unabashedly fanboyish about. Penpot is an absolutely <em>fantastic</em> design tool. It’s basically Figma but <em>good</em>. It’s also designed and built by people who <em>actually understand</em> what designing and building for the web looks like.</p>
<p><a href="https://penpot.app/">Penpot</a> not only matches Figma in almost every case that actually matters, it exceeds it in many of the most important areas of designing for the web. I could write a whole piece purely based on what Penpot gets right that Figma gets wrong, but a few highlights include (but are not limited to):</p>
<ul>
<li>Being able to add margins to elements in a layout (<em>honestly</em>, this alone makes my life infinitely easier)</li>
<li>Tokens that actually match the design tokens format module spec</li>
<li>Tokens that can be exported as JSON natively without shitting the bed or relying on jank plugins</li>
<li>Being able to reference token aliases <em>and</em> perform mathematical operations in token definitions (hello, <a href="https://www.youtube.com/watch?v=3mXSJVrWfgw">logarithmic type scales</a>)</li>
<li>A 1:1 representation of the CSS box model and faithful representations of CSS grid and flexbox</li>
<li>Their glorious, fabulous, wonderful approach to Typography tokens</li>
</ul>
<p>Penpot was honestly the biggest surprise for me when putting <a href="https://piccalil.li/mindful-design?utm_medium=author-promo">the course</a> together and putting these tools through their paces. I was kinda convinced that I’d come crawling back to Figma as soon as the course was done, that Penpot would be a welcome distraction but ultimately fall short somewhere down the line. After all, they’re a small team, with an open source product, competing against Figma, who are ostensibly worth an absolute colossal fuck tonne of money.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/penpot.png" alt="Screenshot of the Penpot UI. A panel on the left lists the pages of a document at the top, and the layers within the selected page underneath. The centre panel shows an in-progress design. The design consists of an illustration, a heading that reads ‘What are you grateful for today?’, a text box for a user to enter their response, and two buttons; ‘Next’ and ‘Skip for today’. The right panel contains the editable properties of the selected element, in this case the sizing and layout options, followed by specific typography settings, and a colour picker to set the element’s colour." /></p>
<p>After my first few forays into Penpot I kinda thought that was the case. “Look at me. Right again,” is what I <em>would</em> have said if I didn’t roll my sleeves up, get rid of the Figma-brain, forgive the admittedly less-than-stunning UI design, and give it an honest stab at working for me.</p>
<p>After a couple of weeks in Penpot, I found myself actively dreading opening Figma to do my 'real' work. Back to constantly being reminded of their shitty AI tools. Back to autolayout being an absolute disaster. Back to their keyboard shortcuts being changed around what feels like every two weeks.</p>
<p>Penpot is a breath of fresh air. There's enough there now to actively replace all but the most locked-in Figma projects, and they’re improving things in meaningful ways, not actively destroying the things that made the product good in the first place, which seems to be Figma's approach over the last 18 months.</p>
<p>All of my design work outside of <em>The One Big Client That Is So Locked In To The Figma Ecosystem It Would Cost A Hundred Grand To Unfuck</em> is now done either directly in code, or in Penpot. I’ve even been able to cancel my Figma subscription. What a day that was.</p>
<p>All of that is to say, if you're a web, product or UI designer and find yourself increasingly jaded with what Figma has become, you owe it to yourself to <a href="https://penpot.app/">give Penpot a whirl</a>.</p>
<h2>The other bits</h2>
<p>I’m pretty chill when it comes to my process and tools. Give me a big stack of paper, something to write words into, somewhere I can lash sticky notes around, and something I can draw rectangles in and I’m happy.</p>
<p>I also don’t do much in the way of visual or brand design these days, to the delight of my much-more-talented friends who have had to find increasingly creative ways to tell me to fuck off with my 'first pass at a logo for this project' DMs.</p>
<p>Unfortunately, for visual design and brand design in particular, there really aren’t that many options. No one seems to be doing anything interesting in the space, so much so that GIMP is still the most-recommended tool when it comes to traditional visual design (a la Photoshop). I love GIMP, but come on, it’s pure, unadulterated “I see your stepdad’s been on the Linux forums again” vibes.</p>
<p><strong>Editor's note:</strong> I'll allow it.</p>
<p>For vector work, we’re eating even less well. Inkscape does a passable impression of if the good parts of Illustrator all somehow fell out the app, but it’s dated and horrible in its own way. If all you need to do is tweak an SVG then it’s <em>fine</em>, but a quick poll of my contacts showed responses that ranged from ‘meh’ to ‘are you back on your meds yet?’</p>
<p>Visual and brand designers: I’m sorry. Really.</p>
<h2>Breaking away from SaaS</h2>
<p>Hopefully that’s been a decent run-down of the tools we have at our disposal that aren’t paywalled by the money-guzzling vampires that prop up the SaaS landscape. While open source tooling isn’t the silver bullet that many folks naively believe it to be, it’s a damn sight better for us, the consumer, than the brainchild of technofeudalism and hypercapitalism.</p>
<p>The market right now is one of monopolies. Where any big player that is remotely threatened by a startup can buy or acqui-hire their way to devouring any competition. So much so that there’s a non-zero number of startups being formed with the express intention of nipping at the heels of Figma, Vercel and the like in the hopes of being swept up for an undisclosed fee. Which is embarrassing but okay lads go wild.</p>
<p>When the market is <a href="https://www.wheresyoured.at/dot-com-bubble/">this many layers of fucked</a>, we’re lucky that we have alternatives. By using, supporting and contributing to nice products built by nice people, we can go some way to making open source a viable and sustainable model in whatever future in which we find ourselves.</p>
<p>We also need to move away from seeing open source tools as 'hobby' projects. Penpot are showing that it’s possible to monetize open source design tooling without turning into absolute shitheels, and folks like Ghost and GitBook are uniquely positioned to be market leaders backed by open source offerings.</p>
<p>The future can be bright for open source tooling, we just need to break away from the exploitative and extractive machinations of venture-capital-backed SaaS monstrosities.</p>
        
        ]]></description>
        
      </item>
    
      <item>
        <title>In praise of off-screen menus</title>
        <link>https://piccalil.li/blog/in-praise-of-off-screen-menus/?ref=design-category-rss-feed</link>
        <dc:creator><![CDATA[Jason Bradberry]]></dc:creator>
        <pubDate>Thu, 27 Feb 2025 11:55:00 GMT</pubDate>
        <guid isPermaLink="true">https://piccalil.li/blog/in-praise-of-off-screen-menus/?ref=design-category-rss-feed</guid>
        <description><![CDATA[<p>It’s fairly accepted that keeping navigation visible is best practice for menu design, right? At least when it comes to designing for desktop viewports. Nielsen Norman Group goes as far as saying that off-screen menus are “<a href="https://www.nngroup.com/articles/menu-design/#toc-make-navigation-visible-1">not appropriate for desktop websites and apps</a>”.</p>
<p>Like a lot of black and white thinking, I’m <em>not so sure</em> the truth is so cut and dry, so I’m going to make a case for the off-screen menu being a <em>better</em> experience in the <em>right</em> context.</p>
<h2>Moving beyond task-oriented thinking</h2>
<p>A lot of User Experience (UX) research looks at interface design through a task-oriented lens. Testers may be asked to “find the newsletter subscribe form and sign up” or “look for information relating to this company’s returns policy”. UX insights like these work really well in a task-oriented context. When your users are in <em>task mode</em> it’s easy to see why it makes sense to keep navigation front and centre — the easier you can make it to find your way around, the faster and smoother the path to task completion. But while information gathering and task completion is one of the primary modes of engagement online, not everyone who visits a website has a specific task in mind.</p>
<p>A lot of the time we’re in <em>exploration mode</em> rather than <em>task mode</em> when we’re online — quite literally “browsing” the web. Maybe we’re getting an idea of a brand, poking around for inspiration, or checking out a link someone sent us. In this mode, we’re much more likely to dig around out of curiosity, or because something catches our eye. In this context, providing visible navigation might actually <em>detract</em> from the experience, aiding decision fatigue, and adding subtle layers of distraction from the content of the page.</p>
<h2>Keeping the focus on the content</h2>
<p>I’m a big advocate of designing for sustained, focused attention, especially where storytelling or long-form reading plays a key role in what you’re designing. Distraction is kryptonite to modern humans. If you’ve clicked a link on social media to read an article or check out a landing page, the last thing you need is a list of other pages tempting you away before you start reading.</p>
<p>Presenting a nav is presenting a list of decisions. In the quest for great UX, we should never forget that the decision that may prove the most valuable for someone landing on a web page is to stay a while and actually read the thing. To my mind, we can spend a lot of time debating UI choices, but if you nail your information architecture and serve up great content, the biggest thing you can do to help your audience is to focus on designing a great reading/browsing experience. The fewer choices you present throughout the design, the less likely it is that decision fatigue is going to eat away at your content’s ability to hold your reader’s attention.</p>
<p></p><p>Watch the <a href="https://iframe.mediadelivery.net/embed/468647/024f4e6e-9586-4faa-8129-d1cf4a5358c7?autoplay=false&amp;loop=false&amp;muted=false&amp;preload=true&amp;responsive=true">video</a>.</p><p></p>
<h2>Off-screen menus can be easy to access</h2>
<p>With a fixed position trigger button, the off-screen menu can always be a click/tap away, no matter how deep you’ve scrolled. I find this approach works great for a lot of service-based brand websites, where brand storytelling and does the heavy lifting from a sales perspective. In that context, you want to maintain focus while on key landing pages, but users may want easy access to key pages to get a sense of a company’s services, products and previous work. Conversion focused landing pages are another example of where there’s a clear benefit to getting the menu out of the way to keep user’s focus on the in-page content, while allowing those not ready to commit yet to access other pages and have a poke around.</p>
<h2>Making use of the extra real estate</h2>
<p>Sometimes navigation doesn’t call for anything more than a simple list of links at the top of the page, but off-screen navigation can open up the opportunity to experiment with different visual weightings and groupings for these links — making the most of the extra space in the menu canvas.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/becolourful.png" alt="A bold blue and cream website menu with large serif text listing sections: What, Why, Who, Work, Wisdom. Sidebar contains contact details and branding elements for 'Becolourful'." title="off-screen menu design for Becolourful" /></p>
<p>The <a href="https://becolourful.co.uk/">Becolourful website</a> keeps the focus on the larger primary links, while giving links to secondary landing pages a different treatment, with a much lower visual weighting and clear separation through lower proximity and vertical orientation. This keeps the focus on the pages that play the most important role in building trust with prospective new clients.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/quarterre.png" alt="An off-screen menu with a light blue background displaying bold black text for sections: Studio, Cases, and Thoughts. Contact details for UK and Denmark offices appear at the bottom, along with Quarterre branding." title="Off-screen menu design for Quarterre" /></p>
<p><a href="https://quarterre.com/">Quarterre’s website</a> takes a similar approach of using scale to add hierarchy to the navigation links, while also using the additional space in the menu canvas to include contact details, which serve to highlight that the studio has offices in London and Denmark.</p>
<p>Another plus point for the off-screen menu is the ability to design a list of links with a vertical orientation. This removes the risk of nav items wrapping to multiple lines, or having to reduce menu item font size if the ideal nav architecture takes up a lot of horizontal space. Instead, with a vertical list we can take advantage of automatic scroll overflow and give the whole menu a bit more breathing room. For sites where navigation is CMS controlled, it’s also nice to know that new pages won’t break the menu design!</p>
<h2>Aesthetics and brand expression</h2>
<p>There’s another way that the extra screen real estate can help the effectiveness of the website too, and that’s by providing a canvas for visual interest. People buy with their eyes. On a cognitive level, we <a href="https://ifvp.org/content/why-our-brain-loves-pictures">process images 60,000 times faster than text</a>. The visual choices we make in a design are <a href="https://medium.com/get-focused/harnessing-visual-stimuli-strategies-for-enhancing-focus-and-concentration-in-a-visually-saturated-b7135903f2c5">a tool we can use to harness cognitive processing and enhance focus and concentration</a> when executed well.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/sister-mary.png" alt="An off-screen menu with a bold blue background displaying black uppercase text for sections: Story, Ethos, Process, Work, and Reflections. 'Work' is emphasised in bold with an underline effect." title="Off-screen menu design for Sister Mary" /></p>
<p></p><p>Watch the <a href="https://iframe.mediadelivery.net/embed/468647/8d1429f8-a8d6-4d37-b287-3bd58b5240e6?autoplay=false&amp;loop=false&amp;muted=false&amp;preload=true&amp;responsive=true">video</a>.</p><p></p>
<p>The decorative type and bold colours in <a href="https://www.sistermary.nyc/">Sister Mary</a>’s menu design serves not only to enhance the brand’s visual identity but provides visual stimuli that engage on a sensory level, making the experience more memorable. Visual stimuli also <a href="https://medium.com/get-focused/harnessing-visual-stimuli-strategies-for-enhancing-focus-and-concentration-in-a-visually-saturated-b7135903f2c5">influence our ability to concentrate</a>. It’s a careful balance, where adding a little visual interest can aid cognitive processing, command attention and really make an experience memorable. Adding too much can be distracting and add to our cognitive overload.</p>
<p>Perhaps the Sister Mary example treads a little over the wrong side of the line with its level of motion. On the one hand I could see the theoretical argument in favour of this level of motion — for a simple site with five pages, most people will probably interact with the off-screen menu very little in the course of a visit. The off-screen menu shows off their creative skillset and fits the brand, which feels crafted, heavyweight and creative. But with the motion toned down a little, I think they’d be in the sweet spot for their context.</p>
<p></p><p>Watch the <a href="https://iframe.mediadelivery.net/embed/468647/8fd2544c-c490-4e73-8669-44275e79613c?autoplay=false&amp;loop=false&amp;muted=false&amp;preload=true&amp;responsive=true">video</a>.</p><p></p>
<p>This off-screen menu from the <a href="https://eis-lab.de/">Eislab website</a> is a great example of using interaction design to showcase the brand personality and add some fun to the experience. The way they use scale to emphasise their product page is a really smart piece of design.</p>
<p>All too often discussions around user experience focus on usability, under the premise that usability trumps aesthetics when it comes to creating an effective interface. The brilliant <em>UX Myths</em> does <a href="https://uxmyths.com/post/1161244116/myth-25-aesthetics-are-not-important-if-you-have-good-us">a great job of debunking this bias</a>. Attractive things are perceived as more functional, more trustworthy, and more desirable. It’s why <a href="https://www.nngroup.com/books/emotional-design/">cheap wine tastes better in a nice glass</a>, and why the iPod dominated the MP3 player market, despite it not being the first, or arguably the best on the market. Check out Don Norman’s book <a href="https://www.nngroup.com/books/emotional-design/">Emotional Design</a> for a deep dive on this subject.</p>
<h2>Context is everything</h2>
<p>Going back to the UX research, the most critical thing you can do is establish connections between the data and your context. For example, in <a href="https://www.nngroup.com/articles/hamburger-menus/">this Nielsen study</a>, the researchers noted that “If people use hidden navigation, they do so later in the task than if it were visible”, and that "people were significantly more likely to use the navigation (whether hidden or partially visible) on mobile than on desktop”. If we’re designing a site with a primarily mobile audience, and we’re using on-page storytelling to guide people through the experience, then the data <em>supports</em> the idea of using an off-screen menu to minimise distraction until navigation is needed.</p>
<p>The underlying message I’m putting forward here is that making design and UX decisions should always be <strong>based on your project context</strong>. There is no right or wrong when it comes to UX, only context and compromise. <strong>You know your context</strong> and you can consider the UX decisions you make as a series of judgement calls that balance different configurations of compromise within that context.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/off-screen-collage.png" alt="A collection of four off-screen menus, each with distinct colours and typography. Designs include pastel tones, bold serif and sans-serif fonts, and layouts featuring navigation links such as Studio, Cases, Work, and Contact." /></p>
<p>It may be that an off-screen menu is perfect for the project you’re working on right now. It may not be. That’s not really the point. What I’m really saying here is don’t be afraid of going against the common best practice if that <em>feels right</em> in your context. See how it performs, and <a href="https://set.studio/">iterate on it</a>.</p>
        
        ]]></description>
        
      </item>
    
      <item>
        <title>Why I’m excited about text-box-trim as a designer </title>
        <link>https://piccalil.li/blog/why-im-excited-about-text-box-trim-as-a-designer/?ref=design-category-rss-feed</link>
        <dc:creator><![CDATA[Jason Bradberry]]></dc:creator>
        <pubDate>Thu, 19 Dec 2024 13:32:06 GMT</pubDate>
        <guid isPermaLink="true">https://piccalil.li/blog/why-im-excited-about-text-box-trim-as-a-designer/?ref=design-category-rss-feed</guid>
        <description><![CDATA[<p>I’ve been excited by the potential of <code>text-box-trim</code>, <code>text-edge</code> and <code>text-box</code> for a while. They’re in <a href="https://drafts.csswg.org/css-inline-3/#leading-trim">draft status</a> at the moment, but when more <a href="https://caniuse.com/?search=text-box-trim">browser support</a> is available, this capability will open up some exciting possibilities for improving typesetting in the browser, as well as giving us more control of alignment and internal spacing in our components, such as a button.</p>
<p>Daniel Schwarz wrote a great <a href="https://css-tricks.com/two-css-properties-for-trimming-text-box-whitespace/">deep dive into the current proposal</a> for these two CSS properties, but in this article I’d like to give you an even more solid understanding of the problem this new CSS capability is solving.</p>
<p>Aligning text on the web has <em>historically</em> involved a level of compromise. Much of this is down to how fonts render in the browser, and inconsistencies in how different fonts take up space within their text box.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/font-mentrics-text-box.png" alt="The word ‘Typography’ set in large bold type, with the text box outlined, demonstrating the extra space within the text box, above and below the visual height of the text" title="A typical text-box. But what makes up that extra space?" /></p>
<p>This diagram shows the text box for <a href="https://tightype.com/typefaces/moderat">Moderat Extrabold</a>, the headline font we use for <a href="https://piccalil.li/blog/redesigning-piccalilli-the-first-part-of-the-design-process/">Piccalilli</a>. The box is cropped pretty tight horizontally, but vertically there’s a lot of space above and below, which can make typesetting tricky, especially when combining fonts which may have different amounts of space above and below (which we’ll come to later).</p>
<p>What makes up all that extra space? There are a lot of factors involved, and the spacing can differ greatly from font to font. Let’s break it down.</p>
<h2>A primer in font metrics</h2>
<p>It’s good to have some context for the metrics that influence the spacing within a font. Here’s a visual breakdown of the vertical metrics within <em>Moderat Extrabold</em>.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/font-anatomy.png" alt="The word ‘Typography’ set in large bold type, with lines showing the baseline, x-height, cap height, ascender line and descender line" title="Typeface spacing anatomy" /></p>
<p>The ascender and descender lines mark the boundaries of the font’s geometry. In general, <a href="https://fonts.google.com/knowledge/glossary/ascenders_descenders">ascenders and descenders</a> will extend to these lines. Letters with curved or angled forms generally <a href="https://fonts.google.com/knowledge/glossary/overshoot">overshoot</a> these lines ever so slightly, to achieve visual balance alongside their straight-edged counterparts.</p>
<p>As you can see below, in some fonts, certain ascenders will sit below the ascender line. Check out the lowercase “t” here in <em>Moderat</em> below, for example.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/font-ascender-descender.png" alt="The letters ‘Hy, th’ set in large bold type, with lines showing the baseline, x-height, cap height, ascender line and descender line. The letter ‘t’ in Moderat here sits lower than the cap height" title="Some ascenders may sit below the cap height and ascender line" /></p>
<p>The cap height, as the name implies, marks the height of a font’s capital letterforms. It often sits below the ascender line, but in some fonts the cap height and ascender line can be at the same height.</p>
<p>The take away here is that the spacing dynamics <em>within</em> the characters of your text will differ depending on the font you’re using.</p>
<h2>Font sizing</h2>
<p>In digital type, font metrics are all relative to font size. Let’s imagine we give a paragraph element a font-size of <code>1em</code> in our CSS. What aspect of this font is <code>1em</code> tall? The short answer is <strong>we don’t know</strong> because the font size does not give us any reliable information on the size of the characters within a font or the metrics within it.</p>
<p>To help understand why, it’s helpful to know that when a type designer is creating a font, they’ll design each character within a box known as an <em>em square</em>, which acts as a grid container for the glyph. This is not the same unit we’re applying in CSS, as the browser calculates em values differently than traditional type design. If our paragraph with <code>font-size: 1em</code> renders at <code>16px</code>, what’s happening internally within the font is that its em square container is being <em>scaled</em> to <code>16px</code> tall. Inspect the element in the browser, and with a line-height of 1, the element’s bounding box will be 16px tall. But within that box, the positioning and sizing of the actual letterforms are totally up to the font designer, which is why they can vary so much from font to font.</p>
<div><h2>FYI</h2>
The `16px` value is an approximation and based on a presumption that your operating system font size has not been changed from its default value. 
</div>
<blockquote>
<p>Although the font size set by us designers tells the software at which size to render the em square, the type design <em>within</em> that em square can theoretically sit wherever the type designer wants it to. The horizontal and vertical positions of the marks that make up any given letterform are very much an arbitrary decision, so, like many things in type and typography, there are no hard-and-fast rules.</p>
<p>— <a href="https://fonts.google.com/knowledge/choosing_type/exploring_x_height_the_em_square">Elliot Jay Stocks</a></p>
</blockquote>
<p>This variability is a key consideration when swapping a font, or using multiple fonts in a project. Check out <a href="https://fonts.google.com/knowledge/choosing_type/exploring_x_height_the_em_square">Elliot Jay Stocks’ write-up for Google</a> for more on this.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/font-spacing-differences.png" alt="The word ‘Apples &amp; Oranges’ set in large bold type in Inter above, and Josefin Sans below, with lines showing the baseline, cap height and descender line, and the text boxes outlined. The spacing differences are clear, with each font sitting at a different vertical position within the text box. Inter’s descenders extend outside the text box, but in Josefin Sans’, both the ascenders and descenders extend outside the text box" title="Spacing differences within the design of Inter and Josefin Sans" /></p>
<p>Above is a comparison of <a href="https://fonts.google.com/specimen/Inter?query=inter">Inter</a> with <a href="https://fonts.google.com/specimen/Josefin+Sans">Josefin Sans</a> set at the same font size and a line-height of <code>1.0</code>. The text box is marked in red, and the cap height, baseline and descender line in yellow. As you can see, whilst both text boxes are the same height, <em>Josefin Sans’</em> baseline sits higher than <em>Inter’s</em>, and the spacing above and below the two fonts is markedly different. Notice that both fonts include ascenders and descenders that extend out of their text box too.</p>
<p>To show an example that takes this to extremes, here’s <a href="https://www.myfonts.com/collections/zapfino-extra-font-linotype">Zapfino</a>. Check out those swashes which are <em>miles</em> out of the text box. What’s also interesting here is that the cap height sits a <em>way</em> outside of the text box too. Thinking back to the flexibility type designers can employ in designing their fonts within the em square, this example really demonstrates that sizing and spacing within a font can be a bit of a wild west at the extremes.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/zapfino-container.png" alt="The word ‘Jackfruit’ set in the Zapfino font, with lines showing the baseline and cap height, and the text box outlined. The capital letters and ascenders and descenders extend out of the box by a significant amount" title="Zapfino uses its em square “container” with a pinch of salt!" /></p>
<h2>Leading</h2>
<p>The final piece of the puzzle in understanding how text boxes are calculated in CSS is <code>line-height</code>, or “leading” in typographic terms. In traditional metal type, the spacing between lines of text was set via lead strips. These spacer strips were added <em>between</em> lines. The CSS approach to leading works a little differently, in that spacing is added both <em>above</em> <em>and below</em> each line of text. You can think of this as a kind of “half leading”.</p>
<p>With line-height set to <code>1.0</code>, an element’s text box height will equal its font-size (multiplied by the number of lines of text if it wraps). In the case of our paragraph example, the text box will be <code>16px</code> tall. Change the line-height to <code>1.5</code>, and the text box grows to <code>24px</code> tall, with <code>4px</code> of leading added above and below. And if you set a fixed line height rather than a relative one, the browser just sets the text box to match the line-height and distributes any space evenly above and below.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/font-leading.png" alt="On the left, the letters ‘Aa’ set in large bold type at a line-height of 1em, with the text box outlined. On the right, the same letters set at a line-height of 1.5em, with annotations marking the font height of 1em, and half-leading above and below of 0.25em, totalling 1.5em" title="Text element set at 1em line-height vs 1.5em line-height, showing how line-height is equally divided above and below as “half leading”" /></p>
<h2>Let's see how <code>text-box-trim</code> will help us</h2>
<p>When you break it down, the extra space within an element’s text box is quite simple to understand. Just take the font size and add half the leading above and below. But as we’ve learned, it’s the extra space <em>within</em> the font itself, and the variability of the character sizing and positioning within different fonts that makes this much more tricky to work with in practice.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/font-metric-parts.png" alt="The word ‘Typography’ set in large bold type, with lines showing the baseline and cap height, and annotations marking the font visual height, font height, line-height and half-leading above and below" title="Text-box spacing broken down into its constituent parts" /></p>
<p>With <code>text-box-trim</code> we gain control over which boundary line text boxes are cropped to, and finally we can trim away this extra space to work with a font’s actual visual height.</p>
<p>One of the ways we’re planning to use this feature to improve typesetting at <a href="https://set.studio/">Set Studio</a> is within our favoured <a href="https://utopia.fyi/space/calculator?c=320,18,1.2,1240,20,1.25,5,2,&amp;s=0.75%7C0.5%7C0.25,1.5%7C2%7C3%7C4%7C6,s-l&amp;g=s,l,xl,12">fluid spacing system</a>. We use a spacing scale that’s based on multiples of a base unit, which we combine with utilities like <a href="https://piccalil.li/blog/my-favourite-3-lines-of-css/">flow</a> to keep a sense of rhythm between all the elements on a page. But in practice, the extra space within text boxes has meant we’ve had to let go of the idea of creating true vertical rhythm for text elements within our spacing system.</p>
<p>We’re pragmatic and happy to live with this for the sake of <a href="https://buildexcellentwebsit.es/">creating designs that work with the medium of the browser</a>. But when a little bit more support comes for <code>text-box</code> properties and we can trim away that unwanted extra space, we’ll be all over it, as a <a href="https://piccalil.li/blog/its-about-time-i-tried-to-explain-what-progressive-enhancement-actually-is/">progressive enhancement</a>.</p>
<pre><code>.prose :is(h2, h3, h4, p, ul, ol, li, blockquote, figure) {
  text-box: cap alphabetic;
}
</code></pre>
<div><h2>FYI</h2>
<p>We’re using the <a href="https://css-tricks.com/two-css-properties-for-trimming-text-box-whitespace/#aa-text-box-the-shorthand-property">shorthand property</a> here.</p>
</div>
<p>Here we’re trimming text elements within <code>.prose</code> content to the cap height and baseline. Our prose now nicely follows our fluid spacing rhythm!</p>
<p>Applying a trim like this could — depending on the font as we’ve discussed — cut a fairly severe amount of spacing from between your text elements, so it’s very likely you’ll want to increase the spacing when this is applied. Hence our slight trepidation about using <code>text-box</code> in production yet.</p>
<p>It’s worth bearing in mind that design tools like Figma treat <a href="https://www.figma.com/blog/line-height-changes/">text spacing in a very similar way to the browser</a>, with leading above and below, so spacing decisions during design will have been made with this extra spacing in place.</p>
<p>To account for this, we can bump the <a href="https://piccalil.li/blog/my-favourite-3-lines-of-css/">flow space</a> up a step within our spacing system. Because our CSS is affecting wider elements via the change to <code>--flow-space</code>, we’re going to fence the code in a <code>@supports</code> query now because we <em>only</em> want this to apply <em>if</em> <code>text-box-trim</code> is available to us.</p>
<pre><code>@supports (text-box: cap alphabetic) {
	.prose :is(h2, h3, h4, p, ul, ol, li, blockquote, figure) {
	  --flow-space: var(--space-l);
	  
	  text-box: cap alphabetic
	}
}
</code></pre>
<p>Figma has a setting that lets you toggle ‘vertical trim’ for text elements, under the additional typography settings. If you’re planning to use <code>text-box</code> in your code, it’s a good idea to design with this setting on. And test designs in the browser with and without trimming the text box to make sure both the reading experience is solid in each case. Readability is more important than perfect vertical rhythm.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/figma-vertical-trim.png" alt="Screenshot showing Figma’s ‘Cap height to baseline’ setting, within ‘Typography &gt; Basics &gt; Vertical Trim’" /></p>
<p>Another good example of where these new CSS properties will help us improve our designs, is making precise vertical alignment of text and imagery like <a href="https://dribbble.com/shots/14835580-Financial-Times-Article">this design from Marko Cvijetic on Dribbble</a> much more easily achievable.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/dribbble-shot-1.png" alt="Article layout design by Marko Cvijetic, featuring various image elements with text precisely aligned vertically" title="&lt;a href='https://dribbble.com/shots/14835580-Financial-Times-Article'&gt;Financial Times — Article on Dribble, by Marko Cvijetic&lt;/a&gt;" /></p>
<p>One of the most common use cases for a lot of us is visually centering text within elements like buttons or notifications. This is especially handy for fonts that have awkward spacing like <em>Josefin Sans</em>.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/button-trim.png" alt="Two buttons side by side, one with text set in Josefin Sans with a default text-box where the text is not visually centered, the other with visually centered text achieved by trimming to the cap height and baseline" /></p>
<p>There are plenty of creative uses for <code>text-box-trim</code> too. In <a href="https://quarterre.com/studio">this design</a> I placed headings with their baseline flush against sections below using negative margin, like this:</p>
<pre><code>.footer-heading {
	margin-bottom: calc((var(--space-3xs) + 0.072em)* -1);
}
</code></pre>
<p>It’ll be nice to be able to achieve effects like this without resorting to magic numbers, thanks to <code>text-box-trim</code>.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/flush-footer-heading.jpg" alt="A website footer that has a heading, “Talk to us”, which is perfectly aligned with the box below it" title="With text-box-trim we’ll be able to avoid using negative margin to achieve effects like this example, where the heading sits with its baseline flush against another element below" /></p>
<p>I used a similar approach to add baseline borders to headings in <a href="https://www.wepioneer.co/">another project</a>, but couldn’t achieve perfect baseline alignment in Firefox. With <code>text-box-trim</code> this effect could be layered in as a progressive enhancement, with the lines only added where the browser supports it.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/text-box-trim-border.png" alt="Screenshot showing a border effect added to a the baseline of a heading on the WePioneer website" title="Using &lt;code&gt;text-box&lt;/code&gt; would make perfect alignment of these baseline borders straightforward, and much more easy to apply as a progressive enhancement" /></p>
<p>I’m excited to see what people make with these new CSS properties once they ship!</p>
<h2>Latest support</h2>
<p>See the latest browser support for <code>text-box-trim</code>, <code>text-box-edge</code> and <code>text-box</code> <a href="https://caniuse.com/?search=text-box-trim">here</a>. As with all newer CSS specifications, the syntax might change as it evolves, so I recommend keeping an eye on <a href="https://github.com/w3c/csswg-drafts/issues?q=text-box-trim+label:%22topic:+text+edge+control%22">the discussions</a>.</p>
        
        ]]></description>
        
      </item>
    
      <item>
        <title>Redesigning Piccalilli: the build process</title>
        <link>https://piccalil.li/blog/redesigning-piccalilli-the-build-process/?ref=design-category-rss-feed</link>
        <dc:creator><![CDATA[Andy Bell]]></dc:creator>
        <pubDate>Wed, 21 Aug 2024 10:20:37 GMT</pubDate>
        <guid isPermaLink="true">https://piccalil.li/blog/redesigning-piccalilli-the-build-process/?ref=design-category-rss-feed</guid>
        <description><![CDATA[<div><h2>FYI</h2>
<p>This is the third and final part of our series on redesigning Piccalilli. To get the most out of this article, we <a href="https://piccalil.li/blog/redesigning-piccalilli-the-first-part-of-the-design-process/">recommend you start from the top</a>.</p>
</div>
<p>At this point, we’ve completed the design work and have also produced a backlog of production tasks, so I’m sorry to say, the build is actually quite <em>boring</em> to write about.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/redesign-notion.jpg" alt="A Notion kanban with columns for Ice Box, Not Started, In Progress, In Review and Done. There are various cards in each state assigned to various people in the team" /></p>
<p>It’s boring because at this point, almost all eventualities should be accounted for, so the developers only have to concentrate on writing scalable, maintainable code.</p>
<h2>HTML only build of the site</h2>
<p>What’s the best way to write scalable, efficient and maintainable code? It’s not faffing around, arguing about frameworks, that’s for sure. It’s all about getting the baseline experience — the <em>foundations</em> — of the site as solid as possible and the best way to achieve that is concern ourselves, in terms of output, solely on HTML.</p>
<p>Sure, we’re running with React and JSX on this project. It’s because we know that Astro will not render a massive bundle of bloated client-side JavaScript by default. Working with React components means we can effectively and efficiently move platform if Astro doesn’t work out so good in the longer term, along with enabling working with <a href="https://storybook.js.org/">Storybook</a> easier. Regardless of the technology choices for components, we want to make sure the output HTML is in tip-top shape. A framework won’t write bad HTML, it’s people that fall short more often than not.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/html-only-homepage.jpg" alt="A HTML only version of the homepage, featuring header, navigation and intro, then topics navigation." title="&lt;a href='/images/blog/html-only-homepage.jpg'&gt;View full size&lt;/a&gt;" /></p>
<p>We add a very small amount of CSS to utilise the system font stack because raw HTML makes our eyes sad, but hopefully you can see, it’s super paired-back. It’s much easier to scan the structure of the page like this too.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/html-only-post-page.jpg" alt="A HTML only version of the article page, featuring header, navigation and prose content." title="&lt;a href='/images/blog/html-only-post-page.jpg'&gt;View full size&lt;/a&gt;" /></p>
<p>We build the whole site as HTML, giving us an end deliverable of a HTML-only, fully functional webpage. There's no client-JS interactivity at this point, but ultimately, we want the <a href="https://piccalil.li/blog/how-a-minimum-viable-experience-produces-a-resilient-inclusive-end-product/">minimum viable experience</a> to be our solid foundation.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/html-only-headline.jpg" alt="A HTML only version of the headline component in story book, featuring a heading, subheading and summary." title="&lt;a href='/images/blog/html-only-headline.jpg'&gt;View full size&lt;/a&gt;" /></p>
<p>We also use this phase of production to get the structure of the pattern library in place. In our case, this is using <a href="https://storybook.js.org/">Storybook</a>. Our focus for components now is less how they look and more what the structure of their output is and also the structure of the data that is passed between them.</p>
<pre><code>export interface Topic {
  label: string;
  link: string;
}

export interface TopicsListProps {
  heading?: string;
  topics: Topic[];
}

const TopicsList: React.FC&lt;TopicsListProps&gt; = ({ heading = 'Topics', topics }) =&gt; {
  return (
    &lt;nav aria-label="Topics"&gt;
      &lt;h2&gt;{heading}&lt;/h2&gt;
      &lt;ul&gt;
        {topics.map((topic, index) =&gt; (
          &lt;li key={index}&gt;
            &lt;a href={topic.link}&gt;{topic.label}&lt;/a&gt;
          &lt;/li&gt;
        ))}
      &lt;/ul&gt;
    &lt;/nav&gt;
  );
};

export default TopicsList;
</code></pre>
<p>It’s really useful to be focused on a small number of things at any time. Separation of concerns really helps with that and with the HTML-only build in place, we can move on to CSS.</p>
<h2>Integration of CSS</h2>
<p>We <a href="https://piccalil.li/blog/redesigning-piccalilli-the-second-part-of-the-design-process">built the front-end already with the prototypes</a>, so in terms of applying the correct design tokens and overall look and feel, we’ve already solved that problem.</p>
<p>Our focus now with CSS is putting all of our effort on long term maintainability. We know <em>how</em> to build the front-end of the site, but we’re at this point, thinking about future iterations of the design and what’s coming up in the shorter term.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/headline-with-css.jpg" alt="A full styled version of the headline component in story book, featuring a heading, subheading and summary." title="&lt;a href='/images/blog/headline-with-css.jpg'&gt;View full size&lt;/a&gt;" /></p>
<p>A good example of this is the theming system we’ve implemented, which <a href="https://piccalil.li/blog/how-were-approaching-theming-with-modern-css/">you can read about here</a>. We’re not, y’know, going to design loads of themes for the site that can be toggled, but instead, once the components are in place — structurally — the theme is what applies the look and feel. An immediate need for that theming system is dark mode.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/theme-toggling.gif" alt="A callout unit, titled “FYI” toggles from dark to light mode on a loop" /></p>
<p>With that in mind, all of the components look a bit like this:</p>
<pre><code>.badge {
  display: var(--badge-display, inline-flex);
  border: var(--badge-border, var(--stroke));
  padding: var(--badge-padding, calc(var(--space-2xs) * 0.5) var(--space-2xs));
  font-size: var(--badge-font-size, var(--size-step--3));
  font-family: var(--badge-font-family, var(--font-display));
  color: var(--badge-color, var(--text-dark));
  text-decoration: var(--badge-default-decoration, none);
  text-transform: var(--badge-text-transform, uppercase);
}

.badge:is(a):hover {
  background-color: var(--badge-hover-bg, var(--color-dark));
  color: var(--badge-hover-color, var(--color-light));
  border-color: var(--badge-hover-border-color, var(--color-dark));
}
</code></pre>
<p>You might think that is overkill, but it allows two things. First, setting up a different colour scheme is as simple as this:</p>
<pre><code>:root {
  --badge-color: var(--text-light);
  --badge-hover-bg: var(--color-light);
  --badge-hover-color: var(--color-dark);
  --badge-hover-border-color: var(--color-light);
}
</code></pre>
<p>Second, by making nearly <em>everything</em> configurable based on a solid HTML structure means that if we want to redesign or refresh the UI in the longer term, <em>technically</em>, we should be able to define a new theme configuration and be done with it. It makes future iteration prototypes much quicker too.</p>
<p>The most realistic use-case for this theming is that every course we publish will have a specifically branded landing page that doesn’t necessarily match the overarching Piccalilli look and feel. We can theme those landing pages with the theme system, including large layout differences quite easily. It also means there is scope for articles to have art direction in the long term, too.</p>
<h2>Wrapping up</h2>
<p>We’re building this thing to be as low effort as possible to maintain so we can focus all of our energy on producing excellent content instead. The way it’s coming together, I think we might have done just that.</p>
<p>I hope you’ve enjoyed this series on redesigning the Piccalilli site. I’ve certainly enjoyed writing it. The next thing you see about this stuff is <strong>the actual live site</strong> very soon. We can’t wait for you to see it.</p>
<p>If you like the way <a href="https://set.studio/">we at Set Studio</a> have approached this stuff, <a href="https://set.studio/contact-us/">get in touch</a>. We’d love to hear how we can help.</p>
        
        ]]></description>
        
      </item>
    
      <item>
        <title>Redesigning Piccalilli: the second part of the design process</title>
        <link>https://piccalil.li/blog/redesigning-piccalilli-the-second-part-of-the-design-process/?ref=design-category-rss-feed</link>
        <dc:creator><![CDATA[Andy Bell]]></dc:creator>
        <pubDate>Wed, 14 Aug 2024 10:20:37 GMT</pubDate>
        <guid isPermaLink="true">https://piccalil.li/blog/redesigning-piccalilli-the-second-part-of-the-design-process/?ref=design-category-rss-feed</guid>
        <description><![CDATA[<div><h2>FYI</h2>
<p>This is the second part of our series on redesigning Piccalilli. To get the most out of this article, we <a href="https://piccalil.li/blog/redesigning-piccalilli-the-first-part-of-the-design-process/">recommend you read the first part</a>.</p>
</div>
<p>After getting through our <a href="https://piccalil.li/blog/redesigning-piccalilli-the-first-part-of-the-design-process/">first sprint</a> we have now completed our second and last sprint of the prototype design phase of our full redesign of <a href="https://piccalil.li/">Piccalilli</a>.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/design-process.svg" alt="A diagram that shows 7 design phases over two sprints. Between each phase there is a feedback point. The phases are &quot;Priority guides&quot;, &quot;Design research&quot;, &quot;Creative ideation&quot;, &quot;Prototype: base&quot;, &quot;Module designs&quot;, &quot;Prototype: second pass&quot;, &quot;Design docs&quot;. After signoff there are &quot;Design docs&quot;, &quot;Backlog planning&quot; and &quot;Timeout&quot;" title="A reminder of the Set Studio process we are following in this series &lt;a href='/images/blog/design-process.svg'&gt;View full size&lt;/a&gt;" /></p>
<p>We’ve done the first sprint, so it’s time to move on to the next one. This is where we get into a lot more detail with the design and expand on what we’ve already got, mostly in the browser.</p>
<h2>We had good page concepts but we need a home page</h2>
<p>Designing a homepage after other stuff? It’ll never catch on. Sure in a lot of projects, starting with the homepage spiders the rest of the design process really well, but in this context, the <strong>reading experience is the core of our design</strong>, so it makes sense to focus our early — and generally higher — energy levels on that.</p>
<p>With us nailing that (trust me, wait until you see it), we can confidently tackle the beast and the milestone at the most risk of  stakeholder inference: the home page.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/figma-piccalilli-homepage.jpg" alt="Two homepage compositions with a yellow and black colour pallete with neutral tones for the background. There’s a hero unit, topics navigation, popular posts and latest posts which is clipped by the Figma window" /></p>
<p>After deciding on the priority of content in the first design sprint, along with already getting a design system — of sorts — in place, we can get into — and back out of — Figma pretty damn quickly.</p>
<p>There’s two concepts here. One is a future homepage (left) and a version of the homepage that we’re going to ship in this <a href="https://set.studio/#approach">initial iteration of the redesign</a>. We’re not shooting for perfection at this point, more, we want to get ideas on to a page composition to see how it flows at a macro level.</p>
<p>The only discernible difference between the two concepts is that the future homepage will have a more expressive hero unit, which we will commission a trusted illustrator to work on, along with a primary action to see our courses. The first of which <a href="https://piccalil.li/blog/some-info-about-my-upcoming-workshop-and-course/#course">launches later in the year</a>.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/current-piccalilli-homepage.jpg" alt="The current Piccalilli homepage that is live today and can be explored by heading to the root of this website, but is described below" /></p>
<p>As you can see, a lot of the existing affordances, well, <em>navigation</em> is the same as the current homepage. That’s what homepages are at the end of the day: <em>navigation pages</em>.</p>
<p>What we have added though is the latest three articles, a tab panel for the popular content so you can see what’s currently popular and what articles have been the most popular over time. The hope is that if someone who has never read a Piccalilli article will be able to get a good vibe of the content that has resonated with readers. Later down the page, we’ve added a sign up section to encourage folks to either get new articles in their inbox or subscribe with the favourite RSS reader.</p>
<p></p><p>Watch the <a href="https://iframe.mediadelivery.net/embed/468647/51fea7ab-1a61-4054-957c-4220ad2ca76f?autoplay=false&amp;loop=false&amp;muted=false&amp;preload=true&amp;responsive=true">video</a>.</p><p></p>
<p>Looking pretty snazzy huh? That’s the prototype by the way because of course, we smashed that out with junk CSS, just like we did with the rest of the prototypes in the first sprint.</p>
<h2>Iterating based on how things feel in the browser</h2>
<p>In the first design sprint, the aritcle page template looked as follows:</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/post-page.png" alt="The &quot;fold&quot; of a post page showing a hero unit with the title, &quot;Applying P3 colours on an existing project&quot; along with meta info about the author" title="&lt;a href='/images/blog/post-page.png'&gt;View full size&lt;/a&gt;" /></p>
<p>In this version we had the information about the author in a left-hand column and the prose of the article in the right-hand column. In a more macro view in Figma, this worked really quite well because the overall grid system felt balanced. The problem with websites is you never see the whole page in your viewport. In fact, we have <a href="https://viewports.fyi/">no idea what viewport we’re going to be met with</a>.</p>
<p>When we got the post page layout in the browser, it became pretty clear that the reading experience wasn’t up the the standard we were aiming for.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/post-page-empty-sidebar.jpg" alt="A clip of a post page with all the content pushed out to the right, making the UI look empty and awkward" /></p>
<p>Having the content pushed out to the right looks really awkward when there’s nothing else in the sidebar. We definitely don’t want to be distracting readers with docked elements either!</p>
<p>It’s at this point where you have to step back and really work out what the problem is and start to play with ideas. The idea that stuck for us was both, putting the sidebar on the right-hand side and also, increasing the font size of the prose. Again, the typography felt balanced in Figma, but once we got it into the browser, we were less confident of that.</p>
<p></p><p>Watch the <a href="https://iframe.mediadelivery.net/embed/468647/931a23d7-ccbe-4312-a87d-037e196092d4?autoplay=false&amp;loop=false&amp;muted=false&amp;preload=true&amp;responsive=true">video</a>.</p><p></p>
<p>The updated prototype made us much happier. Sure we’re working with pretty junk content here — it’s just an excerpt from an existing article. We’re going to get into the details of the prose design implementation during production because there are <em>thousands</em> of content combinations in the website’s content, so we’ll be much more efficient working with <em>real content</em> than faked content at that point.</p>
<p>The main thing is that iteration <em>transformed</em> the reading experience which is what we needed to get done at this point.</p>
<h2>Finding issues and iterate on them</h2>
<p>The benefit of junk CSS is we can find fragilities that we need to account for in production code. We can also find potential accessibility issues and oh boy, we <em>found</em> one of those 😅</p>
<p>Let’s zoom in on the full-blooded version of the website header for sec:</p>
<p></p><p>Watch the <a href="https://iframe.mediadelivery.net/embed/468647/eac90f7d-a731-497c-a812-b4fe7fce6bbd?autoplay=false&amp;loop=false&amp;muted=false&amp;preload=true&amp;responsive=true">video</a>.</p><p></p>
<p>The header looks good, but it’s pretty complex in its nature. There’s a lot of layout going on and yep, we opted for CSS Grid to give us the level of control we needed — especially responsively.</p>
<p>The problem we found — and as the video shows — was because of the ordering of content at a HTML level conflicting with the visual layout, we accidentally broke visual tab ordering which is an absolute no for us.</p>
<p>In this situation, it makes sense to completely rip the header apart, find what it is about our initial design that is causing problems then prototype a solution. That’s exactly what we did.</p>
<p>The problem at hand was we were grouping buttons on smaller viewports and visually separating them on larger viewports. We had to ditch that idea and maintain the grouping on all viewports instead which in hindsight was a better idea anyway. That’s the thing with <a href="https://set.studio/#approach">approaching design in an iterative manner</a>: you find these issues and are already in the right mindset to deal with them efficiently and effectively.</p>
<h2>Analysing how the design will work in the real world and tightening things up</h2>
<p>The last issue we faced to wrap up this sprint was elements that break out of the post layout’s column system. For example we have a component called a <em>Preview Frame</em>. This is an <code>&lt;iframe&gt;</code> that shows a real web page. It also has an affordance for you to resize the frame to see the page’s responsive adjustments. We use them a lot in topics like <em>‌<a href="https://piccalil.li/category/reality-check">Reality Check</a></em>.</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/preview-frame-in-post-layout.jpg" alt="A clip of the post layout prototype which has a the preview frame, showing a demo. The preview frame breaks out of the layout system that the post content is in" /></p>
<p>Looks pretty good already, right? Sure does! But one of the downsides of writing junk code for prototypes is you tend to follow the happier path, as it were. In important part of these design sprints is to go back through the prototypes and make sure everything is going to work with the real life website.</p>
<p>The way we’d built the post layout didn’t quite match what the real production environment would get us. Essentially, we’d closed one sidebar layout, rendered the preview frame and then opened another sidebar layout with the content that followed. Again, this feels totally doable, but we don’t want to be introducing complex platform code in Astro to handle that situation. Complexity brings fragility with it, which we don’t want.</p>
<p></p><p>See the Pen <a href="https://codepen.io/piccalilli/pen/gONxYPZ/4a29f984594bfd4e2de6fba70fbfd31e">The super rough layout test we put together</a> by Andy Bell (<a href="https://codepen.io/piccalilli/">@piccalilli</a>) on <a href="https://codepen.io">CodePen</a>.</p><p></p>
<p>We needed to account for the break out element — our <em>Preview Frame</em> — to be a part of the content that resides in the left hand column. A really efficient way of working that out is to get away from the prototype and spin up an even simpler prototype like the CodePen above. Sure that thing looks like absolute garbage, but what it did do is help us calculate the simplest possible to the solution at hand.</p>
<p>We opted to keep using the <a href="https://every-layout.dev/layouts/sidebar/">Every Layout Sidebar</a>, but enhanced its usage in the post layout with container units, <code>z-index</code> and container queries to both apply the border to the correct side, based on whether the sidebar had stacked or not, and also use the container units now available to us to size and stack the breakout elements efficiently. I’ll write up about that some more in another post.</p>
<p>We would have had to deal with this problem in production without our approach to design which would have caused a massive, rather stressful disruption. Designing actual web pages rather than pictures of them is hella useful.</p>
<h2>Getting ready for production and wrapping up this sprint</h2>
<p>With the prototypes wrapped up, the design sprint is now complete. We’ve got all the assets ready like premium fonts and also got our design documentation tightened up.</p>
<p>It’s all about planning at this point. We break the implementation of the design into two distinct parts. One part is a HTML-only build and the other is UI development. I’ll cover this in the next part of this article series</p>
<p><img src="https://piccalil.b-cdn.net/images/blog/redesign-notion.jpg" alt="A Notion kanban with columns for Ice Box, Not Started, In Progress, In Review and Done. There are various cards in each state assigned to various people in the team" /></p>
<p>For us, it’s all about building a backlog of tasks in Notion and distributing them. With the backlog ready, we are now ready to build a real website!</p>
<hr />
<p>If you like what you see already about this process and are looking for an agency partner, <a href="https://set.studio/contact-us/">get in touch</a>. We’d love to speak to you.</p>
        
        ]]></description>
        
      </item>
    
    </channel>
  </rss>
