Category: Coding

  • 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.

  • Reactive SVGs: How to Build Illustrations That Respond to Data Using D3 and UK Open Datasets

    Reactive SVGs: How to Build Illustrations That Respond to Data Using D3 and UK Open Datasets

    Raw data is boring. A spreadsheet of ONS broadband penetration figures or Ofcom spectrum usage statistics is about as gripping as a council planning notice. But bind those same numbers to a living, breathing SVG illustration and suddenly you have something people actually want to look at. That is the promise of reactive SVG data visualisation, and D3.js is the library that makes it properly possible without reaching for a bloated charting framework that hides all the interesting bits from you.

    This article is a hands-on walkthrough. We are going to fetch real UK open data, parse it, and use D3 to bind it to SVG elements so the visuals respond dynamically to the figures. No toy datasets. No made-up numbers. Real data from sources the UK government and regulators actually publish.

    Developer building a reactive SVG data visualisation UK project on a large monitor in a modern studio
    Developer building a reactive SVG data visualisation UK project on a large monitor in a modern studio

    Why SVG and D3 Instead of Canvas or a Chart Library?

    Canvas is fast for pixel-heavy rendering. Chart libraries like Chart.js are quick to deploy. But neither gives you the fine-grained control that reactive SVG data visualisation demands when you want illustrations, not just bar charts. SVG is part of the DOM, which means every shape, path, and text node is queryable, styleable, and animatable with CSS. D3 exploits this completely.

    The data join pattern at D3’s core (enter, update, exit) is genuinely elegant once it clicks. You tell D3 what data you have, what DOM elements should represent it, and what to do when data changes. The library handles the rest. It is declarative in the right places and imperative where you need control. I have used it on projects ranging from tiny inline sparklines to full-screen choropleth maps, and I keep coming back because nothing else gives you the same ceiling.

    Getting Your UK Open Data: ONS and Ofcom

    The Office for National Statistics publishes machine-readable datasets through its ONS API, which returns JSON in a fairly navigable structure. Ofcom releases its Connected Nations datasets as downloadable CSVs covering broadband coverage by local authority district. Both are genuinely free, regularly updated, and ideal for a reactive SVG project.

    For this walkthrough we are using Ofcom’s Connected Nations data: specifically, the percentage of premises with access to gigabit-capable broadband by UK nation and region. It is a flat CSV, which means we can use D3’s built-in d3.csv() loader and avoid writing a custom parser.

    import * as d3 from "https://cdn.jsdelivr.net/npm/d3@7/+esm";
    
    const DATA_URL = "https://your-hosted-copy/ofcom-connected-nations.csv";
    
    d3.csv(DATA_URL, d => ({
      region: d["Region"],
      gigabit_pct: +d["Gigabit capable (%)"],
      premises: +d["Total premises"]
    })).then(data => {
      render(data);
    });

    Note the + coercion on the numeric fields. D3’s CSV parser returns strings by default. Skip that coercion and your scales will treat “84” as text, which produces spectacularly wrong output. Ask me how I know.

    Building the SVG Container and Scales

    The margin convention in D3 is worth following even when it feels ceremonial. It keeps your axes and labels inside the viewport without wrestling with overflow: visible hacks later.

    const margin = { top: 40, right: 30, bottom: 60, left: 120 };
    const width = 800 - margin.left - margin.right;
    const height = 500 - margin.top - margin.bottom;
    
    const svg = d3.select("#chart")
      .append("svg")
      .attr("viewBox", `0 0 ${width + margin.left + margin.right} ${height + margin.top + margin.bottom}`)
      .attr("preserveAspectRatio", "xMidYMid meet")
      .append("g")
      .attr("transform", `translate(${margin.left},${margin.top})`);

    Using viewBox instead of hard-coded pixel dimensions is non-negotiable if you want the illustration to be responsive. The SVG scales itself to the container, and your D3 coordinates stay consistent regardless of screen size. This is how reactive SVG data visualisation actually becomes reactive to viewport changes as well as data changes.

    Close-up of D3.js code powering a reactive SVG data visualisation UK broadband chart on a laptop screen
    Close-up of D3.js code powering a reactive SVG data visualisation UK broadband chart on a laptop screen

    Now the scales. For a horizontal bar chart of regional broadband coverage:

    const x = d3.scaleLinear()
      .domain([0, 100])
      .range([0, width]);
    
    const y = d3.scaleBand()
      .domain(data.map(d => d.region))
      .range([0, height])
      .padding(0.3);

    scaleBand handles the spacing maths for categorical axes so you do not have to. The padding value of 0.3 adds 30% whitespace between bands, which visually separates the bars without making them hair-thin.

    The D3 Data Join: Where the Reactive Magic Happens

    This is the part that confuses people initially and then becomes the thing they explain excitedly to colleagues. The data join binds an array of data objects to a selection of DOM elements. Elements that do not yet exist go into the enter selection. Elements whose data has disappeared go into the exit selection. Everything in between is the update selection.

    const bars = svg.selectAll("rect.bar")
      .data(data, d => d.region); // key function keeps transitions smooth
    
    // Enter: create new bars
    bars.enter()
      .append("rect")
      .attr("class", "bar")
      .attr("y", d => y(d.region))
      .attr("height", y.bandwidth())
      .attr("x", 0)
      .attr("width", 0) // start at zero for transition
      .attr("fill", "#4F46E5")
      .merge(bars) // merge with update selection
      .transition()
      .duration(800)
      .ease(d3.easeCubicOut)
      .attr("width", d => x(d.gigabit_pct));
    
    // Exit: remove stale bars
    bars.exit()
      .transition()
      .duration(400)
      .attr("width", 0)
      .remove();

    The key function in .data(data, d => d.region) is critical for smooth transitions. Without it, D3 matches data to elements by index. With it, elements are bound by region name, so if you filter or reorder the dataset the bars animate to their new positions rather than snapping jarringly.

    Making It Genuinely Reactive: Filtering and UI Controls

    The real payoff of reactive SVG data visualisation comes when you wire up UI controls that change the underlying data and re-call the render function. Add a simple dropdown that filters by UK nation:

    const nations = ["All", "England", "Scotland", "Wales", "Northern Ireland"];
    
    const select = d3.select("#controls")
      .append("select")
      .on("change", function() {
        const selected = this.value;
        const filtered = selected === "All"
          ? fullData
          : fullData.filter(d => d.nation === selected);
        render(filtered);
      });
    
    select.selectAll("option")
      .data(nations)
      .enter()
      .append("option")
      .text(d => d);

    Each time the user changes the dropdown, render(filtered) runs with a new data array. D3 works out which bars need to be added, which need updating, and which need removing. You do not manually manipulate the DOM. That is the whole point.

    Going Beyond Bar Charts: Binding Data to Illustrated SVG Paths

    Bar charts are fine, but the really interesting territory is binding data to custom SVG illustrations, like a stylised map of the UK’s twelve regions, or an illustrated diagram of network infrastructure where path stroke-width encodes bandwidth figures.

    The principle is identical. Load an SVG file (exported from Figma or Illustrator), inline it in your HTML, then use D3 to select specific paths by their id or data-region attributes and drive their visual properties from data. Colour fills from a sequential scale, opacity driven by coverage percentage, stroke animations that pulse for regions below a threshold: all of it is just attribute binding.

    const colour = d3.scaleSequential()
      .domain([0, 100])
      .interpolator(d3.interpolateBlues);
    
    data.forEach(d => {
      d3.select(`#region-${d.region.replace(/\s+/g, "-").toLowerCase()}`)
        .transition()
        .duration(600)
        .attr("fill", colour(d.gigabit_pct));
    });

    This approach turns a static SVG illustration into a living data artefact. Your designer exports a clean regional map from Figma. Your D3 code breathes data into it. The two disciplines talk to each other through attribute naming conventions agreed upfront. It is the kind of collaboration between design and dev that produces genuinely impressive output.

    Performance and Accessibility Notes

    A few things worth pinning to your monitor. First, ARIA labels. SVG is not inherently accessible. Add role="img" and aria-label to your SVG container, and use <title> and <desc> elements inside individual groups for screen readers. The Web Accessibility Initiative has clear guidance on SVG accessibility patterns.

    Second, transitions look great but they are not free. If you are rendering several hundred elements, consider using d3.transition() with a shared timer rather than individual transitions, and cap your dataset size where the visual encoding stops being legible anyway. A choropleth with 400 regions is just noise.

    Third, host your open data files yourself or proxy them. Fetching directly from government data portals in production is fragile; file structures change, URLs break, and there is no SLA. Pull the data into your own infrastructure on a schedule and serve it from there.

    The Bottom Line on D3 and Open Data

    Reactive SVG data visualisation using UK open datasets is one of those projects that teaches you an enormous amount in a short time. You learn D3’s join model. You learn how SVG coordinate systems actually work. You learn that ONS data is more useful than most developers realise. And you produce something genuinely worth showing in a portfolio, because it combines real public information with craft-level visual thinking. That combination is rare, and it shows.

    The Ofcom and ONS datasets are updated regularly, which means a project you build this month stays relevant as new figures land. Wire it up to a scheduled data fetch, add a timestamp to your visualisation, and you have something that essentially maintains itself.

    Frequently Asked Questions

    What is reactive SVG data visualisation and how does it differ from a static chart?

    Reactive SVG data visualisation means your SVG elements update dynamically when the underlying data changes, using a library like D3.js to bind data to DOM attributes in real time. A static chart is a fixed image or pre-rendered output; a reactive one responds to user input, data filters, or live data feeds without a page reload.

    Where can I download free UK open datasets to use with D3.js?

    The Office for National Statistics (ons.gov.uk) and Ofcom both publish machine-readable open datasets covering topics from broadband coverage to regional demographics. The ONS also provides a developer API that returns JSON, and Ofcom’s Connected Nations data is available as downloadable CSV files updated annually.

    Do I need to know D3.js well to build reactive SVG illustrations, or can beginners start here?

    D3’s data join pattern has a learning curve, so some JavaScript confidence is recommended before diving in. That said, the enter/update/exit model is well-documented and once it clicks, building reactive SVG visualisations becomes much more intuitive. Starting with a simple bar chart bound to a CSV is the fastest path to understanding it properly.

    Can I import an SVG illustration from Figma and bind data to it using D3?

    Yes, and this is one of the most powerful workflows available. Export your SVG from Figma, inline it in your HTML, and give key paths meaningful IDs or data attributes. D3 can then select those paths and drive their fill, opacity, stroke, or transform properties directly from your dataset.

    How do I make D3 SVG visualisations accessible for screen readers?

    Add role=”img” and an aria-label to the SVG container, and include a element as the first child of the SVG for a short description. For more complex visuals, a <desc> element and aria-describedby attribute provide additional context. Avoid encoding critical information solely through colour, and ensure interactive elements are keyboard-navigable.</p> <p><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "What is reactive SVG data visualisation and how does it differ from a static chart?", "acceptedAnswer": { "@type": "Answer", "text": "Reactive SVG data visualisation means your SVG elements update dynamically when the underlying data changes, using a library like D3.js to bind data to DOM attributes in real time. A static chart is a fixed image or pre-rendered output; a reactive one responds to user input, data filters, or live data feeds without a page reload." } }, { "@type": "Question", "name": "Where can I download free UK open datasets to use with D3.js?", "acceptedAnswer": { "@type": "Answer", "text": "The Office for National Statistics (ons.gov.uk) and Ofcom both publish machine-readable open datasets covering topics from broadband coverage to regional demographics. The ONS also provides a developer API that returns JSON, and Ofcom's Connected Nations data is available as downloadable CSV files updated annually." } }, { "@type": "Question", "name": "Do I need to know D3.js well to build reactive SVG illustrations, or can beginners start here?", "acceptedAnswer": { "@type": "Answer", "text": "D3's data join pattern has a learning curve, so some JavaScript confidence is recommended before diving in. That said, the enter/update/exit model is well-documented and once it clicks, building reactive SVG visualisations becomes much more intuitive. Starting with a simple bar chart bound to a CSV is the fastest path to understanding it properly." } }, { "@type": "Question", "name": "Can I import an SVG illustration from Figma and bind data to it using D3?", "acceptedAnswer": { "@type": "Answer", "text": "Yes, and this is one of the most powerful workflows available. Export your SVG from Figma, inline it in your HTML, and give key paths meaningful IDs or data attributes. D3 can then select those paths and drive their fill, opacity, stroke, or transform properties directly from your dataset." } }, { "@type": "Question", "name": "How do I make D3 SVG visualisations accessible for screen readers?", "acceptedAnswer": { "@type": "Answer", "text": "Add role=\"img\" and an aria-label to the SVG container, and include a element as the first child of the SVG for a short description. For more complex visuals, a element and aria-describedby attribute provide additional context. Avoid encoding critical information solely through colour, and ensure interactive elements are keyboard-navigable." } } ] } </script></p> </div> <div style="margin-top:var(--wp--preset--spacing--40)" class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/reactive-svg-data-visualisation-uk-d3-open-data/"><time datetime="2026-07-23T21:03:20+00:00">July 23, 2026</time></a></div></div> </li><li class="wp-block-post post-195 post type-post status-publish format-standard has-post-thumbnail hentry category-coding category-web-design tag-css-grid-guide tag-css-grid-vs-flexbox-2026 tag-css-layout-systems tag-flexbox-tutorial tag-front-end-development"> <div class="wp-block-group alignfull is-layout-flow wp-block-group-is-layout-flow" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><figure style="aspect-ratio:3/2" class="wp-block-post-featured-image"><a href="https://launchpad-design.co.uk/css-grid-vs-flexbox-2026/" target="_self" ><img width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/developers-desk-with-code-editor-showing-css-grid-vs-flexbo-1.png" class="attachment-full size-full wp-post-image" alt="CSS Grid vs Flexbox in 2026: Which Layout System Should You Actually Use?" style="width:100%;height:100%;object-fit:cover;" decoding="async" loading="lazy" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/developers-desk-with-code-editor-showing-css-grid-vs-flexbo-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developers-desk-with-code-editor-showing-css-grid-vs-flexbo-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developers-desk-with-code-editor-showing-css-grid-vs-flexbo-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developers-desk-with-code-editor-showing-css-grid-vs-flexbo-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure> <h2 class="wp-block-post-title has-x-large-font-size"><a href="https://launchpad-design.co.uk/css-grid-vs-flexbox-2026/" target="_self" >CSS Grid vs Flexbox in 2026: Which Layout System Should You Actually Use?</a></h2> <div class="entry-content alignfull wp-block-post-content has-medium-font-size is-layout-flow wp-block-post-content-is-layout-flow"><p>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.</p> <p>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.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/developers-desk-with-code-editor-showing-css-grid-vs-flexbo-1.png" alt="Developer's desk with code editor showing CSS Grid vs Flexbox 2026 layout patterns on screen" class="wp-image-193" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/developers-desk-with-code-editor-showing-css-grid-vs-flexbo-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developers-desk-with-code-editor-showing-css-grid-vs-flexbo-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developers-desk-with-code-editor-showing-css-grid-vs-flexbo-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developers-desk-with-code-editor-showing-css-grid-vs-flexbo-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Developer's desk with code editor showing CSS Grid vs Flexbox 2026 layout patterns on screen</figcaption></figure> <h2>What Flexbox Actually Does Well</h2> <p>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.</p> <p>Here’s the classic pattern everyone has written at least forty times:</p> <pre><code>.nav { display: flex; align-items: center; gap: 1rem; justify-content: space-between; }</code></pre> <p>Crisp, readable, does exactly what you expect. The <code>gap</code> 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 <code>flex-wrap</code> lets items gracefully collapse to the next line without you needing to define explicit breakpoints.</p> <p>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 <code>align-items: stretch</code> 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.</p> <h2>Where CSS Grid Changes the Game</h2> <p>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.</p> <p>The pattern that converts most Flexbox sceptics is <code>grid-template-columns</code> with <code>repeat</code> and <code>auto-fill</code>:</p> <pre><code>.gallery { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 1.5rem; }</code></pre> <p>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.</p> <p>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:</p> <pre><code>.card-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; } .card { display: grid; grid-template-rows: subgrid; grid-row: span 3; } </code></pre> <p>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 <a href="https://caniuse.com" rel="noopener noreferrer">Can I Use</a>, sits at over 93% globally as of early 2026, which is comfortably above the threshold most production codebases accept.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/close-up-of-code-editor-screen-with-css-grid-layout-declarat-2.png" alt="Close-up of code editor screen with CSS Grid layout declarations, illustrating CSS Grid vs Flexbox 2026 comparison" class="wp-image-194" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/close-up-of-code-editor-screen-with-css-grid-layout-declarat-2.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/close-up-of-code-editor-screen-with-css-grid-layout-declarat-2-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/close-up-of-code-editor-screen-with-css-grid-layout-declarat-2-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/close-up-of-code-editor-screen-with-css-grid-layout-declarat-2-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Close-up of code editor screen with CSS Grid layout declarations, illustrating CSS Grid vs Flexbox 2026 comparison</figcaption></figure> <h2>Browser Support in 2026: Is It Actually Safe?</h2> <p>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.</p> <p>The one nuance worth noting is that some newer Grid features, like <code>masonry</code> 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.</p> <h2>The Decision Framework (Actual, Usable Advice)</h2> <p>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.</p> <p>More specifically:</p> <ul> <li><strong>Use Flexbox for:</strong> 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.</li> <li><strong>Use Grid for:</strong> 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 <code>grid-template-areas</code>.</li> </ul> <p>The <code>grid-template-areas</code> syntax deserves a special mention because it’s one of the most readable pieces of CSS ever written:</p> <pre><code>.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; }</code></pre> <p>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.</p> <h2>Can You Use Both at the Same Time?</h2> <p>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.</p> <p>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 <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_grid_layout" rel="noopener noreferrer">Grid layout documentation</a> if you’re still getting comfortable with the more advanced features like subgrid and named lines.</p> <h2>The Bottom Line</h2> <p>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.</p> <h2>Frequently Asked Questions</h2> <h3>Is CSS Grid better than Flexbox in 2026?</h3> <p>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.</p> <h3>When should I use Flexbox instead of Grid?</h3> <p>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.</p> <h3>Is CSS subgrid safe to use in production in 2026?</h3> <p>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.</p> <h3>Can you use CSS Grid and Flexbox together in the same project?</h3> <p>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.</p> <h3>What is the browser support for CSS Grid in 2026?</h3> <p>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.</p> <p><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "Is CSS Grid better than Flexbox in 2026?", "acceptedAnswer": { "@type": "Answer", "text": "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." } }, { "@type": "Question", "name": "When should I use Flexbox instead of Grid?", "acceptedAnswer": { "@type": "Answer", "text": "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." } }, { "@type": "Question", "name": "Is CSS subgrid safe to use in production in 2026?", "acceptedAnswer": { "@type": "Answer", "text": "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." } }, { "@type": "Question", "name": "Can you use CSS Grid and Flexbox together in the same project?", "acceptedAnswer": { "@type": "Answer", "text": "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." } }, { "@type": "Question", "name": "What is the browser support for CSS Grid in 2026?", "acceptedAnswer": { "@type": "Answer", "text": "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." } } ] } </script></p> </div> <div style="margin-top:var(--wp--preset--spacing--40)" class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/css-grid-vs-flexbox-2026/"><time datetime="2026-06-30T18:05:11+00:00">June 30, 2026</time></a></div></div> </li><li class="wp-block-post post-189 post type-post status-publish format-standard has-post-thumbnail hentry category-coding category-design category-web-design tag-backdrop-filter-css tag-frosted-glass-css tag-glassmorphism-ui-design tag-ui-design-trends-2026 tag-web-interface-design"> <div class="wp-block-group alignfull is-layout-flow wp-block-group-is-layout-flow" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><figure style="aspect-ratio:3/2" class="wp-block-post-featured-image"><a href="https://launchpad-design.co.uk/glassmorphism-is-back-and-this-time-its-doing-it-right/" target="_self" ><img width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/laptop-screen-showing-glassmorphism-ui-design-with-frosted-g-1.png" class="attachment-full size-full wp-post-image" alt="Glassmorphism Is Back: And This Time It’s Doing It Right" style="width:100%;height:100%;object-fit:cover;" decoding="async" loading="lazy" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/laptop-screen-showing-glassmorphism-ui-design-with-frosted-g-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/laptop-screen-showing-glassmorphism-ui-design-with-frosted-g-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/laptop-screen-showing-glassmorphism-ui-design-with-frosted-g-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/laptop-screen-showing-glassmorphism-ui-design-with-frosted-g-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure> <h2 class="wp-block-post-title has-x-large-font-size"><a href="https://launchpad-design.co.uk/glassmorphism-is-back-and-this-time-its-doing-it-right/" target="_self" >Glassmorphism Is Back: And This Time It’s Doing It Right</a></h2> <div class="entry-content alignfull wp-block-post-content has-medium-font-size is-layout-flow wp-block-post-content-is-layout-flow"><p>Glassmorphism UI design had its moment, crashed out spectacularly, and has now quietly climbed back through the window. If you were doing interface work around 2020 and 2021, you remember the carnage: every Dribbble shot was drowning in blurry, frosted-glass panels stacked on top of gradient backgrounds, looking gorgeous in a static screenshot and completely unreadable in practice. Accessibility advocates had a field day. Developers quietly cried into their CSS. Then it died, as trends do.</p> <p>Except it didn’t die. It evolved. And in 2026, glassmorphism is genuinely useful, not just pretty. The difference between then and now is the difference between using a power tool to show off and using it to actually build something. Let’s get into why it failed, what’s changed, and how to implement it without breaking your interface or your users’ eyesight.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/laptop-screen-showing-glassmorphism-ui-design-with-frosted-g-1.png" alt="Laptop screen showing glassmorphism UI design with frosted glass panels on a gradient background" class="wp-image-187" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/laptop-screen-showing-glassmorphism-ui-design-with-frosted-g-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/laptop-screen-showing-glassmorphism-ui-design-with-frosted-g-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/laptop-screen-showing-glassmorphism-ui-design-with-frosted-g-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/laptop-screen-showing-glassmorphism-ui-design-with-frosted-g-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Laptop screen showing glassmorphism UI design with frosted glass panels on a gradient background</figcaption></figure> <h2>Why Glassmorphism UI Design Fell Apart the First Time</h2> <p>The original wave of glassmorphism had one fatal flaw: it prioritised the aesthetic over the function. The whole appeal is that frosted, translucent layering effect where UI elements feel like they’re floating on frosted glass. Lovely. The problem is that legibility depends entirely on what’s sitting behind that panel, and nobody seemed to care about that in 2020.</p> <p>Text contrast ratios plummeted. WCAG 2.1 requires a minimum contrast ratio of 4.5:1 for normal text, and a huge proportion of glassmorphism implementations were scoring somewhere around 2:1 on a good day. Throw a dynamic background behind it (a moving video, a rotating gradient, user-generated content) and readability became essentially random. You might be fine. You might not. That’s not a design system, that’s a lottery.</p> <p>There was also the performance angle. <code>backdrop-filter: blur()</code> is expensive. On lower-end Android handsets and older MacBooks, layering multiple blurred elements destroyed frame rates. The BBC’s own digital accessibility guidelines, which you can find on <a href="https://www.bbc.co.uk/accessibility/" target="_blank" rel="noopener">bbc.co.uk/accessibility</a>, make very clear that visual presentation must never come at the cost of usability. A lot of glassmorphism implementations in that era simply didn’t hold up.</p> <h2>What’s Actually Different About Glassmorphism in 2026</h2> <p>A few things converged to rehabilitate the aesthetic. First, hardware got better. The average GPU in a mid-range mobile now handles <code>backdrop-filter</code> without flinching, which removes the single biggest performance objection. Second, CSS itself got smarter. The <code>@supports</code> rule means you can serve the glass effect only to browsers that can handle it cleanly, with a solid fallback for everything else. No more leaving older devices with a janky, half-rendered mess.</p> <p>Third, and most importantly, designers got more disciplined. The glassmorphism UI design that’s making a comeback in serious product work is nothing like the Dribbble excess of 2021. It’s used sparingly, on specific UI components like modal dialogs, notification cards, and navigation overlays, rather than as the entire visual language of an interface. Backgrounds are controlled. The blur radius is modest. Text always sits on a surface with enough opacity to guarantee contrast.</p> <p>Apple’s design language has played a significant role here. iOS has used frosted-glass effects in its notification centre and Control Centre for years, and with each iteration the implementation has become more refined. Designers studying those patterns learnt that the glass works when the background context is intentionally designed, not left to chance.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/close-up-of-glassmorphism-ui-design-on-a-smartphone-notifica-2.png" alt="Close-up of glassmorphism UI design on a smartphone notification card with frosted translucent effect" class="wp-image-188" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/close-up-of-glassmorphism-ui-design-on-a-smartphone-notifica-2.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/close-up-of-glassmorphism-ui-design-on-a-smartphone-notifica-2-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/close-up-of-glassmorphism-ui-design-on-a-smartphone-notifica-2-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/close-up-of-glassmorphism-ui-design-on-a-smartphone-notifica-2-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Close-up of glassmorphism UI design on a smartphone notification card with frosted translucent effect</figcaption></figure> <h2>How to Implement Glassmorphism Without Breaking Anything</h2> <p>The core CSS is actually quite simple. The magic trio is <code>background: rgba()</code> with low alpha, <code>backdrop-filter: blur()</code>, and a subtle <code>border</code> with partial transparency. Something like this gets you most of the way there:</p> <pre><code>.glass-card { background: rgba(255, 255, 255, 0.15); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid rgba(255, 255, 255, 0.25); border-radius: 12px; } </code></pre> <p>That’s the skeleton. The craft is in what you do around it. Your background layer needs to be a controlled gradient or a static image, not dynamic content. If the surface behind the glass can change unpredictably, your contrast guarantee evaporates. I’d also recommend capping blur values at around 16px to 20px for performance; anything beyond that is rarely perceptible to users anyway and the computational cost climbs sharply.</p> <p>For accessibility, wrap your text in an element with a slightly higher background opacity than the card itself. A small inner container with <code>background: rgba(0, 0, 0, 0.35)</code> behind white text can push your contrast ratio back into safe territory without killing the frosted effect visually. It’s a minor cheat, but it works and your users can actually read your content.</p> <p>Teams building with design systems, particularly those working on <a href="https://dijitul.uk/bespoke-software/" rel="noopener">bespoke web software</a> with complex UI requirements, will want to tokenise these values early. A glass surface isn’t just one component; it should be defined as a reusable token set (opacity, blur radius, border alpha, shadow depth) so the effect stays consistent across the product and is easy to adjust globally if your background palette changes.</p> <h2>Tools That Make Glassmorphism Easier to Get Right</h2> <p>Figma is still the go-to for prototyping the effect. The background blur property in Figma’s Fill panel mimics <code>backdrop-filter</code> closely enough to communicate intent to developers, though it won’t be pixel-perfect until it’s in the browser. Pair it with Figma’s contrast checker plugin (or the third-party Able plugin) and you can validate your text contrast before a single line of code is written.</p> <p>For the CSS side, there are a few generators worth bookmarking. CSS Glass and Glassmorphism.css both let you dial in your values and copy the output directly. They’re not magic, but they’re useful for getting a starting point quickly and adjusting from there rather than tuning values manually in DevTools.</p> <p>If you’re working in a component framework like React or Vue, consider wrapping your glass surfaces in a dedicated component that enforces the design token values. Hard-coding <code>blur(12px)</code> directly into a dozen different stylesheets is how inconsistency creeps in. One glass-card component, one place to update, consistent output everywhere.</p> <h2>Where Glassmorphism Actually Belongs in a Modern Interface</h2> <p>Not everywhere. That bears repeating. The reason the 2026 version of this trend holds up is because the designers using it well are strategic about placement. Modal dialogs and overlays are the sweet spot; the content beneath is controlled, the blur is contextually meaningful (it signals depth and focus), and users interpret it correctly as a layered surface. Navigation components on hero sections with static backgrounds work well too.</p> <p>Where it still struggles is in data-heavy interfaces. Tables, dashboards, and anything with dense information simply doesn’t benefit from a frosted surface. The effect adds visual complexity precisely where you need clarity. Keep glassmorphism UI design for moments of emphasis, transitions, and lightweight UI chrome. Use solid surfaces for the hard work.</p> <p>The aesthetic isn’t broken. It never was, really. It was just misused by a generation of designers who discovered a cool effect and applied it everywhere at once. Now that the initial excitement has settled and the tooling has matured, glassmorphism sits comfortably in the modern designer’s toolkit, not as a style statement, but as a genuinely useful approach to visual hierarchy and depth when applied with a bit of restraint and a working knowledge of contrast ratios.</p> <h2>Frequently Asked Questions</h2> <h3>What is glassmorphism UI design?</h3> <p>Glassmorphism is a design style that uses frosted-glass-style panels with partial transparency, background blur, and subtle borders to create a sense of depth and layering in interfaces. It became popular around 2020 and is now being used more responsibly in 2026 product design.</p> <h3>Why did glassmorphism fail the first time round?</h3> <p>The main issues were poor text contrast ratios, unpredictable readability when placed over dynamic backgrounds, and serious performance problems on lower-end devices caused by heavy use of CSS backdrop-filter. Many implementations failed basic WCAG accessibility standards.</p> <h3>How do I make glassmorphism accessible?</h3> <p>Ensure your text always meets WCAG 2.1 contrast requirements (4.5:1 for body text) by using a semi-opaque inner layer behind text elements to boost contrast. Design your background as a controlled gradient rather than dynamic content, so contrast stays predictable. Always check with a contrast-checking tool before shipping.</p> <h3>What CSS properties do I need for a glass effect?</h3> <p>The core properties are background with rgba() at low alpha, backdrop-filter: blur() (with the -webkit- prefix for Safari), and a semi-transparent border. Use @supports to provide solid-surface fallbacks for browsers that don’t support backdrop-filter, which covers older devices cleanly.</p> <h3>Where should I use glassmorphism in an interface?</h3> <p>Glassmorphism works best on modal dialogs, notification cards, navigation overlays, and hero section UI elements where the background is controlled. Avoid using it on data-dense surfaces like tables and dashboards, where visual clarity is more important than aesthetic depth.</p> <p><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "What is glassmorphism UI design?", "acceptedAnswer": { "@type": "Answer", "text": "Glassmorphism is a design style that uses frosted-glass-style panels with partial transparency, background blur, and subtle borders to create a sense of depth and layering in interfaces. It became popular around 2020 and is now being used more responsibly in 2026 product design." } }, { "@type": "Question", "name": "Why did glassmorphism fail the first time round?", "acceptedAnswer": { "@type": "Answer", "text": "The main issues were poor text contrast ratios, unpredictable readability when placed over dynamic backgrounds, and serious performance problems on lower-end devices caused by heavy use of CSS backdrop-filter. Many implementations failed basic WCAG accessibility standards." } }, { "@type": "Question", "name": "How do I make glassmorphism accessible?", "acceptedAnswer": { "@type": "Answer", "text": "Ensure your text always meets WCAG 2.1 contrast requirements (4.5:1 for body text) by using a semi-opaque inner layer behind text elements to boost contrast. Design your background as a controlled gradient rather than dynamic content, so contrast stays predictable. Always check with a contrast-checking tool before shipping." } }, { "@type": "Question", "name": "What CSS properties do I need for a glass effect?", "acceptedAnswer": { "@type": "Answer", "text": "The core properties are background with rgba() at low alpha, backdrop-filter: blur() (with the -webkit- prefix for Safari), and a semi-transparent border. Use @supports to provide solid-surface fallbacks for browsers that don't support backdrop-filter, which covers older devices cleanly." } }, { "@type": "Question", "name": "Where should I use glassmorphism in an interface?", "acceptedAnswer": { "@type": "Answer", "text": "Glassmorphism works best on modal dialogs, notification cards, navigation overlays, and hero section UI elements where the background is controlled. Avoid using it on data-dense surfaces like tables and dashboards, where visual clarity is more important than aesthetic depth." } } ] } </script></p> </div> <div style="margin-top:var(--wp--preset--spacing--40)" class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/glassmorphism-is-back-and-this-time-its-doing-it-right/"><time datetime="2026-06-30T09:42:08+00:00">June 30, 2026</time></a></div></div> </li><li class="wp-block-post post-186 post type-post status-publish format-standard has-post-thumbnail hentry category-coding category-design category-nerdy tag-batch-image-processing tag-colour-palette-extraction tag-design-automation-python tag-graphic-design-coding tag-python-scripts-for-graphic-designers"> <div class="wp-block-group alignfull is-layout-flow wp-block-group-is-layout-flow" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><figure style="aspect-ratio:3/2" class="wp-block-post-featured-image"><a href="https://launchpad-design.co.uk/python-scripts-for-graphic-designers/" target="_self" ><img width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/graphic-designer-using-python-scripts-for-graphic-designers-1.png" class="attachment-full size-full wp-post-image" alt="10 Python Scripts Every Graphic Designer Should Have in Their Toolkit" style="width:100%;height:100%;object-fit:cover;" decoding="async" loading="lazy" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/graphic-designer-using-python-scripts-for-graphic-designers-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/graphic-designer-using-python-scripts-for-graphic-designers-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/graphic-designer-using-python-scripts-for-graphic-designers-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/graphic-designer-using-python-scripts-for-graphic-designers-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure> <h2 class="wp-block-post-title has-x-large-font-size"><a href="https://launchpad-design.co.uk/python-scripts-for-graphic-designers/" target="_self" >10 Python Scripts Every Graphic Designer Should Have in Their Toolkit</a></h2> <div class="entry-content alignfull wp-block-post-content has-medium-font-size is-layout-flow wp-block-post-content-is-layout-flow"><p>Graphic design is creative work. Renaming 400 exported assets at midnight is not. If you have ever spent a Tuesday afternoon manually resizing the same logo to seventeen different dimensions, or digging through a folder of files named <code>final_FINAL_v3_USE_THIS.png</code>, this guide is for you. Python scripts for graphic designers are not some mythical developer territory. They are small, learnable, genuinely useful tools that will hand you back hours of your week.</p> <p>You do not need to be a software engineer. You need about an afternoon, Python installed on your machine, and a willingness to feel briefly confused before something clicks beautifully into place.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/graphic-designer-using-python-scripts-for-graphic-designers-1.png" alt="Graphic designer using Python scripts for graphic designers on a MacBook in a modern studio" class="wp-image-184" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/graphic-designer-using-python-scripts-for-graphic-designers-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/graphic-designer-using-python-scripts-for-graphic-designers-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/graphic-designer-using-python-scripts-for-graphic-designers-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/graphic-designer-using-python-scripts-for-graphic-designers-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Graphic designer using Python scripts for graphic designers on a MacBook in a modern studio</figcaption></figure> <h2>Why Python Is Perfect for Design Automation</h2> <p>Python reads almost like English, which matters when you are a designer who has never touched a terminal before. It also has a library called <a href="https://python-imaging-library.readthedocs.io/" rel="noopener noreferrer">Pillow</a> (the maintained fork of the old PIL image library) that makes image manipulation genuinely straightforward. Add <code>colorthief</code> for palette extraction, <code>os</code> for file system work, and <code>pathlib</code> for cleaner path handling, and you have a proper little automation toolkit. According to the <a href="https://www.bbc.co.uk/news/technology-64669291" rel="noopener noreferrer">BBC’s coverage of the tech skills gap in the UK</a>, Python consistently ranks as one of the most in-demand skills across creative and technical roles alike. Designers who can script are suddenly very employable.</p> <p>All the scripts below are beginner-friendly. Each one does one job, does it well, and is short enough that you can actually read it and understand what is happening.</p> <h2>Setting Up: Install Python and the Libraries You Need</h2> <p>Head to <a href="https://www.python.org/downloads/" rel="noopener noreferrer">python.org</a> and grab the latest stable release. Once installed, open your terminal and run:</p> <pre><code>pip install Pillow colorthief</code></pre> <p>That handles the imaging heavy lifting. Everything else uses Python’s standard library, which comes pre-installed. Now, on to the good stuff.</p> <h2>1. Batch Resize Images to Multiple Dimensions</h2> <p>This is the one that pays for itself immediately. Drop all your source files into a folder, run the script, and get back a set of resized exports without touching a single slider.</p> <pre><code>from PIL import Image import os sizes = [(1920, 1080), (1280, 720), (800, 600), (400, 300)] input_folder = "source_images" output_folder = "resized_exports" os.makedirs(output_folder, exist_ok=True) for filename in os.listdir(input_folder): if filename.lower().endswith((".jpg", ".jpeg", ".png")): img = Image.open(os.path.join(input_folder, filename)) for width, height in sizes: resized = img.resize((width, height), Image.LANCZOS) name, ext = os.path.splitext(filename) resized.save(os.path.join(output_folder, f"{name}_{width}x{height}{ext}")) print(f"Processed: {filename}") </code></pre> <p><code>LANCZOS</code> is the resampling filter that gives you the sharpest results. Worth knowing.</p> <h2>2. Extract a Colour Palette from Any Image</h2> <p>Colour palette extraction is genuinely magical the first time you run it. Point this script at a photograph or brand asset and it pulls out the dominant colours as hex values, ready to paste into Figma or your CSS variables.</p> <pre><code>from colorthief import ColorThief def get_palette(image_path, colour_count=6): ct = ColorThief(image_path) palette = ct.get_palette(color_count=colour_count) hex_colours = ["#{:02x}{:02x}{:02x}".format(r, g, b) for r, g, b in palette] print(f"Palette for {image_path}:") for colour in hex_colours: print(colour) get_palette("your_image.jpg") </code></pre> <p>Run this on a client’s product photography before a branding session and walk in looking extremely prepared.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/python-scripts-for-graphic-designers-showing-colour-palette-2.png" alt="Python scripts for graphic designers showing colour palette extraction code on screen" class="wp-image-185" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/python-scripts-for-graphic-designers-showing-colour-palette-2.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/python-scripts-for-graphic-designers-showing-colour-palette-2-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/python-scripts-for-graphic-designers-showing-colour-palette-2-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/python-scripts-for-graphic-designers-showing-colour-palette-2-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Python scripts for graphic designers showing colour palette extraction code on screen</figcaption></figure> <h2>3. Bulk Rename Files With a Sensible Convention</h2> <p>The dark art of file naming. This script renames every image in a folder using a clean prefix and sequential numbering, which is the sort of thing that makes a project folder look professional and stops your client forwarding you <code>untitled-1-copy-2.png</code> at 11pm.</p> <pre><code>import os from pathlib import Path folder = Path("design_assets") prefix = "brand_asset" files = sorted([f for f in folder.iterdir() if f.suffix in [".png", ".jpg", ".svg"]]) for i, file in enumerate(files, start=1): new_name = f"{prefix}_{i:03d}{file.suffix}" file.rename(folder / new_name) print(f"{file.name} -> {new_name}") </code></pre> <p>The <code>:03d</code> format means your files go <code>001</code>, <code>002</code>, not <code>1</code>, <code>2</code>, so they sort correctly in every file manager known to humanity.</p> <h2>4. Convert PNG Files to WebP in Bulk</h2> <p>WebP files are significantly smaller than PNGs without a meaningful quality hit, which matters for web performance. This script batch converts an entire folder.</p> <pre><code>from PIL import Image import os input_folder = "png_assets" output_folder = "webp_exports" os.makedirs(output_folder, exist_ok=True) for filename in os.listdir(input_folder): if filename.lower().endswith(".png"): img = Image.open(os.path.join(input_folder, filename)) name = os.path.splitext(filename)[0] img.save(os.path.join(output_folder, f"{name}.webp"), "webp", quality=85) print(f"Converted: {filename}") </code></pre> <h2>5. Add a Watermark to Every Image in a Folder</h2> <p>Client proofing just became semi-automated. This script pastes a semi-transparent watermark PNG over every image in a folder and saves the results separately, so your originals remain untouched.</p> <pre><code>from PIL import Image import os watermark = Image.open("watermark.png").convert("RGBA") input_folder = "proofs_source" output_folder = "proofs_watermarked" os.makedirs(output_folder, exist_ok=True) for filename in os.listdir(input_folder): if filename.lower().endswith((".jpg", ".png")): base = Image.open(os.path.join(input_folder, filename)).convert("RGBA") wm_resized = watermark.resize((base.width // 3, base.height // 3)) position = (base.width - wm_resized.width - 20, base.height - wm_resized.height - 20) base.paste(wm_resized, position, wm_resized) base.convert("RGB").save(os.path.join(output_folder, filename)) print(f"Watermarked: {filename}") </code></pre> <h2>6. Generate Consistent Social Media Export Sizes</h2> <p>Every platform wants a slightly different crop. Rather than doing this by hand in Photoshop for every campaign, define your sizes once and let Python handle the rest.</p> <pre><code>from PIL import Image import os social_sizes = { "instagram_square": (1080, 1080), "instagram_story": (1080, 1920), "linkedin_banner": (1584, 396), "twitter_header": (1500, 500), } image_path = "campaign_master.jpg" img = Image.open(image_path) base_name = os.path.splitext(image_path)[0] for label, (w, h) in social_sizes.items(): resized = img.resize((w, h), Image.LANCZOS) resized.save(f"{base_name}_{label}.jpg") print(f"Saved: {label}") </code></pre> <h2>7. Strip EXIF Data Before Sending Files to Clients</h2> <p>EXIF metadata in photographs can contain GPS coordinates, camera model, original file paths, and other information you probably do not want attached to client deliverables. This is a one-liner wrapped in a function.</p> <pre><code>from PIL import Image import os def strip_exif(input_path, output_path): img = Image.open(input_path) clean = Image.new(img.mode, img.size) clean.putdata(list(img.getdata())) clean.save(output_path) print(f"Clean copy saved: {output_path}") strip_exif("photo_with_metadata.jpg", "photo_clean.jpg") </code></pre> <h2>8. Auto-Generate Thumbnail Previews</h2> <p>Drop all your large master files into a folder and get a <code>thumbs</code> subfolder of 200px previews, useful for project documentation or quick client reviews.</p> <pre><code>from PIL import Image import os folder = "master_assets" thumb_folder = os.path.join(folder, "thumbs") os.makedirs(thumb_folder, exist_ok=True) for filename in os.listdir(folder): if filename.lower().endswith((".jpg", ".png")): img = Image.open(os.path.join(folder, filename)) img.thumbnail((200, 200)) img.save(os.path.join(thumb_folder, filename)) print(f"Thumb: {filename}") </code></pre> <p>Note that <code>thumbnail()</code> preserves aspect ratio, unlike <code>resize()</code>. Handy distinction to know.</p> <h2>9. Check Images Meet Minimum Resolution Requirements</h2> <p>Before sending a batch off to print, run this to flag anything under your minimum resolution. Saves the awkward conversation with the print house.</p> <pre><code>from PIL import Image import os min_width = 2480 min_height = 3508 # A4 at 300dpi folder = "print_ready" for filename in os.listdir(folder): if filename.lower().endswith((".jpg", ".png")): img = Image.open(os.path.join(folder, filename)) w, h = img.size if w < min_width or h < min_height: print(f"WARNING - Too small: {filename} ({w}x{h})") else: print(f"OK: {filename} ({w}x{h})") </code></pre> <h2>10. Build a Colour Palette HTML Swatch Sheet</h2> <p>Extract a palette and immediately generate an HTML file showing the swatches, which you can drop straight into a client presentation or design brief document. This is the one that impresses people.</p> <pre><code>from colorthief import ColorThief def generate_swatch_html(image_path, output_html="swatches.html", count=8): ct = ColorThief(image_path) palette = ct.get_palette(color_count=count) hex_list = ["#{:02x}{:02x}{:02x}".format(r, g, b) for r, g, b in palette] swatches = "".join( f'<div style="background:{c};width:100px;height:100px;display:inline-block;margin:5px;" title="{c}"></div>' for c in hex_list ) html = f"<html><body><h2>Colour Palette</h2>{swatches}</body></html>" with open(output_html, "w") as f: f.write(html) print(f"Swatch sheet saved: {output_html}") generate_swatch_html("brand_photo.jpg") </code></pre> <h2>Where to Go Next With Python Scripts for Graphic Designers</h2> <p>These ten scripts are the gateway. Once they feel comfortable, look into <code>watchdog</code> for scripts that trigger automatically when files land in a folder, and <code>reportlab</code> for generating PDFs programmatically. If you want structured learning, the <a href="https://www.gov.uk/guidance/digital-and-technology-professional-competency-framework" rel="noopener noreferrer">UK Government Digital Service competency framework</a> includes scripting and automation as valued technical skills across digital roles, which tells you something about where this is all heading.</p> <p>The bigger point is this: repetitive tasks are not part of your job description. They are friction. Python scripts for graphic designers exist specifically to remove that friction, and the learning curve is genuinely shallower than most designers expect. Ten scripts, one afternoon, and suddenly your workflow is a different creature entirely.</p> <h2>Frequently Asked Questions</h2> <h3>Do I need to know how to code to use Python scripts for graphic design tasks?</h3> <p>Not really. The scripts in this guide are written to be readable even if you have never coded before. Start by copy-pasting and running them as-is, then gradually tweak the folder names and settings to match your workflow. That is how most designers get started.</p> <h3>What Python libraries do I need for image automation?</h3> <p>Pillow is the essential one, handling resizing, format conversion, watermarking, and thumbnail generation. For colour palette extraction, add colorthief. Both install in seconds with pip and are well-documented with active communities.</p> <h3>Will these scripts work on a Mac and Windows?</h3> <p>Yes. Python and Pillow run on both platforms without modification. The file paths in the scripts use Python's os and pathlib modules, which handle the differences between operating systems automatically.</p> <h3>How long does it take to batch resize 500 images with Python?</h3> <p>Typically under a minute for 500 standard JPEG or PNG files, depending on the output sizes and your machine's specs. Compared to doing it manually in Photoshop or Affinity Photo, it is essentially instant.</p> <h3>Can I automate Figma or Adobe tasks with Python?</h3> <p>Figma has a REST API that Python can talk to, so yes, things like exporting frames or reading file data are possible. Adobe's Creative Cloud apps support scripting via their own tools, though Python integration there is less direct. For file-level work like the scripts in this guide, Python works independently of any design app.</p> <p><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "Do I need to know how to code to use Python scripts for graphic design tasks?", "acceptedAnswer": { "@type": "Answer", "text": "Not really. The scripts in this guide are written to be readable even if you have never coded before. Start by copy-pasting and running them as-is, then gradually tweak the folder names and settings to match your workflow. That is how most designers get started." } }, { "@type": "Question", "name": "What Python libraries do I need for image automation?", "acceptedAnswer": { "@type": "Answer", "text": "Pillow is the essential one, handling resizing, format conversion, watermarking, and thumbnail generation. For colour palette extraction, add colorthief. Both install in seconds with pip and are well-documented with active communities." } }, { "@type": "Question", "name": "Will these scripts work on a Mac and Windows?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Python and Pillow run on both platforms without modification. The file paths in the scripts use Python's os and pathlib modules, which handle the differences between operating systems automatically." } }, { "@type": "Question", "name": "How long does it take to batch resize 500 images with Python?", "acceptedAnswer": { "@type": "Answer", "text": "Typically under a minute for 500 standard JPEG or PNG files, depending on the output sizes and your machine's specs. Compared to doing it manually in Photoshop or Affinity Photo, it is essentially instant." } }, { "@type": "Question", "name": "Can I automate Figma or Adobe tasks with Python?", "acceptedAnswer": { "@type": "Answer", "text": "Figma has a REST API that Python can talk to, so yes, things like exporting frames or reading file data are possible. Adobe's Creative Cloud apps support scripting via their own tools, though Python integration there is less direct. For file-level work like the scripts in this guide, Python works independently of any design app." } } ] } </script></p> </div> <div style="margin-top:var(--wp--preset--spacing--40)" class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/python-scripts-for-graphic-designers/"><time datetime="2026-06-30T07:26:12+00:00">June 30, 2026</time></a></div></div> </li><li class="wp-block-post post-183 post type-post status-publish format-standard has-post-thumbnail hentry category-coding category-tech-stuff category-web-design tag-core-web-vitals tag-inp-lcp-cls-fixes tag-page-speed-uk tag-uk-website-optimisation tag-web-performance-2026"> <div class="wp-block-group alignfull is-layout-flow wp-block-group-is-layout-flow" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><figure style="aspect-ratio:3/2" class="wp-block-post-featured-image"><a href="https://launchpad-design.co.uk/core-web-vitals-fix-uk-website-2026/" target="_self" ><img width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-analysing-core-web-vitals-fix-for-a-uk-website-in-1.png" class="attachment-full size-full wp-post-image" alt="Why Your Website’s Core Web Vitals Are Still Broken in 2026 (And How to Actually Fix Them)" style="width:100%;height:100%;object-fit:cover;" decoding="async" loading="lazy" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-analysing-core-web-vitals-fix-for-a-uk-website-in-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-analysing-core-web-vitals-fix-for-a-uk-website-in-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-analysing-core-web-vitals-fix-for-a-uk-website-in-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-analysing-core-web-vitals-fix-for-a-uk-website-in-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure> <h2 class="wp-block-post-title has-x-large-font-size"><a href="https://launchpad-design.co.uk/core-web-vitals-fix-uk-website-2026/" target="_self" >Why Your Website’s Core Web Vitals Are Still Broken in 2026 (And How to Actually Fix Them)</a></h2> <div class="entry-content alignfull wp-block-post-content has-medium-font-size is-layout-flow wp-block-post-content-is-layout-flow"><p>Right. You’ve run PageSpeed Insights, stared at a wall of amber and red scores, and muttered something unprintable at your screen. Welcome to the club. Despite Google making Core Web Vitals a ranking signal years ago, a staggering proportion of UK small business and e-commerce sites are still failing at least one metric. According to the <a href="https://www.ons.gov.uk/businessindustryandtrade/itandinternetindustry" target="_blank" rel="noopener">ONS data on UK internet industry</a>, the number of UK businesses trading online continues to grow, which makes it all the more baffling that so many of them are haemorrhaging rankings because of fixable performance issues. This is your technically grounded guide to the core web vitals fix your UK website actually needs in 2026.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-analysing-core-web-vitals-fix-for-a-uk-website-in-1.png" alt="Developer analysing core web vitals fix for a UK website in 2026 on multiple monitors" class="wp-image-181" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-analysing-core-web-vitals-fix-for-a-uk-website-in-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-analysing-core-web-vitals-fix-for-a-uk-website-in-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-analysing-core-web-vitals-fix-for-a-uk-website-in-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-analysing-core-web-vitals-fix-for-a-uk-website-in-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Developer analysing core web vitals fix for a UK website in 2026 on multiple monitors</figcaption></figure> <h2>What Are Core Web Vitals and Why Do They Still Matter in 2026?</h2> <p>Three metrics. That’s all Google is officially measuring under Core Web Vitals: Largest Contentful Paint (LCP), Interaction to Next Paint (INP), and Cumulative Layout Shift (CLS). INP replaced First Input Delay in early 2024 and it’s been quietly brutalising sites ever since. These aren’t abstract benchmarks invented by committee; they map directly to how a real human being experiences loading a page on a 4G connection on the Tube.</p> <p>LCP measures how fast your biggest visible element renders. INP measures how snappy your site feels when someone taps, clicks, or types. CLS measures whether your page jumps around like a nervous ferret while it loads. Fail any of them and you’re not just annoying your users; you’re handing a quiet ranking penalty to competitors who bothered to sort theirs out.</p> <h2>Why UK SME and E-Commerce Sites Fail More Than They Should</h2> <p>I’ve looked at a lot of UK business sites over the years and the failure patterns are almost always the same. It’s rarely one catastrophic problem. It’s death by a thousand cuts: a bloated WooCommerce theme, render-blocking Google Tag Manager scripts, hero images served without modern compression, third-party chat widgets loading synchronously. Each one adds a few hundred milliseconds. Collectively they torpedo your LCP.</p> <p>UK e-commerce sites in particular tend to inherit technical debt from theme marketplaces. Themes built on Bootstrap 4, autoloading twelve Google Fonts variants, carousels powered by jQuery plugins from 2019. The stacking effect is brutal. A site that looks fine on a developer’s M3 MacBook Pro over fibre will absolutely fall apart for someone browsing on an iPhone SE in a post office queue in Wolverhampton.</p> <h2>Fixing LCP: The Largest Contentful Paint Problem</h2> <p>Your LCP target is under 2.5 seconds. Most failing UK sites are sitting between 3.5 and 6 seconds. The biggest culprits are almost always images and render-blocking resources.</p> <p>Start with your hero image. If it’s a JPEG or PNG being loaded via a CSS background, that’s two problems at once. Switch to WebP or AVIF (AVIF compression is genuinely remarkable at this point), serve it as an <code><img></code> element with proper dimensions declared, and add <code>fetchpriority="high"</code> to the tag. That single attribute tells the browser this image is critical and to fetch it immediately rather than queuing it behind other resources.</p> <pre><code><img src="hero.avif" width="1200" height="630" fetchpriority="high" alt="Your descriptive alt text" ></code></pre> <p>Next: preload your LCP image in the <code><head></code>. This is still criminally underused on UK sites.</p> <pre><code><link rel="preload" as="image" href="hero.avif" fetchpriority="high"></code></pre> <p>Finally, audit your render-blocking scripts. Google Tag Manager firing synchronously in the <code><head></code> is an LCP killer. Move third-party scripts to load with <code>defer</code> or <code>async</code> wherever possible. GTM itself should load asynchronously; if it isn’t, something has gone wrong with your implementation.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/chrome-devtools-performance-panel-showing-long-tasks-relevan-2.png" alt="Chrome DevTools performance panel showing long tasks relevant to core web vitals fix" class="wp-image-182" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/chrome-devtools-performance-panel-showing-long-tasks-relevan-2.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/chrome-devtools-performance-panel-showing-long-tasks-relevan-2-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/chrome-devtools-performance-panel-showing-long-tasks-relevan-2-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/chrome-devtools-performance-panel-showing-long-tasks-relevan-2-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Chrome DevTools performance panel showing long tasks relevant to core web vitals fix</figcaption></figure> <h2>Fixing INP: Interaction to Next Paint Is the Hard One</h2> <p>INP is the metric that’s caught the most sites off-guard since it replaced FID. The threshold for a good score is under 200 milliseconds. Poor is anything over 500ms. The nuance here is that INP measures the worst interaction across an entire page session, not just the first one. That means a sluggish dropdown menu or a heavy on-click handler buried in a product filter can tank your entire score.</p> <p>The main culprit for high INP on UK e-commerce sites is long tasks on the main thread. JavaScript that runs for more than 50ms without yielding blocks the browser from responding to user input. Here’s the pattern to break it up:</p> <pre><code>// Instead of one long synchronous function: function heavyTask() { // ...200ms of work... } // Yield to the browser between chunks: async function yieldingTask() { for (const chunk of dataChunks) { processChunk(chunk); await new Promise(resolve => setTimeout(resolve, 0)); } }</code></pre> <p>The <code>scheduler.postTask()</code> API is worth exploring if you’re on a modern stack; it gives you fine-grained control over task priority. For WordPress and WooCommerce sites, the quickest win is usually auditing which plugins are registering event listeners on every page. WooCommerce cart fragments, live chat scripts, cookie consent managers; each one adds JavaScript weight that the browser has to process before it can respond to the next click.</p> <p>Use Chrome DevTools’ Performance panel (or the slightly more accessible Web Vitals extension) to identify which interactions are generating the longest tasks. Look for the red triangles. Then work backwards to the script responsible.</p> <h2>Fixing CLS: Stop Your Page Jumping Around</h2> <p>Cumulative Layout Shift should be under 0.1. It’s the most visually obvious failure and often the easiest to fix, yet plenty of UK sites are still shipping CLS scores of 0.3 or worse.</p> <p>The classic cause: images without declared dimensions. When the browser doesn’t know how tall an image is before it loads, it reserves no space. Then the image appears and shunts everything down the page. The fix is a single line of CSS that’s been good practice for years but somehow still gets skipped:</p> <pre><code>img, video { aspect-ratio: attr(width) / attr(height); height: auto; width: 100%; }</code></pre> <p>Always declare explicit <code>width</code> and <code>height</code> attributes on your <code><img></code> tags too. The browser uses these to calculate space before the image loads.</p> <p>Web fonts are the other sneaky CLS source. When your custom font loads and swaps in, text reflows and shifts the layout. The fix is <code>font-display: optional</code> for non-critical fonts, or <code>font-display: swap</code> combined with a closely matched system font fallback using the <code>size-adjust</code> CSS descriptor. The font matching tools from Malte Ubl’s Fontaine project are genuinely useful here for generating fallback metrics automatically.</p> <p>Ad slots, banners, and dynamically injected content are the third category. Reserve space for them explicitly with CSS. A banner that loads after the DOM has painted and pushes your content down by 60 pixels will absolutely destroy your CLS score.</p> <h2>Measuring the Right Way: Real User Data vs Lab Data</h2> <p>PageSpeed Insights shows you two sets of data: lab data (simulated, consistent, useful for debugging) and field data from the Chrome User Experience Report (CrUX). Google’s ranking decisions are based on CrUX field data, not lab scores. A site can score 95 in PageSpeed lab conditions and still fail Core Web Vitals in the field if real users on real networks and devices are having a different experience.</p> <p>If your site doesn’t yet have enough traffic to appear in CrUX, you’re assessed at the origin level or not at all. But you should still optimise; you’re building the performance foundation for when the data does accumulate. Use the <a href="https://search.google.com/search-console" target="_blank" rel="noopener">Google Search Console</a> Core Web Vitals report to see page-group level field data for your actual UK users.</p> <p>The bottom line for a core web vitals fix on a UK website in 2026 is this: it’s almost never one thing. It’s the compound effect of images, scripts, fonts, and layout choices that were each fine in isolation but terrible together. Audit methodically, fix the highest-impact items first (LCP image delivery and render-blocking scripts will move the needle fastest), and measure with field data, not just lab scores. Your rankings, and your users, will thank you for it.</p> <h2>Frequently Asked Questions</h2> <h3>What is a good Core Web Vitals score in 2026?</h3> <p>Google defines ‘good’ as LCP under 2.5 seconds, INP under 200 milliseconds, and CLS under 0.1. All three thresholds need to be met at the 75th percentile of real user page loads to pass. Hitting two out of three still counts as a partial failure.</p> <h3>How do I check my Core Web Vitals for free?</h3> <p>Google Search Console gives you real-user field data grouped by page type, which is the most valuable report for UK site owners. PageSpeed Insights (pagespeed.web.dev) gives you both lab and field data for individual URLs. The Chrome Web Vitals browser extension lets you measure in real time as you browse.</p> <h3>Does fixing Core Web Vitals actually improve Google rankings?</h3> <p>Yes, though it’s one signal among many. Google uses Core Web Vitals as a tiebreaker when content quality is broadly similar between competing pages. For competitive UK e-commerce and local search queries, the difference between a passing and failing score can visibly shift rankings. More importantly, faster sites convert better.</p> <h3>Why is my WordPress site failing INP?</h3> <p>WordPress and WooCommerce sites typically accumulate JavaScript from multiple plugins all registering event listeners and running tasks on the main thread simultaneously. Cart fragment scripts, live chat widgets, cookie consent managers, and page builder scripts are common culprits. Audit your loaded scripts with Chrome DevTools and remove or defer anything not critical to the initial interaction.</p> <h3>How long does it take to fix Core Web Vitals?</h3> <p>Technical fixes can be implemented in a day or two for a developer who knows what they’re looking for. However, Google’s CrUX field data updates on a rolling 28-day window, so you won’t see improvements reflected in Search Console immediately. Expect three to four weeks before field data catches up to your fixes.</p> <p><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "What is a good Core Web Vitals score in 2026?", "acceptedAnswer": { "@type": "Answer", "text": "Google defines 'good' as LCP under 2.5 seconds, INP under 200 milliseconds, and CLS under 0.1. All three thresholds need to be met at the 75th percentile of real user page loads to pass. Hitting two out of three still counts as a partial failure." } }, { "@type": "Question", "name": "How do I check my Core Web Vitals for free?", "acceptedAnswer": { "@type": "Answer", "text": "Google Search Console gives you real-user field data grouped by page type, which is the most valuable report for UK site owners. PageSpeed Insights (pagespeed.web.dev) gives you both lab and field data for individual URLs. The Chrome Web Vitals browser extension lets you measure in real time as you browse." } }, { "@type": "Question", "name": "Does fixing Core Web Vitals actually improve Google rankings?", "acceptedAnswer": { "@type": "Answer", "text": "Yes, though it's one signal among many. Google uses Core Web Vitals as a tiebreaker when content quality is broadly similar between competing pages. For competitive UK e-commerce and local search queries, the difference between a passing and failing score can visibly shift rankings. More importantly, faster sites convert better." } }, { "@type": "Question", "name": "Why is my WordPress site failing INP?", "acceptedAnswer": { "@type": "Answer", "text": "WordPress and WooCommerce sites typically accumulate JavaScript from multiple plugins all registering event listeners and running tasks on the main thread simultaneously. Cart fragment scripts, live chat widgets, cookie consent managers, and page builder scripts are common culprits. Audit your loaded scripts with Chrome DevTools and remove or defer anything not critical to the initial interaction." } }, { "@type": "Question", "name": "How long does it take to fix Core Web Vitals?", "acceptedAnswer": { "@type": "Answer", "text": "Technical fixes can be implemented in a day or two for a developer who knows what they're looking for. However, Google's CrUX field data updates on a rolling 28-day window, so you won't see improvements reflected in Search Console immediately. Expect three to four weeks before field data catches up to your fixes." } } ] } </script></p> </div> <div style="margin-top:var(--wp--preset--spacing--40)" class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/core-web-vitals-fix-uk-website-2026/"><time datetime="2026-06-29T13:04:37+00:00">June 29, 2026</time></a></div></div> </li><li class="wp-block-post post-174 post type-post status-publish format-standard has-post-thumbnail hentry category-coding category-web-design tag-css-font-performance tag-font-variation-settings tag-opentype-variable-fonts tag-variable-fonts-web-design tag-web-typography"> <div class="wp-block-group alignfull is-layout-flow wp-block-group-is-layout-flow" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><figure style="aspect-ratio:3/2" class="wp-block-post-featured-image"><a href="https://launchpad-design.co.uk/variable-fonts-web-design-2026/" target="_self" ><img width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/monitor-displaying-variable-fonts-web-design-weight-axis-spe-1.png" class="attachment-full size-full wp-post-image" alt="Variable Fonts in 2026: The Typography Superpower Most Sites Aren’t Using" style="width:100%;height:100%;object-fit:cover;" decoding="async" loading="lazy" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/monitor-displaying-variable-fonts-web-design-weight-axis-spe-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/monitor-displaying-variable-fonts-web-design-weight-axis-spe-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/monitor-displaying-variable-fonts-web-design-weight-axis-spe-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/monitor-displaying-variable-fonts-web-design-weight-axis-spe-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure> <h2 class="wp-block-post-title has-x-large-font-size"><a href="https://launchpad-design.co.uk/variable-fonts-web-design-2026/" target="_self" >Variable Fonts in 2026: The Typography Superpower Most Sites Aren’t Using</a></h2> <div class="entry-content alignfull wp-block-post-content has-medium-font-size is-layout-flow wp-block-post-content-is-layout-flow"><p>Typography on the web has always been a bit of a faff. You pick a typeface, you download four or five separate font files for the different weights and styles, your page load bloats accordingly, and then your designer asks for a slightly bolder heading variant and the whole cycle starts again. Variable fonts break that cycle completely. And yet, despite browser support being essentially universal since around 2020, a surprising number of live production sites are still serving static font stacks like it’s 2015. In variable fonts web design, there is a genuinely dramatic performance and flexibility win sitting on the table, and most teams still haven’t picked it up.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/monitor-displaying-variable-fonts-web-design-weight-axis-spe-1.png" alt="Monitor displaying variable fonts web design weight axis specimens in a modern studio" class="wp-image-172" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/monitor-displaying-variable-fonts-web-design-weight-axis-spe-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/monitor-displaying-variable-fonts-web-design-weight-axis-spe-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/monitor-displaying-variable-fonts-web-design-weight-axis-spe-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/monitor-displaying-variable-fonts-web-design-weight-axis-spe-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Monitor displaying variable fonts web design weight axis specimens in a modern studio</figcaption></figure> <h2>What Are Variable Fonts, Exactly?</h2> <p>A variable font is a single font file that contains an entire design space rather than a fixed snapshot. Instead of separate files for Regular, Medium, SemiBold, Bold, ExtraBold and so on, you get one file with axes that you can interpolate along continuously. The OpenType variable font specification defines several standard axes: <code>wght</code> (weight), <code>wdth</code> (width), <code>ital</code> (italic), <code>slnt</code> (slant), and <code>opsz</code> (optical size). Typeface designers can also define custom axes, which opens up some genuinely wild creative territory. Recursive, a variable font from ArrowType, has an axis called <code>MONO</code> that lets you slide between proportional and monospaced spacing mid-render. That kind of thing simply does not exist in the static font world.</p> <p>The spec is maintained by the OpenType consortium and has been supported in Chrome, Firefox, Safari and Edge for years. The <a href="https://web.dev/articles/variable-fonts" target="_blank" rel="noopener">Google web.dev documentation on variable fonts</a> is still one of the clearest technical references going, even if you want to go deeper than this article covers.</p> <h2>Why Variable Fonts Are a Real Performance Win</h2> <p>Here is the part that tends to surprise people. A single variable font file is not the same size as all those individual static files added together. It is considerably smaller. A typical type family might ship five or six static weight files totalling 300-400 KB combined. The equivalent variable font file frequently comes in under 100 KB, sometimes much less depending on the character set. That is a meaningful reduction in font payload, and on mobile connections, particularly on 4G in rural areas of the UK where speeds can be inconsistent, that matters to real users.</p> <p>Beyond raw file size, there is the HTTP request count. Each static font file is a separate request. A variable font is one request. Fewer round trips, simpler caching strategy, less complexity in your <code><link rel="preload"></code> logic. It all compounds.</p> <h2>How to Implement Variable Fonts in CSS</h2> <p>Implementation is genuinely straightforward. If you are self-hosting a variable font (recommended for performance over relying on a third-party CDN), your <code>@font-face</code> declaration looks like this:</p> <pre><code>@font-face { font-family: 'Inter'; src: url('/fonts/Inter-Variable.woff2') format('woff2 supports variations'), url('/fonts/Inter-Variable.woff2') format('woff2'); font-weight: 100 900; font-style: normal; font-display: swap; }</code></pre> <p>The <code>font-weight: 100 900</code> range declaration is what tells the browser this file covers the full weight axis. Once declared, you can use any value in that range in your CSS without downloading anything extra:</p> <pre><code>h1 { font-weight: 750; } .caption { font-weight: 380; }</code></pre> <p>That is not a typo. 750 and 380 are valid values. You are no longer constrained to multiples of 100. This is the design flexibility part that typographically-minded developers tend to get quite excited about.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-coding-variable-fonts-web-design-implementation-wi-2.png" alt="Developer coding variable fonts web design implementation with CSS font-variation-settings on screen" class="wp-image-173" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-coding-variable-fonts-web-design-implementation-wi-2.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-coding-variable-fonts-web-design-implementation-wi-2-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-coding-variable-fonts-web-design-implementation-wi-2-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/06/developer-coding-variable-fonts-web-design-implementation-wi-2-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Developer coding variable fonts web design implementation with CSS font-variation-settings on screen</figcaption></figure> <h2>Using Font Variation Settings for Custom Axes</h2> <p>Standard axes like <code>wght</code> and <code>wdth</code> map to familiar CSS properties. But custom axes require the lower-level <code>font-variation-settings</code> property. Four-letter axis tags in uppercase are custom; lowercase are registered standard axes. Here is an example using a hypothetical font with a custom <code>CASL</code> (casual) axis, which Recursive actually ships:</p> <pre><code>body { font-variation-settings: 'wght' 400, 'CASL' 0.5; } .pull-quote { font-variation-settings: 'wght' 600, 'CASL' 1; }</code></pre> <p>One gotcha worth knowing: <code>font-variation-settings</code> does not inherit individual values elegantly. If you set it on a parent and override it on a child, you need to re-declare all axes on the child or the unspecified ones snap to their defaults. It is one of those CSS specifics that bites everyone at least once. The workaround is to use CSS custom properties as axis value holders and reference them inside <code>font-variation-settings</code>:</p> <pre><code>:root { --font-weight: 400; --font-casual: 0; } body { font-variation-settings: 'wght' var(--font-weight), 'CASL' var(--font-casual); } .pull-quote { --font-weight: 600; --font-casual: 1; }</code></pre> <p>Now the child only overrides the custom property it needs to change, and the rest inherit correctly. Tidy.</p> <h2>Animating Variable Font Axes with CSS</h2> <p>Because variable font axes are numerical values, they are animatable. You can transition <code>font-variation-settings</code> in CSS, which opens up some genuinely striking UI effects without a single line of JavaScript. A weight transition on hover, for instance:</p> <pre><code>.nav-link { font-variation-settings: 'wght' 400; transition: font-variation-settings 200ms ease; } .nav-link:hover { font-variation-settings: 'wght' 700; }</code></pre> <p>That said, animating font axes is GPU-hungry when done carelessly. Stick to <code>will-change: font-variation-settings</code> on elements you know will animate, and avoid triggering reflows on large blocks of body text. Test on a mid-range Android handset, not just your MacBook Pro, because the render cost can be quite visible on lower-powered hardware.</p> <h2>Where to Find Good Variable Fonts</h2> <p>Google Fonts now has a solid and growing variable font catalogue, and all fonts are free to self-host. Fontshare, run by Indian Type Foundry, has some excellent variable options at no cost. For commercial projects with stricter brand requirements, type foundries like Dalton Maag (London-based, work with major UK brands) offer premium variable font licences that include the full axis range. It is worth checking licence terms carefully; some variable font licences restrict the number of axes you can use in web contexts, which is an odd quirk of the industry still working itself out.</p> <h2>Variable Fonts and Optical Size: The Hidden Gem</h2> <p>The <code>opsz</code> axis is the one most developers overlook entirely, and it is arguably the most typographically valuable. Optical size adjustments change the actual letterform design, not just scale, based on the intended size of use. A 12px caption and a 60px display heading are rendered at different weights and proportions automatically when <code>font-optical-sizing: auto</code> is set in CSS. This is how type was handled in quality print for centuries, and it has only been feasible on screen since variable fonts arrived. It is the kind of detail that makes a design feel expensive without being able to pinpoint exactly why.</p> <h2>Is the Performance Argument Still Valid in 2026?</h2> <p>Some engineers push back and argue that with HTTP/2 multiplexing and aggressive browser caching, the number-of-requests argument is less compelling than it used to be. Fair point. But the file size argument holds up even under that scrutiny. And the design flexibility argument has nothing to do with performance at all; it is purely about what you can build. Being able to set <code>font-weight: 467</code> to hit exactly the visual weight your brand system specifies, without any extra asset, is just a better way to work. The variable fonts web design case was strong in 2020 when this landed; in 2026 it is essentially inarguable. There is no good reason to be shipping five static font files when one variable file does the same job better.</p> <p>If your current project is still on static fonts, running a quick audit with Chrome DevTools’ Network tab filtered to font resources will show you exactly what you are dealing with. The migration path is usually a morning’s work, and the performance uplift in Core Web Vitals, specifically the reduction in render-blocking time from font loading, tends to show up clearly in your Lighthouse scores within a few days of deployment.</p> <h2>Frequently Asked Questions</h2> <h3>What is a variable font and how does it differ from a regular web font?</h3> <p>A variable font is a single font file that contains an entire range of weights, widths, and other stylistic variations along continuous axes, rather than fixed snapshots. A regular static font file only contains one specific style, so you need multiple files to cover different weights. Variable fonts give you far more design flexibility with fewer files.</p> <h3>Do variable fonts actually improve website loading speed?</h3> <p>Yes, in most cases. A single variable font file is typically much smaller than the combined file size of equivalent static font files, and it requires only one HTTP request instead of several. This reduces page weight and simplifies caching, which can noticeably improve font loading performance, especially on slower mobile connections.</p> <h3>Are variable fonts supported in all modern browsers?</h3> <p>Browser support is essentially universal. Chrome, Firefox, Safari, and Edge have all supported the OpenType variable font specification for several years. You may encounter issues only with very old browser versions, but a straightforward fallback using the standard font stack handles those gracefully.</p> <h3>Where can I find free variable fonts to use on my website?</h3> <p>Google Fonts has a growing selection of free variable fonts that can be self-hosted. Fontshare by Indian Type Foundry also offers high-quality variable fonts at no cost. For commercial work requiring more distinct typography, foundries like Dalton Maag offer premium licensed variable fonts.</p> <h3>Can I animate variable font axes in CSS without JavaScript?</h3> <p>Yes. Because variable font axes are numerical values, CSS transitions and animations work on the font-variation-settings property directly. You can animate weight, width, or any custom axis purely in CSS. Be mindful of performance on lower-powered devices and use will-change sparingly on elements you know will animate.</p> <p><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "What is a variable font and how does it differ from a regular web font?", "acceptedAnswer": { "@type": "Answer", "text": "A variable font is a single font file that contains an entire range of weights, widths, and other stylistic variations along continuous axes, rather than fixed snapshots. A regular static font file only contains one specific style, so you need multiple files to cover different weights. Variable fonts give you far more design flexibility with fewer files." } }, { "@type": "Question", "name": "Do variable fonts actually improve website loading speed?", "acceptedAnswer": { "@type": "Answer", "text": "Yes, in most cases. A single variable font file is typically much smaller than the combined file size of equivalent static font files, and it requires only one HTTP request instead of several. This reduces page weight and simplifies caching, which can noticeably improve font loading performance, especially on slower mobile connections." } }, { "@type": "Question", "name": "Are variable fonts supported in all modern browsers?", "acceptedAnswer": { "@type": "Answer", "text": "Browser support is essentially universal. Chrome, Firefox, Safari, and Edge have all supported the OpenType variable font specification for several years. You may encounter issues only with very old browser versions, but a straightforward fallback using the standard font stack handles those gracefully." } }, { "@type": "Question", "name": "Where can I find free variable fonts to use on my website?", "acceptedAnswer": { "@type": "Answer", "text": "Google Fonts has a growing selection of free variable fonts that can be self-hosted. Fontshare by Indian Type Foundry also offers high-quality variable fonts at no cost. For commercial work requiring more distinct typography, foundries like Dalton Maag offer premium licensed variable fonts." } }, { "@type": "Question", "name": "Can I animate variable font axes in CSS without JavaScript?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Because variable font axes are numerical values, CSS transitions and animations work on the font-variation-settings property directly. You can animate weight, width, or any custom axis purely in CSS. Be mindful of performance on lower-powered devices and use will-change sparingly on elements you know will animate." } } ] } </script></p> </div> <div style="margin-top:var(--wp--preset--spacing--40)" class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/variable-fonts-web-design-2026/"><time datetime="2026-06-23T08:05:20+00:00">June 23, 2026</time></a></div></div> </li><li class="wp-block-post post-162 post type-post status-publish format-standard has-post-thumbnail hentry category-coding category-tech-stuff category-web-design tag-framer-website-builder tag-no-code-vs-low-code-vs-full-code-2026 tag-no-code-web-design tag-web-development-approaches tag-webflow-vs-next-js"> <div class="wp-block-group alignfull is-layout-flow wp-block-group-is-layout-flow" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><figure style="aspect-ratio:3/2" class="wp-block-post-featured-image"><a href="https://launchpad-design.co.uk/no-code-vs-low-code-vs-full-code-2026/" target="_self" ><img width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-and-developer-comparing-no-code-vs-low-code-vs-full-1.png" class="attachment-full size-full wp-post-image" alt="No-Code vs Low-Code vs Full Code: Choosing the Right Build Approach for Your Next Project" style="width:100%;height:100%;object-fit:cover;" decoding="async" loading="lazy" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-and-developer-comparing-no-code-vs-low-code-vs-full-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-and-developer-comparing-no-code-vs-low-code-vs-full-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-and-developer-comparing-no-code-vs-low-code-vs-full-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-and-developer-comparing-no-code-vs-low-code-vs-full-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure> <h2 class="wp-block-post-title has-x-large-font-size"><a href="https://launchpad-design.co.uk/no-code-vs-low-code-vs-full-code-2026/" target="_self" >No-Code vs Low-Code vs Full Code: Choosing the Right Build Approach for Your Next Project</a></h2> <div class="entry-content alignfull wp-block-post-content has-medium-font-size is-layout-flow wp-block-post-content-is-layout-flow"><p>The question of how to actually build something has never been more loaded. In 2026, the gap between dragging a block in Webflow and writing a custom API route in Next.js is enormous, but both approaches can ship a production-ready product. Understanding the no-code vs low-code vs full code 2026 landscape properly, rather than just defaulting to what you already know, is genuinely one of the most useful decisions you can make before a single pixel gets placed or a single line gets typed.</p> <p>This isn’t about which approach is objectively best. It’s about which one fits the project sitting in front of you right now. Let’s actually break it down.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-and-developer-comparing-no-code-vs-low-code-vs-full-1.png" alt="Designer and developer comparing no-code vs low-code vs full code 2026 build approaches at studio workstations" class="wp-image-160" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-and-developer-comparing-no-code-vs-low-code-vs-full-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-and-developer-comparing-no-code-vs-low-code-vs-full-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-and-developer-comparing-no-code-vs-low-code-vs-full-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-and-developer-comparing-no-code-vs-low-code-vs-full-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Designer and developer comparing no-code vs low-code vs full code 2026 build approaches at studio workstations</figcaption></figure> <h2>What Do We Even Mean by No-Code, Low-Code, and Full Code?</h2> <p>These three terms get blurred constantly, usually by marketing teams trying to make their platform sound more accessible than it is. So let’s be precise.</p> <p><strong>No-code</strong> means building entirely through a visual interface, no programming knowledge required. Webflow is the canonical example for websites. Framer sits in an interesting middle zone (more on that shortly). The idea is that logic, layout, and interactions are all abstracted behind GUI controls.</p> <p><strong>Low-code</strong> means a visual-first environment that still expects you to write some code when complexity demands it. Framer’s React override system is a great example. You can build 90% of a site visually, then drop into TypeScript for a custom animation or data fetch. Platforms like Bubble fall here too for web apps.</p> <p><strong>Full code</strong> means you’re writing everything from scratch, or close to it. Next.js, Remix, SvelteKit, raw React. You control the architecture, the performance, the data layer, all of it. The ceiling is unlimited. So is the time investment.</p> <h2>The Case for No-Code: Webflow and the Visual Web</h2> <p>Webflow has matured considerably. Its CMS is genuinely powerful for content-heavy marketing sites, and the Interactions panel gives motion designers a level of control that would have required GSAP and a developer two years ago. For a UK agency spinning up a client brochure site, a campaign landing page, or a portfolio, Webflow is hard to argue against on speed-to-launch alone.</p> <p>The honest limitations, though, are real. Custom authentication flows, complex database relationships, dynamic user dashboards, Webflow starts to creak. You’ll find yourself reaching for Memberstack, Airtable, Zapier, and a growing stack of third-party bolt-ons that each cost money and introduce failure points. At some point, you’re maintaining a Frankenstein architecture held together by webhooks and crossed fingers.</p> <p>Best for: marketing sites, portfolios, content-driven blogs, campaign pages, client projects where the brief is well-defined and scope is unlikely to balloon.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/05/developer-working-on-low-code-build-tools-in-a-comparison-of-2.png" alt="Developer working on low-code build tools in a comparison of no-code vs low-code vs full code 2026" class="wp-image-161" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/05/developer-working-on-low-code-build-tools-in-a-comparison-of-2.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/developer-working-on-low-code-build-tools-in-a-comparison-of-2-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/developer-working-on-low-code-build-tools-in-a-comparison-of-2-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/developer-working-on-low-code-build-tools-in-a-comparison-of-2-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Developer working on low-code build tools in a comparison of no-code vs low-code vs full code 2026</figcaption></figure> <h2>The Case for Low-Code: Framer’s Interesting Proposition</h2> <p>Framer occupies a genuinely interesting space in the no-code vs low-code vs full code 2026 conversation. It started as a prototyping tool, pivoted aggressively to being a publishing platform, and is now used by design-led teams at some serious companies. The visual canvas is arguably better than Webflow’s for highly expressive, animation-heavy sites. The component model maps closely enough to React that moving to full code later isn’t a complete rewrite.</p> <p>Where Framer shines is for design teams who want to own the build. Designers can ship real sites without waiting for a developer, but developers can drop into code overrides when something bespoke is needed. It’s collaborative in a way that feels natural rather than forced.</p> <p>The caveats: Framer’s CMS is still less mature than Webflow’s, and for anything approaching a real web application, you’ll outgrow it quickly. It’s also worth keeping an eye on pricing, as Framer’s plans have shifted a few times and costs can accumulate for larger teams. The <a href="https://www.gov.uk/guidance/using-open-standards-in-government-technology" target="_blank" rel="noopener">UK government’s guidance on open standards in technology</a> is a useful reminder that platform lock-in is a real risk worth evaluating before committing.</p> <p>Best for: design-led teams, portfolio sites with heavy animation, marketing pages for tech companies, projects where designer autonomy is a priority.</p> <h2>The Case for Full Code: Next.js and Owning Everything</h2> <p>Next.js remains the dominant React framework in 2026 for good reason. Server components, edge rendering, the App Router, built-in image optimisation, and a deployment pipeline that slots directly into Vercel or a self-hosted setup. If you’re building a SaaS product, an e-commerce platform, a membership site with real logic, or anything that needs to scale with user data, full code is the only honest answer.</p> <p>The trade-off is time and expertise. A Next.js project requires architectural decisions upfront: database choice, authentication strategy, state management, API design. You’re not dragging blocks; you’re writing components, managing dependencies, handling errors, writing tests. For a small studio or solo developer, the overhead is real.</p> <p>That said, the developer experience in 2026 is genuinely good. TypeScript tooling is excellent, component libraries like shadcn/ui have removed enormous amounts of boilerplate, and deployment is faster than ever. If you have the skills or the team, full code gives you nothing you can’t build.</p> <p>Best for: SaaS products, web applications with user accounts, e-commerce with custom logic, anything requiring a real backend, projects with long-term scale requirements.</p> <h2>How to Actually Choose: A Practical Framework</h2> <p>Here’s the decision tree I tend to use when scoping a new project.</p> <p>Start with the question: does this project need user accounts, custom logic, or a real database relationship beyond basic CMS fields? If yes, you’re in full code territory unless you want to spend months patching low-code workarounds.</p> <p>If no, ask: does the design require significant custom animation, unusual layout patterns, or component-level interactivity? If yes, Framer’s low-code model is worth serious consideration. If the design is relatively conventional, Webflow’s no-code environment will get you to launch faster.</p> <p>Timeline and budget matter enormously. A startup with two weeks and a tight budget to validate an idea should not be commissioning a bespoke Next.js application. A growing platform with paying users and a development team should not be running on Webflow CMS bolted to four third-party services.</p> <h2>The Hybrid Reality Most Projects Actually Live In</h2> <p>The honest truth about the no-code vs low-code vs full code 2026 decision is that most real-world projects are hybrid. A marketing site in Webflow or Framer pulling data from a headless CMS, connected to a Next.js backend that handles authentication and payments. Or a Framer front-end with code overrides calling a lightweight API. These architectures are increasingly common, and they work well when scoped deliberately.</p> <p>The mistake is letting the approach choose itself by default. Picking Webflow because you’ve always used Webflow, or defaulting to Next.js because it feels more serious. The tool should serve the project, not the other way around. Get that decision right upfront and everything downstream is easier.</p> <h2>Frequently Asked Questions</h2> <h3>Is Webflow good enough for a real business website in 2026?</h3> <p>Absolutely, for most marketing and content-driven sites. Webflow handles CMS, SEO, hosting, and interactions well enough for the vast majority of business websites. Where it struggles is with complex user logic, real databases, and application-level features.</p> <h3>Can Framer replace a developer entirely?</h3> <p>For design-heavy marketing sites and portfolios, Framer can often get a designer to a shipped product without a developer. However, anything requiring custom backend logic, authentication, or complex data handling will still need developer involvement, either through Framer’s code overrides or a separate API.</p> <h3>When should I use Next.js instead of a no-code platform?</h3> <p>Use Next.js when your project needs user accounts, complex data relationships, a custom API, or any logic that goes beyond what a CMS can handle. It’s also the better choice when performance at scale, long-term maintainability, or bespoke functionality are priorities.</p> <h3>How much does it cost to build with Webflow vs Next.js?</h3> <p>Webflow’s pricing starts from around £14 per month for basic sites, scaling up to £35+ for CMS and e-commerce plans. Next.js itself is open-source and free, but you’ll factor in hosting (Vercel’s free tier is generous, paid plans start around £16 per month) plus development time, which is significantly higher than no-code.</p> <h3>What is the best build approach for a SaaS startup in 2026?</h3> <p>Most SaaS products genuinely need full code, specifically a framework like Next.js, because user authentication, billing, dashboards, and data logic require real engineering. You might use a no-code tool for the marketing landing page, but the actual product needs a proper codebase.</p> <p><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "Is Webflow good enough for a real business website in 2026?", "acceptedAnswer": { "@type": "Answer", "text": "Absolutely, for most marketing and content-driven sites. Webflow handles CMS, SEO, hosting, and interactions well enough for the vast majority of business websites. Where it struggles is with complex user logic, real databases, and application-level features." } }, { "@type": "Question", "name": "Can Framer replace a developer entirely?", "acceptedAnswer": { "@type": "Answer", "text": "For design-heavy marketing sites and portfolios, Framer can often get a designer to a shipped product without a developer. However, anything requiring custom backend logic, authentication, or complex data handling will still need developer involvement, either through Framer's code overrides or a separate API." } }, { "@type": "Question", "name": "When should I use Next.js instead of a no-code platform?", "acceptedAnswer": { "@type": "Answer", "text": "Use Next.js when your project needs user accounts, complex data relationships, a custom API, or any logic that goes beyond what a CMS can handle. It's also the better choice when performance at scale, long-term maintainability, or bespoke functionality are priorities." } }, { "@type": "Question", "name": "How much does it cost to build with Webflow vs Next.js?", "acceptedAnswer": { "@type": "Answer", "text": "Webflow's pricing starts from around £14 per month for basic sites, scaling up to £35+ for CMS and e-commerce plans. Next.js itself is open-source and free, but you'll factor in hosting (Vercel's free tier is generous, paid plans start around £16 per month) plus development time, which is significantly higher than no-code." } }, { "@type": "Question", "name": "What is the best build approach for a SaaS startup in 2026?", "acceptedAnswer": { "@type": "Answer", "text": "Most SaaS products genuinely need full code, specifically a framework like Next.js, because user authentication, billing, dashboards, and data logic require real engineering. You might use a no-code tool for the marketing landing page, but the actual product needs a proper codebase." } } ] } </script></p> </div> <div style="margin-top:var(--wp--preset--spacing--40)" class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/no-code-vs-low-code-vs-full-code-2026/"><time datetime="2026-05-31T15:52:47+00:00">May 31, 2026</time></a></div></div> </li><li class="wp-block-post post-156 post type-post status-publish format-standard has-post-thumbnail hentry category-coding category-design category-web-design tag-build-design-system-figma-2026 tag-design-tokens tag-developer-handoff-design-system tag-figma-component-architecture tag-tokens-studio-figma"> <div class="wp-block-group alignfull is-layout-flow wp-block-group-is-layout-flow" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"><figure style="aspect-ratio:3/2" class="wp-block-post-featured-image"><a href="https://launchpad-design.co.uk/how-to-build-a-design-system-figma-tokens-studio-2026/" target="_self" ><img width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-working-on-a-build-design-system-figma-2026-project-1.png" class="attachment-full size-full wp-post-image" alt="How to Build a Design System From Scratch in 2026 Using Figma and Tokens Studio" style="width:100%;height:100%;object-fit:cover;" decoding="async" loading="lazy" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-working-on-a-build-design-system-figma-2026-project-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-working-on-a-build-design-system-figma-2026-project-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-working-on-a-build-design-system-figma-2026-project-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-working-on-a-build-design-system-figma-2026-project-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure> <h2 class="wp-block-post-title has-x-large-font-size"><a href="https://launchpad-design.co.uk/how-to-build-a-design-system-figma-tokens-studio-2026/" target="_self" >How to Build a Design System From Scratch in 2026 Using Figma and Tokens Studio</a></h2> <div class="entry-content alignfull wp-block-post-content has-medium-font-size is-layout-flow wp-block-post-content-is-layout-flow"><p>Design systems have gone from being the exclusive obsession of large product teams at Monzo or the BBC to something every serious designer and developer needs to understand. And honestly? The barrier to entry has never been lower. If you want to <strong>build a design system in Figma 2026</strong> that actually scales, that your devs will love, and that won’t collapse into chaos six months later, this guide is for you. We’re going step by step, and we’re bringing <a href="https://tokens.studio/" rel="noopener noreferrer">Tokens Studio</a> along for the ride, because design tokens are where the real power lives.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-working-on-a-build-design-system-figma-2026-project-1.png" alt="Designer working on a build design system Figma 2026 project at a modern London studio workstation" class="wp-image-154" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-working-on-a-build-design-system-figma-2026-project-1.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-working-on-a-build-design-system-figma-2026-project-1-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-working-on-a-build-design-system-figma-2026-project-1-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/designer-working-on-a-build-design-system-figma-2026-project-1-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Designer working on a build design system Figma 2026 project at a modern London studio workstation</figcaption></figure> <h2>Why Design Tokens Are the Foundation You Can’t Skip</h2> <p>Before you touch a single component, you need to sort your tokens. Think of tokens as variables for your design decisions. Colour values, spacing increments, font sizes, border radii, shadow depths, all of it lives in tokens rather than being hard-coded into individual components. The moment you hardcode <code>#1A1A2E</code> directly into 47 components, you’ve built a maintenance nightmare, not a system.</p> <p>Tokens Studio (the Figma plugin) lets you define, organise, and sync tokens in a JSON format that your developers can consume directly. It also integrates with Style Dictionary, which transforms those tokens into platform-specific outputs: CSS custom properties for the web, Swift constants for iOS, XML for Android. That’s the handoff pipeline sorted before a single component is drawn.</p> <h3>Naming Your Tokens Properly</h3> <p>Naming is where most teams go wrong. There are broadly three tiers of tokens, and understanding them saves enormous grief later.</p> <ul> <li><strong>Primitive (global) tokens:</strong> Raw values. <code>color.blue.500 = #3B82F6</code>. These are the periodic table of your system. Never reference them directly in components.</li> <li><strong>Semantic (alias) tokens:</strong> Meaningful assignments. <code>color.action.primary = {color.blue.500}</code>. This is what your components actually reference.</li> <li><strong>Component tokens:</strong> Scoped to a specific component. <code>button.background.default = {color.action.primary}</code>. Optional but powerful for complex components.</li> </ul> <p>The reason for this three-tier structure? When your brand pivots from blue to teal (and it will happen, trust me), you update one primitive token and the entire system propagates the change. Magic, but actually just good architecture.</p> <h2>Setting Up Tokens Studio in Figma</h2> <p>Install Tokens Studio from the Figma Community. Once it’s running, you’ll see a panel where you can create token sets. Start with a <code>global</code> set for your primitives and a <code>semantic</code> set that references them. In Tokens Studio, you reference another token using curly brace syntax: <code>{color.blue.500}</code>.</p> <p>For teams working collaboratively, connect Tokens Studio to a GitHub repository. Your token JSON lives in source control alongside your code. Designers push token changes via the plugin; developers pull them and run Style Dictionary to generate updated CSS variables. The design-to-code gap narrows dramatically. According to the <a href="https://www.gov.uk/guidance/government-design-principles" rel="noopener noreferrer">UK Government Design Principles</a>, consistency and clarity are foundational to good service design, and a token-based system is precisely how you enforce both at scale.</p> <figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://launchpad-design.co.uk/wp-content/uploads/2026/05/close-up-of-figma-and-tokens-studio-json-panel-used-to-build-2.png" alt="Close-up of Figma and Tokens Studio JSON panel used to build design system in Figma 2026" class="wp-image-155" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/05/close-up-of-figma-and-tokens-studio-json-panel-used-to-build-2.png 1024w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/close-up-of-figma-and-tokens-studio-json-panel-used-to-build-2-300x300.png 300w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/close-up-of-figma-and-tokens-studio-json-panel-used-to-build-2-150x150.png 150w, https://launchpad-design.co.uk/wp-content/uploads/2026/05/close-up-of-figma-and-tokens-studio-json-panel-used-to-build-2-768x768.png 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Close-up of Figma and Tokens Studio JSON panel used to build design system in Figma 2026</figcaption></figure> <h2>Component Architecture: Building for Scale</h2> <p>Now the fun part. Components in Figma should follow an Atomic Design hierarchy, even if you don’t call it that out loud in your team documentation.</p> <h3>Atoms First</h3> <p>Build your smallest, indivisible elements first. Buttons, input fields, checkboxes, radio buttons, badges, icons. Each atom should use semantic tokens exclusively, never raw values. Use Figma’s component properties to handle variants: state (default, hover, active, disabled), size (small, medium, large), and hierarchy (primary, secondary, ghost).</p> <p>Keep each atom in a dedicated page or dedicated section within a page. Organise your layers obsessively. Naming matters here: use the <code>Group/Component Name</code> slash convention so Figma’s asset panel presents them cleanly. <code>Button/Primary/Default</code> reads like a file path, which is exactly what it is.</p> <h3>Molecules and Organisms</h3> <p>Molecules combine atoms into slightly more complex chunks. A form field is a molecule: it combines a label atom, an input atom, and a helper text atom. An organism is a full section: a navigation bar, a hero block, a card grid. Each layer of composition should reference its children as nested component instances, not as detached copies. Detaching components is the design system equivalent of deleting a git history.</p> <h3>Using Figma Variables Alongside Tokens Studio</h3> <p>Figma’s native Variables (introduced in 2023 and considerably more mature now in 2026) and Tokens Studio overlap in interesting ways. Figma Variables are great for live mode switching, light and dark themes, for instance, because they’re native to the runtime. Tokens Studio is better for complex multi-brand setups and for the developer export pipeline. In practice, many teams use both: Variables for the Figma-side interactive prototyping experience, Tokens Studio for the actual production handoff. It’s not either/or; it’s knowing which tool solves which problem.</p> <h2>Developer Handoff That Doesn’t Make Developers Want to Quit</h2> <p>When you <strong>build a design system in Figma 2026</strong>, the handoff process is where the theory meets reality. A few non-negotiable practices:</p> <ul> <li><strong>Token JSON in the repo:</strong> Developers should be able to run <code>npm run build:tokens</code> and get updated CSS custom properties automatically. No more screenshots of hex codes.</li> <li><strong>Component documentation:</strong> Use Figma’s built-in description fields to document intended behaviour, states, and usage restrictions. If a component shouldn’t be used without an icon, say so in the description.</li> <li><strong>Storybook integration:</strong> If your devs are working in React or Vue, push them towards maintaining a Storybook instance that mirrors the Figma component library. When the two drift apart, you have a system problem, not a communication problem.</li> <li><strong>Change logs:</strong> Every token or component update should be logged. A simple markdown file in the repo works fine. Designers tend to forget that a subtle colour tweak can break contrast ratios across an entire product.</li> </ul> <h2>Keeping the System Alive (The Hard Bit)</h2> <p>Building a design system is about 30% of the work. The other 70% is governance, iteration, and adoption. Appoint a system owner, even if it’s a rotating responsibility. Schedule quarterly audits of your token sets and component library. Create a clear contribution process so product teams can propose additions without every random one-off component ending up in the core library.</p> <p>Teams that genuinely succeed at this, whether they’re a ten-person startup in Sheffield or a hundred-person product org in London, share one trait: they treat the design system as a product in its own right. It has a roadmap, a backlog, and real users (the rest of the design and engineering team).</p> <p>The payoff is real. Faster prototyping, dramatically reduced QA cycles, consistent accessibility compliance, and designers who can spend their time solving actual UX problems rather than recreating the same button variant for the fourteenth time. That’s why so many teams are keen to <strong>build a design system in Figma 2026</strong> rather than continuing to wing it with ad hoc component libraries.</p> <p>If you take one thing from all of this: start with your tokens. Get the naming right. Everything else builds on top of that foundation, and a solid foundation means the whole system scales without drama. Now go make something properly good.</p> <h2>Frequently Asked Questions</h2> <h3>What is a design token and why does it matter for a design system?</h3> <p>A design token is a named variable that stores a design decision, such as a colour value, spacing size, or font size. Rather than hardcoding raw values into components, you reference tokens, which means updating a single token automatically propagates changes across the entire system without manual edits.</p> <h3>Do I need to pay for Tokens Studio to use it with Figma?</h3> <p>Tokens Studio has a free tier that covers basic token management and is perfectly usable for small teams or solo projects. The Pro tier unlocks advanced features like GitHub, GitLab, and Azure DevOps sync, multi-file token sets, and themes, which are essential for larger product teams managing multiple brands or complex theming.</p> <h3>What is the difference between Figma Variables and Tokens Studio?</h3> <p>Figma Variables are a native Figma feature suited to live prototype switching, such as toggling between light and dark mode directly in the canvas. Tokens Studio is a plugin that excels at complex token structures, multi-brand setups, and generating developer-ready outputs via Style Dictionary. Many teams use both together rather than choosing one over the other.</p> <h3>How long does it take to build a design system from scratch in Figma?</h3> <p>A basic but functional token-based design system with core atoms and a documented handoff pipeline can take one to three weeks for an experienced designer working full-time. A comprehensive system covering typography, spacing, colour, elevation, motion, and a full component library for a mature product can take two to four months. The governance and adoption phase never really ends.</p> <h3>How do I make sure developers actually use the design system?</h3> <p>The single biggest driver of developer adoption is reducing friction in the handoff process. When tokens are available as auto-generated CSS custom properties or platform-specific constants directly from the repo, developers don’t need to manually transcribe values, which removes a major pain point. Maintaining a Storybook that mirrors the Figma library also helps bridge the gap between design intent and coded implementation.</p> <p><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "What is a design token and why does it matter for a design system?", "acceptedAnswer": { "@type": "Answer", "text": "A design token is a named variable that stores a design decision, such as a colour value, spacing size, or font size. Rather than hardcoding raw values into components, you reference tokens, which means updating a single token automatically propagates changes across the entire system without manual edits." } }, { "@type": "Question", "name": "Do I need to pay for Tokens Studio to use it with Figma?", "acceptedAnswer": { "@type": "Answer", "text": "Tokens Studio has a free tier that covers basic token management and is perfectly usable for small teams or solo projects. The Pro tier unlocks advanced features like GitHub, GitLab, and Azure DevOps sync, multi-file token sets, and themes, which are essential for larger product teams managing multiple brands or complex theming." } }, { "@type": "Question", "name": "What is the difference between Figma Variables and Tokens Studio?", "acceptedAnswer": { "@type": "Answer", "text": "Figma Variables are a native Figma feature suited to live prototype switching, such as toggling between light and dark mode directly in the canvas. Tokens Studio is a plugin that excels at complex token structures, multi-brand setups, and generating developer-ready outputs via Style Dictionary. Many teams use both together rather than choosing one over the other." } }, { "@type": "Question", "name": "How long does it take to build a design system from scratch in Figma?", "acceptedAnswer": { "@type": "Answer", "text": "A basic but functional token-based design system with core atoms and a documented handoff pipeline can take one to three weeks for an experienced designer working full-time. A comprehensive system covering typography, spacing, colour, elevation, motion, and a full component library for a mature product can take two to four months. The governance and adoption phase never really ends." } }, { "@type": "Question", "name": "How do I make sure developers actually use the design system?", "acceptedAnswer": { "@type": "Answer", "text": "The single biggest driver of developer adoption is reducing friction in the handoff process. When tokens are available as auto-generated CSS custom properties or platform-specific constants directly from the repo, developers don't need to manually transcribe values, which removes a major pain point. Maintaining a Storybook that mirrors the Figma library also helps bridge the gap between design intent and coded implementation." } } ] } </script></p> </div> <div style="margin-top:var(--wp--preset--spacing--40)" class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/how-to-build-a-design-system-figma-tokens-studio-2026/"><time datetime="2026-05-31T08:05:37+00:00">May 31, 2026</time></a></div></div> </li></ul> <div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--60);padding-bottom:var(--wp--preset--spacing--60)"></div> <div class="wp-block-group alignwide has-global-padding is-layout-constrained wp-block-group-is-layout-constrained"><nav class="alignwide wp-block-query-pagination is-content-justification-space-between is-layout-flex wp-container-core-query-pagination-is-layout-4dea2dca wp-block-query-pagination-is-layout-flex" aria-label="Pagination"> <a href="https://launchpad-design.co.uk/category/coding/" class="wp-block-query-pagination-previous"><span class='wp-block-query-pagination-previous-arrow is-arrow-arrow' aria-hidden='true'>←</span>Previous Page</a> <div class="wp-block-query-pagination-numbers"><a class="page-numbers" href="https://launchpad-design.co.uk/category/coding/">1</a> <span aria-current="page" class="page-numbers current">2</span> <a class="page-numbers" href="https://launchpad-design.co.uk/category/coding/page/3/">3</a> <a class="page-numbers" href="https://launchpad-design.co.uk/category/coding/page/4/">4</a></div> <a href="https://launchpad-design.co.uk/category/coding/page/3/" class="wp-block-query-pagination-next">Next Page<span class='wp-block-query-pagination-next-arrow is-arrow-arrow' aria-hidden='true'>→</span></a> </nav></div> </div> </div> <div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:25%"> <h2 class="wp-block-heading has-small-font-size" style="font-style:normal;font-weight:600;letter-spacing:1.6px;text-transform:uppercase">The Latest</h2> <div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div> <div class="wp-block-query is-layout-flow wp-block-query-is-layout-flow"><ul class="wp-block-post-template is-layout-flow wp-block-post-template-is-layout-flow"><li class="wp-block-post post-273 post type-post status-publish format-standard has-post-thumbnail hentry category-design category-nerdy category-web-design tag-accessible-colour-palette tag-colour-accessibility-design tag-colour-blindness-ui tag-inclusive-design-uk tag-wcag-contrast-ratio"> <div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-54d079fe wp-block-group-is-layout-flex"><h3 class="wp-block-post-title has-large-font-size"><a href="https://launchpad-design.co.uk/colour-blindness-accessible-palette-design-uk-wcag-2026/" target="_self" >Designing for Colour Blindness: What UK Product Teams Get Wrong About Accessible Palettes in 2026</a></h3> <div class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/colour-blindness-accessible-palette-design-uk-wcag-2026/"><time datetime="2026-09-17T20:01:35+00:00">September 17, 2026</time></a></div></div> <div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div> </li><li class="wp-block-post post-270 post type-post status-publish format-standard has-post-thumbnail hentry category-coding category-design category-web-design tag-cookie-banner-ux tag-cookie-consent-ui-design-uk-ico-pecr tag-ico-cookie-guidance-2026 tag-pecr-compliance-design tag-uk-web-privacy-design"> <div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-54d079fe wp-block-group-is-layout-flex"><h3 class="wp-block-post-title has-large-font-size"><a href="https://launchpad-design.co.uk/cookie-consent-ui-design-uk-ico-pecr-compliance/" target="_self" >Designing Cookie Consent Flows That Don’t Destroy Your Conversion Rate: A UK PECR and ICO Compliance Guide</a></h3> <div class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/cookie-consent-ui-design-uk-ico-pecr-compliance/"><time datetime="2026-09-16T19:21:30+00:00">September 16, 2026</time></a></div></div> <div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div> </li><li class="wp-block-post post-268 post type-post status-publish format-standard has-post-thumbnail hentry category-apps category-design category-web-design tag-empty-state-ui-design-saas-uk tag-product-ui-design tag-saas-onboarding-design tag-ux-design-patterns tag-web-app-ux"> <div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-54d079fe wp-block-group-is-layout-flex"><h3 class="wp-block-post-title has-large-font-size"><a href="https://launchpad-design.co.uk/empty-state-ui-design-saas-uk-onboarding/" target="_self" >How to Design Effective Empty States: The UI Pattern UK SaaS Products Consistently Underestimate</a></h3> <div class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/empty-state-ui-design-saas-uk-onboarding/"><time datetime="2026-09-14T15:41:26+00:00">September 14, 2026</time></a></div></div> <div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div> </li><li class="wp-block-post post-266 post type-post status-publish format-standard has-post-thumbnail hentry category-coding category-design category-web-design tag-css-clamp tag-design-tokens-css tag-fluid-typography tag-frontend-development tag-responsive-type-scale"> <div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-54d079fe wp-block-group-is-layout-flex"><h3 class="wp-block-post-title has-large-font-size"><a href="https://launchpad-design.co.uk/fluid-typography-css-clamp-uk-frontend-developers/" target="_self" >Fluid Typography With CSS clamp(): The Technique UK Frontend Developers Should Have Adopted Two Years Ago</a></h3> <div class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/fluid-typography-css-clamp-uk-frontend-developers/"><time datetime="2026-09-14T13:01:57+00:00">September 14, 2026</time></a></div></div> <div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div> </li><li class="wp-block-post post-263 post type-post status-publish format-standard has-post-thumbnail hentry category-coding category-nerdy category-web-design tag-frontend-icon-system tag-inline-svg-vs-svg-sprites tag-svg-icon-performance tag-svg-sprites-vs-inline-svg-2026-uk tag-uk-web-development"> <div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-54d079fe wp-block-group-is-layout-flex"><h3 class="wp-block-post-title has-large-font-size"><a href="https://launchpad-design.co.uk/svg-sprites-vs-inline-svg-2026-uk-frontend-developer/" target="_self" >Icon Fonts Are Dead, But Are SVG Sprites Still Worth Using in 2026? A UK Frontend Developer’s Take</a></h3> <div class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/svg-sprites-vs-inline-svg-2026-uk-frontend-developer/"><time datetime="2026-09-10T09:42:53+00:00">September 10, 2026</time></a></div></div> <div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div> </li><li class="wp-block-post post-261 post type-post status-publish format-standard has-post-thumbnail hentry category-design category-nerdy category-web-design tag-data-dashboard-ui-design-uk tag-data-visualisation-ux tag-government-data-tools-ui tag-information-dense-dashboard tag-uk-design-system"> <div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-54d079fe wp-block-group-is-layout-flex"><h3 class="wp-block-post-title has-large-font-size"><a href="https://launchpad-design.co.uk/data-dashboard-ui-design-uk-government-open-data/" target="_self" >How to Design Data-Dense Dashboards That Actually Work: Lessons From UK Government Open Data Tools</a></h3> <div class="wp-block-post-date has-small-font-size"><a href="https://launchpad-design.co.uk/data-dashboard-ui-design-uk-government-open-data/"><time datetime="2026-09-03T17:22:07+00:00">September 3, 2026</time></a></div></div> <div style="height:var(--wp--preset--spacing--20)" aria-hidden="true" class="wp-block-spacer"></div> </li></ul> </div> </div> </div> </main> <footer class="wp-block-template-part"> <div class="wp-block-group alignfull is-style-section-4 has-contrast-color has-base-background-color has-text-color has-background has-link-color wp-elements-5da341d6370005ca50e8ccec8a4d9236 has-global-padding is-layout-constrained wp-container-core-group-is-layout-58f2d333 wp-block-group-is-layout-constrained is-style-section-4--2" style="padding-top:var(--wp--preset--spacing--50);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--50);padding-left:var(--wp--preset--spacing--40)"> <div class="wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-686a51e3 wp-block-group-is-layout-flex"> <div class="wp-block-group wp-container-content-9cfa9a5a has-global-padding is-content-justification-left is-layout-constrained wp-container-core-group-is-layout-236ffaf5 wp-block-group-is-layout-constrained"> <p class="has-text-align-left wp-block-paragraph" style="font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.039), 0.9rem);font-style:normal;font-weight:600;letter-spacing:1px;text-transform:uppercase">Search</p> <form role="search" method="get" action="https://launchpad-design.co.uk/" class="wp-block-search__button-outside wp-block-search__icon-button wp-block-search" ><label class="wp-block-search__label screen-reader-text" for="wp-block-search__input-3" >Search</label><div class="wp-block-search__inside-wrapper" style="width: 100%"><input class="wp-block-search__input" id="wp-block-search__input-3" placeholder="" value="" type="search" name="s" required style="border-width: 1px"/><button aria-label="Search" class="wp-block-search__button has-background has-icon wp-element-button" type="submit" style="border-width: 1px;background-color: #f3931d"><svg class="search-icon" viewBox="0 0 24 24" width="24" height="24"> <path d="M13 5c-3.3 0-6 2.7-6 6 0 1.4.5 2.7 1.3 3.7l-3.8 3.8 1.1 1.1 3.8-3.8c1 .8 2.3 1.3 3.7 1.3 3.3 0 6-2.7 6-6S16.3 5 13 5zm0 10.5c-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5-2 4.5-4.5 4.5z"></path> </svg></button></div></form></div> </div> <div style="height:48px" aria-hidden="true" class="wp-block-spacer"></div> <div class="wp-block-group alignwide is-content-justification-space-between is-layout-flex wp-container-core-group-is-layout-1d0a7695 wp-block-group-is-layout-flex"> <div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex"><div class="is-default-size wp-block-site-logo"><a href="https://launchpad-design.co.uk/" class="custom-logo-link" rel="home"><img loading="lazy" width="731" height="279" src="https://launchpad-design.co.uk/wp-content/uploads/2026/01/launchpad_logo.jpg" class="custom-logo" alt="Launchpad Design news and articles" decoding="async" srcset="https://launchpad-design.co.uk/wp-content/uploads/2026/01/launchpad_logo.jpg 731w, https://launchpad-design.co.uk/wp-content/uploads/2026/01/launchpad_logo-300x115.jpg 300w" sizes="auto, (max-width: 731px) 100vw, 731px" /></a></div></div> </div> </div> </footer></div> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/twentytwentyfive/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script id="eztoc-scroll-scriptjs-js-extra"> var eztoc_smooth_local = {"scroll_offset":"30","add_request_uri":"","add_self_reference_link":""}; //# sourceURL=eztoc-scroll-scriptjs-js-extra </script> <script id="eztoc-scroll-scriptjs-js" src="https://launchpad-design.co.uk/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js?ver=2.0.88"></script> <script id="eztoc-js-cookie-js" src="https://launchpad-design.co.uk/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js?ver=2.2.1"></script> <script id="eztoc-jquery-sticky-kit-js" src="https://launchpad-design.co.uk/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js?ver=1.9.2"></script> <script id="eztoc-js-js-extra"> var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"\u003Cspan class=\"\"\u003E\u003Cspan class=\"eztoc-hide\" style=\"display:none;\"\u003EToggle\u003C/span\u003E\u003Cspan class=\"ez-toc-icon-toggle-span\"\u003E\u003Csvg style=\"fill: #999;color:#999\" xmlns=\"http://www.w3.org/2000/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"\u003E\u003Cpath d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"\u003E\u003C/path\u003E\u003C/svg\u003E\u003Csvg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http://www.w3.org/2000/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"\u003E\u003Cpath d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"/\u003E\u003C/svg\u003E\u003C/span\u003E\u003C/span\u003E","chamomile_theme_is_on":""}; //# sourceURL=eztoc-js-js-extra </script> <script id="eztoc-js-js" src="https://launchpad-design.co.uk/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js?ver=2.0.88-1789629145"></script> <script id="wp-emoji-settings" type="application/json"> {"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://launchpad-design.co.uk/wp-includes/js/wp-emoji-release.min.js?ver=7.0.5"}} </script> <script type="module"> /*! This file is auto-generated */ var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))}); //# sourceURL=https://launchpad-design.co.uk/wp-includes/js/wp-emoji-loader.min.js </script> </body> </html>