Author: Alex Mason

  • Fluid Typography With CSS clamp(): The Technique UK Frontend Developers Should Have Adopted Two Years Ago

    Fluid Typography With CSS clamp(): The Technique UK Frontend Developers Should Have Adopted Two Years Ago

    There’s a particular kind of embarrassment reserved for the moment you open your beautifully crafted web page on a 13-inch laptop and watch all your carefully considered heading sizes either cramp into something tiny or balloon out past the content container. Fixed type scales do this. They always have. Fluid typography using CSS clamp() solves it, and I’m genuinely baffled that, as of 2026, it still isn’t the default approach on most UK frontend projects I encounter.

    This isn’t a gentle introduction. I’ll assume you know what a rem is and that you’ve written a media query before. What I want to walk through is the actual maths behind clamp(), how to calibrate it for the screen sizes your UK users are actually on, and how to fold the whole thing into a proper design token workflow so your type scale lives in one place and propagates everywhere.

    Frontend developer writing fluid typography CSS clamp code on a laptop
    Photo by Lukas Blazek on Pexels

    What clamp() actually does

    clamp(min, preferred, max) picks the preferred value, but clamps it between a floor and a ceiling. That preferred value is where all the cleverness happens. If you write something like:

    font-size: clamp(1rem, 2.5vw, 1.5rem);

    You get a font size that scales with the viewport width, but never drops below 1rem and never exceeds 1.5rem. That’s the core idea. The problem is that 2.5vw in isolation is a terrible preferred value, because it produces 0 at 0px and scales purely linearly with zero regard for legibility at mid-range viewports. You need a preferred value that interpolates smoothly between two known sizes at two known viewport widths. That’s where the proper formula comes in.

    The interpolation formula you actually need

    The formula for a linearly interpolated fluid value between a minimum font size at a minimum viewport width and a maximum font size at a maximum viewport width looks like this:

    preferred = calc(minSize + (maxSize - minSize) * ((100vw - minWidth) / (maxWidth - minWidth)))

    In real units, if you want 1rem (16px) at 375px viewport and 1.5rem (24px) at 1280px:

    slope = (24 - 16) / (1280 - 375) = 8 / 905 ≈ 0.00884
    intercept = 16 - 0.00884 * 375 ≈ 12.685px
    
    preferred = calc(12.685px + 0.00884 * 100vw)

    Which you’d convert to rem (dividing by 16 for a standard root font size) and write as:

    font-size: clamp(1rem, 0.7928rem + 0.5525vw, 1.5rem);

    Yes, those decimals look gnarly. That’s fine. CSS handles it. You are not writing this by hand for every token; you’re generating it. More on that shortly.

    Calibrating for UK screen usage patterns

    Your breakpoint assumptions matter here. The temptation is to use 320px as your minimum, but StatCounter’s UK mobile resolution data shows that sub-360px devices now represent a tiny fraction of UK traffic. The iPhone 15 family, Samsung Galaxy A series, and Pixel 8 all sit at 390px or 393px logical width. Using 375px as your minimum is reasonable; 360px is safer if you want extra headroom.

    At the upper end, UK desktop usage clusters heavily around 1280px to 1440px. A 1920px maximum makes sense for large-display contexts, but for most B2B SaaS products and editorial sites, capping your fluid scale at 1440px stops runaway sizes on widescreen monitors whilst keeping the type relationship intact on the screens your users actually have.

    My working defaults for a UK web project in 2026:

    • Min viewport: 375px
    • Max viewport: 1440px
    • Root font size assumption: 16px

    These feed into every token calculation. Change the viewport bounds and every size updates automatically, which is exactly the kind of systematic control that makes a design token workflow worthwhile.

    CSS clamp fluid typography values shown as design tokens on a code editor screen
    Photo by Marc Mueller on Pexels

    Building a fluid type scale as design tokens

    The right place to store a fluid type scale is in CSS custom properties, generated from a source of truth. I’d argue for keeping the raw scale parameters in a JSON token file (compatible with the W3C Design Token Community Group format, which has decent tooling support now) and compiling the clamp() values at build time.

    A minimal token definition might look like:

    {
      "font-size": {
        "sm": { "min": "14px", "max": "16px" },
        "base": { "min": "16px", "max": "18px" },
        "lg": { "min": "20px", "max": "26px" },
        "xl": { "min": "28px", "max": "40px" },
        "2xl": { "min": "36px", "max": "56px" }
      }
    }

    A small Node script (or a PostCSS plugin like postcss-utopia, which wraps the Utopia calculator logic) reads those pairs plus your viewport bounds and emits:

    :root {
      --font-size-sm:  clamp(0.875rem, 0.8279rem + 0.2347vw, 1rem);
      --font-size-base: clamp(1rem, 0.9529rem + 0.2347vw, 1.125rem);
      --font-size-lg:  clamp(1.25rem, 1.0735rem + 0.8825vw, 1.625rem);
      --font-size-xl:  clamp(1.75rem, 1.3676rem + 1.9118vw, 2.5rem);
      --font-size-2xl: clamp(2.25rem, 1.6912rem + 2.7941vw, 3.5rem);
    }

    Then your component CSS just references var(--font-size-xl) and the browser handles the rest. No media queries, no breakpoint logic in component files, no manual tweaks per screen size. If you’re already building with a considered typography stack, dropping fluid tokens in is a natural extension of the same thinking.

    The line-length problem fluid type creates

    Here’s a wrinkle I see trip people up. When you make your body copy larger at wide viewports, your line length (measure) also tends to grow because content areas expand. Optimal legibility sits around 60-75 characters per line. A 18px body size in a full-width column at 1440px is brutal to read.

    The fix is to apply fluid typography alongside a max-width constraint on text containers, usually expressed in ch units. Something like max-width: 72ch on a prose container gives you typographic legibility that holds across viewport sizes. If you’re working on data-dense interfaces, this interacts with layout in more complex ways, but for editorial contexts it’s the single most effective pairing. I’ve written separately about designing data-heavy interfaces where these constraints get more nuanced.

    Accessibility: what clamp() doesn’t fix for you

    This is the part people skip and shouldn’t. clamp() with viewport-relative units can break user font-size preferences when set as the preferred value. If a user has set their browser default to 20px (common amongst users with low vision), a clamp() with a vw-based preferred value will often override that preference at mid-range viewport widths.

    The fix is to express your min and max in rem (so they respect the user’s root font size) and keep the viewport-scaling component relatively modest. Avoid making the vw component so large that it dominates and overrides rem-based preferences at most widths. The WCAG 1.4.4 Resize Text criterion requires that text can be resized to 200% without loss of content or functionality, and a poorly calibrated clamp() can fail that silently.

    Test with browser zoom, not just OS-level zoom. They behave differently. And if you’re working on products where accessibility really matters (and it should always matter), cross-reference your approach against the guidance in the designing for older users piece, since fluid type scales interact directly with the readability concerns raised there.

    A practical integration checklist

    Before you ship a fluid type scale, I’d run through these:

    • Are min and max values in rem, not px? (px ignores user preferences.)
    • Does the scale still look right at 320px? (Edge case, but government accessibility audits will check it.)
    • Have you tested browser zoom at 200%? That’s the WCAG threshold.
    • Are line lengths constrained at wide viewports?
    • Do your fluid sizes live in CSS custom properties, not scattered throughout component files?
    • Is the scale generated from a single source of truth so it can change in one place?

    I’ve seen projects where the type scale is duplicated across twelve component files and the Figma file, and they’re all different from each other by 2px here and there. It’s the typographic equivalent of archaeological layers. A token-driven clamp() system collapses that mess into something you can actually maintain.

    Worth mentioning: Utopia and similar tools

    If you’d rather not write a custom build script, Utopia.fyi by Clearleft is the most polished UI for generating fluid type and space scales. You punch in your viewport bounds, your type scale ratios, and your base sizes, and it spits out ready-to-use clamp() values with a live preview. I use it for rapid prototyping and to sanity-check hand-calculated values. It’s also where I first saw how naturally fluid grids and fluid type pair together, which led me down the rabbit hole of the kind of structured layout thinking covered in the return to editorial grid layout discussion.

    On completely different creative projects, I’ve noticed that even hobbyist communities with strong visual identity thinking are getting more thoughtful about typography at scale. The folks at brickclub.uk are a good example of a community site that clearly cares about readability across devices, which is the baseline any content-led site should be hitting.

    Fluid typography isn’t a trend. It’s just correct behaviour for a medium where you genuinely do not know the screen your user is on. The tooling is mature, the browser support is universal (even IE is no longer an excuse anyone’s making in 2026), and the design token integration path is well-trodden. The only reason not to be doing this is inertia, and inertia is a terrible technical decision.

    Frequently Asked Questions

    What browsers support CSS clamp() for fluid typography?

    All modern browsers have supported clamp() since 2020, including Chrome, Firefox, Safari, and Edge. As of 2026 global browser support sits above 97%, so there are no meaningful compatibility concerns for UK web projects. You can use it without a fallback for the vast majority of users.

    How is CSS clamp() different from using media queries for responsive type?

    Media queries produce stepped changes at fixed breakpoints, so font size jumps rather than scales. clamp() interpolates continuously between a minimum and maximum size as the viewport width changes, producing smooth scaling with no abrupt jumps. It also means far less code, since you replace multiple breakpoint overrides with a single property value.

    Will fluid typography break user font size preferences in their browser?

    It can, if you express the min and max values in px instead of rem. Using rem for both bounds ensures the scale respects a user’s browser default font size setting. Keep the viewport-scaling component proportionally modest so it doesn’t override user preferences at mid-range viewport widths.

  • How to Design Data-Dense Dashboards That Actually Work: Lessons From UK Government Open Data Tools

    How to Design Data-Dense Dashboards That Actually Work: Lessons From UK Government Open Data Tools

    There’s a specific kind of despair that comes from opening a government data portal and watching your browser tab freeze under the weight of seventeen nested tables, colour-coded with no legend, and a typography scale that tops out at 11px. I’ve spent an embarrassing amount of time pulling data from HMRC filing tools, Companies House search interfaces, and Ofcom’s connected nations reports, and the contrast between the ones that work and the ones that don’t is genuinely instructive. Not in a “here are five mistakes to avoid” way, but in a granular, layout-level way that tells you exactly why dense information UIs fail and what fixing them actually costs.

    The good news: data dashboard UI design in the UK has a handful of public sector examples worth studying closely. The bad news: most of them are improvements over disasters rather than models of perfection. Either way, there’s a lot to learn.

    Government data dashboard UI design on a desktop monitor in a UK office setting
    Photo by Keysi Estrada on Pexels

    Why government data tools are the right case study

    Private-sector dashboards get to constrain their data. A SaaS analytics product shows you the five metrics that justify its price. Government tools can’t do that. Companies House has to surface director histories, address changes, filing deadlines, PSC data, insolvency events, and charge registrations, all on a single company profile. Ofcom’s Connected Nations tracker plots broadband and mobile coverage across every postcode in the UK and has to let a telecoms analyst, a local councillor, and a journalist all make sense of it without training. HMRC’s business tax account has to serve a sole trader who files once a year and a payroll team running weekly PAYE submissions. That breadth is brutal on UI designers, and it’s precisely what makes these tools useful to study.

    The pressure to present everything to everyone creates the same pattern failures you see in enterprise SaaS dashboards, internal ops tools, and data journalism products. Solve it at the government scale and you’ve solved it everywhere.

    Hierarchy first: what HMRC’s business tax account gets right

    HMRC’s business tax account underwent a significant redesign using the GOV.UK Design System, and the result is instructive. The primary improvement was ruthless hierarchy. The old interface tried to present every outstanding obligation, every payment, every registration at equal visual weight. The redesign introduced a clear primary action at the top of the page, then organised everything else into categorised sections with meaningful labels.

    The lesson: in any data-dense UI, the user has a most-common task. Find it. Put it at the top. Make everything else subordinate. This sounds obvious but most dashboard designers resist it because stakeholders want every metric to feel “important”. They’re not all important at the same time. If your UI tries to shout everything at once, it communicates nothing.

    Typographically, GOV.UK Design System uses GDS Transport (or the open-licence version, GDS Transport Web) with a strict, large-step type scale. The difference between heading levels is dramatic by design. On a data-heavy page, a small size differential between H2 and body text means users scan poorly. You want the hierarchy to be almost cartoonishly obvious. I’d argue most commercial product designers are too subtle with their type scales in contexts where the data volume demands contrast.

    Tables that don’t cause eye strain: lessons from Companies House

    The Companies House search experience has improved considerably since the WebCHeck era. The current interface handles a genuinely tricky problem: tabular data that varies enormously in row density depending on what you’re looking at. A dormant micro-company has three rows of filing history. A large PLC has hundreds.

    Close-up of a structured data table used in UK dashboard UI design
    Photo by Pavel Danilyuk on Pexels

    A few things stand out. First, the alternating row colour is implemented with enough contrast to be functional without being visually loud. This matters. I’ve seen dashboards where alternating rows are almost identical in lightness and the zebra striping does nothing useful. Companies House uses a grey that’s distinct enough to genuinely separate rows. Second, the table doesn’t try to show everything inline. Document links open into a viewer rather than expanding the row and breaking the spatial relationship between rows. That keeps the table scannable even when a user is drilling into detail.

    The bigger structural choice is column count. Companies House limits visible columns to the genuinely essential ones and puts additional metadata one click away. This is the right call. Every additional column in a table increases cognitive load exponentially, not linearly. If you’re designing a financial dashboard, a logistics ops screen, or a data journalism tool, this principle applies directly: start with the minimum viable column set and make expanded detail feel natural, not buried.

    For designers working on anything with structured layout systems, the Companies House table structure is worth reverse-engineering. The grid decisions behind it, particularly how they handle variable-length content in fixed-width columns, are more considered than they look.

    Colour as data channel, not decoration

    Ofcom’s Connected Nations interactive maps are where data dashboard UI design in the UK gets genuinely sophisticated. The challenge is presenting five-level signal strength data across hundreds of thousands of data points in a format that’s readable at both national and street level. They use colour as a primary data channel, which is the right call, but they also do something many tools skip: they label the colour scale clearly, they make the legend persistent at all zoom levels, and they provide a text fallback for every postcode lookup.

    The failure mode I see in commercial data dashboards is using colour purely decoratively or to signal sentiment (red bad, green good) without encoding actual data. If your chart uses six shades of blue to show six categories, you’ve just made a puzzle. Colour should carry a specific, legible meaning and that meaning should be explained, always.

    There’s also a contrast accessibility dimension here. GOV.UK’s design guidelines mandate a minimum contrast ratio of 4.5:1 for text and 3:1 for graphical elements, in line with WCAG 2.1 AA. Commercial dashboards routinely fail this on data visualisations. Light grey labels on white backgrounds. Pale teal percentage indicators. These look clean in a Figma mock-up and become unreadable in production. Testing colour decisions against real ambient conditions, particularly on non-calibrated office monitors, is non-negotiable if your UI has more than a handful of data points.

    On a completely different scale of data visualisation, I find it useful to think about how even simple, real-world categorisation problems share the same underlying design challenge. Homeowners in Nottinghamshire increasingly turn to specialists like The Bin Boss for domestic wheelie bin cleaning, a service that requires communicating hygiene and environment-related data (bacteria load, cleaning frequency, germ reduction results) to a non-technical audience via a house-facing interface, whether that’s a website, a scheduling app, or a service report. The Bin Boss (thebinboss.co.uk) essentially solves the same information hierarchy problem that Ofcom’s maps do: how do you communicate a gradient of states (clean, mildly contaminated, heavily contaminated) in a way that’s immediately understood? Colour coding, iconography, and clear labelling. The principles don’t change because the subject matter is wheelie bins instead of broadband signal.

    Spacing is doing more work than you think

    One of the consistent things I notice across the better UK public sector data tools is generous internal spacing in dense components. Padding inside table cells. Breathing room between a chart and its axis labels. Margin between a data summary and the table it describes. This isn’t aesthetic preference; it’s functional. Dense data requires spatial separation to allow the eye to parse individual elements without them bleeding into each other.

    The typical failure is designing at 100% zoom on a large monitor with a single row of sample data. Everything looks fine. Then real data populates the table at 90% zoom on a 1366×768 laptop screen (still one of the most common screen resolutions in the UK, particularly in public sector settings) and the interface becomes unreadable. Designing for the densest realistic data state at the smallest realistic viewport is the only way to catch this early.

    If you’re building tools that sit on complex white-label or multi-tenant architectures, the spacing decisions at component level become even more critical. I’d recommend reading our breakdown of white-labelling patterns for UK B2B SaaS dashboards, which goes into how spacing and layout decisions need to survive theme variations across different client brands.

    What the Ofcom approach teaches us about filtering

    Filter controls on data-heavy UIs are almost always underdesigned. The Ofcom Connected Nations tool handles this well by keeping filters visible and persistent rather than hiding them in a modal. When filters are out of sight, users forget they’re applied. Then they make decisions based on data that’s silently scoped to a subset. In a compliance dashboard, a financial reporting tool, or an ops screen, that’s a real problem.

    The filter control design itself matters too. Multi-select checkboxes for categorical filters, sliders for continuous ranges, clear labels showing what’s currently applied and an obvious way to clear them. These aren’t novel patterns, but they’re consistently missed. The UK government’s icon design conventions for control affordances are worth reviewing here as well, since ambiguous filter icons routinely confuse users who aren’t coming from a SaaS-trained mental model.

    The filtering question connects to a broader truth about data dashboard UI design in the UK public sector context: users arrive with extremely varied data literacy. Designing a filter that a data analyst understands immediately and a non-specialist doesn’t get wrong requires real work, usually involving a lot of label text that most designers trim prematurely in the name of visual cleanliness.

    Making it work in practice

    If I were auditing a data-heavy UI right now, my checklist would look something like this. Is there one primary action or piece of information that the majority of users are looking for? Is it above the fold and visually dominant? Are tables limited to the minimum necessary columns? Is colour encoding labelled and accessible? Is there enough spacing to parse individual elements at realistic viewport sizes? Are filters visible and clearly indicating their current state?

    For tools handling government-facing data specifically, the GOV.UK Design System documentation is the most useful free resource in the UK for getting these decisions right. It’s not just about visual style; the decision rationale behind each pattern is documented, and that rationale transfers directly to commercial data product design.

    The complexity of a dataset doesn’t excuse a difficult interface. The Bin Boss-style clarity principle applies at every scale: whether you’re surfacing environment and bacteria data on a wheelie bin cleaning schedule or displaying PSC filings across ten thousand companies, the job is always to reduce the effort required to extract meaning. Everything else is just implementation detail.

    Frequently Asked Questions

    What makes a data dashboard UI design work for UK government tools?

    The best UK government data UIs, like HMRC’s business tax account and Companies House search, succeed by establishing strong visual hierarchy so the most common user task is immediately obvious, then organising subordinate information into clearly labelled sections. They also follow the GOV.UK Design System’s accessibility standards, which ensures colour contrast, type scale, and spacing hold up under real-world conditions.

    How do you handle too many columns in a data-heavy dashboard?

    The practical solution is to identify the minimum column set that covers the majority of user tasks and move everything else into an expandable detail view or secondary page. Every additional column increases cognitive load significantly, so the goal is always to display the essential data inline and make deeper detail feel one deliberate click away rather than buried.

    What colour contrast ratio should data dashboard UIs target in the UK?

    WCAG 2.1 AA requires a minimum 4.5:1 contrast ratio for text and 3:1 for graphical elements like chart labels or axis lines. UK public sector tools are required to meet this standard, and it’s a sensible baseline for any commercial dashboard handling complex datasets, particularly since data visualisation colour choices frequently fail this threshold when tested outside Figma.

    Should filter controls be visible or hidden in a data dashboard?

    Visible and persistent is nearly always the better choice. When filters are tucked into a modal or collapsed panel, users forget they’re applied and interpret scoped data as the full picture. Keeping active filter states visible, with a clear way to remove them, prevents this and significantly reduces user errors in data-intensive interfaces.

    Which free UK resources are most useful for designing government-facing data UIs?

    The GOV.UK Design System (design-system.service.gov.uk) is the starting point, as it documents not just visual patterns but the reasoning behind each decision, which transfers well to commercial data products. Ofcom’s Connected Nations reports and Companies House’s public interface are also worth studying as live examples of complex dataset presentation at scale.

  • Designing Multi-Tenant SaaS Dashboards: The White-Labelling Patterns UK B2B Teams Need in 2026

    Designing Multi-Tenant SaaS Dashboards: The White-Labelling Patterns UK B2B Teams Need in 2026

    There’s a very specific kind of design hell that UK B2B SaaS teams walk into when a sales director announces: “We’ve landed a white-label deal. Can you just swap out the logo and change the colours?” The answer is technically yes. The better question is whether your design system was ever built to support it. In most cases, it wasn’t. And that’s what white label SaaS dashboard design in the UK has quietly become in 2026: a structural problem dressed up as a branding request.

    I’ve spent a fair amount of time pulling apart multi-tenant dashboard architectures, both at the design token level and in Figma component libraries, and the patterns that separate teams who cope from teams who spiral into duplication nightmares are pretty consistent. This is what actually works.

    Multi-tenant SaaS dashboard interface shown on a monitor, relevant to white label SaaS dashboard design UK
    Photo by Egor Komarov on Pexels

    Why most SaaS design systems aren’t white-label ready out of the box

    The problem usually starts at the colour layer. A team builds a design system around a single brand: one primary palette, one set of semantic colour names, one font stack. Everything works beautifully until tenant two shows up with a completely different brand identity, different primary colours, and a typeface that isn’t Inter. Suddenly you’ve got a choice: fork the entire component library, or retrofit a theming layer that the system was never designed to accommodate.

    The fork path is where most teams end up, and it’s slow, expensive, and creates ongoing maintenance debt every time a core component changes. If you’ve got six tenants and three engineers, forking is how you spend your entire sprint cycle keeping six slightly different versions of a button component in sync. No one wants that.

    The better path is design tokens, specifically a three-tier token structure that separates raw values, semantic meaning, and component-level application. This isn’t a new idea, but the W3C Design Tokens Community Group‘s draft specification has given it enough formal grounding that it’s worth implementing properly now rather than cobbling something together.

    The three-tier token structure that makes multi-brand manageable

    Tier one is your primitive tokens: raw values with no meaning attached. colour-blue-500: #2563EB. That’s it. No context, no semantic weight. Just a value in your design system’s vocabulary.

    Tier two is semantic tokens. These reference primitives but give them meaning: colour-brand-primary: {colour-blue-500}. This is where the tenant swap actually happens. When tenant B comes in with their own brand colour, you’re changing only this layer. Tier three is component tokens, which reference semantic tokens: button-background-colour: {colour-brand-primary}.

    What this means practically: swapping a tenant’s brand requires changing roughly 15 to 30 semantic tokens. Not 400 individual component properties. I’ve seen UK fintech teams get a new tenant’s dashboard looking correct in under two hours using this structure properly. Without it, the same job takes days and breaks something unrelated every time.

    This also connects nicely to the work I’d recommend reading on icon systems in UK product design, because icon colour inheritance is one of the sneakier places where teams hardcode values instead of pulling from semantic tokens, and it creates silent inconsistencies the moment you apply a tenant theme.

    Figma component strategies for multi-tenant dashboards

    Figma’s variables system (now properly mature after a rocky 2024 rollout) is the most practical way to manage multi-tenant theming at the design stage. The approach that works: one base component library, one set of variable collections per tenant, and a simple variable swap to preview any tenant’s brand in the same file.

    Set up your variable collections to mirror your three-tier token structure exactly. Primitives collection, semantic collection, component collection. When onboarding a new tenant, you’re creating a new semantic collection that maps to different primitives, and that collection swap is all it takes to see the entire dashboard re-skin in Figma. This matters beyond aesthetics: it means your handoff documentation is always correct, because the component specs are pulling live values from the right collection rather than being annotated by hand.

    One thing I’d flag specifically for UK B2B contexts: accessibility compliance. The WCAG 2.2 guidance on GOV.UK is increasingly being referenced by enterprise procurement teams when evaluating SaaS products, especially in public sector adjacent markets. When a tenant swaps their brand colours in, your semantic token structure needs to preserve contrast ratios, which means building contrast validation into your token system, not treating it as an afterthought. Figma’s built-in contrast checker helps here, but I’d also run token exports through a script that validates WCAG AA thresholds automatically before a new tenant theme goes live.

    Logo swapping and asset management across tenants

    Logo swapping sounds like the easy part. It’s not, because logos aren’t just image files, they carry implicit sizing assumptions, clear space requirements, and colour mode variants that most teams don’t standardise. A tenant hands you their logo as a 2MB PNG with a white background and you’re suddenly in a conversation about SVG conversion and dark mode variants that no one budgeted for.

    The pattern that saves time: define a logo slot specification upfront. Decide the maximum and minimum dimensions, require SVG with transparent background, specify which colour modes need variants (light background, dark background, monochrome), and document this as an onboarding requirement for every tenant. This turns an ad-hoc request process into a predictable intake checklist. It also means your Figma library has a proper logo component with defined constraints rather than a free-floating image that someone will inevitably resize incorrectly.

    Typography is the other asset dimension people underestimate. If your product uses a licensed typeface, you cannot simply apply it to a white-label tenant without checking the licence covers redistribution and sub-licensing. I covered the landscape of usable typefaces in some depth in the piece on open source font pairing for UK web design, and that’s genuinely worth reading if you’re specifying fonts for a multi-tenant product, because the safe defaults there are exactly the ones that won’t land you in a licence dispute when a tenant insists on their brand typeface.

    Building the dashboard layout layer that works for every tenant

    Theming handles colour and typography. Layout is a different layer entirely, and it’s where white-label dashboards often feel slightly wrong even when the colours are correct. The issue is density assumptions baked into the layout that suit one type of user but not another.

    If your SaaS product serves both a small UK accounting firm and a large property management group, the data they want to see on their dashboards is different, the density they’re comfortable with varies, and the navigation hierarchy that makes sense for one makes no sense for the other. Token-based theming solves the brand problem; what solves the layout problem is a modular panel architecture where tenants can configure which panels are visible without requiring you to build a custom layout per client.

    This is really a product decision as much as a design one, but the Figma implication is worth spelling out: build dashboard layouts using an auto-layout grid of configurable panel components rather than fixed-position screens. Each panel is self-contained. A tenant configuration sets which panels are active. The design system handles spacing and sizing tokens. You never hardcode a dashboard layout in a static frame again. It’s a bit more upfront work, maybe two or three additional sprints to build the panel abstraction properly, but it makes every subsequent tenant onboarding genuinely faster.

    The same thinking applies to accessibility across different user demographics. If you’re building for tenants whose end users skew older, the considerations I wrote about in the piece on designing for older users in UK product teams become tenant-level configuration concerns: default font size tokens, touch target size tokens, reduced motion preferences. These are all design token decisions, which means a well-structured system can accommodate them per-tenant without forking the component library.

    When to build this properly vs. when to ship something scrappy

    Not every white-label deal justifies a full three-tier token refactor. If you’ve got one tenant, a simple CSS variable override at the root level might be genuinely sufficient. But if your sales pipeline has more than two potential white-label clients, and especially if those clients are enterprise contracts where your product will be embedded in their internal tools under their brand, the upfront investment in a proper token architecture pays back within the first two onboardings. The maths isn’t complicated.

    The UK B2B SaaS market in 2026 is structurally pushing more products toward multi-tenancy. Procurement consolidation, budget pressure, and the growth of platform-first business models all mean your product is more likely than ever to end up underneath someone else’s logo. Building a design system that handles that gracefully isn’t a nice-to-have, it’s table stakes for products that want to scale.

  • The Principles Behind BBC iPlayer’s UI: What Every British Product Designer Can Learn From It

    The Principles Behind BBC iPlayer’s UI: What Every British Product Designer Can Learn From It

    I’ve spent more time than is professionally advisable picking apart how the BBC iPlayer interface works. Not watching content on it, mind you. Actually staring at hover states, tab-order behaviour, loading skeletons, and the way the navigation rail collapses on a 40-inch telly versus a 320px mobile viewport. The BBC iPlayer UI design principles UK product teams should be studying are genuinely embedded in every screen of that product, and I want to drag them out properly.

    This is a teardown, not a fan letter. Where iPlayer does something brilliantly, I’ll say so. Where there’s a head-scratching inconsistency, that’s going in too. Either way, there’s a stack of transferable thinking here that most UK product teams would benefit from nicking.

    Television screen showing a streaming content grid, illustrating BBC iPlayer UI design principles UK product teams can learn from
    Photo by https://kaboompics.com/ on Pexels

    How iPlayer handles content discovery without overwhelming you

    Content discovery is probably the hardest design problem in streaming. You have thousands of titles, a user with forty-five seconds of patience, and a recommendation system that may or may not know them well yet. iPlayer’s solution is surprisingly restrained given the scale of the BBC’s catalogue.

    The homepage is structured as a progressive hierarchy. The hero slot anchors attention, but it’s not auto-advancing like Netflix’s carousel assault on your focus. Below it, content rows are labelled with actual editorial intent: “Catch Up”, “Recommended for You”, “New Arrivals”. These are not clever algorithmic names. They’re plain English labels that tell you immediately what logic organised them. That’s a design decision, not a default.

    I’d argue the most important part of the discovery UI is what iPlayer refuses to do. There are no autoplay trailers on hover in the web interface. There’s no “you have 5 seconds before the next episode starts” pressure mechanic unless you’ve opted into it. That restraint lowers cognitive load measurably, and it respects the fact that a significant portion of the BBC’s audience, covered thoroughly in the over-55 audience design piece on this blog, find high-density motion interfaces actively hostile.

    Accessibility as a structural decision, not a retrofit

    The BBC publishes its own accessibility standards, the BBC Accessibility Standards and Guidelines, which sit alongside WCAG 2.2. That’s not marketing copy. You can see the results of it directly in iPlayer’s codebase: focus states that are actually visible (not that 1px dashed outline browsers default to), semantic HTML that makes keyboard navigation feel deliberate rather than accidental, and live subtitle rendering that works across every surface including smart TVs where most streaming services just… don’t bother.

    The subtitle implementation is worth a short paragraph on its own. iPlayer’s subtitles render as HTML text overlaid on the video container rather than burned into the video stream. That means font size, colour, and background opacity are all user-adjustable. It also means the subtitle DOM is accessible to screen readers in certain configurations. That’s technically more complex to implement than a static .vtt file being displayed, and the BBC chose to do it anyway. That’s what “accessibility as infrastructure” looks like rather than accessibility as checkbox.

    If your product team is still treating accessibility annotations as a final design-handoff step, iPlayer is a case study in why that approach breaks down. The accessibility behaviour here is inseparable from the component architecture. You can’t retrofit it cleanly. Build it in or spend twice the effort later. This connects to the same reasoning I wrote about in the icon design system teardown, where icon meaning and accessibility labelling need to be decided at the system level, not icon by icon.

    Multi-device consistency and where it gets complicated

    iPlayer runs on an extraordinary range of surfaces. A 2013 Samsung smart TV, a current-gen PlayStation, a 320px Android handset, a desktop browser, and an iPad all need to present the same content catalogue through fundamentally different interaction paradigms. That is an engineering and design problem most product teams never encounter at this scale, but the principles iPlayer uses to solve it are still directly applicable.

    The key move is abstracting the design system away from the input model. The layout responds not just to screen size but to inferred input type: pointer (mouse/trackpad), touch, or remote/d-pad. The navigation rail behaviour changes meaningfully between these modes. On a remote-controlled TV interface, every interactive element needs to be reachable via directional navigation without any pointer. iPlayer’s focus management logic handles this without the user ever thinking about it.

    For most product teams the relevant principle is this: design for your secondary device first. iPlayer’s constraints from TV remote navigation have made the whole interface more keyboard-accessible by necessity. That’s a good trade. If you’re building a web app and keyboard navigation is an afterthought, try designing the component interaction model for a d-pad first and then add pointer support on top. The resulting component will be cleaner.

    Performance design and the perception of speed

    iPlayer’s actual page performance is not perfect. Run it through WebPageTest on a throttled 4G connection and you’ll see a real-world LCP that could be sharper. But the perceived performance is well managed, and that distinction matters more to users than a 100/100 Lighthouse score.

    The loading skeleton UI is implemented with care. Skeletons match the aspect ratios of the content cards they’re replacing, including the 16:9 thumbnail, the title line, and the metadata line. When content loads, there’s no layout shift. The skeleton was drawn to the correct dimensions. This is a WCAG-adjacent win but also just good engineering; it prevents the cascading reflows that trash Core Web Vitals scores and make pages feel broken to users even when the content eventually renders correctly.

    Image delivery on iPlayer also uses responsive sizing properly. The BBC’s image service appends dimension parameters to thumbnail URLs so the browser receives an image at the correct resolution for the current viewport. I’ve seen mid-sized UK product teams serving 1200px wide thumbnails inside 240px card slots. That’s not just a performance problem; it’s a data usage problem for mobile users on capped plans, which the Ofcom Connected Nations report consistently shows is still a significant real-world concern in the UK outside major city centres.

    The design system thinking underneath it all

    The BBC’s GEL (Global Experience Language) design system is public, and it’s worth reading even if you’re not building a product that touches the BBC at all. GEL is the spine of iPlayer’s consistency. Components are defined with explicit spacing, type scales, and interaction states at the system level. Individual feature teams don’t design new card components from scratch; they pull from GEL.

    That’s the transferable bit. The specific components in GEL don’t matter to your product. The structure of the thinking does. When a design decision is made once at the system level and then pulled into features rather than reinvented per screen, you ship faster, the product feels more coherent, and edge cases (like that 320px viewport on a cheap Android handset) get solved once and inherited everywhere.

    If your team is still at the stage of building a design system, the TypeScript for designers piece is worth reading alongside this one, because codifying your tokens and component contracts in a typed system is what prevents GEL-style consistency from decaying over time as teams grow.

    The BBC iPlayer UI design principles UK teams should extract aren’t magic. They’re the result of treating design constraints as opportunities, building accessibility into architecture, and refusing to optimise for engagement metrics that make interfaces worse. That combination is rarer than it should be, and iPlayer is one of the cleaner examples of it on any screen in the country.

  • Designing for Older Users: What UK Product Teams Get Wrong About the Over-55 Audience Online

    Designing for Older Users: What UK Product Teams Get Wrong About the Over-55 Audience Online

    Ofcom’s 2024 Online Nation report put a number to something most product teams already suspect but rarely act on: the over-55 demographic is one of the fastest-growing online cohorts in the UK. Not just growing. Growing fast. And yet, if you spend an afternoon watching someone in that age group try to use a typical SaaS product or a government-adjacent web app, you will feel genuine embarrassment at the assumptions baked into our interfaces. I’ve sat in enough usability sessions to know that the gap between what designers think older users can handle and what actually happens on screen is enormous.

    This isn’t an accessibility checkbox article. It’s about the specific, recurring design decisions that make products hostile to people over 55, and what switching those decisions actually looks like in practice. The fix is almost never a separate “accessibility mode”. It’s just better design.

    Older woman using a tablet at home, relevant to designing for older users UK accessibility
    Photo by Marcus Aurelius on Pexels

    Why the over-55 audience is not who you think it is

    The lazy mental model of an older user is someone confused by technology. That model is outdated and statistically wrong. Many people in the 55-75 bracket have been using the internet since the late 1990s. They have more disposable income than younger demographics, they shop online, they bank digitally, they stream. According to Ofcom’s internet use research, broadband penetration among over-65s in the UK has risen significantly year on year. These are not digital novices. They are experienced users dealing with interfaces built by people who did not design with them in mind.

    The actual challenges are specific. Contrast sensitivity changes with age. Motor precision decreases. Reading speed slows when type is small or poorly spaced. Working memory means multi-step flows with no persistent progress information are genuinely harder to complete. None of these things mean someone is bad at technology. They mean the technology is bad at accommodating normal human variation.

    The contrast and type size failures that are everywhere

    Grey text on a white background is the single most common UI failure I see when looking at products aimed at a general UK audience. Designers use it because it looks refined. WCAG 2.1 AA requires a contrast ratio of at least 4.5:1 for normal text. The trendy light-grey placeholder text in form fields routinely fails this. The secondary text on pricing pages fails this. The fine print on checkout screens absolutely fails this.

    Type size is the other obvious one. A base font size of 14px or 15px might render acceptably on a 27-inch monitor at your desk. On a tablet held at arm’s length by someone whose near vision has shifted, it is punishment. Sixteen pixels should be the floor. Eighteen is more honest for body copy. Line height below 1.5 compounds the problem by collapsing the space between lines that lets the eye track correctly.

    If you’ve been reading my earlier piece on choosing and pairing system fonts for the web, you’ll know that system fonts carry genuine legibility advantages at body size, particularly because they’ve been hinted and rendered for the OS they live on. That advantage matters more for older users than it does for anyone else.

    Touch targets and motor precision

    A 24px icon button that expands a menu is fine when you’re 29 and have the fine motor control of someone who grew up texting on a glass screen. It’s a genuine barrier when your hands are less precise. Apple’s Human Interface Guidelines recommend a minimum touch target of 44 by 44 points. Google’s Material Design says 48 by 48dp. Most production UIs I audit for clients are hitting 32 by 32 on interactive elements, sometimes less.

    The fix is not complicated. Add padding. Use larger hit areas than the visible icon. Space interactive elements so that missing one doesn’t accidentally trigger another. These are also excellent improvements for mobile users on a bumpy train, so they help everyone. Good accessibility decisions usually do.

    Related to this: hover states that only appear on desktop are not a navigation strategy. Dropdown menus that require hovering and then moving precisely into a sub-menu without the menu disappearing are a known usability failure for everyone, but disproportionately so for users with slower or less precise cursor movement. The solution is click-to-open behaviour or a transition delay on the menu close.

    Cognitive load and the multi-step flow problem

    The pattern I see causing the most drop-off with older UK users in usability research is multi-step flows with no persistent progress indicator and no ability to go back without losing state. Checkout flows. Application forms. Account setup wizards. The assumption is that a user will hold the full mental model of where they are in the process. That assumption is wrong for many users, and increasingly wrong as the complexity of the task increases.

    Persistent breadcrumbs on long forms. Clear step indicators that say “Step 3 of 5”. Save and return later functionality for longer forms. Autofill that actually works correctly with UK address formats. These are table stakes that many products have not implemented.

    Error messages deserve their own mention. Generic messages like “An error occurred” or “Invalid input” with a red border and no further context are genuinely useless. Precise errors that say “Your sort code should be six digits with no spaces” or “Your date of birth should be in DD/MM/YYYY format” are what accessibility looks like in practice.

    The icon-only interface trap

    Icon-only navigation has been creeping into UK product design for years. It looks clean in Figma mockups at 100% zoom. It is confusing in practice for a significant portion of users. My piece on how product teams are getting their icon systems wrong covers this at length, but the short version is: icons without labels are only clear when the iconography is universal and learnt. Most product icons are neither. Older users who didn’t grow up with a particular design language’s conventions find ambiguous icons significantly harder to decode. Add labels. Combine the icon with text. It adds a few pixels of height to your nav and it eliminates a major source of confusion.

    Designing for older users UK accessibility in real product decisions

    The design decisions that actually fix these issues are not a separate track from good design. They’re the same decisions. High contrast ratios look more professional, not less. Larger text with good line height reads better for everyone. Clear error messages reduce support tickets. Persistent progress indicators reduce abandonment. These are all wins on metrics that product teams already care about.

    If your team hasn’t done usability testing with participants over 55, do it. Recruit through local community organisations, Age UK, or digital inclusion programmes. Watch what happens. I guarantee you will find at least three things to fix before the session ends, and you will fix them faster than any other research you’ve done, because the problems are visible and the solutions are concrete.

    One practical first step: run your existing UI through a contrast checker (there are browser extensions for this) and sort the failures by page priority. Fix the worst offenders on your homepage and primary conversion flows first. That alone will move your accessibility score and your conversion numbers simultaneously.

    The broader point is that designing for older users in the UK isn’t a niche concern or an edge case. It’s designing for a large, growing, and financially significant audience that is currently being failed by most of the interfaces they encounter. Fix the contrast. Fix the type size. Fix the touch targets. Fix the error messages. Then actually test with the people you’re designing for. The rest follows from there.

  • The Typography Stack in 2026: How to Choose and Pair System Fonts Without Looking Cheap

    The Typography Stack in 2026: How to Choose and Pair System Fonts Without Looking Cheap

    Here’s the thing that nobody says out loud: most web font implementations are a performance tax in disguise. You add a Google Fonts <link> in the <head>, you pick something that looks nice in Figma, and then you wonder why your Largest Contentful Paint is a disaster. I’ve watched this play out on dozens of projects, and the pattern is almost always the same. The typography looks considered, the loading experience does not.

    Building a solid system font stack in 2026 isn’t about giving up on brand expression. It’s about being smarter with what you load, when you load it, and how you fall back gracefully when things go wrong. This guide walks through the actual mechanics of doing that, from stack construction to subsetting to font-display strategy, with enough detail to be genuinely useful rather than just vaguely inspirational.

    Designer reviewing a system font stack layout on a widescreen monitor
    Photo by Miguel Á. Padriñán on Pexels

    Why system fonts deserve more respect than they get

    The reputation of system fonts is stuck somewhere around 2014, when using them felt like admitting defeat. That narrative is outdated. The current default system stacks are genuinely good. Apple’s San Francisco is a masterclass in legibility at small sizes. Segoe UI Variable (shipping with Windows 11) is properly optical-size aware. Inter, whilst technically a web font, ships natively in several Linux environments and is increasingly used as a system default in design tools.

    A well-constructed system font stack in CSS looks something like this:

    font-family:
      system-ui,
      -apple-system,
      BlinkMacSystemFont,
      'Segoe UI Variable',
      'Segoe UI',
      Roboto,
      Oxygen,
      Ubuntu,
      sans-serif;

    That stack costs zero bytes, loads in zero milliseconds, and renders without layout shift. On a content-heavy site, that’s worth a lot. The Core Web Vitals improvement alone can be significant, particularly for Cumulative Layout Shift (CLS) and LCP, both of which get hammered by render-blocking font requests.

    When you actually need a web font (and when you don’t)

    I’d argue the honest answer is: less often than you think, and almost never for body copy. System fonts at 16px with sensible line-height and letter-spacing are perfectly readable. The use cases where a web font genuinely earns its keep are narrower than most designers admit.

    Genuine reasons to load a web font include: a logotype-adjacent display face that’s core to the brand identity, a distinctive serif for editorial contexts where the personality of the letterform matters, or a monospaced font for code samples where system options (Courier New, I’m looking at you) are visually terrible. Body copy at 16–18px? The system font stack wins almost every time.

    The question I ask on every project is whether a user could actually tell the difference between the web font and a well-configured system font at reading distance. More often than not, the answer is no. What they will notice is a flash of invisible text or a layout jump. That’s the trade you’re making.

    CSS code showing a system font stack configuration in a dark-theme editor
    Photo by Pixabay on Pexels

    How to load web fonts without destroying your performance scores

    When a web font is genuinely justified, the loading strategy matters as much as the font itself. There are three levers that make the biggest difference: self-hosting, subsetting, and font-display.

    Self-host everything

    Stop using Google Fonts via CDN. It creates a cross-origin request that costs you a DNS lookup, a TCP connection, and potentially a TLS handshake before a single byte of font data arrives. Self-host the files on your own domain instead. Tools like google-webfonts-helper generate the CSS and font files you need in seconds. Your font is now one fewer external dependency, and you have full control over caching headers.

    Subset aggressively

    A full variable font file can be 200–400KB. For a UK-facing site serving primarily Latin-script content, you need maybe 20% of that. The unicode-range descriptor in your @font-face rule tells the browser which characters are actually in each file, so it only downloads the subset it needs. Use pyftsubset from the fonttools library to strip everything you don’t need. A Latin subset for English content typically covers U+0020–U+00FF, plus U+2013–U+2122 for typographic punctuation. That’s it.

    For a typical paragraph-weight subset, I regularly get files under 20KB. That’s a very different conversation than serving 300KB of font data for characters your users will never see.

    Use font-display correctly

    The font-display descriptor controls what happens whilst your web font loads. The options matter:

    • swap renders immediately in a fallback, then swaps when the web font arrives. Fast but causes layout shift.
    • optional gives the browser a very short window to load the font; if it doesn’t arrive in time, the browser uses the fallback for the entire page load. Zero layout shift, and on repeat visits the cached font renders immediately. This is my default for body fonts.
    • block renders invisible text for up to 3 seconds. Avoid it. It’s what’s killing your LCP on slow connections.

    For display fonts where the visual difference genuinely matters, swap is acceptable if you’ve done the work to minimise the metric mismatch between your web font and fallback. Which brings us to the next bit.

    Matching your fallback metrics to eliminate layout shift

    The biggest cause of font-related CLS is metric mismatch: your web font has different line-height, letter-spacing, or ascender/descender values than the system font rendering in its place. When the web font arrives, everything reflows. That’s the jump users hate.

    CSS now has size-adjust, ascent-override, descent-override, and line-gap-override descriptors inside @font-face, and they’re specifically designed for this. You apply them to a local fallback font definition to make it metrically equivalent to your web font. The Malte Ubl approach of using the Font Style Matcher is worth reading, and the Fontaine library automates this for build pipelines.

    A simplified example for matching Inter with a system fallback:

    @font-face {
      font-family: 'Inter Fallback';
      src: local('Arial');
      ascent-override: 90.2%;
      descent-override: 22.48%;
      line-gap-override: 0%;
      size-adjust: 107.4%;
    }
    
    body {
      font-family: 'Inter', 'Inter Fallback', system-ui, sans-serif;
    }

    The layout is now almost identical before and after the web font loads. CLS drops to near zero. This is the kind of detail that separates a properly engineered typography stack from one that just happens to look okay in Figma. Incidentally, if you want to see this principle applied at scale, the approach connects directly to the same performance discipline I mentioned in our variable fonts deep dive, which covers how font axes interact with rendering at different viewport sizes.

    Pairing system fonts with brand type: a practical approach

    The pairing model I’ve settled on for most UK product work is a single web font for display headings (H1, H2, hero text) and a system font stack for everything else: body copy, UI labels, form inputs, navigation. This gives you brand personality where it’s visible, and zero performance cost where it isn’t.

    For display type, a variable font is almost always the better choice over a static weight. You get the full weight and width axis with a single file. Fonts like Cabinet Grotesk, Fraunces, or Anybody Variable cover a huge range of expressive territory at roughly 40–80KB subsetted. Pair that against system-ui for body and the contrast is actually better than two web fonts fighting for attention.

    The same principle applies to design systems built in Figma. If your design system is using a bespoke web font for every text style, someone on the engineering side is eventually going to raise a performance ticket. Getting ahead of that in the design phase, by deliberately scoping which styles use the web font and which defer to system defaults, is much cleaner than retrofitting it later. The same discipline that makes a good design system in Figma applies here: decide at the token level which typefaces are brand-critical and which are functional.

    On a practical note: some niches have specific loading constraints that make this even more pressing. Anyone building content-heavy landing pages under heavy traffic, whether that’s e-commerce, media, or specialist verticals like vape seo where organic performance is critical, will feel font loading overhead in real conversion metrics. It’s not an abstract concern.

    Preloading the right files

    If you’ve subsetted correctly, you can preload your critical font files without much guilt. The pattern is a <link rel="preload"> in the document <head>, pointing at your subset WOFF2 file with as="font" and crossorigin. This tells the browser to fetch it as early as possible, even before the CSS is parsed.

    Only preload what’s above the fold. Preloading three font weights because they all appear somewhere on the page is still a mistake. For most sites, one or two files is the right ceiling. The web.dev font best practices guide covers the nuances of preload priority, and it’s worth reading alongside your Lighthouse report rather than in isolation.

    The goal isn’t a font system that’s technically impressive. It’s one that users never think about because the text was simply there, readable and on-brand, from the first paint. That’s harder than it sounds, but the tooling in 2026 makes it genuinely achievable without exotic build steps or compromising visual quality.

    Frequently Asked Questions

    What is a system font stack and why should I use one?

    A system font stack is a CSS font-family declaration that references fonts already installed on the user’s operating system, such as San Francisco on macOS or Segoe UI on Windows. Because no files need to be downloaded, there’s zero loading time and no risk of layout shift from font swapping. For body copy especially, modern system fonts are high-quality and save significant performance overhead.

    Do system fonts hurt brand identity?

    Not if you’re strategic about where you use them. The approach most experienced product teams use is to load a single web font for display headings and marketing-facing text, while using a system font stack for body copy, labels, and UI elements. You preserve brand character where it’s most visible, and avoid paying a performance cost on the parts users don’t consciously notice.

    What is font-display: optional and when should I use it?

    The font-display: optional descriptor gives the browser a very short window (typically around 100ms) to load a web font; if it doesn’t arrive in time, the fallback is used for that entire page load and no swap occurs. On subsequent visits, the cached font renders immediately with no shift. It’s the best choice for body fonts because it eliminates Cumulative Layout Shift entirely whilst still serving the web font to most repeat visitors.

    How do I stop my web fonts causing layout shift (CLS)?

    The main cause is metric mismatch between your web font and its fallback. Use the CSS descriptors ascent-override, descent-override, and size-adjust inside a local @font-face rule to make your system fallback font metrically match your web font. This means the layout stays identical before and after the web font loads, bringing CLS close to zero. Tools like Fontaine can automate this at build time.

  • Astro vs Next.js in 2026: Which Framework Should UK Web Developers Actually Build With?

    Astro vs Next.js in 2026: Which Framework Should UK Web Developers Actually Build With?

    The framework debate has a new shape in 2026. A couple of years ago, the conversation was basically “are you using Next.js or are you wrong?” That’s no longer the case. Astro vs Next.js is now a genuine technical decision, and if you’re a UK freelancer or small agency picking a stack for a new project, getting it wrong costs you real time and money. I’ve spent a fair chunk of the last year shipping with both, and I have opinions.

    This isn’t a “both are great in their own way” fence-sit. I’ll tell you which one wins for which type of work, what the hosting implications look like on UK infrastructure, and why the choice matters more than most tutorials let on.

    Web developer comparing Astro vs Next.js framework code on dual monitors
    Photo by Alicia Christin Gerald on Pexels

    What each framework actually is

    Next.js, maintained by Vercel, is a React-based full-stack framework. It does server-side rendering, static generation, incremental static regeneration, API routes, middleware, edge functions, the lot. It’s been the default choice for serious React projects for years, and the ecosystem around it is enormous.

    Astro is something different. It’s an islands-architecture framework that ships zero JavaScript to the browser by default. You write components in whatever flavour you fancy (React, Svelte, Vue, or plain HTML) and Astro only hydrates the interactive bits. The result is pages that are genuinely fast in a way that feels almost unfair. For content-heavy sites, the Lighthouse scores are embarrassing compared to a typical Next.js build.

    These two frameworks are not really competing for the same use case. The problem is that a lot of developers reach for Next.js out of habit, even when Astro would be the smarter pick.

    Build performance: where Astro genuinely wins

    For a marketing site, a blog, a documentation hub, or a portfolio, Astro is faster to build with and faster to serve. Full stop. The islands architecture means your pages arrive in the browser as HTML with CSS, and only the components that need interactivity (a search bar, a contact form, a live pricing widget) get JavaScript injected. Everything else is static.

    I rebuilt a client’s agency site last autumn, previously on Next.js with a bloated component tree, and the move to Astro dropped Time to First Byte from around 800ms to under 120ms on a cold UK edge. The Core Web Vitals went green across the board without any heroics. If you’ve been wrestling with layout performance issues at the CSS level, the framework layer matters even more than you might think.

    Next.js, by contrast, carries React into the browser on every page by default. Even with server components (which are genuinely clever and have improved things substantially), you’re shipping more JavaScript than Astro would. For a SaaS dashboard, a social platform, or anything with heavy real-time state, that’s a reasonable trade. For a brochure site? It’s not.

    Hosting costs on UK providers

    This is where the decision gets practical and where UK developers often get stung. Next.js is heavily optimised for Vercel’s own infrastructure. That’s not a criticism, Vercel is a good product, but their free tier has limits that bite fast, and their Pro tier at roughly £17 per user per month adds up for a small agency with multiple projects running.

    Alternatives like Netlify or UK-adjacent providers such as Cloudflare Pages handle Next.js, but you lose some features (middleware running on Vercel’s edge, ISR at the granular level) or find workarounds necessary. The Vercel lock-in is real, even if the company insists otherwise.

    Astro sites, because they’re largely static output, deploy anywhere. Cloudflare Pages for free. An S3-compatible UK bucket behind a CDN. Your client’s existing cPanel host, if it comes to that. I’ve run Astro sites on Hetzner VPS instances in their UK datacentre (Falkenstein is technically Germany, but their London presence is growing) for under £5 per month including everything. Next.js apps with server-side requirements need a Node runtime, which means either a managed platform with associated costs or your own self-hosted VPS setup that you need to maintain.

    For UK freelancers billing smaller clients, the hosting cost difference can genuinely affect whether a project is profitable at the price point the client expects.

    Which projects actually suit each framework

    Astro wins for: marketing sites, landing pages, blogs, documentation, portfolios, news sites, e-commerce storefronts where the cart is a third-party embed, and any project where content is the primary product. If the page is mostly read, not interacted with, Astro should be your first choice.

    Next.js wins for: SaaS products with authenticated dashboards, apps with real-time data requirements, anything with complex server-side logic that needs to live close to the data layer, and projects where the team is already deep in the React ecosystem and moving away would cost more than it saves. It’s also the better pick when you’re building something that will grow into a full application, because its routing and API layer scale well.

    A pattern I see constantly in UK agency work: someone specs a Next.js build for a 12-page product site because the team knows React. The site ends up with a bundle size north of 800KB for pages that are basically text and images. Then they spend a sprint optimising what the framework choice created. Astro wouldn’t have done that.

    There’s also a middle path worth mentioning. Some teams are now running hybrid setups: Astro for the public-facing marketing and content pages, Next.js (or a lighter alternative like Remix) for the authenticated product area. The two can coexist on subdomains or subdirectories, and if you’re thoughtful about the split, you get the best performance characteristics of both without too much architectural overhead.

    The developer experience difference

    Next.js has the larger ecosystem, more Stack Overflow answers, and a bigger community in the UK dev scene. If you’re hiring or collaborating, finding someone familiar with Next.js is easier. The Astro community is growing fast, and the documentation is genuinely excellent, but it’s still smaller.

    Astro’s component model, where you can mix React, Svelte, and vanilla components in the same project, sounds chaotic but is surprisingly workable. For a freelancer who has built up a library of components across different frameworks, it’s actually liberating. I’ve pulled in a React data-viz component alongside a Svelte interactive widget and it just worked. That flexibility is part of why Astro suits project-based freelance work so well.

    One thing I’ve noticed: clients who care about their web presence (the ones spending money on cookie free display advertising UK services and similar performance-focused digital channels) are increasingly asking specific questions about page speed. Astro makes it much easier to hit those targets without a performance engineering sprint at the end of every project.

    For teams already building design systems or working across multiple products, the framework choice also interacts with your component architecture. If you’re maintaining icon systems or a full icon design system across multiple surfaces, understanding how your framework handles component hydration will affect how you structure those shared resources.

    My actual recommendation

    Default to Astro for anything content-first. The performance advantages are real, the hosting costs are lower, and the developer experience is genuinely good. You won’t spend three hours debugging why your bundle includes a library you imported once in a layout file.

    Use Next.js when the project genuinely needs it: persistent server-side state, complex auth flows, real-time features, or a codebase that’s going to grow into something an engineering team maintains long-term.

    The Astro documentation is worth an afternoon of your time even if you’re not planning to use it immediately. You’ll come away with a much clearer sense of what “islands architecture” actually means in practice, which makes the Next.js vs Astro decision far more intuitive when a new project lands on your desk.

    Both frameworks are mature, production-ready, and supported well enough that you won’t be stranded. The choice is about fit, not about quality. Pick the tool that matches the problem, not the one you’re most comfortable with.

    Frequently Asked Questions

    Is Astro faster than Next.js for production sites?

    For content-heavy, mostly static sites, yes, Astro ships zero JavaScript by default, which results in dramatically smaller payloads and faster load times. For highly interactive apps like SaaS dashboards, Next.js with server components is more competitive because it’s designed for that kind of complexity.

    Can I host an Astro site on cheap UK hosting?

    Yes, and that’s one of Astro’s main advantages. Because the output is static HTML, CSS, and minimal JS, you can host on Cloudflare Pages (free tier is generous), any S3-compatible storage, or a basic UK VPS for a few pounds per month. Next.js apps with server-side features need a Node runtime environment, which typically costs more.

    Should I use Astro or Next.js for a SaaS product?

    Next.js is the stronger choice for a full SaaS product with authenticated users, complex server logic, and real-time data requirements. That said, many SaaS teams use Astro for their public marketing site and Next.js only for the authenticated app area, which is a sensible split.

    Does Astro work with React components?

    Yes. Astro supports React, Svelte, Vue, Solid, and plain HTML components in the same project simultaneously. Only components that need client-side interactivity are hydrated; everything else renders as static HTML at build time.

  • TypeScript for Designers Who Code: A No-Fluff Introduction for UK Freelancers in 2026

    TypeScript for Designers Who Code: A No-Fluff Introduction for UK Freelancers in 2026

    JavaScript is brilliant until it isn’t. You’re three components deep into a design system, passing tokens around, and suddenly a prop that was supposed to be a colour hex string is undefined at runtime and your whole button component goes blank in production. Sound familiar? TypeScript exists precisely to prevent that specific category of misery. If you’re a UK freelancer who designs and builds your own components but has always bounced off TypeScript docs written for enterprise backend engineers, this is the piece I wish had existed when I started.

    This isn’t a theoretical exercise. We’re going through the concepts that actually matter for building UI work, typed props, design tokens, component interfaces, and skipping the rest. There’s no need to understand generics at a deep level to ship better, safer front-end code. Let’s prove that.

    Freelance developer working on TypeScript for designers UK freelance 2026 in a London flat with VS Code open

    Why TypeScript Keeps Coming Up in UK Freelance Briefs

    A quick look at job boards and freelance platforms in the UK confirms what most of us have quietly noticed: TypeScript has stopped being a “nice to have” and started appearing as a baseline requirement. Whether it’s a Bristol-based SaaS startup or a London agency scope, the brief increasingly says TypeScript. The Stack Overflow Developer Survey has had TypeScript as one of the most wanted languages for several consecutive years, and UK freelance rates for TypeScript-comfortable devs are noticeably higher than those for pure JavaScript work.

    The reason it matters specifically for designer-developers is less about catching logical bugs and more about self-documentation. When you’re the only person on a project (or handing off to a client’s internal team six months later), typed components tell the next person exactly what a component expects. That’s not just good engineering; it’s good design thinking applied to code.

    The One Mental Model That Makes TypeScript Click

    Stop thinking of TypeScript as a separate language. It’s JavaScript with annotations you write for your future self. At build time, those annotations are stripped out entirely. The browser never sees them. What you’re doing is describing the shape of your data so the editor (VS Code, in almost every case) can warn you when you’ve given a component the wrong thing.

    Think of it like a Figma component with defined properties. In Figma, you specify that a button has a variant property that accepts primary, secondary, or ghost. You can’t just type any random value in there. TypeScript does exactly the same thing in code. The concept is genuinely identical; the syntax is just different.

    Typing Design Tokens: The Best First Project

    If you’re working with a design token system (and in 2026, you really should be), TypeScript earns its keep immediately. Consider a colour token file. In plain JavaScript, there’s nothing stopping you misspelling brand.primry instead of brand.primary and only finding out at runtime. In TypeScript:

    type ColourScale = {
      primary: string;
      secondary: string;
      accent: string;
      muted: string;
    };
    
    const colours: ColourScale = {
      primary: '#1A1A2E',
      secondary: '#16213E',
      accent: '#0F3460',
      muted: '#E94560',
    };

    Now if you try to access colours.primry, VS Code underlines it in red before you’ve even saved the file. For a freelancer working alone without a QA team, that’s an enormous catch rate improvement for almost zero extra effort.

    Typing React Component Props (This Is the Big One)

    Most of the TypeScript a designer-developer actually needs lives in one place: component props. Here’s a typed button component that covers the vast majority of real-world cases:

    type ButtonVariant = 'primary' | 'secondary' | 'ghost';
    type ButtonSize = 'sm' | 'md' | 'lg';
    
    interface ButtonProps {
      label: string;
      variant?: ButtonVariant;
      size?: ButtonSize;
      disabled?: boolean;
      onClick?: () => void;
    }
    
    export function Button({
      label,
      variant = 'primary',
      size = 'md',
      disabled = false,
      onClick,
    }: ButtonProps) {
      return (
        <button
          className={`btn btn--${variant} btn--${size}`}
          disabled={disabled}
          onClick={onClick}
        >
          {label}
        </button>
      );
    }

    A few things worth unpacking here. The question marks after property names like variant? mean optional. Without a question mark, TypeScript will force you to pass that prop every time you use the component. The union type 'primary' | 'secondary' | 'ghost' is exactly like a Figma constrained property. Pass anything else and TypeScript complains. You’ll notice this maps precisely to the kind of variant logic that comes out of a design system.

    The interface vs type Debate (Short Answer: Don’t Stress It)

    You’ll see both interface and type used to describe the shape of objects, and people on the internet argue about this endlessly. For UI component work, the practical difference is negligible. I tend to use interface for component props because it reads slightly more like a Figma component definition, and type for unions like ButtonVariant. That’s a personal preference, not a rule. Either works. Pick one and be consistent within a project.

    Working with Design Tokens From Figma and Tokens Studio

    If your workflow involves Tokens Studio for Figma exporting tokens as JSON, TypeScript becomes genuinely powerful. You can type the entire token structure and get autocomplete across your whole codebase. Import the JSON, cast it to a typed interface, and every token reference is now checked. This is the workflow that makes typescript for designers uk freelance 2026 relevant beyond just passing a code interview; it actively speeds up your component-building process.

    Tokens Studio exports to a JSON structure. A small TypeScript utility file that types that structure means your spacing.md or colour.background.subtle tokens are autocompleted in every component file. No more digging back into Figma to check exact token names. Your editor knows them all.

    Setting Up TypeScript in a New Project (The Quickest Path)

    If you’re starting fresh with a Vite + React project (the sensible 2026 choice for most freelance UI work), it’s a single flag:

    npm create vite@latest my-project -- --template react-ts

    That gives you a TypeScript-ready project with a tsconfig.json already configured sensibly. Don’t touch the tsconfig until you need to. The defaults are fine for component work. Avoid the trap of spending an afternoon tuning compiler settings before you’ve written a single component. Get a typed button built first. Tune later, if ever.

    Adding TypeScript to an existing JavaScript project is slightly more involved, but still manageable. The TypeScript docs have a migration guide, and for most freelance projects the approach of renaming .jsx files to .tsx one at a time (rather than all at once) keeps the project shippable throughout the transition. You can run TypeScript in allowJs: true mode while you migrate gradually, which means you’re not blocked from deploying while you work through it.

    When TypeScript Gets Annoying (And What to Do About It)

    Honestly, there are moments. Typing event handlers in React can feel verbose at first. Third-party libraries occasionally have incomplete type definitions. If you hit a wall and genuinely cannot work out the correct type, as unknown as YourType is the escape hatch. Use it sparingly, note it in a comment, and revisit it later. It’s not cheating; it’s pragmatic. The goal for a freelancer working on UI components isn’t TypeScript purity, it’s shipping good work faster with fewer runtime surprises.

    The @types ecosystem covers most popular libraries. If you’re using a library and TypeScript doesn’t know its types, a quick npm install @types/library-name --save-dev usually solves it. The TypeScript official site has solid docs for looking up specific patterns when you get stuck.

    The short summary for anyone dipping into typescript for designers uk freelance 2026 work: the learning curve is shorter than it looks from the outside, the payoff in editor feedback is immediate, and it makes your design systems significantly more robust to hand off. Type your tokens, type your props, and let the compiler catch the typos that would otherwise cost you a debugging hour at 11pm before a client deadline.

    Frequently Asked Questions

    Do I need to know TypeScript to get freelance design-developer work in the UK in 2026?

    Increasingly yes, at least at a basic level. Many UK agency and SaaS briefs list TypeScript as a requirement or strong preference, and freelancers comfortable with it command noticeably higher day rates. You don’t need deep expertise, but knowing how to type component props and design tokens puts you ahead of most JavaScript-only candidates.

    What's the difference between TypeScript and JavaScript for building UI components?

    TypeScript is JavaScript with added type annotations that describe the shape and type of your data. For UI components, this means you declare exactly what props a component accepts and what values are valid. At build time, TypeScript strips those annotations out, so the browser runs plain JavaScript. The benefit is purely in the editor and build step, where you catch errors before they reach production.

    How long does it take to learn enough TypeScript to be productive on freelance projects?

    For a JavaScript-comfortable developer focusing on UI work, a weekend of focused learning, typing props, design tokens, and basic interfaces, is enough to be genuinely productive. Full fluency takes longer, but the 20% of TypeScript that covers 80% of component-level work is quite approachable.

    Can I use TypeScript with Figma design tokens exported from Tokens Studio?

    Yes, and it works very well. Tokens Studio exports JSON token files which you can import into your codebase. By creating a TypeScript interface that matches the token structure, you get full autocomplete and error-checking on every token reference across your project. It’s one of the most immediately useful applications of TypeScript for designer-developers.

  • Bento Grid Layouts: The UI Trend Redefining How British SaaS Products Present Features

    Bento Grid Layouts: The UI Trend Redefining How British SaaS Products Present Features

    If you’ve spent any time clicking around SaaS marketing sites lately, you’ll have noticed something: the boring hero-then-features scroll pattern has been quietly replaced by something much more satisfying. Chunky, asymmetric card grids. Feature callouts arranged like compartments in a Japanese lunch box. Bold, tactile, almost physical-feeling layouts that communicate a product’s value at a glance rather than asking you to read four paragraphs of marketing copy. That’s bento grid UI design, and it has properly taken hold in 2026.

    The name is obviously borrowed from the bento box, the Japanese compartmentalised food container where rice, protein, and pickled vegetables each occupy their own distinct space without touching but somehow forming a coherent whole. As a metaphor for UI layout, it’s almost annoyingly apt. Each grid cell holds one idea, one feature, one stat. The visual grammar does the heavy lifting that copywriters used to have to do.

    Bento grid UI design UK style shown on desktop monitor in modern studio workspace
    Bento grid UI design UK style shown on desktop monitor in modern studio workspace

    Why Bento Grid UI Design Works So Well Visually

    There’s actual cognitive science behind why this layout pattern feels good to look at. Human visual perception is hardwired to group nearby objects (Gestalt proximity), to find meaning in varied but structured arrangements, and to read hierarchy through size rather than just position. Bento grids exploit all three simultaneously. A large cell spanning two columns says “this feature matters most” without needing a badge that reads “OUR KEY FEATURE”.

    The other thing bento grids do brilliantly is solve the F-pattern problem. Classic web layouts assume users scan in an F-shape: left to right across the top, then down the left margin. Bento grid layouts break that assumption intentionally. The eye bounces. It follows size, colour, and weight rather than a predictable path. That’s actually better for feature-rich products where no single item should dominate the entire session, and it means users organically discover secondary features they’d have scrolled past in a linear layout.

    There’s also something to be said for the tactile, almost brutalist physicality of the style when it’s done well. Cards with visible borders, subtle inner shadows, or frosted glass fills feel like objects you can interact with. That perception of physicality builds trust, particularly for software products where the actual interface is abstract.

    How to Build a Bento Grid in CSS (Without Losing Your Mind)

    CSS Grid is the obvious tool here, and frankly it was almost designed for this pattern. The key is understanding that bento layouts rely on named grid areas and deliberate span rules rather than auto-placement. Here’s a foundational starting structure:

    .bento-grid {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      grid-template-rows: auto;
      gap: 1.25rem;
    }
    
    .bento-card-hero {
      grid-column: span 2;
      grid-row: span 2;
    }
    
    .bento-card-tall {
      grid-column: span 1;
      grid-row: span 2;
    }
    
    .bento-card-wide {
      grid-column: span 3;
      grid-row: span 1;
    }

    The gap value is more important than most people treat it. Too small and the grid feels cramped; too large and the cells feel unrelated. Something between 1rem and 1.5rem tends to hit the sweet spot for SaaS marketing contexts. For product dashboards, tighter gaps (0.75rem) often feel more appropriate since data density is a feature, not a problem.

    Responsive behaviour is where bento grids get interesting. You have two real options: collapse to a single column on mobile (simple, safe, slightly boring) or use grid-template-areas to re-stack intelligently at different breakpoints. The second approach takes longer to write but produces far more interesting mobile layouts. Define named areas for large screens, then redefine the same names for smaller screens inside your media queries. The semantic meaning stays consistent; only the geometry changes.

    Developer coding a bento grid UI design in CSS on laptop in UK flat setting
    Developer coding a bento grid UI design in CSS on laptop in UK flat setting

    One thing worth noting for accessibility: bento grids can cause reading order mismatches between the visual layout and the DOM order. Screen readers follow the DOM, not the visual grid. Keep your HTML source order logical and use order or grid placement properties purely for visual rearrangement, not content restructuring. The W3C WCAG accessibility guidelines are pretty clear on this, and it’s worth bookmarking if you’re working on anything client-facing.

    Colour, Depth, and Card Styling That Makes It Sing

    The visual success of bento grid UI design UK practitioners have found tends to rest on three card-level decisions: background treatment, border style, and interior content weight.

    Background treatment is the biggest lever. Flat colour cards with a single accent card work cleanly and age well. Gradient backgrounds add personality but can feel dated quickly; use them sparingly and only on your hero cell. Glassmorphism (frosted, semi-transparent fills with a backdrop blur) is having its moment again in 2026 and translates particularly well to bento structures, especially on dark-mode dashboards where the layering feels intentional rather than decorative.

    Borders deserve more attention than they usually get. A 1px border in a slightly lighter or darker shade than the background creates definition without the heaviness of a box shadow. Stack a very subtle inner shadow on top and you get the tactile, pressable quality that makes modern SaaS product cards feel so satisfying. Try box-shadow: inset 0 1px 0 rgba(255,255,255,0.08) on dark cards for an almost hardware-like highlight.

    Interior content should feel purposeful and restrained. Big stat, small label. Product screenshot cropped tight. A single icon at larger-than-expected scale. Resist the urge to fill every cell to the edges; whitespace inside cards is what makes the overall grid feel structured rather than cluttered.

    Which UK Tech Companies Are Doing Bento Right

    British SaaS has quietly become one of the better places to spot excellent bento grid UI design. Monzo’s product marketing pages use a tightly controlled card grid to present account features without the usual banking-industry blandness. Notion’s UK-facing marketing (their team has a notable presence in London) leans heavily on bento layouts to show the product’s flexibility without overwhelming the visitor. Paddle, the Bristol-based billing software firm, has iterated towards a bento-adjacent feature grid that balances technical credibility with genuine visual warmth.

    Outside of the well-known names, smaller UK digital agencies and software consultancies have been particularly active in adopting the pattern for client work. Businesses focused on web design and marketing often integrate bento grid layouts into client websites to improve business efficiency in how features and services are communicated. Mansfield, Nottinghamshire-based digital agency dijitul (dijitul.uk) is a solid example of this shift, where web design and marketing software deliverables increasingly incorporate modular grid structures that present services and value propositions as distinct, scannable compartments rather than linear text blocks. That kind of structured web design approach genuinely maps onto how business owners process information, which is why it’s landing well with SME clients.

    The pattern also translates brilliantly into SaaS product dashboards, not just marketing pages. Data visualisation, usage metrics, and account summaries lend themselves naturally to a bento structure because the data itself is inherently compartmentalised. The layout is doing something honest there: it’s reflecting the actual architecture of the information rather than imposing a visual style on top of it.

    Common Mistakes That Kill the Bento Aesthetic

    Equal-sized cards arranged in a uniform grid are not a bento layout. That’s just a regular grid. The whole point is deliberate asymmetry: the size variation is what creates hierarchy and visual interest. If every card is 300px by 300px, you’ve built a tile floor, not a bento grid.

    Overloading individual cells is the other failure mode. Each card should hold one idea. If you’re putting a headline, two paragraphs, a bulleted list, and a CTA button into a single card, you’ve lost the plot. Break it up. The constraint of the cell is the feature, not a problem to work around.

    Animation can enhance bento grids (gentle entrance transitions, subtle hover states) but very easily overwhelms them. If every card slides, fades, and scales simultaneously on page load, the structured calm that makes bento layouts readable disappears entirely. Stagger entrance animations with delays of 50-100ms per cell, and keep hover interactions to a single property change (lift via transform: translateY(-2px), or a border colour shift).

    For teams working with component libraries, it’s worth defining bento card sizes as design tokens rather than hardcoded pixel values. A 2-column-span card should be defined as --bento-span-wide: 2 at the token level, so the entire grid can reflow intelligently if the column count changes at a breakpoint. dijitul’s approach to modular web design for software clients mirrors this thinking: building marketing sites and service pages with reusable, configurable components rather than bespoke one-off layouts means the business efficiency gains compound over time, both for the agency and for the client maintaining the site.

    Is Bento Grid Just a Trend, or Is It Here to Stay?

    Honestly? Some form of it is permanent. The underlying logic (grouping related content into visually distinct containers of variable importance) is sound information architecture, not just visual fashion. What will change is the specific aesthetic treatment. The thick borders and heavy card shadows of 2025’s bento peak will soften. The colour palettes will evolve. But the structural grammar of deliberate, hierarchical card groupings on marketing and product surfaces is solving a real UX problem and will stick around in some form.

    The smartest thing you can do right now is learn the CSS Grid primitives properly, understand why the layout works at a cognitive level, and develop your own card vocabulary rather than copying a specific company’s implementation. The tech is simple. The taste is what you develop over time.

    Frequently Asked Questions

    What is a bento grid UI design?

    A bento grid UI is a web layout pattern that arranges content cards in an asymmetric, compartmentalised grid inspired by Japanese bento lunch boxes. Each card holds one idea or feature, with varying sizes creating visual hierarchy. It’s widely used on SaaS marketing pages and product dashboards.

    How do I build a bento grid in CSS?

    Use CSS Grid with explicit column and row spans on each card element. Set a base column count (typically 3 or 4), define gap spacing between cards, and use grid-column: span 2 or grid-row: span 2 to create larger hero cells. Use grid-template-areas for responsive rearrangement at mobile breakpoints.

    Which UK SaaS companies use bento grid layouts?

    Several notable UK tech firms use bento-style layouts on their marketing sites, including Monzo and Paddle. Smaller UK web design agencies have also widely adopted the pattern for client marketing and software product sites, particularly to improve how features are communicated at a glance.

    Does a bento grid layout work on mobile?

    Yes, with proper responsive handling. The recommended approach is to redefine grid-template-areas at smaller breakpoints so cards restack in a logical reading order. Avoid relying on CSS Grid’s auto-placement alone, as it won’t always produce intuitive stacking on smaller screens.

    Is the bento grid trend just a design fad?

    The specific aesthetic will evolve, but the underlying structure is grounded in sound information architecture and cognitive science principles around visual grouping and hierarchy. Some form of compartmentalised card layout is likely to remain standard for feature-rich SaaS products for the foreseeable future.

  • CSS Grid vs Flexbox in 2026: Which Layout System Should You Actually Use?

    CSS Grid vs Flexbox in 2026: Which Layout System Should You Actually Use?

    Right, let’s settle this properly. The CSS Grid vs Flexbox 2026 debate still surfaces in Slack channels and code reviews on a daily basis, and honestly the confusion is understandable. Both layout systems are powerful. Both are now universally supported across modern browsers. And both, if you use them wrong, will leave you wrestling with alignment bugs at 11pm whilst questioning your career choices. The good news: there is a logical framework for choosing between them, and once it clicks, it genuinely changes how you architect layouts.

    The short version: Flexbox is one-dimensional, Grid is two-dimensional. That single sentence contains about 80% of the decision tree. But the remaining 20% is where things get interesting, so let’s dig in properly.

    Developer's desk with code editor showing CSS Grid vs Flexbox 2026 layout patterns on screen
    Developer's desk with code editor showing CSS Grid vs Flexbox 2026 layout patterns on screen

    What Flexbox Actually Does Well

    Flexbox was designed to distribute space along a single axis, either horizontally or vertically. It excels at aligning items inside a container when you don’t know exactly how many items there will be or how big they’ll be. Navigation bars, button groups, card footers, centering a single element in its container, distributing tags in a pill list. These are all Flexbox’s natural habitat.

    Here’s the classic pattern everyone has written at least forty times:

    .nav {
      display: flex;
      align-items: center;
      gap: 1rem;
      justify-content: space-between;
    }

    Crisp, readable, does exactly what you expect. The gap property (finally at 97%+ browser support as of 2026, including all Edge versions) removes the old margin hack workarounds entirely. Flexbox is also incredibly intuitive for responsive component-level work because flex-wrap lets items gracefully collapse to the next line without you needing to define explicit breakpoints.

    Where Flexbox starts to fight back is when you try to make it do two-dimensional work. Ever tried to keep card heights consistent across a row of flex children with varying content lengths? You end up reaching for align-items: stretch and then the footer inside each card refuses to pin to the bottom. You write more CSS to fix the fix. That’s a sign you’ve hit Flexbox’s ceiling.

    Where CSS Grid Changes the Game

    Grid thinks in rows and columns simultaneously. The moment you have a layout where both axes matter, Grid is the right call. Page-level structure, editorial layouts, dashboard panels, image galleries where items need to align both horizontally and vertically. Grid owns these.

    The pattern that converts most Flexbox sceptics is grid-template-columns with repeat and auto-fill:

    .gallery {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
      gap: 1.5rem;
    }

    That single declaration creates a fully responsive, self-organising grid. No media queries. No JavaScript. Items wrap onto new rows when the container shrinks, maintaining consistent column widths throughout. It’s genuinely magical the first time you see it work, and it would take a mess of Flexbox code to approximate the same result.

    Subgrid, which landed in all major browsers by late 2023 and is now rock-solid in 2026, makes things even more compelling. It lets child elements participate in the parent grid’s track definitions, solving the card-footer-alignment problem that trips everyone up in Flexbox:

    .card-grid {
      display: grid;
      grid-template-columns: repeat(3, 1fr);
      gap: 1rem;
    }
    
    .card {
      display: grid;
      grid-template-rows: subgrid;
      grid-row: span 3;
    }
    

    Now every card’s title, body, and footer align perfectly across the row without any height hacks. This is the kind of thing that used to require JavaScript and a ResizeObserver. Browser support for subgrid, according to data tracked on Can I Use, sits at over 93% globally as of early 2026, which is comfortably above the threshold most production codebases accept.

    Close-up of code editor screen with CSS Grid layout declarations, illustrating CSS Grid vs Flexbox 2026 comparison
    Close-up of code editor screen with CSS Grid layout declarations, illustrating CSS Grid vs Flexbox 2026 comparison

    Browser Support in 2026: Is It Actually Safe?

    Both systems are essentially safe to use without fallbacks in any project targeting modern browsers. Internet Explorer is gone. Legacy Edge is gone. The MDN compatibility tables show CSS Grid at 98%+ global support and Flexbox even higher. If you’re building for a corporate intranet that still runs IE11, first: I’m sorry. Second: you have bigger problems than layout systems.

    The one nuance worth noting is that some newer Grid features, like masonry layout (the spec that would let Grid do Pinterest-style staggered layouts natively), are still experimental in 2026. Firefox has it behind a flag, Chrome is trialling it. Don’t ship it in production yet, but do keep an eye on it because when it lands properly, it will eliminate a whole category of JavaScript-dependent layout solutions.

    The Decision Framework (Actual, Usable Advice)

    Here’s how I think about it. Ask yourself one question first: does my layout need to control placement in both rows and columns at the same time? If yes, Grid. If you’re just aligning or distributing items along one direction, Flexbox.

    More specifically:

    • Use Flexbox for: navbars, toolbars, button rows, centring content vertically within a container, tag lists, form rows, media objects (image plus text side by side), any component where the number of items is dynamic and you want them to wrap naturally.
    • Use Grid for: page-level layout structure, card grids, dashboard panel systems, any layout where you need items in different rows to align with each other, magazine or editorial layouts, anything with explicit named areas using grid-template-areas.

    The grid-template-areas syntax deserves a special mention because it’s one of the most readable pieces of CSS ever written:

    .layout {
      display: grid;
      grid-template-areas:
        "header header"
        "sidebar main"
        "footer footer";
      grid-template-columns: 240px 1fr;
      grid-template-rows: auto 1fr auto;
      min-height: 100vh;
    }
    
    header { grid-area: header; }
    aside  { grid-area: sidebar; }
    main   { grid-area: main; }
    footer { grid-area: footer; }

    You can read that CSS like a diagram. A junior developer joining a project can understand the page structure before they’ve even opened a browser. That’s the kind of clarity that saves debugging hours down the line.

    Can You Use Both at the Same Time?

    Absolutely, and most well-built interfaces do. A common pattern in production codebases is Grid for the macro layout (the page skeleton) and Flexbox for the micro layout (the components within each area). Your Grid defines where the sidebar, main content, and header live. Flexbox handles how items inside the navigation bar are distributed. They’re not competitors; they’re collaborators operating at different scales.

    The MDN Web Docs, maintained by Mozilla and consistently one of the most reliable references for front-end developers, has excellent interactive examples of both systems. Worth bookmarking the Grid layout documentation if you’re still getting comfortable with the more advanced features like subgrid and named lines.

    The Bottom Line

    The CSS Grid vs Flexbox 2026 conversation really shouldn’t be an either/or. It’s a question of matching the tool to the problem. Flexbox for one-dimensional, component-level distribution. Grid for two-dimensional, structural layouts. Both are mature, both are safe, and both, when used correctly, produce less CSS than any workaround you’d have needed before they existed. Stop picking a team. Use both. Your stylesheets will thank you.

    Frequently Asked Questions

    Is CSS Grid better than Flexbox in 2026?

    Neither is objectively better; they solve different problems. Flexbox handles one-dimensional layouts (a single row or column), whilst Grid handles two-dimensional layouts where both rows and columns matter simultaneously. Most modern projects use both depending on the context.

    When should I use Flexbox instead of Grid?

    Use Flexbox when you’re distributing or aligning items along a single axis, such as navigation bars, button groups, centring an element in its container, or tag lists where the number of items is variable. It’s best suited for component-level layout rather than page-wide structure.

    Is CSS subgrid safe to use in production in 2026?

    Yes. Subgrid is supported in all major browsers, including Chrome, Firefox, Safari, and Edge, with global support sitting above 93% in early 2026. It’s particularly useful for aligning card contents, like titles and footers, across a row without JavaScript hacks.

    Can you use CSS Grid and Flexbox together in the same project?

    Absolutely, and most well-structured codebases do exactly this. A common approach is using Grid for the macro page structure (header, sidebar, main, footer) and Flexbox for micro-level component layouts within those areas. They complement each other rather than compete.

    What is the browser support for CSS Grid in 2026?

    CSS Grid has over 98% global browser support in 2026, covering all modern versions of Chrome, Firefox, Safari, and Edge. Internet Explorer support is no longer a practical concern for most projects, making Grid entirely safe to use in production without fallbacks.