Front-end education for the real world. Since 2018.





Latest articles by Andy Bell

  1. We made an email template to help convince your boss to pay for Complete CSS

    We recently launched Complete CSS, and a lot of people have mentioned that they don’t know how to approach their boss to ask them to pay for it. Here’s an email template for you to help with that.

  2. Complete CSS launches on November 26

    We have news! We’re in the home straight, finishing up Complete CSS and with that, we have a launch date: November 26 at 12pm GMT. Sign up to get updates and we’ll email you as soon as it is live.

  3. “Secure Custom Fields” is not Advanced Custom Fields

    A quick article to help folks affected by the recent WordPress situation and the reckless takeover of ACF.

  4. How I build a button component

    A button is arguably the most likely component to find itself in your codebase so I’m going to show you how I approach building one.

  5. Introducing: Complete CSS

    Our first course is nearly ready so we’re opening up pre-orders.

  6. Building a breakout element with container units

    Learn how to use container units and container queries to enhance an already flexible sidebar layout with some extra design control and full width breakout elements.

  7. Redesigning Piccalilli: the build process

    In the final part of this redesign series we break down our approach to aspects of the production build of the incoming, new front-end.

  8. Redesigning Piccalilli: the second part of the design process

    The second part of the Piccalilli redesign article series where we cover the second half of our design process, getting ready to build it.

  9. Riffing on the latest CSS fit text approach

    I took Roman Komarov’s handy new @property powered CSS fit text solution for a spin and tweaked it to work with our context, replacing a JS powered system.

  10. A handful of reasons JavaScript won’t be available

    It’s always safe to assume JavaScript will not be available, so here’s a quick list of very realistic reasons it won’t be.

  11. Redesigning Piccalilli: the first part of the design process

    The start of a new article series which gives you a look behind the scenes at the Piccalilli redesign and Set Studio’s design process.

  12. We want to help designers learn to code

    We want to produce content that helps people working on real world projects, so we’ve created a survey to learn more from you.

  13. Front-End solution: Eyebrow heading dots

    Learn how anchor positioning is really useful for a solution other than for positioning popovers.

  14. It’s about time I tried to explain what progressive enhancement actually is

    Progressive enhancement hasn’t caught on nearly as much as it should. It’s likely related to folks not being able to envision it working in their real world contexts. This post attempts to alleviate that and reignite the conversation.

  15. How to stop Figma using your work to train their “AI” models

    A really quick video to show you where the right settings are and what settings to disable to protect your work.

  16. The time for designers to learn to code is now

    With design tools further commoditising and sanitising expected creative output, the time for designers to be able to stand out is very much here. I think for some, learning to code is a good route for that.

  17. Front-End challenge: Eyebrow heading dots

    We’re doing it differently in this edition. There’s already code and I’m challenging folks to refactor and improve my solution with modern CSS.

  18. Mask image is pretty handy

    Often overlooked, the mask-image property can be a simple way to inject some character into your web design work.

  19. A quick and easy guide to Markdown

    So many Markdown guides are either too complicated or really hard to read. I thought I’d try to fix that with a super simple, clear guide.

  20. Let’s make a floating button sign up form pattern

    I tackle an age-old design pattern and build it with nice, simple CSS.

  21. How I’m using “AI”

    An honest roundup of what I personally think of “AI” and how it genuinely has its uses in my day-to-day work.

  22. How a handful of independent publishers are doing their thing

    I really like paying good writers so I thought I’d recommend a handful of publications I’m paying for and look at how they do things.

  23. I’m worried about the tabbing behaviour, rather than the syntax and name of CSS masonry

    There’s a lot of chatter about CSS masonry at the moment. Should it be called “masonry” and should it be grid? Let’s worry about the basics first.

  24. Full text RSS is back

    Ever since we re-platformed Piccalilli to Astro, full text RSS no longer worked like it did with Eleventy. We’ve hacked together a fix and now it does!

  25. Applying P3 colours on an existing project

    The set.studio site is powered by design tokens, which for colours, are hex codes. I managed to automatically convert those to P3 colours with a custom PostCSS plugin.

  26. Upcoming custom element support in React

    React’s version 19 Beta is boasting full custom element support so I cover how that could impact projects on our radar and how this new support will make an impact.

  27. CSS inheritance

    Inheritance truly is a superpower and it’s what makes developing on the web a joy if you embrace it. In this quick post, I’m going to convert you into a super fan.

  28. An evolution, not a revolution

    We’ve refreshed the look and feel of both the Piccalilli site and the brand so wrote up a little about that and the future of the platform.

  29. A primer on the cascade and specificity

    Often feared by developers, the cascade and specificity is actually really simple if you utilise the right mental model when authoring CSS.

  30. I want to elevate more people with Piccalilli Links

    A big part of the Piccalilli Links thing is I want to elevate good writers. I need help discovering those writers though!

  31. How we’re approaching theming with modern CSS

    We’ve started a new project which requires heavy, creative theming, so I made a prototype to test some ideas out.

  32. The box model and box sizing

    To open up this CSS Fundamentals series, we’re looking at one of those most important aspects of CSS to understand: how the box model is affected by box sizing.

  33. Front-End solution: progress indicator

    All is revealed about how to build this Front-End Challenges Club challenge, with some great contributions to the community too.

  34. Some little ways I’m using CSS :has() in the real world

    I’ve created some low fidelity demos of :has() snippets that I’ve been using in real-world client projects.

  35. The path to becoming a publisher

    In light of Chris Coyier’s recent article about CSS-Tricks, I think it’s about time I shared some plans with you all.

  36. Front-End challenge: progress indicator

    Front-End Challenges Club is back! It’s been a long while since the last one and this challenge is a real head scratcher.

  37. Event currentTarget to the rescue

    A really quick tip to hopefully save you from throwing your computer out of the window due to JavaScript events.

  38. A Global Documentation Platform

    Inspired by the recent “A Global Design System” article, I talk about what worries me: the future of MDN and a possible alternative to it.

  39. A CSS project boilerplate

    For the many folks who ask how I write CSS since removing Sass, this is how I and the Set Studio team do it in 2024.

  40. Interop 2024

    After the success of previous years, it’s great to see Interop is back in 2024. In this post, I note down what I’m looking forward to.

  41. Some information about my upcoming workshop and course

    I’m doing a lot of content this year, but the stuff I’m most excited about is a brand new workshop and a brand new course. They follow a similar theme to each other: helping you to become a better CSS developer who writes more scalable, maintainable CSS.

  42. Happy international box sizing awareness day

    My all-time favourite CSS technique — courtesy of Paul Irish — celebrates another birthday.

  43. It feels like React is getting a bit of a kicking recently

    I talk about an apparent attitude shift in attitude towards React in the community and also make some recommendations about decision-making for your projects.

  44. A highly configurable switch component using modern CSS techniques

    Learn how build a highly configurable switch component using modern CSS, such as :has(), container queries, Logical Properties and Custom Properties.

  45. Low-tech Eleventy Categories

    Eleventy has built-in tagging and collections capabilities that I’m riffing on to show you how to build a super simple category system with RSS feeds for each one.

  46. Piccalilli Links

    I give a run-down about the new links setup on the Piccalilli site and how it all works.

  47. Reality Check #3: Building out a layered hero grid layout from Dribbble

    In this edition of Reality Check, I tackle an interesting grid layout that also features some pretty unique background image treatment.

  48. Piccalilli will return in 2024

  49. LH units are cool

  50. Reality Check #2: Building out a fancy 404 page from Layers

  51. Reality Check #1: Building out a furniture site from Dribbble

  52. A (more) Modern CSS Reset

    I wrote “A Modern CSS Reset” almost 4 years ago and, yeh, it’s not aged overly well. I spotted it being linked up again a few days ago and thought it’s probably a good idea to publish an updated version.

  53. How a minimum viable experience produces a resilient, inclusive end-product

  54. My favourite 3 lines of CSS

  55. Line heights in CSS work better with ratios

  56. A CLS punishment for progressive enhancement?

    I’ve stumbled across an issue with Lighthouse where I get a bad performance score for a progressive enhanced burger menu pattern.

  57. Learn Eleventy From Scratch is now open source

  58. Define delay for each property in the transition shorthand

    You can set a different delay for each transitioned property, using the transition shorthand, which creates some pretty cool state changes.

  59. Prevent squishy elements with flex none

    You can prevent that annoying squished look that elements like icons get when space runs out in a flex context with flex: none.

  60. Build a fancy hover animation

    Learn how to use the power of CSS to take any collection of images and make them blend well together with a fancy interactive state.

  61. Container Queries are actually coming

    After years of asking and memes, we’re finally getting container queries and they will transform UI design, just like media queries did.

  62. Use transparent borders and outlines to assist with high contrast mode

    It’s tempting to use a sharp box shadow for focus styles to both remove the default focus ring and to get around sharp outline corners. With this method, you can create problems for Windows High Contrast users, so this quick tip will help you get the best of both worlds.

  63. Disable client-side React with Next JS

    Frameworks like Next JS output a lot of heavy-duty client side JavaScript, so this quick tip stops that to have a huge positive impact on performance.

  64. Fluid typography with CSS clamp

    Learn to create a simple, accessibility friendly and configurable fluid type system that uses modern CSS sizing functions.

  65. Add inline SVG directly in your CSS

  66. CSS Frameworks, hype and dogmatism

    Some notes on the dogmatism and gatekeeping themes of Tech Twitter and how they can generate often incorrect and naive statements—specifically about frameworks and methodologies.

  67. Add scroll margin to all elements which can be targeted

    We can add an extra bit of space to targeted elements, thanks to modern CSS!

  68. Control changing numbers with font variant numeric

    Get the benefits of monospaced fonts with your favourite (supported) non-monospaced fonts.

  69. Convert a 2D array into a flat, 1D array of unique items

    Convert a messy multidimensional array into a nice single dimension array of unique items.

  70. Use CSS Clamp to create a more flexible wrapper utility

    A handy way to use modern CSS functions to give yourself fine-grained, yet flexible, design control.

  71. Build a fully-responsive, progressively enhanced burger menu

    In this premium tutorial, we’re going to build a burger menu from the ground up, using progressive enhancement, ResizeObserver, Proxy state and of course, super-solid HTML and CSS that pull from the CUBE CSS principles.

  72. Load all focusable elements with JavaScript

    A handy helper function that will load all user-focusable elements inside a parent element for you.

  73. Dynamic footer copyright date in Eleventy

    That time of the year is coming up, so this trick will keep your website footer up to date on your Eleventy site.

  74. What are design tokens?

    Design tokens are just spicy variables, right? Wrong! They are an extremely versatile way of sharing design properties and in this tutorial, you’ll learn how they work.

  75. Flow CSS Utility

  76. Solution: Progress Stepper

    Front-End Challenges Club - Challenge #008

  77. Challenge: Progress Stepper

    Front-End Challenges Club - Challenge #008

  78. Build a responsive media browser with CSS

    Using the power of modern CSS layout, we create a flexible media browser and video player layout that maintains its aspect ratio at all viewports.

  79. Create a JSON feed with 11ty

  80. Picture element as a progressive enhancement

  81. Use grayscale filter to see where you are relying too much on colour

  82. Create a line break while maintaining inline status

  83. Visually hide an element with CSS

  84. Tips and notes about freelancing

    A guide on going freelance with some helpful advice to hopefully help you to make the plunge.

  85. Build a dashboard with CUBE CSS

    An in-depth guide to going from HTML all the way to a full styled banking dashboard, using the CUBE CSS methodology

  86. Squishy button active state

  87. Aligning description lists with CSS Grid

  88. Contains CSS attribute selector

  89. Easy horizontal and vertical centering in CSS

  90. A safer way to vertically fill the viewport

  91. Make a button element look like a link

  92. Limit line lengths to increase readability

  93. Responsive borders with CSS outline

  94. Quick and easy local server

  95. Use a set to remove array duplicates

  96. How to use the lesson project files to rescue your project

    Sometimes you get a bit stuck in a course, so this quick tip teaches you how to get back on track

  97. Learn Eleventy From Scratch launch day

    Today is a massive day for Piccalilli, so here’s a reflective post about the production of the debut course.

  98. CUBE CSS

    A CSS methodology oriented towards simplicity and consistency with a heavy dosage of pragmatism.

  99. Solution: Heading Keyline

    Front-End Challenges Club - Challenge #007

  100. Challenge: Heading Keyline

    Front-End Challenges Club - Challenge #007

  101. CSS Logical Properties

    Create spacing that works regardless of the direction of your content or the environment of your users.

  102. Build a light and global state system

    Using Proxies and subscriber functions, we can create an observable, reactive state system with a tiny footprint.

  103. Create a responsive grid layout

    Even with no media-queries, we can create a flexible and powerful responsive layout.

  104. Creating a full bleed CSS utility

    Break out of the mould of your fixed-width container to create visual interest.

  105. New shoes

    Piccalilli has been on a holiday for over two months, but has had a complete re-design and re-platforming.

  106. Solution: Auto-scrolling, responsive grid

    Front-End Challenges Club - Solution #006

  107. Challenge: Auto-scrolling, responsive grid

    Front-End Challenges Club - Challenge #006

  108. Solution: Tabs

    Front-End Challenges Club - Solution #005

  109. Challenge: Tabs

    Front-End Challenges Club - Challenge #005

  110. Solution: Progress Button

    Front-End Challenges Club - Solution #004

  111. Challenge: Progress Button

    Front-End Challenges Club - Challenge #004

  112. Solution: Duotone card

    Front-End Challenges Club - Solution #003

  113. Challenge: Duotone Card

    Front-End Challenges Club - Challenge #003

  114. Solution: Toggle switch

    Front-End Challenges Club - Solution #002

  115. Challenge: Toggle switch

    Front-End Challenges Club - Challenge #002

  116. Solution: Email sign-up form

    Front-End Challenges Club - Solution #001

  117. Challenge: Email sign-up form

    Front-End Challenges Club - Challenge #001

  118. Create a semantic breakout button to make an entire element clickable

  119. Create a user controlled dark or light mode

    Automatic dark and light themes, based on system user-preferences, are handy but in this tutorial, we take that one step further and give our users control.

  120. Create a split, faux-container layout with CSS Grid and Flexbox

  121. Two simple methods to vertically and horizontally center content with CSS

  122. Relative sizing with EM units

    Responsive units, like EM units, are super powerful and in this tutorial, you’ll learn how to use that power to give your front-ends resilience

  123. Creating an aspect ratio CSS utility

  124. Get a CSS Custom Property value with JavaScript

  125. A progressive disclosure component

  126. Bypass service worker on localhost