Design System
Complete visual style specification. This document serves as the single source of truth for design and web development.
Typography
Font families, typographic scale, and text styling guidelines.
Headings
IBM Plex Sans — All headings (H1–H3)
Interface Elements
Inter — Smaller headings (H4–H6), UI components
Body text and paragraphs
Inter — Body text, UI elements
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
| Element | Size | Font / Weight | Line-height | Usage |
|---|---|---|---|---|
| H1 | 48px / 3rem | IBM Plex Sans Bold (700) | 1.1 | Hero sections |
| H2 | 36px / 2.25rem | IBM Plex Sans SemiBold (600) | 1.2 | Main sections |
| H3 | 28px / 1.75rem | IBM Plex Sans SemiBold (600) | 1.3 | Subsections, cards |
| H4 | 20px / 1.25rem | Inter Medium (500) | 1.4 | Smaller headings |
| H5 | 18px / 1.125rem | Inter SemiBold (600) | 1.5 | UI components |
| H6 | 16px / 1rem | Inter SemiBold (600) | 1.5 | Inline headings |
| P | 16px / 1rem | Inter Regular (400) | 1.6 | Body text |
| SMALL | 14px / 0.875rem | Inter Regular (400) | 1.5 | Captions, metadata |
| A | Inherit | Inter Medium (500) | Inherit | Amber-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
Block on light 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
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
max-width: 1280px
Homepage, portfolio, contact, general pages
max-width: 65ch
Blog posts, talks, documentation — text-heavy content for optimal readability
Hero Section
Page Title with Accent
Description text that summarizes the page content. The left column holds the heading, description, and optional CTA buttons.
stat label
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
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.
Animations
Motion tokens and live animation demos.
Fade In Up
This element fades in
animation: fadeInUp 0.6s ease-out
Typewriter Text
Hover Highlight
Section
Full-width layout block with background variants for structuring page content.
Default
White background. Used for standard content sections.
Surface
Subtle zinc-50 background. Used to differentiate content areas without strong contrast.
Inverse
Dark zinc-900 background. Used for hero sections, footers, or high-contrast areas.
Accent
Orange-500 background. Used for call-to-action blocks or highlight sections.
Variants
| Variant | Background | Use case |
|---|---|---|
| default | White | Standard content |
| surface | Zinc-50 | Subtle content separation |
| inverse | Zinc-900 | Hero, footer, high-contrast |
| accent | Orange-500 | CTA 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.
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.
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.
of DevOps and cloud infrastructure experience
successfully completed across industries
regularly scheduled topics
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.
at professional conferences
in CZ and abroad
of speaking experience
Replacing Kubernetes Ingress-NGINX
Finding a simple replacement for Kubernetes Ingress-NGINX. Ingress controllers are complex, and matching the simplicity of NGINX is hard.
Kubernetes training
Learn to deploy and run containerized apps at scale. Manage clusters, deploy with Helm, and handle everyday Kubernetes operations.
training duration
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
| Element | Font | Size | Color |
|---|---|---|---|
| Page heading | IBM Plex Sans (font-display) | 3xl – 4xl (responsive) | white (dark) / zinc-900 (light) |
| Homepage heading | IBM Plex Sans (font-display) | 3xl – 6xl (responsive) | white |
| Article heading | IBM Plex Sans (font-display) | 2xl – 3xl (responsive) | white |
| Accent phrase | (inherits) | (inherits) | orange-500 |
| Description | Inter (font-body) | base (16px) | zinc-400 (dark) / zinc-600 (light) |
| Stat value | Inter (font-body) | 3xl (page) / xl (article) | white |
| Stat label | Inter (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
| Variant | Background | Stats | Buttons | Image / Icon |
|---|---|---|---|---|
| Homepage | light (zinc-100) | — | 1 (CTA) | Avatar |
| Service Page | dark | 3 | 3 | — |
| Content Page | dark | 3 | — | — |
| Blog Listing | dark | — | — | — |
| Blog Article | dark | 3 (metadata) | — | — |
| Training | dark | 2 | — | Logo / 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 card
White background with a subtle inset shadow. The primary card variant for content on light pages.
Surface card
Elevated card with a prominent outer shadow. Use for featured content or cards that need visual prominence.
Inverse card
Dark background for use on light sections. Pairs well with white or accent buttons.
Accent card
Orange background for pricing blocks, CTAs, or highlighted content that demands attention.
Accent Light card
Soft orange tint for gentle emphasis without the full accent weight.
Hoverable card
Hover to see the lift and orange ring. Use on clickable cards like training listings or service links.
Kubernetes
Learn to deploy and operate containerized applications at scale. Cluster management, Helm, and day-to-day operations.
od 5 400 CZK
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
| Variant | Background | Shadow | Text | Tailwind Classes |
|---|---|---|---|---|
| Default | white | inset-shadow-sm | zinc-900 / zinc-600 | bg-white inset-shadow-sm inset-shadow-zinc-900/10 |
| Surface | white | shadow-xl | zinc-900 / zinc-600 | bg-white shadow-xl shadow-zinc-900/10 |
| Inverse | zinc-900 | none | white / zinc-300 | bg-zinc-900 |
| Accent | orange-500 | none | black / black/80 | bg-orange-500 |
| Accent Light | orange-50 | none | zinc-900 / zinc-600 | bg-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 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.
Assembled Form
Contact Us
We'd love to hear from you. Fill out the form below.
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).
| Element | Light Classes | Dark Classes |
|---|---|---|
| Input | border border-zinc-300 bg-white px-4 py-2.5 text-sm text-zinc-700 | border border-zinc-600 bg-zinc-800 px-4 py-2.5 text-sm text-zinc-100 |
| Textarea | Same as input + resize-y | Same as input + resize-y |
| Label | block font-heading text-sm font-semibold text-zinc-900 mb-1.5 | block font-heading text-sm font-semibold text-zinc-100 mb-1.5 |
| Helper text | text-xs text-zinc-500 mt-1 | text-xs text-zinc-400 mt-1 |
| Placeholder | Default 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.
| Control | Default State | Checked State | Notes |
|---|---|---|---|
| Checkbox | w-5 h-5 border border-zinc-300 bg-white | checked:bg-orange-500 checked:border-orange-500 | SVG checkmark via CSS background-image |
| Radio | w-5 h-5 border border-zinc-300 bg-white | bg-orange-500 + inset box-shadow | Square shape (0px radius), inset dot via box-shadow |
| Toggle | w-11 h-6 bg-zinc-300 | peer-checked:bg-orange-500 + translate-x-5 | Hidden sr-only checkbox + peer siblings for track and knob |
States
| State | Border | Background | Label Color | Description |
|---|---|---|---|---|
| Default | zinc-300 | white | zinc-900 | Resting state |
| Focus | zinc-500 | white | zinc-900 | focus:border-zinc-500, no outline |
| Error | red-500 (2px) | red-50 | zinc-900 | Label stays default; use border-2 border-red-500, error message in red-700 |
| Disabled | zinc-200 | zinc-50 | zinc-400 | opacity-50 cursor-not-allowed |
Spacing Rules
| Relationship | Value | Class |
|---|---|---|
| Label to input | 6px | mb-1.5 |
| Between fields | 20px | space-y-5 |
| Inline field gap | 16px | gap-4 |
| Form padding (in card) | 32px | p-8 |
| Helper text to input | 4px | mt-1 |
Dark Mode Token Swap
When placing forms on dark backgrounds (hero, footer), swap these tokens.
| Element | Light | Dark |
|---|---|---|
| Card background | bg-white border-zinc-200 | bg-zinc-900 border-zinc-700 |
| Input border | border-zinc-300 | border-zinc-600 |
| Input background | bg-white | bg-zinc-800 |
| Input text | text-zinc-700 | text-zinc-100 |
| Placeholder | Default | placeholder:text-zinc-500 |
| Focus border | focus:border-zinc-500 | focus:border-zinc-400 |
| Toggle track (off) | bg-zinc-300 | bg-zinc-600 |
| Checkbox (unchecked) | border-zinc-300 bg-white | border-zinc-600 bg-zinc-800 |
Loading & Skeletons
Skeleton placeholders and shimmer animations.
Callout
Highlighted content blocks for important information.
Important update
This is the primary callout variant. Use it to draw attention to key information on light backgrounds.
Dark section callout
Use this variant on dark backgrounds such as hero sections or footers. The orange border remains the accent anchor.
Subtle emphasis
A minimal variant for when the callout should blend with a white page while still providing a clear visual marker.
Side note
A neutral callout for supplementary information that doesn't require strong emphasis.
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
| Element | Font | Weight | Notes |
|---|---|---|---|
| Label | Inter (font-heading) | 600 (semibold) | Optional heading line |
| Text | Inter (font-heading) | 400 (normal) | Body content |
Color Combinations
| Variant | Border | Background | Label Color | Text Color |
|---|---|---|---|---|
| Accent | orange-500 | orange-50 | zinc-900 | zinc-700 |
| Accent Dark | orange-500 | zinc-900 | white | zinc-300 |
| Accent Light | orange-500 | white | zinc-900 | zinc-700 |
| Neutral | zinc-900 | zinc-100 | zinc-900 | zinc-700 |
| Danger | red-500 | red-50 | zinc-900 | zinc-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.
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.
| Element | Token | Usage |
|---|---|---|
| Error border | Red-500 | Input borders, callout left border |
| Error text | Red-700 | Inline error messages |
| Error background | Red-50 | Input group fills, danger callout background |
ⓘ Password is too short
Do's & Don'ts
Contrast and accessibility guidelines.
High contrast on orange.
Low contrast (poor readability).
ⓘ Password is too short
Border outline + inline error text is sufficient.
ⓘ Password is too short
Red background fill is too heavy — it breaks visual hierarchy.