En
English English
Deutsch Deutsch
Suomi Suomi
English (US) English (US)

Log in to create and track orders. After registration, you will have access to up-to-date product prices.

Create account Login
En
English English
Deutsch Deutsch
Suomi Suomi
English (US) English (US)

Typography

Base type scale for product and marketing screens. Use semantic headings to preserve hierarchy, then rely on global styles to keep rhythm and color consistent.

Headings

Heading 1 - 56px

Heading 2 - 40px

Heading 3 - 28px

Heading 4 - 24px

Heading 5 - 20px
Heading 6 - 16px

Body Text

Large text - 18px

Regular text - 16px

Small text - 14px

Extra small text - 12px

Font Weights

Light - 300

Regular - 400

Medium - 500

SemiBold - 600

Bold - 700

ExtraBold - 800

Code Example

<header class="page__header">
  <div class="page__container">
    <h1>Page Title</h1>
    <p>Lead paragraph that introduces the page.</p>
  </div>
</header>

<section class="page__container">
  <h2>Section Heading</h2>
  <p>Body copy lives at 16px. Use <small> for helper text.</p>
</section>

Keep a single H1 per page, then descend the scale in order (H2 → H6) to maintain accessibility and predictable spacing.

Forms & Validation

Form elements use the shared form-* naming to align spacing, focus rings, and error states across pages. Keep labels outside inputs, pair errors with .form-error, and toggle states with modifiers like --floating or --error.

Inputs

Floating Label Inputs (for authentication pages)

Inputs with labels that move up when focused or filled

<div class="form-group">
  <div class="form-input form-input--floating">
    <label class="form-input__label" for="email">Email<span class="text-red">*</span></label>
    <input type="email" id="email" placeholder="Email" />
  </div>
</div>

Textarea

Select

Checkboxes

Radio Buttons

How to Show Validation Errors

✓ Normal Input:

<div class="form-group">
  <input type="email" class="form-input">
</div>

❌ Error Input (Red Border):

<div class="form-group">
  <input type="email" class="form-input form-input--error">
</div>

Add class: form-input--error for red border

💬 Error Message:

<div class="form-group">
  <input type="email" class="form-input form-input--error">
  <span class="form-error">Error message here</span>
</div>

Add element: <span class="form-error"> inside .form-group

🎯 Live Demo

Range Slider

-

Form Skeleton (Code)

<form class="form">
  <div class="form-group">
    <label class="form-label" for="email">Email</label>
    <input id="email" type="email" class="form-input" placeholder="email@example.com" required>
    <span class="form-error">Error copy lives here</span>
  </div>

  <div class="form-group">
    <label class="form-label" for="message">Message</label>
    <textarea id="message" class="form-textarea" rows="4"></textarea>
  </div>

  <div class="form-actions">
    <button class="btn btn--primary" type="submit">Submit</button>
    <button class="btn btn--ghost" type="button">Cancel</button>
  </div>
</form>

Keep helper or error text immediately after the control; wrap logical sections in .form-group for consistent spacing.

Filter Components

Composable filter stack with range sliders, checkboxes, and helper tooltips. Structure each block with .filter__group, pair labels with .filter__label, and keep reset actions within the group header for clarity.

Price Range Filter

Code Example

<aside class="filter">
  <div class="filter__group">
    <div class="filter__header">
      <div class="filter__label">
        <span>Price range</span>
        <button class="filter__tooltip" aria-label="Info">?</button>
      </div>
      <button class="filter__reset">Reset</button>
    </div>

    <div class="filter__content">
      <div class="filter__range-inputs">... numeric inputs ...</div>
      <div class="range-slider">... dual handles ...</div>
    </div>
  </div>
</aside>

Wire sliders with your preferred JS (we use the dual-handle slider in filter.js) and keep currency/unit markers outside the inputs for better validation.

Page Structure

Layout primitives that keep headings, gutters, and page chrome aligned. Start each page with .page__header for title context, then wrap content in .page__container to control max-width and padding.

Example Layout

Content Block

Wrap sections, cards, and filters inside .page__container to maintain consistent gutters.

Global Page Classes

Reusable CSS classes for consistent page layouts.

.page__header PAGE HEADER
<div class="page__header">
  <div class="page__container">
    <h1>Page Title</h1>
  </div>
</div>
Spacing: 64px top/bottom (desktop), 32px (mobile)
H1: margin: 0, color: brand-blue
.page__container CONTENT CONTAINER
<div class="page__container">
  <p>Your page content</p>
  <div class="your-component"></div>
</div>
Max-width: 1440px, horizontally centered
Padding: 64px (desktop), 32px (tablet), 16px (mobile)

Buttons

Button system uses the base .btn plus modifiers for emphasis (--primary, --secondary, --outline, --ghost) and size (--sm, --lg). Pair with optional .btn__icon spans for left or right glyphs.

Button Variants

Primary (Dark Blue) - Main actions

Secondary (Red) - Important secondary actions

Outline - Less prominent actions

Outline Blue - White background with blue border (used for active pagination)

Ghost - Subtle actions

Button Sizes

Buttons with Icons

Code Usage

<!-- Primary Button -->
<button class="btn btn--primary">Click me</button>

<!-- Small Secondary Button -->
<button class="btn btn--secondary btn--sm">Small</button>

<!-- Outline Button -->
<button class="btn btn--outline">Outline</button>

<!-- Outline Blue Button (for active pagination) -->
<button class="btn btn--outline--blue">Outline Blue</button>

<!-- Button with Icon -->
<button class="btn btn--primary">
  <span class="btn__icon"><svg>...</svg></span>
  Add Item
</button>

Quantity Input Component

Form component for quantity selection — adjust with +/- or type a value

<div class="form-quantity">
  <button class="form-quantity__btn" data-delta="-1">
    <svg>...</svg>
  </button>
  <input type="number" class="form-quantity__input"
    value="1" min="1">
  <button class="form-quantity__btn" data-delta="1">
    <svg>...</svg>
  </button>
</div>

Pagination

Page navigation with active page highlighting

<div class="pagination">
  <button class="btn btn--outline--blue pagination">1</button>
  <button class="btn btn--ghost pagination">2</button>
  <button class="btn btn--ghost pagination">3</button>
  <button class="btn btn--ghost pagination pagination--next">
    <svg>...</svg>
  </button>
</div>

Active page: Use btn--outline--blue class
Inactive pages: Use btn--ghost class
Arrow buttons: Add pagination--next or pagination--prev modifier

Icons

SVG sprite that powers every glyph across the product. Reference icons with a <use> tag that points to /assets/icons/MAIN_SPRITE.svg#icon-name; size and color inherit from the surrounding text.

Glyph Set

All sprite symbols rendered in a responsive grid.

Code Example

<!-- Standalone icon -->
<svg width="24" height="24" aria-hidden="true">
  <use href="/assets/icons/MAIN_SPRITE.svg#icon-download"></use>
</svg>

<!-- Icon inside a button -->
<button class="btn btn--primary">
  <span class="btn__icon">
    <svg width="16" height="16">
      <use href="/assets/icons/MAIN_SPRITE.svg#icon-check"></use>
    </svg>
  </span>
  Save
</button>

Add aria-hidden="true" when icons are decorative; otherwise pair the glyph with visible text or an aria-label.

Table

Responsive table patterns for catalog and document listings. Use the base .table class for simple grids, and add the .table--expandable modifier plus data-expand-target/data-expand-content pairs for nested details. Colspans are intentionally applied on detail rows to keep cell widths aligned with the desktop design spec.

Simple Data Table

Brand Code Name Price Stock Actions
555 0 261 231 046 Rod/strut, stabiliser 1999.79 € 2
ABAKUS 0 241 229 612 Gas Spring, rear window 3.38 € 4
ABE 0 261 231 046 Brake shoe set, parking brake 13.52 € 4
BMW 1 987 946 011 Rod/strut, stabiliser 8.07 € 4

Expandable Nested Table (Orders)

Table with expandable rows showing order details

INCOMING
ORDER NUMBER
ORDER NUMBER ORDER DATE ORDER ITEM QTY. ORDER AMOUNT
001 63700-000000004 27.01.2025 12 1489.33 €
CODE BRAND NAME QUANTITY PRICE AMOUNT STATUS
11427512300 BMW Set oil-filter el... 4 1489.33 € 1489.33 € Status
10-ECO012 ASHIKA Oil filter 3 1489.33 € 1489.33 € Status
SH426P SCT Oil filter 5 1489.33 € 1489.33 € Status
002 63700-000000005 12.02.2025 3 3.72 €
CODE BRAND NAME QUANTITY PRICE AMOUNT STATUS
10-ECO012 ASHIKA Oil filter 3 1.24 € 3.72 € Status
003 63700-000000006 15.02.2025 5 53.20 €
CODE BRAND NAME QUANTITY PRICE AMOUNT STATUS
11427512300 BMW Set oil-filter 5 10.64 € 53.20 € Status

Code Example

<!-- Basic table -->
<table class="table">
  <thead>...</thead>
  <tbody>
    <tr><td>Cell</td>...</tr>
  </tbody>
</table>

<!-- Expandable table -->
<div class="table table--expandable">
  <table>
    <tbody>
      <tr class="table__master-row">
        <td class="table__expand-cell" data-expand-target="row-1">Order 001</td>
      </tr>
      <tr class="table__detail-row">
        <td colspan="6">
          <div class="table__expand-content" data-expand-content="row-1">
            ...nested content...
          </div>
        </td>
      </tr>
    </tbody>
  </table>
</div>

JavaScript toggles the detail rows by matching data-expand-target and data-expand-content. Keep dropdown actions inside the master row.

Order Card (Mobile)

Collapsible mobile-first summary card that mirrors the desktop expandable table. Toggled entirely via data attributes and shared SCSS tokens so state changes stay in sync across pages.

Live Preview

INCOMING
ORDER NUMBER
001 27.01.2025
ORDER NUMBER
11427512300 BMW

Set oil-filter element

QTY 4
PRICE 1489.33 €
AMOUNT 5 957.32 €
ORDER DATE 27.01.2025
ORDER ITEM QTY. 12
ORDER AMOUNT 1489.33 €

Overview

Mobile-first collapsible card used on My Orders, Cancelled Orders, Order Changes, Shipped Orders, and Statement of Accounts. Visibility is controlled by .visible-md and [data-expanded] attributes; no inline styles are required.

  • Root: .order-card with optional data-expanded="true|false".
  • Header: .order-card__header with label/value pairs and .order-card__expand-trigger button.
  • Body: .order-card__content wraps details, nested order numbers, items, and actions.
  • States: [data-order-number-expanded] and [data-invoice-section-expanded] drive nested toggles.
  • Shared tokens: labels use %order-card-label; row gutters use %order-card-row (see order-card.scss).

Example Markup

<div class="order-card" data-expanded="true">
  <div class="order-card__header">
    <div class="order-card__header-content">
      <span class="order-card__header-label">INCOMING<br>ORDER NUMBER</span>
      <span class="order-card__header-value">001</span>
    </div>
    <button class="order-card__expand-trigger" aria-expanded="true" aria-label="Expand">...arrow svg...</button>
  </div>
  <div class="order-card__content">
    <div class="order-card__order-number" data-order-number-expanded="true">
      <div class="order-card__order-number-row">...</div>
      <div class="order-card__order-number-content">
        <div class="order-card__items">...item cards...</div>
        <div class="order-card__details">...rows...</div>
        <div class="order-card__actions">
          <button class="order-card__action-btn">Save to PDF</button>
          <button class="order-card__action-btn">Save to Excel</button>
        </div>
      </div>
    </div>
  </div>
</div>

JS hook: initOrderCards() wires expand/collapse and sets aria-expanded. Visibility of content is handled purely via the data attributes in CSS.

Notifications & Banners

Centralized messaging components: stacked alerts managed by notificationManager, persistent cookie banners, and smart tooltips bound to data-tooltip attributes.

Alert Notifications (Top Right)

These appear in the top-right corner and auto-dismiss after 5 seconds

Static Examples (Demo Only):

⚠️ These are static HTML examples for demonstration. In production, notifications are created dynamically via JavaScript API.

The items're added to the cart. Go to the cart or continue shopping.

Successfully Saved.

Your profile settings have been saved.

Price change for one of the items in your order.

Please note that the new price for the item. Go to order.

We can't calculate your order.

Please send request to the manager. Send request.

Cookie Consent Banner (Bottom Right)

Fixed position banner for cookie consent - shown below in its actual position

Smart Tooltip

Hover or focus to show tooltip. Auto-positioned to avoid viewport edges.

Hover me: Or me:

Static Tooltip Example:

Tooltip

Select the calendar of days you are ready to expect delivery.

Code Examples

// Alerts via JS API
window.notificationManager.success('Added to cart', 'Success');
window.notificationManager.warning('Price changed for item', 'Price change');
window.notificationManager.error('Could not calculate order', 'Calculation error');

// Tooltips (auto-initialized on elements with data-tooltip)
<button class="tooltip-trigger"
  data-tooltip="Select delivery dates"
  data-tooltip-title="Delivery help">
  ...? icon ...
</button>

// Cookie banner toggle
const banner = document.querySelector('.banner-cookie');
banner.style.display = 'flex'; // show
banner.style.display = 'none'; // hide

Notifications auto-dismiss after 5s; pass { duration: 0 } to keep them persistent.

Colors

Color tokens for brand, functional states, grays, and utilities. Use the SCSS variables in components, or drop the provided utility classes when you need quick overrides.

Brand Colors

$color-brand-blue
#2b2d42
$color-brand-red
#ef233c
$color-paragraph-blue
#596d8c
$color-gray
#dde1e6
$color-primary
#1a73e8
$color-secondary
#34a853
$color-accent
#fbbc04

Functional Colors

$color-error
#d33b27
$color-warning
#f9ab00
$color-warning-light
#fff3cd
$color-success
#188038
$color-info
#1f9e45

Gray Scale

$color-white
#ffffff
$color-black
#000000
$color-gray-100
#f8f9fa
$color-gray-200
#e8eaed
$color-gray-300
#dadce0
$color-gray-400
#c6c6c6
$color-gray-500
#9aa0a6
$color-gray-600
#5f6368
$color-gray-700
#3c4043
$color-gray-800
#202124

Text Colors

$text-primary
#3c4043
$text-secondary
#5f6368
$text-disabled
#c6c6c6

Background Colors

$bg-primary
#ffffff
$bg-secondary
#f8f9fa
$color-gray-fill
#f2f4f8
$bg-gray-fill
#f9fbfd

Utility Classes - Text Colors

Quick utility classes for text colors. All classes use !important for maximum specificity.

.text-primary
#1a73e8
.text-brand-blue
#2b2d42
.text-brand-red
#ef233c
.text-paragraph-blue
#596d8c
.text-white
#ffffff
.text-black
#000000
.text-gray
#5f6368
.text-muted
#5f6368
.text-disabled
#c6c6c6
.text-success
#188038
.text-error
#d33b27
.text-warning
#f9ab00
.text-info
#1f9e45

Utility Classes - Background Colors

Quick utility classes for background colors. All classes use !important for maximum specificity.

.bg-primary
#ffffff
.bg-secondary
#f8f9fa
.bg-brand-blue
#2b2d42
.bg-brand-red
#ef233c
.bg-white
#ffffff
.bg-gray-light
#f2f4f8
.bg-gray
#dde1e6
.bg-success
#188038
.bg-error
#d33b27
.bg-warning
#f9ab00
.bg-warning-light
#fff3cd
.bg-info
#1f9e45

Code Example

// SCSS tokens
$color-brand-blue: #2b2d42;
$color-brand-red: #ef233c;
$color-gray-200: #e8eaed;

// Component usage
.banner {
  background: $color-brand-blue;
  color: $color-white;
}

// Utility classes
<p class="text-muted">Secondary text</p>
<div class="bg-warning-light">Banner copy</div>

Prefer variables in SCSS modules; lean on utilities for one-off adjustments without introducing new CSS.