You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.2 KiB

D11 theme set up

What I would recommend for your stack Core stack Reset / normalize

Use:

Modern Normalize

Very small and sensible.

Design tokens / vars

Use either:

your own variables or selectively import from Open Props

Open Props

You do not need the whole library.

You can literally copy only the tokens you want.

Example:

:root { --font-sans: system-ui, sans-serif;

--size-1: 0.25rem; --size-2: 0.5rem; --size-3: 1rem; --size-4: 1.5rem;

--radius-2: 8px;

--surface-1: #ffffff; --surface-2: #f5f5f5;

--text-1: #111; --text-2: #555;

--brand: hsl(210 90% 50%); }

That alone gets you surprisingly far.

Native CSS nesting is now good enough

You can now do:

.card { padding: var(--size-4);

& h2 { margin-block-start: 0; }

& a { color: var(--brand); } }

No Sass needed.

Browser support is now solid.

Cascade layers are a huge replacement for old Sass architecture

This is one of the biggest modern CSS improvements.

@layer reset, tokens, base, layout, components, utilities;

Then:

@layer base { body { font-family: var(--font-sans); } }

This gives you predictable override behavior without specificity nightmares.

Honestly better than many old Sass architectures.

Container queries are transformative for Drupal theming

Instead of:

@media (min-width: 900px)

you can do:

@container (min-width: 40rem)

This is fantastic for:

paragraphs blocks views reusable Drupal components

because components respond to their container, not the viewport.

That maps beautifully to Drupal’s block-based structure.

Suggested file structure

Something like:

css/ reset.css tokens.css base.css layout.css components/ buttons.css cards.css forms.css navigation.css

Then load in your .libraries.yml.

Very maintainable.

I would honestly skip Pico entirely then

Given what you just said, I think you may actually prefer:

normalize/reset your own tokens semantic HTML native CSS features tiny component CSS

instead of Pico.

Because Pico is opinionated. You may eventually find yourself undoing its typography/layout assumptions.

Whereas your own token system:

stays tiny teaches future-you exactly how the site works avoids framework drift keeps Drupal Twig very clean Modern CSS features worth embracing immediately

These are absolutely worth using now:

clamp() font-size: clamp(1rem, 2vw, 1.5rem); logical properties margin-block: 1rem; padding-inline: 2rem;

Much cleaner than top/right/bottom/left.

:where()

Low-specificity selectors:

:where(article, section, aside) h2 { margin-top: 0; }

Excellent for maintainability.

color-mix() background: color-mix(in srgb, var(--brand), white 90%);

Incredibly useful.

Tooling I would still keep

Even without preprocessing, I’d still consider:

Vite only for: live reload JS bundling asset handling

NOT CSS transforms.

Or skip even that initially.

Modern Drupal theming can genuinely be:

CSS files ES modules libraries.yml done.

And that’s refreshing compared to the old webpack/gulp era.

This approach fits Drupal especially well

Drupal’s strengths are:

semantic HTML server rendering reusable structured content progressive enhancement

A lightweight native CSS architecture aligns with that extremely well.

You avoid importing frontend-app complexity into a CMS that doesn’t necessarily benefit from it.