Tailwind CSS Academy · Lekcja

Strategia motywów dla wielu marek

Zaimplementują Państwo motywy wielu marek, zamieniając wartości zmiennych CSS w ramach różnych selektorów głównych lub atrybutów data-theme.

Lekcja 3 z 413 kroki

Strategia motywów dla wielu marek to bezpłatna lekcja Tailwind CSS Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Tailwind CSS Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Tailwind CSS Academy zawiera 4 lekcji w sumie.

Części tej lekcji nie zostały jeszcze przetłumaczone i są wyświetlane po angielsku.

What Is Multi-Brand Theming?

Multi-brand theming means a single codebase renders different visual identities for different clients, products, or sub-brands. A SaaS company might share one React application between ten enterprise customers, each expecting their logo colors and typography. With a well-designed Tailwind token system, switching brands requires only swapping a set of CSS variable values — no code changes, no separate builds.

Root Selector Swapping Strategy

The simplest multi-brand strategy uses a data attribute on the root element to scope different variable sets. Each brand's variables live under a [data-brand='brandname'] block. JavaScript reads the active brand from configuration, an API, or a URL parameter and sets the attribute on document.documentElement. Tailwind utility classes reference the variables, so they automatically adopt the active brand's values.

/* globals.css */
[data-brand='acme'] {
  --color-primary: #e11d48;
  --color-surface: #fff1f2;
  --font-heading: 'Poppins', sans-serif;
}

[data-brand='globex'] {
  --color-primary: #0284c7;
  --color-surface: #f0f9ff;
  --font-heading: 'Inter', sans-serif;
}

/* Apply in JS */
document.documentElement.setAttribute('data-brand', 'acme');

Brand Token Files

Organize each brand's design decisions in a dedicated token file. This could be a JSON file, a JS module, or even fetched from an API. Keeping brand tokens isolated means a non-developer designer can update a brand's color by editing one JSON file without touching any component code. During deployment, the appropriate brand token file is selected based on the target environment or tenant ID.

// tokens/brands/acme.js
module.exports = {
  'color-primary': '#e11d48',
  'color-primary-hover': '#be123c',
  'color-surface': '#fff1f2',
  'color-text': '#1c1917',
  'radius-button': '0.25rem',
  'font-heading': 'Poppins'
};

// tokens/brands/globex.js
module.exports = {
  'color-primary': '#0284c7',
  'color-primary-hover': '#0369a1',
  'color-surface': '#f0f9ff',
  'color-text': '#0c4a6e',
  'radius-button': '9999px',
  'font-heading': 'Inter'
};

Injecting Brand Variables Dynamically

When the active brand is known at runtime (from user login or URL), inject its variables into the page dynamically using JavaScript. Iterate over the token object and call style.setProperty on document.documentElement. This approach does not require a page reload and works seamlessly with frameworks like React, where the brand context can be stored in a provider and updated on route change.

// applyBrand.js
function applyBrand(brandTokens) {
  const root = document.documentElement;
  Object.entries(brandTokens).forEach(([key, value]) => {
    root.style.setProperty('--' + key, value);
  });
}

// Usage
import acmeTokens from './tokens/brands/acme';
import globexTokens from './tokens/brands/globex';

const activeBrand = window.__BRAND__ || 'acme';
const brandMap = { acme: acmeTokens, globex: globexTokens };
applyBrand(brandMap[activeBrand]);

Tailwind Config for Multi-Brand

The Tailwind config remains brand-agnostic in a multi-brand setup. It only knows semantic variable names, not specific brand values. This is the key architectural decision: the config defines what tokens exist, but the brand files define what they mean. This clean separation means you can add a new brand without touching your Tailwind config or component classes at all.

// tailwind.config.js — brand-agnostic
module.exports = {
  theme: {
    extend: {
      colors: {
        primary: 'var(--color-primary)',
        'primary-hover': 'var(--color-primary-hover)',
        surface: 'var(--color-surface)',
        'text-base': 'var(--color-text)'
      },
      borderRadius: {
        btn: 'var(--radius-button)'
      },
      fontFamily: {
        heading: ['var(--font-heading)', 'system-ui']
      }
    }
  }
}

Build-Time Brand Selection

For applications where the brand is known at build time (different deployments for different clients), you can use environment variables to select the brand token file and inject it into the HTML as static CSS. This approach generates the smallest possible CSS for each brand and avoids any runtime variable-switching overhead. Each brand gets its own deployed artifact with hardcoded CSS variables.

// scripts/inject-brand-css.js
const brand = process.env.BRAND || 'acme';
const tokens = require('./tokens/brands/' + brand);

const css = ':root {\n' +
  Object.entries(tokens)
    .map(([k, v]) => '  --' + k + ': ' + v + ';')
    .join('\n') +
  '\n}';

require('fs').writeFileSync('src/brand-tokens.css', css);
console.log('Brand tokens written for:', brand);

Handling Brand-Specific Assets

Beyond colors, brands often need different logos, illustrations, and icon styles. Use a brand context in your framework to serve the correct assets. For logos, define a logo URL as a CSS variable and render it with an img tag whose src is set by JavaScript. For icons, use a brand-specific icon set mapped through the same token system.

// React BrandProvider example
const brandAssets = {
  acme: {
    logo: '/brands/acme/logo.svg',
    favicon: '/brands/acme/favicon.ico'
  },
  globex: {
    logo: '/brands/globex/logo.svg',
    favicon: '/brands/globex/favicon.ico'
  }
};

function BrandProvider({ brand, children }) {
  const assets = brandAssets[brand];
  return (
    <BrandContext.Provider value={assets}>
      {children}
    </BrandContext.Provider>
  );
}

Testing Multiple Brand Themes

Testing a multi-brand system requires verifying that every component looks correct in every brand theme. Create a theme switcher in your development environment that cycles through all registered brands with a single click. Write visual regression tests using tools like Playwright or Storybook's visual testing addon, capturing screenshots under each brand to catch unintended style leaks between themes.

<!-- Dev-only brand switcher in the corner -->
<div class="fixed bottom-4 right-4 flex gap-2 z-50">
  <button
    onclick="applyBrand('acme')"
    class="px-3 py-1 bg-red-600 text-white text-xs rounded"
  >Acme</button>
  <button
    onclick="applyBrand('globex')"
    class="px-3 py-1 bg-sky-600 text-white text-xs rounded"
  >Globex</button>
</div>

White-Labeling Considerations

White-labeling is multi-brand theming taken to its logical extreme: the client's brand is so complete that your company's identity is invisible. White-labeling requires careful planning of every visual element — not just colors but typography, border radii, spacing scales, and even motion design. Map all of these to tokens, confirm every component respects the token layer, and audit for any hardcoded values that would reveal the underlying platform.

/* Comprehensive white-label token set */
:root {
  /* Brand colors */
  --color-primary: ...;
  --color-secondary: ...;

  /* Typography */
  --font-body: ...;
  --font-heading: ...;
  --text-size-base: ...;

  /* Shapes */
  --radius-sm: ...;
  --radius-md: ...;
  --radius-full: 9999px;

  /* Motion */
  --duration-fast: 150ms;
  --duration-base: 250ms;
  --easing-default: cubic-bezier(0.4, 0, 0.2, 1);
}

Fallback Values and Graceful Degradation

Always provide fallback values for CSS variables to prevent invisible elements when a brand token file fails to load. The var(--name, fallback) syntax ensures a sensible default is used if the variable is undefined. These fallbacks should be your primary brand's values, so the base experience is always functional even if the brand switching mechanism fails.

/* With fallback values */
.card {
  background-color: var(--color-surface, #ffffff);
  color: var(--color-text, #111827);
  border-color: var(--color-border, #e5e7eb);
}

/* In Tailwind, fallbacks in config */
colors: {
  primary: 'var(--color-primary, #3b82f6)',
  surface: 'var(--color-surface, #ffffff)'
}

Brand Tokens in Storybook

Storybook is an excellent environment for developing and previewing multi-brand themes. Add a toolbar selector using the @storybook/addon-toolbars package that lists your available brands. When a brand is selected, apply its token file to the Storybook preview iframe. This lets you visually test every component story in every brand without switching between codebases or deployments.

// .storybook/preview.js
import { applyBrand } from '../src/utils/applyBrand';

export const globalTypes = {
  brand: {
    name: 'Brand',
    defaultValue: 'acme',
    toolbar: {
      items: ['acme', 'globex', 'initech']
    }
  }
};

export const decorators = [
  (Story, context) => {
    applyBrand(context.globals.brand);
    return Story();
  }
];

Quick Check

Test your understanding of Tailwind CSS Mastery concepts from this lesson.

Lesson Recap

In this lesson you learned: data attribute selectors scope brand variable sets to the root element, brand token files isolate each brand's design decisions, and the Tailwind config stays brand-agnostic referencing only semantic variable names. Next up we look at governing and documenting your token system for team consistency.

Bezpłatny start

Ucz się HTML dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
30
Lekcje
120

Często zadawane pytania

Czy lekcja „Strategia motywów dla wielu marek” jest bezpłatna?

Tak — pełny tekst „Strategia motywów dla wielu marek” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Tailwind CSS Academy, przejdź na CoddyKit PRO. Kurs Tailwind CSS Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Strategia motywów dla wielu marek”?

Zaimplementują Państwo motywy wielu marek, zamieniając wartości zmiennych CSS w ramach różnych selektorów głównych lub atrybutów data-theme. Ćwiczysz Tailwind CSS Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Tailwind CSS Academy?

Nie wymagamy żadnego doświadczenia. Tailwind CSS Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Strategia motywów dla wielu marek”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Tailwind CSS Academy?

Tak. Każda lekcja Tailwind CSS Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tokeny prymitywne a semantyczne
  2. Motywy oparte na zmiennych CSS
  3. Strategia motywów dla wielu marek
  4. Dokumentacja i zarządzanie tokenami
← Powrót do Tailwind CSS Academy