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

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.

BaselineTailwind 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)
Bodytext-navy on white — navy is the default text color for everything; every text-* utility carries its own leading
ShapeButtons: rounded-xs (2px) — the only non-default shape decision. Overlays, dialogs, tooltips: whatever Tailwind/component defaults provide.
IconographyFont Awesome 7 (Free/Pro/Duotone/Sharp variables present on the live site)
Live-site provenanceThe 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.

Navy — primary#203768 · rgb(32,55,104)Body text, all headings, primary buttons, footer top, selected states
Navy hover#162850 · rgb(22,40,80)Primary button :hover
Yellow — accent#F9B415 · rgb(249,180,21)CTA buttons, social icons, comparison-range accent
Yellow hover#FFC84A · rgb(255,200,74)Yellow button :hover
Gray-blue#DBDFE7 · rgb(219,223,231)Hero/section backgrounds, footer bottom, disabled text
Gray-blue 50%bg-gray-blue/50Input holders, gray buttons, banner sections
Slate#637395 · rgb(99,115,149)Material secondary: toggle track, snackbar action
Muted#818BA1 · rgb(129,139,161)Secondary/muted text, placeholders
Dark slate#27455C · rgb(39,69,92)Dark image-overlay sections (homepage)
Light gray#F8F8F8 · --color-light-graySubtle alternate background
White#FFFFFFDefault surface, text on navy
Errorred-500 · #EF4444Tailwind default — the live site's #F44336 was a Material default, not a brand color

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.

Heading 1 — text-5xl

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)

Heading 2 — text-4xl

text-3xl lg:text-4xl font-semibold → 30/36 · 36/40 (live site measured 28/36 mobile, 48/56 desktop — desktop deliberately downscaled)

Heading 3 — text-3xl

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)

Heading 4 — text-2xl

text-xl lg:text-2xl font-semibold → 20/28 · 24/32 (desktop exact) · mobile measured 22/28 · also the FAQ question size

Heading 5 — text-xl

text-xl font-semibold → 20px / 28px (exact for h5) · absorbs heading-emphasis (21/28)

Heading small — text-lg leading-6

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)

Emphasis: the site emphasizes via weight modifiers, not tags — --mediumfont-medium, --semibold/-importantfont-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)MeasuredTailwindFit
typography-h1, typography-heading-extra-large36/42 → 64/68 · 600text-4xl lg:text-5xl font-semibold36/40 → 48/48 — desktop deliberately downscaled
typography-h2, typography-v2-heading-large28/36 → 48/56 · 600text-3xl lg:text-4xl font-semibold30/36 → 36/40 — desktop deliberately downscaled
typography-h3, typography-v2-heading-h3, typography-v2-heading-medium24/32 → 32/40 · 600text-2xl lg:text-3xl font-semibold24/32 exact → 30/36
typography-heading-big(-important, -no-scale)30/36–40text-3xl (+ weight)exact
typography-h4, typography-v2-heading-h422/28 → 24/32 · 600text-xl lg:text-2xl font-semibold20/28 → 24/32 exact
typography-h520/28text-xl (+ weight)exact
typography-heading-emphasis-important, *-to-heading-emphasis*21/28 · 600text-xl font-semibold20/28 — 21px folded into 20px
typography-heading-small-important, text-base-to-heading-small-important18/24 · 600text-lg leading-6 font-semiboldexact
typography-text-large(-important), typography-encode-sans-text, text-mobile-large18/30text-lg18/28
typography-text-1(--medium, --semibold)16/26text-base (+ weight)16/24 — or leading-relaxed for exact 26
typography-text-base(-important), text-small-base(-important), encode-sans-text-no-scale16/24text-base (+ weight)exact
typography-text-215/–text-base15px retired → 16px
typography-text-2--bold-uppercase15/24 · 700 · +0.5pxtext-base font-bold uppercase tracking-wide16/24
typography-text-3(--medium, --semibold), typography-text-5(--medium, --bold)14/22text-sm (+ weight)14/20 — button label style
typography-text-small(-important, -bold, -to-*)14/21text-sm (+ weight)14/20
typography-checkbox-label14/24 · 500text-sm leading-6 font-mediumexact
typography-text-4(--medium)12/16text-xs (+ weight)exact
typography-text-tiny(-important), mob-tiniest-tab-text-tiny-important12/18 · 400/600text-xs (+ weight)12/16
typography-text-4--semibold-uppercase12/20 · 600 · +0.5pxtext-xs leading-5 font-semibold uppercase tracking-widerexact
typography-text-4--extrabold-uppercase12/20 · 800 · +0.5pxtext-xs leading-5 font-extrabold uppercase tracking-widerexact
typography-linknavy · no underlinecontent: text-navy underline · chrome: text-navy hover:underlinedeliberate change — underline restored as affordance

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.

Navigation link — Handwerkerverzeichnis text-sm text-navy hover:underline
Inline content link text-navy underline underline-offset-2 font-semibold — inherits size
Link on dark surface text-sm text-yellow hover:underline on navy
Gap observed on the live site: anchors that carry no typography class (e.g. .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

PropertyTailwindNotes
Labeltext-sm font-semiboldmeasured 14/22 · 600 → 14/20
Paddingpy-2 px-4 · search py-4 px-10/px-6 · compact py-1 px-2.5all exact
Min-heightmin-h-12 (compact: min-h-9)measured 46px, rounded to the scale (48px)
Radiusrounded-xs2px exact
Shadow / transformnoneflat buttons, color-only hover
Width modifiersw-full, max-md:w-fullreplaces .full-width, .full-width-mobile
This is the only button component. The live site's Angular Material buttons (36px/4px, in dialogs and pickers) were framework defaults — don't reproduce them; use this button everywhere.

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)

ElementTailwind / values
Labeltext-base text-navy (checkbox labels: text-sm leading-6 font-medium)
Placeholderplaceholder:text-navy/80
Focus state:focus-visible on inputs, selects, textareas, buttons, and links: 2px solid navy outline, 2px offset
Checkbox / radioaccent-navy
Selection controls, pickers, overlaysTailwind/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.

Hero bandbg-gray-blue (.background-holder, .container-hero, directory band)
Banner bandbg-gray-blue/50 (.get-offers-banner)
Navy bandbg-navy text-white (.section-background-blue), yellow CTAs
Dark slate bandbg-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.

Startseite / Arbeiten im Haus / Wände und Decken

breadcrumbs: text-base text-navy · separators text-muted · desktop-only (hidden md:flex — the live site hides them on mobile)

Was muss eine Handwerker-Anfrage enthalten?

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.

default — mx-auto max-w-6xl px-4 md:px-6
width="narrow" — max-w-4xl

shown at reduced scale: highlighted area = the container, dashed strip = the viewport

PartTailwind / prop
Basemx-auto max-w-6xl px-4 md:px-6
width="narrow"max-w-4xl in place of max-w-6xl
fullWidthadds 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).

PartTailwind / prop
Baserelative 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
ActiveisActivearia-current="page" + data-active; data-[active]:text-navy and a 2px navy underline via data-[active]:after:*
Contentoptional 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.

Kostenlos Offerten erhalten

variant="cta-card" / "compact" — text-xl leading-7

Jetzt Handwerker finden

variant="campaign-section" — text-[clamp(28px,4vw,42px)] leading-[1.15]

Jetzt Handwerker finden

variant="campaign-section-wide" — text-[clamp(32px,4vw,48px)] leading-[1.15]

variantTailwind
cta-card / compacttext-xl leading-7
campaign-sectionm-0 text-[clamp(28px,4vw,42px)] leading-[1.15]
campaign-section-widem-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.

PartTailwind / prop
Basehidden items-center gap-2 md:flex
sizesemibold = text-base font-semibold leading-6; semibold-sm = text-sm font-semibold; plain = text-base leading-6
Itemseach crumb: <a href> or, when no href, <span aria-current="page">; separated by <span aria-hidden>/</span>
Link underlineunderline decoration-gray-blue underline-offset-4 hover:decoration-yellow — gray-blue underline turning yellow on hover
classper-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.

  • Küche renoviert

    «Wir sind sehr zufrieden mit der Arbeit. Schnell und sauber.»

  • Wand gestrichen

    «Innerhalb von zwei Tagen drei Offerten erhalten.»

  • Umzugsreinigung

    «Abgabe der Wohnung ohne Beanstandung.»

  • Gartenpflege

    «Zuverlässig und fair im Preis.»

  • Elektroinstallation

    «Kompetente Beratung, saubere Ausführung.»

PartTailwind / prop
Sectionpy-10, marked data-carousel (JS hook)
Headermb-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.

Kostenlos Offerten erhalten

Beschreiben Sie Ihr Projekt und erhalten Sie Offerten von Handwerkern aus Ihrer Region.

SelectorTailwind
.card-ctarounded-xs bg-white shadow-[0_0_21px_5px_rgb(0_0_0/0.15)]
.card-cta .buttonmt-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.

Bereit für Ihr Projekt?

shown static — on the page it renders fixed inset-x-0 top-0 z-1, hidden until the trigger scrolls out of view

PartTailwind / hook
Shellfixed inset-x-0 top-0 z-1 bg-white shadow-lg (+ height via class), starts hidden
Hooksancestor 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.