renovero.ch styleguide
Snapshot: 2026-08-14 17:55 · changelog
Element-based styleguide reverse-engineered from the live site (www.renovero.ch/de) on 2026-07-21.
The baseline is stock Tailwind — preflight plus the default theme. This guide documents only what
changes on top of that baseline: the font, the brand colors, and a handful of component patterns.
Wherever Tailwind's font-size/line-height pair is close to the measured value, the Tailwind utility is
used as-is — the samples below render at the Tailwind values, not the measured ones, with deltas called
out per style. Where the rebuild implementation (kap-static-frontend) deliberately deviates from the live
site — desktop heading sizes, link underlines — this guide follows the rebuild and marks the deviation.
Everything is mobile-first on Tailwind's built-in breakpoints: headings carry an lg: step
(specs in sections 3–4), while body text and buttons are identical at both ends — the one exception is
form inputs, which render 16px below md to prevent iOS focus zoom.
Utility names are Tailwind v4.
- 1 · Foundations
- 2 · Colors
- 3 · Type scale
- 4 · Mapping
- 5 · Links
- 6 · Buttons
- 7 · Forms
- 8 · Surfaces
- 9 · Header & footer
- 10 · Components
1 · Foundations
Everything not listed here is stock Tailwind. The full delta from a default install: one font, eight brand colors, navy as the text color, and a 2px button radius.
| Baseline | Tailwind preflight + default theme. No global CSS beyond the @theme block in section 2. |
|---|---|
| Font family | --font-sans: "Encode Sans", sans-serif — the only font; weights in use: font-normal/medium/semibold/bold/extrabold (400–800) |
| Body | text-navy on white — navy is the default text color for everything; every text-* utility carries its own leading |
| Shape | Buttons: rounded-xs (2px) — the only non-default shape decision. Overlays, dialogs, tooltips: whatever Tailwind/component defaults provide. |
| Iconography | Font Awesome 7 (Free/Pro/Duotone/Sharp variables present on the live site) |
| Live-site provenance | The current site is Angular + Angular Material; its Material specs (4px overlay radius, 36px buttons, gray snackbars, 48px touch targets) are framework defaults, not design decisions — a rebuild replaces them with Tailwind defaults. The AI chat wizard is a self-contained Flutter web embed that ignores page CSS; pages only provide its slot. |
2 · Colors
Measured usage: navy is the text color for ~85% of elements; white and light gray-blue carry the surfaces; yellow is reserved for CTAs and social icons. None of these map to Tailwind default colors — define them as theme tokens.
Tailwind v4 theme block — together with text-navy as the base text color, this is the entire configuration delta from a stock install:
@theme {
--font-sans: "Encode Sans", sans-serif;
--color-navy: #203768;
--color-navy-hover: #162850;
--color-yellow: #F9B415;
--color-yellow-hover: #FFC84A;
--color-gray-blue: #DBDFE7; /* 50% via bg-gray-blue/50 */
--color-slate: #637395;
--color-muted: #818BA1;
--color-dark-slate: #27455C;
--color-light-gray: #F8F8F8;
}
3 · Type scale (Tailwind)
The live site's two overlapping typography generations (text-1…5/h1…h5 and text-base…/v2-heading-*) collapse onto nine Tailwind steps. All type is navy with no letter-spacing except the uppercase labels; headings are font-semibold and carry no margins except h1 (mb-4). Headings switch at the built-in lg: breakpoint, and the rebuild renders desktop headings one Tailwind step smaller than the live site — a deliberate choice from the visual-parity work, not an approximation error. Samples render at the desktop values.
text-4xl lg:text-5xl font-semibold mb-4 → 36/40 · 48px/leading-none (live site measured 36/42 mobile, 64/68 desktop — desktop deliberately downscaled)
text-3xl lg:text-4xl font-semibold → 30/36 · 36/40 (live site measured 28/36 mobile, 48/56 desktop — desktop deliberately downscaled)
text-2xl lg:text-3xl font-semibold → 24/32 · 30/36 (mobile 24/32 exact) · desktop measured 32/40 · exact for heading-big (30/36)
text-xl lg:text-2xl font-semibold → 20/28 · 24/32 (desktop exact) · mobile measured 22/28 · also the FAQ question size
text-xl font-semibold → 20px / 28px (exact for h5) · absorbs heading-emphasis (21/28)
text-lg leading-6 font-semibold → 18px / 24px (exact)
Text large (text-lg) — Erhalten Sie kostenlos mehrere Offerten von Handwerkern aus Ihrer Region und wählen Sie das beste Angebot.
text-lg → 18px / 28px (measured 18/30)
Text base (text-base) — Erhalten Sie kostenlos mehrere Offerten von Handwerkern aus Ihrer Region und wählen Sie das beste Angebot. Main article copy.
text-base → 16px / 24px (exact for text-base 16/24) · absorbs text-1 (16/26 — use leading-relaxed for exact 26px) and text-2 (15px — retired)
Text small (text-sm) — Erhalten Sie kostenlos mehrere Offerten von Handwerkern aus Ihrer Region. Button labels, nav and footer links.
text-sm → 14px / 20px (measured 14/21–22 across text-3, text-5, text-small)
Text tiny (text-xs) — Erhalten Sie kostenlos mehrere Offerten von Handwerkern. Captions and meta text.
text-xs → 12px / 16px (exact for text-4) · absorbs text-tiny (12/18)
Uppercase label small — zwölf pixel
text-xs leading-5 font-semibold uppercase tracking-wider → 12px / 20px / .05em (measured 12/20/600/+0.5px — tracking .042em ≈ wider)
Uppercase label base — fünfzehn pixel
text-base font-bold uppercase tracking-wide → 16px / 24px / .025em (measured 15/24/700/+0.5px)
--medium → font-medium, --semibold/-important → font-semibold, --bold (700) → font-bold, --extrabold (800) → font-extrabold. Muted text: text-muted (#818BA1); disabled/placeholder-on-dark: text-gray-blue.4 · Mapping: renovero classes → Tailwind
Full translation table for the live site's typography-* utilities. Heading rows show mobile → desktop (measured at 390px and 1440px); "exact" means Tailwind's pair equals the measured pair.
| renovero class(es) | Measured | Tailwind | Fit |
|---|---|---|---|
typography-h1, typography-heading-extra-large | 36/42 → 64/68 · 600 | text-4xl lg:text-5xl font-semibold | 36/40 → 48/48 — desktop deliberately downscaled |
typography-h2, typography-v2-heading-large | 28/36 → 48/56 · 600 | text-3xl lg:text-4xl font-semibold | 30/36 → 36/40 — desktop deliberately downscaled |
typography-h3, typography-v2-heading-h3, typography-v2-heading-medium | 24/32 → 32/40 · 600 | text-2xl lg:text-3xl font-semibold | 24/32 exact → 30/36 |
typography-heading-big(-important, -no-scale) | 30/36–40 | text-3xl (+ weight) | exact |
typography-h4, typography-v2-heading-h4 | 22/28 → 24/32 · 600 | text-xl lg:text-2xl font-semibold | 20/28 → 24/32 exact |
typography-h5 | 20/28 | text-xl (+ weight) | exact |
typography-heading-emphasis-important, *-to-heading-emphasis* | 21/28 · 600 | text-xl font-semibold | 20/28 — 21px folded into 20px |
typography-heading-small-important, text-base-to-heading-small-important | 18/24 · 600 | text-lg leading-6 font-semibold | exact |
typography-text-large(-important), typography-encode-sans-text, text-mobile-large | 18/30 | text-lg | 18/28 |
typography-text-1(--medium, --semibold) | 16/26 | text-base (+ weight) | 16/24 — or leading-relaxed for exact 26 |
typography-text-base(-important), text-small-base(-important), encode-sans-text-no-scale | 16/24 | text-base (+ weight) | exact |
typography-text-2 | 15/– | text-base | 15px retired → 16px |
typography-text-2--bold-uppercase | 15/24 · 700 · +0.5px | text-base font-bold uppercase tracking-wide | 16/24 |
typography-text-3(--medium, --semibold), typography-text-5(--medium, --bold) | 14/22 | text-sm (+ weight) | 14/20 — button label style |
typography-text-small(-important, -bold, -to-*) | 14/21 | text-sm (+ weight) | 14/20 |
typography-checkbox-label | 14/24 · 500 | text-sm leading-6 font-medium | exact |
typography-text-4(--medium) | 12/16 | text-xs (+ weight) | exact |
typography-text-tiny(-important), mob-tiniest-tab-text-tiny-important | 12/18 · 400/600 | text-xs (+ weight) | 12/16 |
typography-text-4--semibold-uppercase | 12/20 · 600 · +0.5px | text-xs leading-5 font-semibold uppercase tracking-wider | exact |
typography-text-4--extrabold-uppercase | 12/20 · 800 · +0.5px | text-xs leading-5 font-extrabold uppercase tracking-wider | exact |
typography-link | navy · no underline | content: text-navy underline · chrome: text-navy hover:underline | deliberate change — underline restored as affordance |
5 · Links
Links in content are underlined — the underline is the affordance. Chrome links (header, footer) are plain navy/white but always underline on hover. Yellow is used for links on dark surfaces.
.logo-link, some footer anchors) fall back to the browser default rgb(0,0,238) underlined — there is no global a reset. Tailwind preflight fixes this for free (anchors inherit color, no underline).6 · Buttons
One button component with color variants. Label is always text-sm font-semibold; flat, 2px radius, color-only hover. Hover any button below to see the hover colors.
default: bg-navy text-white hover:bg-navy-hover · .yellow: bg-yellow text-navy hover:bg-yellow-hover · .gray: bg-gray-blue/50 text-navy
search: py-4 px-10 (home hero) or py-4 px-6 (directory) · compact: py-1 px-2.5 min-h-9
| Property | Tailwind | Notes |
|---|---|---|
| Label | text-sm font-semibold | measured 14/22 · 600 → 14/20 |
| Padding | py-2 px-4 · search py-4 px-10/px-6 · compact py-1 px-2.5 | all exact |
| Min-height | min-h-12 (compact: min-h-9) | measured 46px, rounded to the scale (48px) |
| Radius | rounded-xs | 2px exact |
| Shadow / transform | none | flat buttons, color-only hover |
| Width modifiers | w-full, max-md:w-full | replaces .full-width, .full-width-mobile |
7 · Forms
The signature pattern is a borderless, square input inside a translucent gray holder, usually paired with a yellow search button. No visible borders or radii on text inputs. The key dimensions land exactly on the Tailwind spacing scale.
holder: flex items-center h-14 bg-gray-blue/50 rounded-none — input: h-12 px-5 font-medium text-navy bg-transparent border-none, 16px on mobile and md:text-sm from md up (16px prevents iOS focus zoom on touch layouts)
| Element | Tailwind / values |
|---|---|
| Label | text-base text-navy (checkbox labels: text-sm leading-6 font-medium) |
| Placeholder | placeholder:text-navy/80 |
| Focus state | :focus-visible on inputs, selects, textareas, buttons, and links: 2px solid navy outline, 2px offset |
| Checkbox / radio | accent-navy |
| Selection controls, pickers, overlays | Tailwind/component defaults, with navy (accent-navy / bg-navy text-white) as the selected/active color and slate for secondary states. The live site's Material specs here were framework defaults — not worth reproducing. |
8 · Surfaces & sections
Pages alternate white with light gray-blue bands; navy and dark slate are used for high-contrast promo sections. Content sits flat on these bands — no borders or shadows on standard sections.
bg-gray-blue (.background-holder, .container-hero, directory band)bg-navy text-white (.section-background-blue), yellow CTAsbg-dark-slate text-white image-overlay sections (homepage testimonials/steps)9 · Header, breadcrumbs & footer
The header is transparent/white with text-sm navy links and no border or shadow: 104px tall on desktop (h-26), 48px on mobile (h-12), where the nav collapses to "Anmelden" + a burger menu. The footer is two-tone (navy top block, gray-blue legal bar) and structurally identical at both viewports. Measured at 390px and 1440px.
breadcrumbs: text-base text-navy · separators text-muted · desktop-only (hidden md:flex — the live site hides them on mobile)
FAQ question: text-2xl font-semibold (exact) · group titles: text-3xl font-semibold
footer top: bg-navy · text-sm text-white hover:underline links · yellow circular social buttons (size-10 rounded-full bg-yellow text-navy) — footer bottom: bg-gray-blue text-navy text-sm, links hover:underline
10 · Components (src/components/ui)
Shared UI primitives composed by the Storyblok blocks and page templates instead of being re-hand-rolled per page. Each entry is one component in src/components/ui/; the running list is in the repo's styleguide CHANGELOG.md.
Container
The page/section width wrapper. Centralizes the shell that was hand-rolled ~30× across templates, blocks, and chrome.
shown at reduced scale: highlighted area = the container, dashed strip = the viewport
| Part | Tailwind / prop |
|---|---|
| Base | mx-auto max-w-6xl px-4 md:px-6 |
width="narrow" | max-w-4xl in place of max-w-6xl |
fullWidth | adds w-full |
padding (prop) | default px-4 md:px-6; override e.g. px-4 md:px-7, px-4 md:px-0, or "" for none |
class (per use) | layout extras (py-* / flex / grid / gap-*) stay on the caller |
Canonical page width is max-w-6xl (1152px). A few templates still carry md:px-7 / md:px-[28px] (28px) vs the canonical md:px-6 (24px) — candidates to converge.
TabLink
Uppercase navigation tab with an underline on the active item (blog category tab bar).
| Part | Tailwind / prop |
|---|---|
| Base | relative inline-flex w-max items-center gap-1.5 py-4 text-base font-bold uppercase tracking-wide text-slate no-underline hover:text-navy focus-visible:text-navy |
| Active | isActive → aria-current="page" + data-active; data-[active]:text-navy and a 2px navy underline via data-[active]:after:* |
| Content | optional leading <Icon> (iconClass) + label |
SectionHeading
A heading at a named, deliberate type scale. Emits the data-heading-variant marker that sanctions non-base heading sizes. Per-use margins stay on the caller via class.
variant="cta-card" / "compact" — text-xl leading-7
variant="campaign-section" — text-[clamp(28px,4vw,42px)] leading-[1.15]
variant="campaign-section-wide" — text-[clamp(32px,4vw,48px)] leading-[1.15]
| variant | Tailwind |
|---|---|
cta-card / compact | text-xl leading-7 |
campaign-section | m-0 text-[clamp(28px,4vw,42px)] leading-[1.15] |
campaign-section-wide | m-0 text-[clamp(32px,4vw,48px)] leading-[1.15] |
as sets the level (h1–h4) for the document outline, independent of the visual scale. One-off heading scales used on a single page are not modeled here; the compact marker is also applied inconsistently to two text-xl md:text-2xl headings that were left as-is.
Breadcrumb
The desktop-only breadcrumb trail (hidden below md). Crumbs are data; a crumb without href renders as the current page. Hover a link: the gray-blue underline turns yellow.
| Part | Tailwind / prop |
|---|---|
| Base | hidden items-center gap-2 md:flex |
size | semibold = text-base font-semibold leading-6; semibold-sm = text-sm font-semibold; plain = text-base leading-6 |
| Items | each crumb: <a href> or, when no href, <span aria-current="page">; separated by <span aria-hidden>/</span> |
| Link underline | underline decoration-gray-blue underline-offset-4 hover:decoration-yellow — gray-blue underline turning yellow on hover |
class | per-use margins and flex-wrap (wrapping is orthogonal to size) |
Singular-case variants to confirm with design: plain (FAQ breadcrumb is not bold) and semibold-sm (category-detail breadcrumb is text-sm) each occur on one page only. The author breadcrumb's one-off focus-visible:underline link style was normalized away (the global focus outline already covers it).
Carousel
A horizontally-scrolling card rail with a heading and prev/next controls; slides are passed in. One shared enhancement script drives every instance. The track below scrolls (drag or swipe); controls are static in this demo.
Das sagen unsere Kunden
| Part | Tailwind / prop |
|---|---|
| Section | py-10, marked data-carousel (JS hook) |
| Header | mb-8 flex flex-wrap items-center justify-between gap-5 — <h2> + control group |
| Controls | .carousel-button prev/next (see §6), shown when showControls |
| Track / slides | .carousel-card-track; each slide <li class="carousel-card-slide"> in the default slot |
The full-bleed review image gallery (ReviewGallery) is a distinct component and is not built on this primitive.
card-cta (utility)
The elevated "get offers" CTA card surface, shared by the hero, task-create, and craftsmen CTA boxes. A component-layer class (like .button); per-use border, padding, and width stay inline.
Beschreiben Sie Ihr Projekt und erhalten Sie Offerten von Handwerkern aus Ihrer Region.
| Selector | Tailwind |
|---|---|
.card-cta | rounded-xs bg-white shadow-[0_0_21px_5px_rgb(0_0_0/0.15)] |
.card-cta .button | mt-6 w-full |
StickyCtaBar
A fixed top bar that reveals once its trigger scrolls out of view (the "Jetzt Offerten einholen" bar). One shared script; the caller supplies the inner layout and bar height.
shown static — on the page it renders fixed inset-x-0 top-0 z-1, hidden until the trigger scrolls out of view
| Part | Tailwind / hook |
|---|---|
| Shell | fixed inset-x-0 top-0 z-1 bg-white shadow-lg (+ height via class), starts hidden |
| Hooks | ancestor data-sticky-cta-root, reveal trigger data-sticky-cta-trigger, scroll-to-top control data-sticky-cta-scroll-top |
The trust checklist inside these CTA boxes was left un-merged: the task-create list (far fa-check, yellow, top-aligned) and the checklist banner (far fa-check-circle, bold, centered) are deliberately different treatments.