Design System

Complete visual style specification. This document serves as the single source of truth for design and web development.

Foundations

Typography

Font families, typographic scale, and text styling guidelines.

Display

Headings

IBM Plex Sans — All headings (H1–H3)

UI

Interface Elements

Inter — Smaller headings (H4–H6), UI components

Body

Body text and paragraphs

Inter — Body text, UI elements

Code

Code and technical values

Example: const x = 42;

JetBrains Mono — Code blocks, technical values

The quick brown fox jumps over the lazy dog

IBM Plex Sans 3rem 700 1.1

Hero sections

The quick brown fox jumps over the lazy dog

IBM Plex Sans 2.25rem 600 1.2

Main sections

The quick brown fox jumps over the lazy dog

IBM Plex Sans 1.75rem 600 1.3

Subsections, cards

The quick brown fox jumps over the lazy dog

Inter 1.25rem 500 1.4

Smaller headings

The quick brown fox jumps over the lazy dog
Inter 1.125rem 600 1.5

UI components

The quick brown fox jumps over the lazy dog
Inter 1rem 600 1.5

Inline headings

The quick brown fox jumps over the lazy dog

Inter 1rem 400 1.6

Body text

Typographic Scale

ElementSizeFont / WeightLine-heightUsage
H148px / 3remIBM Plex Sans Bold (700)1.1Hero sections
H236px / 2.25remIBM Plex Sans SemiBold (600)1.2Main sections
H328px / 1.75remIBM Plex Sans SemiBold (600)1.3Subsections, cards
H420px / 1.25remInter Medium (500)1.4Smaller headings
H518px / 1.125remInter SemiBold (600)1.5UI components
H616px / 1remInter SemiBold (600)1.5Inline headings
P16px / 1remInter Regular (400)1.6Body text
SMALL14px / 0.875remInter Regular (400)1.5Captions, metadata
AInheritInter Medium (500)InheritAmber-800 #92400E

Link Styles

Responsive scaling: Desktop 100% • Tablet 90% (H1–H3) • Mobile 80% (H1–H3, min 24px)

Colors & Palette

Brand colors, text palette, and background combinations.

Primary Color

Orange-500

HEX
#f97316
RGB
249, 115, 22
TW
Orange-500

Primary button backgrounds, action icons, call-to-action areas. Text must be black (#000).

Orange-50

HEX
#fff7ed
TW
Orange-50

Secondary buttons, light accents.

Orange-600

HEX
#ea580c
TW
Orange-600

Primary button hover state.

Text Accent

Amber-800

HEX
#92400E
RGB
146, 64, 14
TW
Amber-800

Text links on white background, highlighted text, interactive text, labels. WCAG AA contrast.

Danger

Red-500

HEX
#EF4444
RGB
239, 68, 68
TW
Red-500

Danger borders, error highlights, destructive action buttons, form validation borders.

Red-50

HEX
#FEF2F2
RGB
254, 242, 242
TW
Red-50

Danger backgrounds, error state fills, danger callout background.

Dark Background

Zinc-900

HEX
#18181B
TW
Zinc-900

Headings (h1-h5), dark section backgrounds (hero, footer), code blocks.

Zinc-100

HEX
#F4F4F5
TW
Zinc-100

Text on dark background.

Zinc Text Palette

Zinc-700

HEX
#3F3F46
TW
Zinc-700

Body text on light background.

Zinc-500

HEX
#71717A
TW
Zinc-500

Secondary text, captions (small).

Zinc-100

HEX
#F4F4F5
TW
Zinc-100

Text on dark background (Zinc-900).

Zinc-300

HEX
#D4D4D8
TW
Zinc-300

Secondary text on dark background.

Background Combinations

Light background

Block on light background

Dark background

Block on dark background

Code Colors

Syntax highlighting palette for code blocks and inline code.

Blue-300

HEX
#93C5FD
RGB
147, 197, 253
TW
Blue-300
CMYK
42%, 22%, 0%, 1%
OKLCH
0.809 0.105 251.8

Functions, methods, procedures.

Emerald-300

HEX
#6EE7B7
RGB
110, 231, 183
TW
Emerald-300
CMYK
52%, 0%, 21%, 9%
OKLCH
0.845 0.143 165.0

Strings, text values.

Orange-300

HEX
#FDBA74
RGB
253, 186, 116
TW
Orange-300
CMYK
0%, 26%, 54%, 1%
OKLCH
0.83 0.16 70.0

Important: keywords, HTML tags.

Amber-300

HEX
#FCD34D
RGB
252, 211, 77
TW
Amber-300
CMYK
0%, 16%, 69%, 1%
OKLCH
0.879 0.169 91.6

Numbers, constants, boolean values.

Purple-300

HEX
#D8B4FE
RGB
216, 180, 254
TW
Purple-300
CMYK
15%, 29%, 0%, 0%
OKLCH
0.811 0.111 293.6

Classes, types, special objects.

Code Example

Syntax highlighting preview
function calculateTotal(items) {
  const TAX_RATE = 0.21;
  let total = 0;

  for (const item of items) {
    console.log('Processing:', item);
    total += item.price;
  }

  return total * (1 + TAX_RATE);
}

Container & Spacing

Container system, hero structure, and grid layouts.

Container System

Standard Container

max-width: 1280px

Homepage, portfolio, contact, general pages

Prose Mode

max-width: 65ch

Blog posts, talks, documentation — text-heavy content for optimal readability

Standard Container: 1280px Prose (Content): 65ch Breakpoint: 1024px

Hero Section

Hero Structure

Page Title with Accent

Description text that summarizes the page content. The left column holds the heading, description, and optional CTA buttons.

Value

stat label

Value

stat label

Structure: Dark background (Zinc-900) → Two-column flex layout (lg:flex-row lg:justify-between) → Left: heading + description + buttons → Right: stats with orange left border. Homepage uses light background (Zinc-100) with avatar image instead of stats.

Grid Layout

Columns: 12, --grid-col: 12 Gap: 32px, --grid-gap: 32px
3-6-3 (Three columns)
Sidebar L
Main Content
Sidebar R
8-4 (Content + Sidebar)
Main Content
Sidebar
9-3 (Wide + Narrow)
Main Content
Sidebar
4-4-4 (Three equal)
Column 1
Column 2
Column 3
6-6 (Two equal)
Column 1
Column 2

Mobile First

The site is mobile-first. Grid layout is optional for specific cases, the primary system is containers with responsive widths.

Shapes & Radius

Sharp design system — 0px border radius everywhere.

Sharp edges everywhere. No rounding. Technical, modern look inspired by PlanetScale and OpenStatus.

Actions
Radius: 0px (Sharp)
Data
Radius: 0px (Sharp)

Animations

Motion tokens and live animation demos.

Fade In Up

Duration: 0.6s / 1.2s (slow) Easing: ease-out Offset: 30px bottom-to-top
Live Demo — Scroll into view

This element fades in

animation: fadeInUp 0.6s ease-out

Typewriter Text

Duration: 3s (configurable) Steps: steps(37, end) Cursor: blink 0.8s
Live Demo — Typewriter
We code precisely. We deliver fast.

Hover Highlight

Border color: Orange-500 (#f97316) Border width: 1px Transition: 0.3s ease
Light bg / Light block
Hover me
Light bg / Dark block
Hover me
Dark bg / Light block
Hover me
Dark bg / Dark block
Hover me
Components

Section

Full-width layout block with background variants for structuring page content.

Default

Default

White background. Used for standard content sections.

Surface

Surface

Subtle zinc-50 background. Used to differentiate content areas without strong contrast.

Inverse

Inverse

Dark zinc-900 background. Used for hero sections, footers, or high-contrast areas.

Accent

Accent

Orange-500 background. Used for call-to-action blocks or highlight sections.

Variants

VariantBackgroundUse case
defaultWhiteStandard content
surfaceZinc-50Subtle content separation
inverseZinc-900Hero, footer, high-contrast
accentOrange-500CTA blocks, highlights

Hero

Full-width page header sections for different page types.

Heroes use a two-column flex layout on desktop (lg:flex-row) that stacks on mobile. Most variants use the inverse (dark) background. Unlike cards and forms, buttons in heroes are left-aligned with the content flow.

Homepage

I'm
Vojtěch Mareš,
DevOps architect.

Together we'll reduce your infrastructure costs, eliminate technical debt, and prepare your IT infrastructure for rapid scaling.

Avatar
Service Page

DevOps services tailored

I help companies build and manage modern infrastructure. From one-time consulting through hands-on training to long-term partnerships — always with emphasis on automation, security, and transferring know-how to your team.

6+ years

of DevOps and cloud infrastructure experience

20+ projects

successfully completed across industries

8 courses

regularly scheduled topics

Content Page

Talks at conferences

I regularly speak at professional conferences in the Czech Republic and abroad. I share practical experience in DevOps, cloud-native technologies, and modern infrastructure.

8 talks

at professional conferences

7 conferences

in CZ and abroad

4+ years

of speaking experience

Blog Article

Replacing Kubernetes Ingress-NGINX

Finding a simple replacement for Kubernetes Ingress-NGINX. Ingress controllers are complex, and matching the simplicity of NGINX is hard.

March 5, 2026

published

6 min

reading time

Training / Product
Logo

Kubernetes training

Learn to deploy and run containerized apps at scale. Manage clusters, deploy with Helm, and handle everyday Kubernetes operations.

2 days

training duration

€220

price per person excl. VAT

Styling Guidelines

Layout Pattern

All hero variants (except Blog Listing) use a two-column flex layout: flex flex-col gap-y-8 lg:flex-row lg:justify-between. Content stacks vertically on mobile and splits horizontally at the lg breakpoint (1024px). The left column holds text content (max-w-xl), the right column holds stats or an image.

Homepage Avatar

The homepage hero avatar is allowed to overflow horizontally to the right edge of the section. It also extends to the bottom edge with no padding. Use negative margins (-mb-16 -mr-6) to offset the section padding. The parent section should use overflow-hidden to clip any excess.

Typography

ElementFontSizeColor
Page headingIBM Plex Sans (font-display)3xl – 4xl (responsive)white (dark) / zinc-900 (light)
Homepage headingIBM Plex Sans (font-display)3xl – 6xl (responsive)white
Article headingIBM Plex Sans (font-display)2xl – 3xl (responsive)white
Accent phrase(inherits)(inherits)orange-500
DescriptionInter (font-body)base (16px)zinc-400 (dark) / zinc-600 (light)
Stat valueInter (font-body)3xl (page) / xl (article)white
Stat labelInter (font-body)sm (14px)zinc-400

Stats Pattern

Stats use the compact callout pattern with an orange left border: border-l-2 border-orange-500 pl-6. The value uses font-body text-3xl font-bold text-white and the label uses text-sm text-zinc-400. A dedicated Stats component will be implemented separately.

Button Alignment in Heroes

Unlike cards and forms where buttons are right-aligned (flex justify-end), hero buttons are left-aligned with the content flow using flex flex-wrap gap-4. The CTA should be visually connected to the preceding copy, not pulled away from it.

Variant Reference

VariantBackgroundStatsButtonsImage / Icon
Homepagelight (zinc-100)1 (CTA)Avatar
Service Pagedark33
Content Pagedark3
Blog Listingdark
Blog Articledark3 (metadata)
Trainingdark2Logo / Icon

Orange Accent Text

Key phrases in hero headings use text-orange-500 to highlight the most important word or name. This is consistent across all hero variants — the homepage highlights the name, service/content pages highlight the key topic.

Card

Container component with background variants, shadows, and hover effects.

Cards use overflow-hidden p-6 as base classes. Border-radius is 0px from the global reset. Five background variants cover light, dark, and accent contexts. An optional hover effect adds lift and an orange ring.

Default

Default card

White background with a subtle inset shadow. The primary card variant for content on light pages.

Surface

Surface card

Elevated card with a prominent outer shadow. Use for featured content or cards that need visual prominence.

Inverse

Inverse card

Dark background for use on light sections. Pairs well with white or accent buttons.

Accent

Accent card

Orange background for pricing blocks, CTAs, or highlighted content that demands attention.

Accent Light

Accent Light card

Soft orange tint for gentle emphasis without the full accent weight.

Hover Effect

Hoverable card

Hover to see the lift and orange ring. Use on clickable cards like training listings or service links.

With Content

Kubernetes

Learn to deploy and operate containerized applications at scale. Cluster management, Helm, and day-to-day operations.

od 5 400 CZK

Card Grid

Konzultace

2 500 CZK / hod

Expert review of your infrastructure, audit, or strategic consulting for one-off needs.

Skoleni

od 5 400 CZK

Hands-on workshops with practical examples. All materials and sample code included.

DevOps spoluprace

cena dle domluvy

Long-term partnership for infrastructure management, platform development, and team support.

Variant Reference

VariantBackgroundShadowTextTailwind Classes
Defaultwhiteinset-shadow-smzinc-900 / zinc-600bg-white inset-shadow-sm inset-shadow-zinc-900/10
Surfacewhiteshadow-xlzinc-900 / zinc-600bg-white shadow-xl shadow-zinc-900/10
Inversezinc-900nonewhite / zinc-300bg-zinc-900
Accentorange-500noneblack / black/80bg-orange-500
Accent Lightorange-50nonezinc-900 / zinc-600bg-orange-50

Hover Effect

Add the hover addon to any card variant for interactive lift and orange ring. Use on clickable cards (training listings, service links).

transition duration-300 ease hover:-translate-y-0.5 ring-1 ring-transparent hover:ring-orange-500

Buttons

Button styles and interactive element guidelines.

Buttons use font-mono (JetBrains Mono) to stand out and differentiate from badges which use Inter (font-sans). All buttons have 0px border-radius consistent with the design system. Buttons are always right-aligned within their parent container.

Normal
Small
On Dark Background

Hover & Active States

VariantDefaultHoverActiveText
Accentorange-500orange-600orange-500black
Darkzinc-900zinc-700zinc-800white
Whitewhiteorange-50orange-500zinc-900

Sizing

SizePaddingFont SizeTailwind Classes
Normal16px 32px16px (base)px-8 py-4 text-base
Small8px 16px14px (sm)px-4 py-2 text-sm

Alignment

Buttons are always right-aligned within their parent container (cards, forms, dialogs). Use flex justify-end on the button wrapper.

In a Card

Card content goes here with some descriptive text.

In a Form

Forms & Inputs

Input fields, form controls, and validation guidelines.

All form elements use sharp corners (0px border-radius) consistent with the design system. Inputs use a 1px zinc border with a subtle focus transition.

Text Input
Email Input
Phone Number
Checkbox
Radio Button
Preferred Contact
Toggle / Switch
Address (Structured)
Textarea

Assembled Form

Light
Contact Us

We'd love to hear from you. Fill out the form below.

Dark
Contact Us

We'd love to hear from you. Fill out the form below.

Styling Guidelines

Input Tokens

Classes for text-based inputs (text, email, tel, textarea).

ElementLight ClassesDark Classes
Inputborder border-zinc-300 bg-white px-4 py-2.5 text-sm text-zinc-700border border-zinc-600 bg-zinc-800 px-4 py-2.5 text-sm text-zinc-100
TextareaSame as input + resize-ySame as input + resize-y
Labelblock font-heading text-sm font-semibold text-zinc-900 mb-1.5block font-heading text-sm font-semibold text-zinc-100 mb-1.5
Helper texttext-xs text-zinc-500 mt-1text-xs text-zinc-400 mt-1
PlaceholderDefault browser (zinc-400)placeholder:text-zinc-500

Control Tokens

Checkbox, radio, and toggle all use appearance-none to strip browser defaults. Toggle uses the peer pattern with a hidden sr-only checkbox.

ControlDefault StateChecked StateNotes
Checkboxw-5 h-5 border border-zinc-300 bg-whitechecked:bg-orange-500 checked:border-orange-500SVG checkmark via CSS background-image
Radiow-5 h-5 border border-zinc-300 bg-whitebg-orange-500 + inset box-shadowSquare shape (0px radius), inset dot via box-shadow
Togglew-11 h-6 bg-zinc-300peer-checked:bg-orange-500 + translate-x-5Hidden sr-only checkbox + peer siblings for track and knob

States

StateBorderBackgroundLabel ColorDescription
Defaultzinc-300whitezinc-900Resting state
Focuszinc-500whitezinc-900focus:border-zinc-500, no outline
Errorred-500 (2px)red-50zinc-900Label stays default; use border-2 border-red-500, error message in red-700
Disabledzinc-200zinc-50zinc-400opacity-50 cursor-not-allowed

Spacing Rules

RelationshipValueClass
Label to input6pxmb-1.5
Between fields20pxspace-y-5
Inline field gap16pxgap-4
Form padding (in card)32pxp-8
Helper text to input4pxmt-1

Dark Mode Token Swap

When placing forms on dark backgrounds (hero, footer), swap these tokens.

ElementLightDark
Card backgroundbg-white border-zinc-200bg-zinc-900 border-zinc-700
Input borderborder-zinc-300border-zinc-600
Input backgroundbg-whitebg-zinc-800
Input texttext-zinc-700text-zinc-100
PlaceholderDefaultplaceholder:text-zinc-500
Focus borderfocus:border-zinc-500focus:border-zinc-400
Toggle track (off)bg-zinc-300bg-zinc-600
Checkbox (unchecked)border-zinc-300 bg-whiteborder-zinc-600 bg-zinc-800

Loading & Skeletons

Skeleton placeholders and shimmer animations.

Skeleton Loading

Callout

Highlighted content blocks for important information.

Accent

Important update

This is the primary callout variant. Use it to draw attention to key information on light backgrounds.

Accent Dark

Dark section callout

Use this variant on dark backgrounds such as hero sections or footers. The orange border remains the accent anchor.

Accent Light

Subtle emphasis

A minimal variant for when the callout should blend with a white page while still providing a clear visual marker.

Neutral

Side note

A neutral callout for supplementary information that doesn't require strong emphasis.

Danger

Breaking change

Use this variant for warnings, errors, or destructive action notices that require immediate attention.

The sidebar active link uses a compact version of the accent callout pattern: border-l-2 border-orange-500 bg-orange-50

Styling Guidelines

Structure

Every callout uses a strong left border (border-l-4) with p-6 padding and sharp corners (border-radius: 0).

Typography

ElementFontWeightNotes
LabelInter (font-heading)600 (semibold)Optional heading line
TextInter (font-heading)400 (normal)Body content

Color Combinations

VariantBorderBackgroundLabel ColorText Color
Accentorange-500orange-50zinc-900zinc-700
Accent Darkorange-500zinc-900whitezinc-300
Accent Lightorange-500whitezinc-900zinc-700
Neutralzinc-900zinc-100zinc-900zinc-700
Dangerred-500red-50zinc-900zinc-700

Context Rules

Light backgrounds

Use Accent, Accent Light, Neutral, or Danger variants. Label text is zinc-900, paragraph text is zinc-700.

Dark backgrounds

Use the Accent Dark variant. Label text is white, paragraph text is zinc-300.

Danger Styling

Use the danger palette (Red-500 for borders/highlights, Red-50 for backgrounds) for destructive actions, error states, and critical warnings. Apply consistently across callouts, form validation, buttons, and alerts.

Destructive action warning

This action cannot be undone. All data associated with this account will be permanently deleted.

Compact Variant: Sidebar

The sidebar active link uses a compact callout pattern with a thinner border (border-l-2 instead of border-l-4) and the accent color scheme. This demonstrates how the callout pattern scales down for inline or navigation contexts.

Guidelines

States

Form validation and interactive states.

Danger / Error States

Error and danger states use the red palette consistently across all interactive elements: form inputs, inline messages, and background fills.

ElementTokenUsage
Error borderRed-500Input borders, callout left border
Error textRed-700Inline error messages
Error backgroundRed-50Input group fills, danger callout background
Form Validation — Error

Password is too short

Do's & Don'ts

Contrast and accessibility guidelines.

Do
Black text
✓ DO

High contrast on orange.

Don't
White text
✗ DON'T

Low contrast (poor readability).

Do

Password is too short

✓ DO

Border outline + inline error text is sufficient.

Don't

Password is too short

✗ DON'T

Red background fill is too heavy — it breaks visual hierarchy.