docs
TYPO3 v14
Getting started  /  Introduction and architecture

01 — Introduction and architecture

What Yavi is

The Yavi Theme module, Design / Colors page — the whole brand palette on one screen
The Yavi Theme module, Design / Colors page — the whole brand palette on one screen

Yavi is a family of TYPO3 extensions:

ExtensionComposer nameRole
yavi_corewebagentur-yahya/yavi-coreThe framework: content elements, backend module, navigation variants, token system. Contains no brand design.
yavi_lucernewebagentur-yahya/yavi-lucerneA theme: business/agency look. Navy + gold, Inter.

yavi_core builds on Bootstrap Package (bk2k/bootstrap-package) and adds to it rather than replacing it: Bootstrap Package's content elements, image handling and SCSS compilation stay in place.

One rule that explains most of the design

!
yavi_core is the framework, not a design. Every value that makes a site look like Lucerne — the navy, the gold, Inter, the header proportions, the corner radii — lives in the theme, never in core.

This is why yavi_core ships neutral greys as defaults and why a theme declares its values completely rather than as a deviation: a sibling theme can then never inherit a value by accident.

The four layers

Before changing anything, decide which layer the change belongs to. Picking the wrong layer is the most common mistake made with this system.

LayerWhereApplies toDeployment needed
1 — Site settingsBackend module Yavi Theme → config/sites/<id>/settings.yamlone siteno
2 — Theme Setpackages/<theme>/Configuration/Sets/Full/settings.yamlevery site using that themeyes
3 — Theme SCSSpackages/<theme>/Resources/Public/Scss/every site using that themeyes
4 — Corepackages/yavi-core/every theme, every clientyes

Rule of thumb: anything that concerns only this client → layer 1. Anything that is the design → layer 2 or 3. Layer 4 only for genuine bugs or for features that benefit everyone.

A value set on a higher layer wins. An empty field on layer 1 does not mean "no value" — it means "fall through to layer 2, then 4".

How a page is styled

text
Site settings (layer 1)
        │  written by the backend module into config/sites/<id>/settings.yaml
        ▼
ThemeCssVariablesRenderer  →  <style> :root { --card-radius: …; --navbar-height: … } </style>
        │
        ▼
theme-<hash>.css  ←  compiled server-side from SCSS by scssphp (Bootstrap Package)
        │              Structure/*.scss  (geometry, behaviour — core)
        │              Skin/*.scss       (colour, shadow, decoration — theme may replace)
        ▼
the rendered page

Two consequences worth remembering:

Structure and Skin

Core's SCSS is split in two:

FolderContainsThemes
Scss/Structure/Geometry, layout, behaviour: what makes a card a card.rarely touched
Scss/Skin/Colour, shadow, border, decoration: what makes a card look like Lucerne.replaced per component family

A theme replaces a skin file wholesale for a component family instead of overriding single declarations. There are no cascade layers — the theme's file simply comes later.

The token system in one picture

scss
// yavi_core: _variables-defaults.scss — the theme-independent default
--card-radius: calc(12px * var(--theme-radius-scale, 1));

// yavi_lucerne: _variables.scss — the theme's own value
--card-radius: 25px;

// site settings (layer 1) — emitted into the page head
--card-radius: calc(18px * var(--theme-radius-scale, 1));

Everything a site can configure is a CSS custom property, and every custom property has exactly one owner. See 15 — Theming.

What you get out of the box

The same page at 390px — the mobile navigation is a separate variant, not the desktop menu folded up
The same page at 390px — the mobile navigation is a separate variant, not the desktop menu folded up