Design System / Component Library
Design by Jeton Lakna
ecovium · Logistics Platform

One system for every
supply-chain experience.

This is the single source of truth for Ecovium's visual language and interface components. It unifies our principles, color, typography, and the full component library into one place — so every team builds a product that feels consistent, accessible, and built to get the job done. For all matters related to the design system or design-related work, please contact our Principal UX/UI Designer, Jeton Lakna. at jeton.lakna@ecovium.com or by teams, or you can create a ticket in Jira.

Foundations

Design Principles

Design principles are the philosophies that direct every choice we make. They keep us consistent, give Ecovium a cohesive identity, and speed up decisions by aligning teams on what matters most.

01

Design for the supply-chain industry first

We prioritize our customers and the logistics industry in every choice — validating with internal experts, usability tests, interviews, and continuous user feedback.

02

Build trust at every touchpoint

Always give users a clear next step, handle sensitive data with care, and keep interactions consistent across the whole ecovium ecosystem.

03

Design to get the job done

Deliver concise, timely, relevant information exactly when needed. Remove unnecessary steps, keep a clear hierarchy. Keep it simple.

04

Be dependable across platforms

Shared features look and behave the same on every platform, while staying authentic to each device's strengths.

05

Rethink traditional processes

Go beyond digitizing the status quo. Understand the industry deeply, then connect users, tools, workflows, and third-party apps into one seamless experience.

Foundations

Accessibility

We design to improve the lives of everyone in logistics — including those who need diverse means to access our products. Ecovium components, patterns, layouts, and styles target the Web Content Accessibility Guidelines (WCAG) 2.1 Level AA.

The POUR principles

PerceivableUsers can perceive the information presented and engage through whichever senses they use.
OperableUsers can operate the interface and navigate content with any interactive technology they need.
UnderstandableUsers can comprehend the information and grasp how to interact with the UI seamlessly.
RobustA wide range of users can access and interpret content reliably as technology advances.

Where we focus

  • Keyboard compatibility — every component, pattern, and layout is navigable without a mouse.
  • Optimal contrast — colors are chosen for sufficient contrast across forms of color blindness and contrast sensitivity.
  • Clear, hierarchical layout — information is structured so users can focus on what matters.
  • Text-to-speech ready — content converts cleanly and coherently for screen readers.
  • Ample target size — links, buttons, and controls are sized for touch and assistive devices.
  • Video captions & customizable text — zoomable text without losing hierarchy or legibility.
Foundations

Color

Ecovium's palette is built on neutral shades that complement our primary blue. Use color intentionally — to establish hierarchy, communicate status, and draw attention only where it counts.

Core · Brand Primary & Base

Brand Primary & Base
primary
Header
#152F4E
Selection
#21496C
primary
Light Blue
#EAF0F6
Light Blue 2
#F3F7FC

Accent

Decorative

💡
Use semantic colors — green for success, yellow for warning, red for error — to communicate status. For Primary / Ext1 / Ext2 needs, use blue, cyan (turquoise) and magenta (pink) respectively.

Guidelines

✓ Do
  • Use semantic colors consistently — green = success, yellow = warning, red = error.
  • Reserve the primary blue for the single most important action on a view.
  • Lean on neutrals; let accent colors carry meaning, not decoration.
✕ Don't
  • Use light tints (100–300) for text — they fail contrast.
  • Introduce off-palette hex values for one-off needs.
  • Rely on color alone to convey state; always add an icon or label.
tokens Developer notes
  • Map every color to a token; components reference var(--blue-500), never raw hex.
  • Build a semantic layer (--color-success--green-500) so meaning survives a re-theme.
  • Run automated contrast checks in CI against text/background pairs.
Foundations

Typography

Our typeface is Roboto — built for user interfaces, it stays legible at small sizes and adjusts gracefully across web and mobile. Unifying type across every Ecovium tool keeps the experience seamless and scalable.

Headline scale

Header h1
48 / 56px · 3 rem
Header h2
32 / 40px · 2 rem
Header h3
24 / 30px · 1.5 rem
Header h4
20 / 24px · 1.25 rem
Header h5
16 / 20px · 1 rem
Header h6
14 / 16px · 0.875 rem

Control text sizes

NameSizeRemUse case
Large Text16px1 remStand-out text controls, such as the author name in a feed.
Body Text14px0.875 remBody size used in controls — buttons, inputs, tables, or a tree.
Small Text12px0.75 remExceptional cases inside controls — timestamps or a unit of measurement.
📐
Line height. Normal (auto) line height is used in bread-and-butter controls. For long, wrapped or continuous text, use 1.5 line height per WCAG. Body and small text support semibold and italic styling.

Guidelines

✓ Do
  • Use the defined scale (h1–h6 + Large/Body/Small) — no arbitrary sizes.
  • Apply medium weight to headers and labels to separate them from body text.
  • Use 1.5 line-height for long, wrapping copy.
✕ Don't
  • Set custom font sizes outside the scale.
  • Apply line-height to single-line controls — it misaligns content.
  • Use more than two weights in one block of text.
rem Developer notes
  • Size type in rem so it scales with the user's root font setting.
  • Expose the scale as tokens (--text-body: .875rem) and reference them.
  • Load only the Roboto weights you use (300/400/500/700) to keep payload small.
Foundations

Iconography

Icons convey actions, signal status, and help categorize data. Every icon should be clear, intuitive, and consistent. The majority of our icons are filled, giving strong contrast against dense content.

32px
24px · default
16px

Construction

  • 16px base grid; 1.6px line thickness, scaled proportionally (e.g. 20px / 2px).
  • Regular corner radius 2px · small 1px · large 5px.
  • Default sizing 24×24px; small 16×16px; large 32×32px.

Categories

action, alert, audiovisual, communication, content, device, editor, file, hardware, image, map, navigation, notification, places, social, toggle. Each icon belongs to exactly one category.

✓ Do
Keep font weights consistent within the same context and state. Name icons after the object they represent (e.g. trash, not delete).
✕ Don't
Mix different icon weights within the same context, state, or importance. Add corner radius where it isn't needed.
Foundations

Grid & Adaptive Design

The grid is the base of our design philosophy. Layouts use a 12-column grid for the main content area (excluding navigation, headers, and footers) so designs stay flexible across complex interfaces.

12-column responsive grid

Our grid blends fixed and flexible paradigms: it stays fluid up to a maximum width, then becomes fixed while only the margins continue to expand.

Adaptive design

Sometimes responsive isn't enough. You might enter large amounts of data on desktop, but only view or enter a small subset on tablet or phone. Adaptive design means manually crafting device-specific layouts and adapting the complexity of each use case to the form factor — slightly more effort, but far more targeted support.

Guidelines

✓ Do
  • Build the main content on the 12-column grid.
  • Keep gutters and margins on the 4px spacing scale.
  • Switch to adaptive layouts when a use case genuinely differs by device.
✕ Don't
  • Place navigation, headers, or footers inside the content grid.
  • Hard-code pixel widths that break the fluid-then-fixed behavior.
  • Nest grids so deeply the column logic becomes unpredictable.
CSS grid Developer notes
  • Use native CSS Grid / Flexbox; reserve absolute positioning for overlays.
  • Drive column count and gaps from tokens and the breakpoint set.
  • Test each layout at every breakpoint, not just desktop.
Foundations

Illustrations

UX illustrations pair with written messages to help users grasp a concept quickly, make complex ideas relatable, and add personality. Today they're used only for empty states and onboarding — sparingly, so they never distract from the workflow.

✓ Do
Pair every illustration with a message that clarifies the situation and next steps. Use the right size for the context. Keep designs minimal and culturally neutral.
✕ Don't
Put text inside an illustration, scale or hack it unnecessarily, or use one that doesn't add value or clarify the situation.
Foundations

Elevation & Shadow

Shadows show the depth and edge of an elevated component. Elevation is determined by a component's height and its relationship to others — as elevation increases, so does the shadow's intensity.

Level 1 · Resting
Level 2 · Raised
Level 3 · Overlay

Guidelines

✓ Do
  • Match shadow intensity to a component's elevation level (1–3).
  • Use elevation to signal relationships — overlays sit above content.
  • Keep resting surfaces flat or at level 1.
✕ Don't
  • Stack many heavy shadows — it muddies the hierarchy.
  • Invent custom shadow values per component.
  • Use shadow as a decorative border substitute.
box-shadow Developer notes
  • Reference the shadow tokens (--shadow-1/2/3); don't write ad-hoc box-shadow.
  • Raise elevation on :hover / open states to reinforce interaction.
  • Avoid animating box-shadow directly on large surfaces — animate a pseudo-element for performance.
Foundations

Engineering Guide

Practical rules for the team building Ecovium. Use the tokens, spacing, breakpoints, and accessibility conventions below so what ships matches what's designed — and stays consistent as the product grows.

Design tokens

Never hard-code a hex value or pixel. Reference the CSS custom properties so a single change propagates everywhere. The full set lives in the Figma Web Library; the most-used are below.

TokenValueUse for
--blue-500#0066CCPrimary actions, links, focus, selected states
--header#152F4EApp header, top-level navigation, tooltips
--ink#232628Primary body text
--ink-muted#7C7D7ESecondary text, captions, placeholders
--green-500#3FBF30Success status & banners
--yellow-400#FCCF15Warning status & banners
--red-500#FC5D19Error / destructive status & banners
--lightblue#EAF0F6Selected rows, hover surfaces, subtle fills

Spacing scale

All spacing is a multiple of 4px (the baseline grid). Stick to the scale for margins, padding, and gaps — it keeps rhythm consistent across every screen.

4
8
12
16
24
32
40
56
64

Responsive breakpoints

Mobile
0 – 599px
Tablet
600 – 1023px
Desktop
1024 – 1439px
Wide
1440px +

The 12-column grid stays fluid up to the max width, then becomes fixed while margins expand. Where a responsive layout doesn't fit the task, switch to adaptive device-specific designs.

Accessibility checklist

Every component ships to WCAG 2.1 AA. Before merging, confirm:

  • All interactive elements are reachable and operable by keyboard (Tab / Shift-Tab / Enter / Space / arrows where relevant).
  • A visible focus ring appears on keyboard focus and never on inactive controls.
  • Text contrast is at least 4.5:1 (3:1 for large text and non-text UI like icons and borders).
  • Color is never the only signal — pair it with an icon, label, or text.
  • Inputs have associated <label>s; icon-only buttons have an accessible name (aria-label).
  • Touch targets are at least 44 × 44px; status changes are announced to screen readers.

Contrast — get it right

Primary on white text4.6 : 1AA Pass
Header surface13.1 : 1AAA Pass
Ink on white15.3 : 1AAA Pass
blue-200 on white1.5 : 1Fails — décor only

Light tints (100–300) are for backgrounds and decoration, never for text. For text, use 600+ shades or ink tokens.

State naming convention

Every interactive component shares the same five states. Name classes and design layers consistently:

StateClassTrigger
Default.is-defaultResting, no interaction
Hover:hoverPointer over the target
Focus:focus-visibleKeyboard navigation
Active / Pressed:active / .is-pressedMid-press
Disabled[disabled] / .is-disabledUnavailable — 40% opacity
</> Global dev rules
  • Consume tokens, not literals — var(--blue-500) over #0066CC, spacing from the 4px scale.
  • Reach for semantic HTML first (<button>, <table>, <nav>) before adding ARIA — native semantics are free accessibility.
  • Build the five states for every interactive element; don't ship default-only.
  • Keep components controlled & stateless where possible; pass data and callbacks in, emit events out.
  • Respect prefers-reduced-motion — gate non-essential animation behind it.
Component · Forms

Text Input

Inputs let users enter a short string of information into a form.

Anatomy

  • 1Label
  • 2Text input field
  • 3Placeholder / Value
Default · empty
Filled
Focused
Disabled
This field is required.
ElementCasingLimit
LabelTitle case, no punctuation, single noun/noun-phrase (no verbs)25 chars
PlaceholderSentence case, no punctuation — typically "Enter [item]"30 chars

Guidelines

✓ Do
  • Pair every field with a visible, title-case label.
  • Show inline validation on blur or submit, with a clear message.
  • Use placeholder text only as a hint, not as the label.
✕ Don't
  • Use the placeholder as the only label — it disappears on typing.
  • Block typing of valid characters; validate, don't restrict silently.
  • Pack verbs into labels (labels are nouns).
<input> Developer notes
  • Always bind a <label for> (or wrap) — placeholders are not labels.
  • Link errors with aria-describedby and set aria-invalid.
  • Use the right type / inputmode for mobile keyboards (email, number, tel).

Extended states & slots

Required — used to match the carrier event.
Leading slot — an icon hints the field type.
Trailing slot — a visibility toggle.
Read-only — shown, not editable.
Options
  • Label — a short, title-case noun naming the field; always visible, even when filled.
  • Placeholder — an optional hint shown only while empty (“Enter article name”); never a stand-in for the label.
  • Leading / trailing slot — an optional icon, unit (€), or action such as a password-visibility toggle.
  • Helper text — quiet guidance under the field describing the expected format or purpose.
  • Feedback text — replaces the helper text to report validation status (error / success).
  • Required indicator — a red asterisk marks fields that must be completed.
Behaviour in context
  • Interaction — clicking anywhere in the container focuses the field for editing.
  • Validation — validate on blur or submit; pair color with a text message and icon, never color alone.
  • Truncation — overflowing text clips to the container width; the full value stays editable.
  • Alignment — text aligns left; right alignment is reserved for number fields.
Accessibility
  • Bind a real <label for> and link helper / error text with aria-describedby.
  • Set aria-invalid="true" on error and move focus to the first invalid field on submit.
  • Choose the right type / inputmode so mobile shows the correct keyboard.
Related
Component · Forms

Data Select

Date selects let users enter a date by selecting it from a calendar or typing it into a date field. The input opens a calendar dialog on click.

Anatomy

  • 1Date picker input
  • 2Calendar
June 2026
SuMoTuWeThFrSa 123456789101112131415161718192021222324252627282930
ElementDetail
LabelTitle case, no punctuation · limit 25 chars
PlaceholderLowercase mm/dd/yyyy
Day labelsSu, Mo, Tu, We, Th, Fr, Sa

Guidelines

✓ Do
  • Let users either type or pick from the calendar.
  • Use the lowercase mm/dd/yyyy placeholder to signal format.
  • Open the calendar on focus / click of the field.
✕ Don't
  • Force a specific input method — support both.
  • Allow impossible dates; clamp to valid ranges.
  • Trap keyboard focus when the calendar is open.
input + dialog Developer notes
  • Parse and validate typed dates leniently, then normalize on blur.
  • Make the calendar a role="dialog" with full arrow-key navigation.
  • Return focus to the input when the calendar closes.
Component · Forms

Checkbox

Checkboxes let users select or deselect multiple values from a list, or toggle a single option (e.g. a setting on a configure page).

Anatomy

  • 1Checkbox
  • 2Label
Selected
Unselected
Disabled
Disabled
Error
✍️
Labels are sentence case without punctuation (unless a proper noun or user-inputted). Use a parallel structure for labels in the same list. Limit: 60 characters.

Guidelines

✓ Do
  • Use parallel, sentence-case labels within a list.
  • Use checkboxes for multi-select or a single independent toggle.
  • Show an error style when a required selection is missing.
✕ Don't
  • Use a checkbox for mutually exclusive options (use radios).
  • Make the label too small or far from the box to tap.
  • Add punctuation to labels unless it's a proper noun.
type=checkbox Developer notes
  • Use a native <input type="checkbox">; style the box, keep the input operable.
  • Support the indeterminate state for 'select all' headers via the DOM property.
  • Make the whole label clickable by associating it with the input.
Component · Forms

Radio Button

Radio buttons let users select a single option from a mutually exclusive set. Use radios when all options should be visible at once; use a dropdown when the list is long.

Anatomy

  • 1Radio control
  • 2Label
Selected
Unselected
Disabled selected
Disabled
Error

Interactive group

✓ Do
Use a parallel structure for labels and pre-select a safe default when one option is most common.
✕ Don't
Use radios for on/off states (use a Switch) or when users may pick more than one (use Checkboxes).

Labels are sentence case without punctuation unless a proper noun · limit 60 characters.

Guidelines

type=radio Developer notes
  • Use a native <input type="radio"> set sharing one name.
  • Arrow keys move within the group; only the checked radio is tabbable.
  • Wrap related radios in a <fieldset> with a <legend>.
Component · Forms

Switch

Switches let users choose between two mutually exclusive states on the same line — usually enabling vs. disabling. Changes save immediately, so avoid switches on pages that require a save/update action.

Anatomy

  • 1Track
  • 2Handle
  • 3Label
On
Off
Disabled
Disabled
✓ Do
Use when selecting a single ON/OFF or TRUE/FALSE state. The label is the name of the state itself.
✕ Don't
Use as a substitute for radios or checkboxes, or on pages where changes require a manual save.

Label: sentence case without punctuation · limit 30 characters.

Guidelines

role=switch Developer notes
  • Use role="switch" with aria-checked; toggle on Space/Enter.
  • Persist the change immediately and reflect server state on failure.
  • Don't use where a Save step is required — that's a checkbox pattern.
Component · Forms

Slider

A slider is a bar with a grabbable handle. Users drag horizontally to a value within a predefined range. Always display the corresponding value nearby.

Anatomy

  • 1Track
  • 2Label
  • 3Handle
Discount35%
Disabled60%

Use the standard range slider for granular numeric values, such as percentages from 0–100%.

Guidelines

✓ Do
  • Always show the current value near the handle.
  • Use sliders for granular ranges like 0–100%.
  • Give the handle a large enough hit area.
✕ Don't
  • Use a slider where a precise number entry is needed.
  • Hide the selected value.
  • Use tiny handles that are hard to grab on touch.
type=range Developer notes
  • Prefer <input type="range"> for free keyboard + screen-reader support.
  • Set aria-valuetext when the raw number needs units (e.g. '35%').
  • Support arrow keys, Home/End, and Page Up/Down for stepping.
Component · Forms

Dropdown Flyout

The dropdown flyout nests additional menu items within parent items, giving users more options. It can contain multiple levels and is launched from a button, overflow, or dropdown.

Duplicate
Move to
Drafts
Archived
2024
2025
2026
Trash
Export
Delete
Placement. Depending on the button's position, the flyout opens to the left or right. If the menu is near the right edge of the page, the flyout displays on the left. For sizing, refer to Buttons.

Guidelines

✓ Do
  • Flip the flyout side based on available space.
  • Keep nesting shallow (2–3 levels max).
  • Open submenus on hover and on focus / keyboard.
✕ Don't
  • Let menus run off-screen.
  • Nest so deep users lose their place.
  • Require a pixel-perfect hover path between levels.
role=menu Developer notes
  • Use role="menu" / menuitem with roving tabindex.
  • Right/Left arrows open and close submenu levels.
  • Detect viewport edges and reposition (left/right flip) before paint.
Component · Actions

Button

Buttons initiate actions across the app. Labels clearly describe what happens on click — whether linking to another page or triggering an action. If several items share the same verb, use a Dropdown instead.

Anatomy

  • 1Button container
  • 2Label
  • 3Icon (optional)

Kinds

Primary
Secondary
Tertiary
Ghost
Destructive
KindUse case
PrimaryThe most important CTA, tied to the user's main goal. Aim for one primary action per screen, section, or container.
SecondaryRegular, non-primary actions. Several may appear per screen.
TertiaryLowest priority, or paired with a primary to mark an optional action — e.g. "Save" (primary) + "Edit" (tertiary).
GhostThe least emphasis, best for the lowest-priority actions.

Sizes

56px · heroes
40px · default
32px · compact

With icon & icon-only

Settings
ℹ️
Use icon-only buttons only when the icon clearly conveys the intent and it's obvious the icon is a button. Always pair with a tooltip on hover (hover the gear above).

States

Default
Hover
Focus ring
Pressed
40% opacity
StateBehavior
DefaultResting appearance before any interaction.
HoverColor changes to indicate the button can be pressed.
FocusA blue outline appears on keyboard/tab navigation. Never on inactive buttons.
PressedColor shifts while the button is being pressed.
Disabled40% opacity — the option exists but isn't available.
📐
Grouping. Space between grouped or stacked buttons is a multiple of 4px: 20px large · 16px medium · 12px small · 8px mini.

Guidelines

✓ Do
  • Use one primary action per screen or container.
  • Write labels as a clear verb + noun ('Create order').
  • Add a tooltip to every icon-only button.
✕ Don't
  • Place multiple competing primary buttons together.
  • Disable a button without explaining why nearby.
  • Use a button for navigation when a link is correct.
<button> Developer notes
  • Use a real <button> (type=button/submit) — not a clickable <div>.
  • Icon-only buttons need aria-label; disabled buttons get disabled, not just opacity.
  • Group spacing follows the scale: 20 / 16 / 12 / 8px for L / M / S / mini.
Options
  • Label — short, scannable text describing the action (verb + noun, e.g. “Create order”).
  • Leading icon — sits left of the label to reinforce meaning; the preferred position. In a loading state it is swapped for a spinner.
  • Trailing icon — only when it reads naturally, e.g. a “Next ›” wizard step or an export download arrow.
  • Type — use submit to send a form; use the default button for dialogs, navigation and other actions.
Behaviour in context
  • Interaction — the whole container is the hit area; a focused button fires on Space or Enter.
  • No truncation — labels stay on one line and are never cut off; shorten the wording instead.
  • Width & alignment — buttons size to content with a sensible minimum so pairs like “OK / Cancel” align; they may also span a container’s full width.
  • Clustering — group related actions with an 8px gap; a cluster may mix one primary with secondary and tertiary buttons.
Content & writing
  • Lead with a verb and keep to one or two words where possible.
  • Add an ellipsis (“Save as…”) when the action needs more input before it completes.
  • Reserve the danger variant for irreversible actions; don’t repeat it down a list or table.
Related
Component · Actions

Split Button

A split button combines a standard button with a dropdown menu — a main action on the left, and an arrow on the right that expands related, parallel actions.

Anatomy

  • 1Icon (optional)
  • 2Label
  • 3Dropdown action icon
Add correction invoice
Import from file
Duplicate last

Use the split button when…

  • More than two related actions are possible but space is limited or packed.
  • Users select from multiple parallel actions — each a path forward, none cancelling the action.
  • You want to reduce visual complexity across several available actions.

Hover, disabled and other states reuse the same styling as Buttons.

Guidelines

✓ Do
  • Use it when 2+ parallel actions share limited space.
  • Make the left side the most common default action.
  • Keep the secondary actions related to the default.
✕ Don't
  • Put unrelated or destructive actions in the menu.
  • Hide the default action behind the dropdown.
  • Use it when a single button would do.
<button> ×2 Developer notes
  • Two buttons in one shell: the main action and a menu toggle with aria-haspopup.
  • Arrow keys move within the menu; Esc closes and returns focus to the toggle.
  • States reuse the Button tokens — don't fork the styling.
Component · Actions

Tabs

Tabs navigate between different but related content — commonly on tool landing pages and item detail pages.

Tab states

Content for the selected tab appears here.
✍️
Tab names are 1–3 nouns that concisely describe their content, in title case without punctuation. Limit: 30 characters. When tabs overflow, collapse extras into an overflow menu.

Guidelines

✓ Do
  • Use 1–3 noun tab names in title case.
  • Collapse overflowing tabs into an overflow menu.
  • Keep the selected tab's content related to its label.
✕ Don't
  • Use tabs for sequential steps (use a wizard).
  • Change content destructively on tab switch without warning.
  • Exceed the 30-character tab-name limit.
role=tablist Developer notes
  • Use role="tablist"/"tab"/"tabpanel" with aria-selected.
  • Arrow keys move between tabs; only the active tab is in the tab order.
  • Lazy-load heavy panels but preserve scroll/state on return.
Component · Data

Table

Data tables present structured records so users can scan, sort, filter, and act on many items at once. The table is the backbone of Ecovium's list pages — orders, invoices, products, and subscriptions all live in one.

Anatomy

  • 1Tabs
  • 2Search field
  • 3Header row
  • 4Row
  • 5Container
  • 6Row checkbox
  • 7Sort button
  • 8Filter button
  • 9Link button
  • 10Tooltip
  • 11Add / remove columns
  • 12Button
  • 13Advanced filter
  • 14Action button
  • 15Expand dropdown
  • 16Highlight row
  • 17Status info
  • 18Pagination
  • 19Page numbers
  • 20Page arrows
  • 21Rows-per-page

Full table · interactive

0 Selected
Date / Time Status From Delivered Origin Country Order Package
Showing 12–18 of 256 records

Interactive elements

ElementBehavior
Sort buttonClick a column header arrow to sort ascending / descending.
Filter buttonThe funnel icon opens a filter for that column's values.
Advanced filterWhen the switcher is On, an extra filter row appears below the toolbar.
Add / remove columnsThe overflow icon in the header lets users show or hide columns.
Action buttonThe three-dot inline menu reveals row-level actions.
Expand dropdownThe chevron expands the row to reveal a detail card (try it below).
Link buttonOrder numbers are links that open the related record or an external page.

Row behavior

Hover
On hover, the entire row takes a light background color, and row-level action buttons become visible.
Selected
Selecting a checkbox fills the row with a background color and surfaces a bulk action bar above the first row. The header checkbox selects all.

Text

  • Column header text uses a medium weight font to differentiate it from row text.
  • Text longer than the column width truncates with an ellipsis; on hover a tooltip shows the full value.
  • If sorting is enabled, a sort arrow appears next to the ellipsis in the column header.
  • Important values may be set in bold; box / package icons use a soft color at 50% opacity.

Status information

Done Open Return In fulfillment •••

Statuses reuse the semantic palette — green (done), blue (open), red (return), orange (in fulfillment) — paired with a progress indicator of colored segments.

Specs · Height & padding

PropertyValue
Header row height54px
Row height54px
Space between rows2px
Cell padding24 × 24px
Container corner radius5px (rectangular by default)
Important-row highlight4–5px dark bar on the left edge
Use the left highlight bar (4–5px) to flag a row that needs more attention. Use it sparingly — if everything is highlighted, nothing is.

Guidelines

<table> Developer notes
  • Use semantic <table><th scope><td> — not stacked divs.
  • Sortable headers are <button>s with aria-sort.
  • For large datasets, paginate or virtualize; keep selection state outside the row component.
Component · Data

Pagination

Pagination breaks large datasets into pages so users can navigate without endless scrolling. It pairs a record count, page controls, and a rows-per-page selector.

Anatomy

  • 1Status information
  • 2Page numbers
  • 3Previous / next arrows
  • 4Rows-per-page dropdown
Showing 1–13 of 256 records
  • Status information tells users where they are — "Showing 12–18 of 256 records".
  • Page numbers jump straight to a page; the current page is filled with the primary color.
  • Arrows move to the previous or next page and disable at the boundaries.
  • Rows-per-page lets users tune density (13 / 25 / 50).

Guidelines

✓ Do
  • Always show the record range ('12–18 of 256').
  • Disable the arrows at the first / last page.
  • Remember the rows-per-page choice per user.
✕ Don't
  • Reset the user to page 1 on every filter change unintentionally.
  • Show dozens of page numbers — truncate with an ellipsis.
  • Make targets too small to tap.
<nav> Developer notes
  • Wrap in <nav aria-label="Pagination">; mark current with aria-current="page".
  • Sync the active page to the URL so it's shareable and back-button friendly.
  • Arrows are buttons with accessible names ('Previous page').
Component · Feedback

Tooltip

Tooltips display additional descriptive information about an element — explaining a term, denoting a required format (e.g. mm/dd/yyyy), or clarifying why a button is disabled. They appear on hover and cannot themselves be hovered.

Appears above the element
Appears below the element
Appears to the left
Appears to the right
Format: mm/dd/yyyy?

Hover any control above to preview placement.

Best practices

  • Provide useful, additional information or clarification; succinctly expand on the element.
  • Use for icon-only buttons or buttons with a keyboard shortcut.
  • Don't communicate critical information (e.g. form errors) or include links / buttons.
  • Use sparingly — aim for 2–4 per page. A 24×24px help icon may draw attention when needed.

Content is concise, sentence case with punctuation · limit 200 characters. A dotted underline indicates a text trigger.

Guidelines

✓ Do
  • Keep content to one concise, sentence-case line.
  • Attach tooltips to icon-only buttons and shortcuts.
  • Aim for 2–4 tooltips per page, max.
✕ Don't
  • Put links, buttons, or critical info inside a tooltip.
  • Show tooltips on tap-only mobile flows.
  • Exceed the 200-character limit.
role=tooltip Developer notes
  • Trigger on hover and focus; link via aria-describedby.
  • Dismiss on Esc; never trap focus inside the tooltip.
  • Position with collision detection so it never clips off-screen.
Component · Feedback

Spinner

Spinners indicate a loading state on a full page or a smaller component like a menu, select, or button.

Sizes

Large
Medium
Small
Loading invoices

Color

Gray · default
Blue · in focus
White · dark bg
✓ Do
Notify users that their request was received and the action will complete soon.
✕ Don't
Use a spinner as feedback for an entire page load.

Optional label sits below the large or medium spinner — sentence case, no punctuation, limit 60 characters.

Guidelines

role=status Developer notes
  • Wrap in role="status" with a visually-hidden 'Loading' label.
  • Gate the spin animation behind prefers-reduced-motion.
  • Avoid full-page spinners — use skeletons for page-level loads.
Component · Feedback

Progress Bar

Progress bars visually show system loading — uploading a file or loading a page — as well as user progress, like filling out a form.

Anatomy

  • 1Track / Background
  • 2Progress
Uploading specification.pdf68%
Form completion100%
Indeterminate

The progress bar is a block element that fills the width of its container (responsive widths).

Guidelines

✓ Do
  • Show a percentage or step count when known.
  • Use the indeterminate style only when duration is unknown.
  • Let the bar fill the width of its container.
✕ Don't
  • Use a progress bar for instant actions.
  • Leave a determinate bar stuck at one value.
  • Replace it with a spinner when real progress is measurable.
<progress> Developer notes
  • Use <progress> or role="progressbar" with aria-valuenow/min/max.
  • Update aria-valuenow as it advances; omit it for indeterminate.
  • Pair long operations with a textual status update.
Component · Feedback

Empty State

Empty states appear on pages where nothing has been created yet. They tell users what they need to know and how to get started with the page's main features.

Anatomy

  • 1Illustration
  • 2Heading
  • 3Secondary text
  • 4Primary button

No invoices yet

Create your first invoice to start tracking payments, statuses, and clients all in one place.

When to use

  • When no data exists yet.
  • When users must take an action to display content.
  • When a search or filter returned no results.
✓ Do
Orient users by explaining the benefit of the feature, use clear empowering language, and explain the steps to activate it. Use a single primary call-to-action.
✕ Don't
Make users feel unsuccessful or guilty for not using a feature, or pile on multiple primary actions.

Guidelines

layout Developer notes
  • One primary CTA only; render it conditionally on create permission.
  • Reuse the shared illustration set — don't ship one-off art.
  • Distinguish 'no data yet' from 'no results' with different copy.
Component · Display

Avatar

Avatars visually represent users, places, and things — as rich media or representative illustrations. They act as visual cues that help users identify an item faster in long lists and dense interfaces.

Anatomy

  • 1Background
  • 2Image
  • 3Initials
  • 4Icon

Types

Image
JLInitials
Icon · company
SBInitials · tinted

Sizes

JLXL · 56px
JLLarge · 40px
JLMedium · 32px
JLSmall · 24px

With status & group

SBOnline
AKOffline
JLSBAK+5
Group / overflow
🧩
Initials are auto-generated from the first letter of the user's first and last name on a gray-filled circle, unless they upload an image. Always crop rich media correctly to avoid clipped or distorted images. Use avatars as cues — not decorative flair.

Guidelines

✓ Do
  • Use avatars as fast identity cues in dense lists.
  • Crop rich media correctly to avoid distortion.
  • Fall back to initials on a gray circle when no image exists.
✕ Don't
  • Use avatars as purely decorative flair.
  • Show clipped or stretched images.
  • Rely on the avatar alone to identify a user — pair with a name.
<img>/<span> Developer notes
  • Provide meaningful alt (the person/company name); empty alt if a name sits beside it.
  • Generate initials from first + last name; pick text color for contrast on the fill.
  • Lazy-load list avatars and reserve space to avoid layout shift.
Component · Display

Badge & Pill

A badge is a visual label that conveys status or highlights content. Pills are read-only status indicators — not interactive. We suggest semantic colors (red, yellow, green) for statuses.

Status types

Paid Unpaid Pending Draft Primary Ext 1 Ext 2

With icon

Paid Unpaid

Sizes

Large Medium Small
SizeUse case
LargeLarger viewports or heroes that need to draw a user's attention.
MediumDefault — use in most cases while maintaining visual balance.
SmallCompact contexts where balance must be preserved.

Labels are uppercase without punctuation · limit 30 characters. Available colors: gray (default), blue, green, yellow, red, cyan, magenta.

Guidelines

✓ Do
  • Use semantic colors for status (green/yellow/red).
  • Keep labels short, uppercase, ≤30 characters.
  • Pick a size that balances with surrounding content.
✕ Don't
  • Make badges interactive — they're read-only.
  • Use too many colors at once.
  • Let labels wrap (unless translation forces it).
<span> Developer notes
  • Render as a non-interactive <span>; don't add click handlers.
  • If the badge is the only status signal, add visually-hidden text for screen readers.
  • Drive color from the semantic token, not a hard-coded value.
Component · Display

Token

Tokens appear in multi-select dropdowns and file attachers to indicate what's been selected or attached. Tokens here are removable — a single click on the icon clears one.

Anatomy

  • 1Container
  • 2Label
  • 3Remove icon
Tag for test Fashion EU Tariff A long token label that truncat…

When not user-inputted, values are title case without punctuation · limit 30 characters. Tokens that exceed the limit truncate with an ellipsis.

Guidelines

✓ Do
  • Use tokens to show what's selected or attached.
  • Make the remove (✕) clearly tappable.
  • Truncate long values with an ellipsis.
✕ Don't
  • Use tokens for non-removable, read-only labels (use a badge).
  • Hide the remove affordance.
  • Let one long token break the layout.
<span> + button Developer notes
  • The remove control is a real <button aria-label="Remove {value}">.
  • Support Backspace to remove the last token from the field.
  • Keep the parent field focusable and announce additions/removals.
Component · Display

Thumbnail

Thumbnails preview images or files — either a smaller version of an uploaded image, or an icon representing the file type. If an image preview can be generated, display it.

Anatomy

  • 1Image
  • 2File icon
  • 3Caption
front-image.jpg
PDF
specification.pdf
unknown-file

Large thumbnails are 104px. Captions sit below (default) or pinned to the right, truncate after 2 lines, and don't use special truncation for the file extension · limit 36 characters. Use a fallback icon-file-unknown when the type can't be determined.

Guidelines

✓ Do
  • Show an image preview when one can be generated.
  • Use a file-type icon when no preview exists.
  • Cap captions at 2 lines / 36 characters.
✕ Don't
  • Stretch non-square images to fit.
  • Use special truncation that hides the file extension.
  • Leave an undetermined file without the fallback icon.
<img> Developer notes
  • Use object-fit: cover for previews; map MIME types to icons for the rest.
  • Set width/height to reserve space and prevent layout shift.
  • Fall back to icon-file-unknown on load error or unknown type.
Component · Display

Dropzone

The dropzone is a block element that fills its container. Instructive text is centered inside, with a button-styled link for accessibility.

Anatomy

  • 1Dropzone area
  • 2Icon (optional)
  • 3Button / link
  • 4Instructive text
Icon dropzone — more space available
Drop images here or click here to browse
Basic dropzone — less space
Drop file or click here

Either dropzone has identical functionality — choose the icon variant when the layout allows more space, the basic variant when space is limited.

Guidelines

✓ Do
  • Use the icon variant when space allows, the basic variant when it's tight.
  • Let users either drop or click to browse.
  • Show clear states for hover, dragging-over, and disabled.
✕ Don't
  • Accept files silently with no feedback.
  • Hide the accepted file types / size limit.
  • Make the click target ambiguous.
type=file Developer notes
  • Pair the visible dropzone with a hidden <input type="file"> for keyboard/AT users.
  • Validate type & size on the client, but re-validate on the server.
  • Handle dragenter/over/leave/drop and always preventDefault to enable dropping.
Component · Forms

AutoComplete New

An input with real-time suggestions as the user types. It speeds up entry for large value sets — countries, clients, products — while letting users still type freely.

Try typing "ge", "un", or "sw".

✓ Do
  • Highlight the matching substring in each suggestion.
  • Debounce remote lookups and cap the list height.
  • Allow free text when no match is required.
✕ Don't
  • Block submission while suggestions are loading.
  • Auto-select the first item without user intent.
  • Show hundreds of unfiltered options.
role=combobox Developer notes
  • Pattern: role="combobox" + aria-expanded, list is role="listbox".
  • Arrow keys move the active option (aria-activedescendant); Enter selects, Esc closes.
  • Debounce input ~250ms and cancel stale requests.
Component · Forms

MultiSelect New

Select several values from a list at once. Choices appear as removable tokens in the field, with a checkbox menu for adding or removing.

Click to open, tick items, and remove tokens with the ✕.

role=listbox Developer notes
  • Use role="listbox" with aria-multiselectable="true"; options carry aria-selected.
  • Reflect selection in both the tokens and the menu checkboxes from one source of truth.
  • Support "select all" and search for long lists.
Component · Forms

Input Number New

A numeric input with stepper controls and formatting. Use it for quantities, prices, and any value the user nudges up or down.

type=number Developer notes
  • Use inputmode="decimal"; format on blur, store the raw number.
  • Respect min/max/step and clamp on the steppers.
  • Steppers are buttons with aria-label ("Increase quantity").
Component · Forms

Rating New

A star control for capturing or displaying a score. Supports hover preview, read-only display, and clearing.

Interactive
Read-only · 4 of 5
Half & empty
role=radiogroup Developer notes
  • Interactive ratings are a radiogroup; arrow keys change the value.
  • Read-only ratings get aria-label="4 out of 5" and no tab stop.
  • Provide a clear/reset affordance for optional ratings.
Component · Forms

Select Button New

A segmented control for picking one option (or toggling several) from a small, always-visible set — a compact alternative to a dropdown or radios.

Single select
Multi toggle · with icons
role=group Developer notes
  • Single select behaves like a radiogroup; multi behaves like toggle button[aria-pressed].
  • Keep options short (1–2 words) and the set small (2–5).
Component · Forms

Password New

A masked input with a show/hide toggle and a live strength meter that guides users toward a secure password.

Use 8+ characters with letters, numbers & symbols
type=password Developer notes
  • The show/hide toggle is a button with aria-pressed; never log the value.
  • Compute strength on the client for UX, but enforce policy on the server.
  • Announce strength changes via an aria-live="polite" region.
Component · Forms

Input OTP New

Discrete single-character fields for one-time codes and PINs. Focus auto-advances as the user types and steps back on delete.

Type to advance; Backspace to step back.

inputmode Developer notes
  • Set inputmode="numeric" + autocomplete="one-time-code" so mobile offers the SMS code.
  • Handle paste of the full code across boxes; move focus programmatically.
  • Expose the combined value to the form as a single field.
Component · Forms

Color Picker New

A compact swatch that opens a palette for choosing a color — used for labels, tags, and theming.

type=color Developer notes
  • Offer the brand palette first; a native <input type="color"> can back the custom option.
  • Show the selected value as a hex string for copy/paste.
Component · Forms

Knob New

A circular input for a bounded value — a space-saving, visual alternative to a slider for things like capacity, volume, or completion.

70
90 Read-only
role=slider Developer notes
  • Expose as role="slider" with aria-valuenow/min/max; back it with a real range input for keyboard support.
  • Render the arc with stroke-dasharray/dashoffset for crisp scaling.
Component · Panels

Accordion New

Stacked, collapsible sections that let users expand only the content they need — ideal for FAQs, settings, and dense detail panels.

Orders are processed within 24 hours. Delivery windows depend on the destination country and selected carrier.

Returns are accepted within 30 days. Refunds are issued to the original payment method once the item is received.

EU tariff data is attached automatically when present on the product record.

disclosure Developer notes
  • Each header is a button with aria-expanded controlling a region via aria-controls.
  • Decide single- vs multi-open up front; animate height with grid-template-rows or max-height.
Component · Panels

Card New

A flexible container that groups related content and actions. Cards organize dashboards and list items into scannable, self-contained units.

Shipment

Order #02564

7 packages · Warehouse → Germany. Estimated delivery in 2 days.

SB

Sebastian Breitzke

Logistics Lead

Open orders14
Resolved231

Sizes & padding

Three sizes scale padding and title with content density. All spacing stays on the 4px grid.

SizePaddingMain titleUse case
S — Compact16pxBold 16px · 1 remDense lists, sidebars, inline cards
M — Default20pxBold 20px · 1.25 remMost content cards and detail panels
L — Spacious24pxBold 20px · 1.25 remHero cards and primary dashboards
📐
Header anatomy. Main Title (Bold 20px), Subtitle (Bold 14px), Body (Regular 14px). Vertical rhythm: 20px above the title, 14px to the subtitle, 32px to the body, 20px bottom padding.

Card patterns — in the product

TermineHLA1-240807
Pending
Ordered: 20.05.2024
Invoiced: 20.05.2024
Fulfilled: 20.05.2024
Gross Value
BYR
Net Value
H-EC 5477
Tax Rate
0
Articleaych-43122932093480
Pending
A.Name: Trench Coat A
A.Number: 23132158661
Bruttowert: 234 €
Steuersatz: 50%
Parteien
Sebastian Breitzke
Ecovium
Hannover Nr 3
Germany
+49 22393532
ReturnHLA1-240807
Pending
Created: 20.05.2024
Judged: 20.05.2024
By: Sebastian Breitzke
Received
17.05.2024
Closed
18.05.2024
ReturnHLA1-240807
Active
Created: 20.05.2024
Judged: 20.05.2024
By: Sebastian Breitzke
Received: 17.05.2024
TourHLA1-240807 · Max Mustermann
Pending
Stops: Hannover – Zurich (8)
Zeitraum: 15.08.24 11:10 – 22:00
Executed by: DB Schenker
H-EC 5477 · DE 6578
No order assigned yet.
Select order
<article> Developer notes
  • Use <article>/<section> with a heading; make only inner controls focusable.
  • If the whole card is a link, use a single anchor with an accessible name — avoid nested interactive elements.
  • Drive padding/title from the size token (S/M/L); status pills read from the semantic palette.
Component · Panels

Stepper New

Guides users through a multi-step task, showing where they are and what's left. Use for wizards like onboarding, checkout, or creating an order.

Details
2Packages
3Customs
4Review
aria-current Developer notes
  • Mark the active step with aria-current="step"; completed steps get a checkmark and accessible "completed" text.
  • Allow back-navigation to completed steps; validate before advancing.
Component · Panels

Panel & Fieldset New

A titled container that groups content, optionally collapsible. Use panels to chunk long forms and dashboards into digestible blocks.

Basic Information

Article ID, name, category, and description live here. Click the chevron to collapse this panel.

Dimensions
<fieldset> Developer notes
  • Group related form controls in a real <fieldset> + <legend> for screen readers.
  • Collapsible panels use the disclosure pattern (aria-expanded).
Component · Panels

Divider New

A thin rule that separates content into groups — horizontally or vertically, with an optional centered label.

Section one of the content.

Section two, separated by a plain divider.

OR
Left
Right
role=separator Developer notes
  • Use <hr> or role="separator"; a labelled divider's text should be informative.
  • Keep it decorative-light — don't overuse to compensate for poor spacing.
Component · Panels

Toolbar New

A horizontal surface that groups actions and controls — typically anchoring the top of a page, editor, or table with primary actions on the right.

role=toolbar Developer notes
  • Wrap in role="toolbar" with an aria-label; arrow keys move between controls.
  • Collapse low-priority actions into an overflow menu on narrow screens.
Component · Data

Timeline New

Displays a sequence of events along a connected track — perfect for order history, activity logs, and shipment tracking.

  • Order placed07/02/2023 · 5:31 PM

    Order #02564 created by Sebastian Breitzke.

  • Packed at warehouse07/02/2023 · 9:12 PM

    2 packages prepared for dispatch.

  • In transit08/02/2023 · 6:40 AM

    Departed origin facility, Germany.

  • Out for deliveryPending

    Awaiting final-mile carrier.

<ol> Developer notes
  • Render as an ordered list so order is conveyed without relying on visuals.
  • Mark the current event with aria-current; keep timestamps machine-readable in <time>.
Component · Data

Tree New

Displays hierarchical data with expandable nodes — categories, file systems, organizational structures, or nested locations.

  • Warehouse — Germany
    • Fashion
      • Linen Trouser
      • Cotton Tank
    • Electronics
  • Hub — Switzerland
    • Returns bin
role=tree Developer notes
  • Use role="tree"/"treeitem"/"group" with aria-expanded on parent nodes.
  • Arrow keys: Right expands, Left collapses, Up/Down move between visible nodes.
  • Lazy-load deep branches on first expand.
Component · Navigation

Panel Menu New

An accordion-style navigation menu for the sidebar — groups of links that expand and collapse, ideal for deep app sections.

disclosure Developer notes
  • Each group header is a disclosure button (aria-expanded); links inside are an ordered list.
  • Persist the open group and active link to state / route.
Component · Overlays

Toast New

Brief, auto-dismissing notifications that confirm an action without interrupting the workflow. Use toasts for transient feedback — banners for persistent, in-page messages.

Toasts stack in the corner and dismiss after 4 seconds.

role=status Developer notes
  • Render in an aria-live region — polite for info/success, assertive for errors.
  • Pause auto-dismiss on hover/focus; always allow manual close.
  • Keep messages short; never put the only copy of critical info in a toast.
Component · Overlays

Drawer New

A panel that slides in from the edge of the screen for secondary tasks — filters, details, quick edits — without leaving the current page.

role=dialog Developer notes
  • Treat as a modal dialog: trap focus, close on Esc / scrim click, restore focus on close.
  • Pick the edge by content type — filters from the right, primary nav from the left.
Component · Overlays

Popover New

A lightweight overlay anchored to a trigger, holding rich content — quick details, mini-forms, or actions — more than a tooltip, less than a modal.

Share order
popover Developer notes
  • Anchor with collision-aware positioning; close on outside click and Esc.
  • Manage focus into the panel; non-modal, so the page stays interactive.
Component · Display

Chip New

Compact elements representing an input, attribute, or entity — often with an icon or avatar, and optionally removable. Distinct from a read-only Badge.

Verified SBSebastian B. Express Fragile 2 packages
<span> Developer notes
  • Removable chips: the ✕ is a button with aria-label="Remove {label}".
  • Use chips for entities/attributes; use Badge for read-only status only.
Component · Display

Meter Group New

Visualizes how a whole splits across multiple categories in a single bar — storage usage, budget allocation, or order-status breakdowns.

Order status · 256 total
Delivered 48% In transit 22% Processing 18% Returned 12%
role=meter Developer notes
  • Each segment is a role="meter" with aria-valuenow; pair with a visible legend.
  • Order segments logically and keep the legend labels in sync with colors.
Component · Display

Skeleton New

Placeholder shapes that mimic content while it loads, reducing perceived wait and layout shift. Prefer skeletons over spinners for full page or list loads.

Card loading
List loading
aria-hidden Developer notes
  • Mark skeletons aria-hidden="true" and expose a single aria-busy / live "Loading" status instead.
  • Match the skeleton's shape and size to the real content to avoid layout shift.
  • Gate the shimmer behind prefers-reduced-motion.
Component · Navigation

App Header New

The global bar at the top of every Ecovium screen. It carries the logo, primary navigation, the tenant & location switcher, and account controls — in a dark or light variant, with an optional secondary sub-navigation row.

Anatomy

  • 1Logo
  • 2Primary nav
  • 3Tenant / location switcher
  • 4Notification badge
  • 5Utility icons
  • 6Avatar
  • 7Sub-navigation

Dark variant — primary

Light variant — with notifications

Secondary sub-navigation — drill-down

role=banner Developer notes
  • The header is a <header role="banner">; primary nav is a <nav> with aria-current="page" on the active item.
  • The notification badge exposes a live count to screen readers ("9 unread"); the bell is a labelled button.
  • Collapse the primary nav into a drawer below the Tablet breakpoint; keep the logo, tenant, and avatar visible.
Component · Navigation

Settings Menu New

A mega-menu launched from the header gear. It groups every configuration area into labelled categories with icons, so admins reach any setting in one click.

role=menu Developer notes
  • Open from the gear (aria-haspopup="menu", aria-expanded); group with labelled role="group" regions.
  • Trap focus while open, close on Esc / outside click, and restore focus to the gear.
Component · Overlays

Help & Onboarding New

Contextual guidance — from a single help icon to a multi-step product tour and a full documentation side-panel. Use these to teach features in place without pulling users out of their flow.

Help button & tooltips

??
Help button
A simple text tooltip tip
A simple text tooltip tip
Static tip

Onboarding tour

Popover title

Popover text. One more line. Another sentence. Use a tour to introduce a new feature step by step.

1 of 7
Popover title

Popover text. One more line. Another sentence. The dark variant suits image-rich or dimmed backdrops.

1 of 7

Documentation panel

role=dialog Developer notes
  • Tour popovers anchor to their target, announce step changes (aria-live), and always offer Skip / Close.
  • The documentation panel is a non-blocking drawer (role="dialog") with its own search and history; deep-link each article.
  • Never gate critical task info behind a tour the user can dismiss.
Component · Data

Tracking Timeline New

Purpose-built trackers for the logistics journey — a horizontal shipment timeline with milestone icons, a vertical delivery log, and a compact return-process tracker.

Shipment timeline · horizontal

Order Start27 Jan 23
Shipped09 Feb 23
On Route15 Feb 23
ETA23 Feb 23
Order Arrived01 May 23

Delivery log · vertical

  • Order Confirmed07/02/2023 · 5:31PM
  • On The Way10/02/2023 · 6:31PM
  • Out For DeliveryExpected 10/02 · 8:31PM
  • DeliveredExpected 10/02 · 9:31PM

Return process

DHL
Start
On the way
Delivery
Returned
<ol> Developer notes
  • Express milestones as an ordered list with aria-current="step" on the live stage.
  • Drive icon + color state from a single status enum; keep ETAs in machine-readable <time>.
  • Carrier marks (DHL, UPS…) are decorative — provide an accessible carrier name in text.
Product Screens

Screen Foundation

These additions connect the component library with the real Ecovium product screens you submitted: order headers, action toolbars, dashboard tiles, login, split workspaces, enterprise tables, and blueprint spacing rules.

Product screen rules

Use the light blue application canvas, white cards, rounded overlay corners, compact Roboto typography, and one clear primary action on the right. The header remains functional and calm: title first, metadata second, toolbar actions grouped and separated by vertical dividers.

28pxTop padding for modal/workspace screens
52pxDesktop page padding left and right
16pxToolbar icon visual size
24pxDefault toolbar/icon group spacing
48pxPrimary action button height
52pxTab rail height in page headers
20pxMain object title size, bold
14pxMetadata, links and helper text
Methodology

Human-Centered Design (HCD)

Every ecovium screen in this system is the output of a human-centered design process — the product is shaped around the operator on the warehouse floor, the dispatcher, and the customs clerk, not around the database behind them.

ISO 9241-210:2010 frames human-centered design as an approach to building interactive systems that stay usable and useful by focusing on the people who use them — their needs and requirements — and by applying human-factors (ergonomics) and usability knowledge and techniques throughout development. Paraphrased from ISO 9241-210:2010, “Ergonomics of human-system interaction — Human-centred design for interactive systems.”

The standard describes four activities that repeat until the design meets its requirements. The patterns in this library are how each activity shows up in the product.

1
Understand the context of use

Who is the user, what task are they doing, and in what environment? The order header, tour stops and shipment cards reflect the real logistics context.

2
Specify user requirements

What must the system let people accomplish? Clear primary actions, status pills and required-field validation encode those requirements.

3
Produce design solutions

Tokens, components and the screen templates here are the reusable solutions — built once, applied consistently across every app.

4
Evaluate against requirements

Accessibility checks, usability testing and the Do / Don’t guidance close the loop and feed the next iteration.

↻ Iterate until the solution meets user needs
Methodology

Design Thinking

Where HCD sets the standard to meet, Design Thinking is the working method the team uses to get there — a non-linear, five-mode process for understanding users and turning insight into tested solutions.

01
Empathize

Observe and interview real users — dispatchers, packers, customs staff — to understand their goals and pain points.

02
Define

Frame the right problem: a clear, user-centered problem statement that the design must solve.

03
Ideate

Generate many possible solutions — layouts, flows, components — without judging early.

04
Prototype

Build the screens cheaply and quickly — exactly the rendered patterns shown throughout this system.

05
Test

Put prototypes in front of users, learn, and loop back to any earlier mode as needed.

The two methods reinforce each other: Design Thinking supplies the empathy and rapid iteration, while ISO 9241-210 human-centered design supplies the rigor — measurable requirements and formal evaluation — so that “usable and useful” is verified, not assumed.

Product Screens

Header Pattern & Measurement System

The object-header pattern defines the exact hierarchy and spacing for detail pages, expressed below as reusable product tokens with the live header rendered from the component library.

20 / 24Main title, bold, compact line-height
18Secondary title pieces and object state
8 · 12 · 16Micro spacing between title, badges and metadata
24 · 32Header rhythm and toolbar grouping
48–96Large breathing space around primary actions
✓ Do
  • Keep the object title left-aligned and the primary action on the right.
  • Group toolbar icons with 24px rhythm and divider lines between functional groups.
  • Use the tab underline as the main active-state signal.
✕ Don't
  • Let action buttons float without the right-side action area.
  • Mix many type sizes in the header.
  • Reduce the rounded overlay corner; it is part of the product identity.
Product Screens

Order Detail Page Pattern

Object detail screens combine a clear object header, contextual metadata, status badges, an action toolbar and a tabbed content rail. This pattern is reused for orders, invoices, declarations and logistics records.

AreaRule
Title20px bold; object type + number + assignment state.
BadgeOutline pill next to title; status or declaration type.
Metadata14px, two lines max, links in primary blue.
ToolbarIcon-only buttons need tooltips and accessible labels.
Primary actionOne filled blue button; secondary action as blue text link.
Product Screens

Packing Workspace Layout

The fulfillment workspace uses a two-panel structure: selectable order items on the left and the current packing state on the right. Empty states guide the next action without blocking the workflow.

Workspace rules

✓ Do
  • Use equal-height panels to compare source and destination.
  • Keep item cards short: thumbnail, name, SKU, quantity, overflow action.
  • Pair every packed item with a clear confirmation state.
✕ Don't
  • Use large decoration inside work-heavy panels.
  • Hide the quantity; it is the operational decision point.
  • Put critical packing instructions only inside an image.
Product Screens

Application Launcher & Tiles

The launcher shows the cross-product pattern: a top application bar, a news ticker, contextual tabs and grouped application tiles with colored icon chips.

Tile partSpecification
Icon chip44px rounded chip, semantic or category color.
SurfaceWhite card with small radius and level-1 shadow.
ContentTitle, short descriptor, optional NEW badge.
LayoutGrouped sections (All Apps, Favorite Screen) with clear headings.
Product Screens

Login Template

The login screen is calm and minimal: a centered card on a soft brand background, rounded inputs, a single primary button and clear secondary actions.

auth Developer notes
  • Use autocomplete="email" and autocomplete="current-password".
  • Preserve visible labels even when inputs are filled.
  • Never show authentication errors only through color; include text.
Product Screens

Enterprise Table Pages

The invoice and fulfillment table screens share one core page pattern: two-level navigation, contextual tabs, search, optional advanced filter, a primary create action, status pills, row actions and bottom pagination.

Customer Experience · Invoices
Fulfillment · Orders
  • The primary button sits at the right of the list toolbar.
  • Rows stay white with light separators to support dense scanning.
  • Status text pairs color with an icon for stronger meaning.

Content-area layout blueprint

Planning structure for notifications, header, tabs and the content area.

  • Notifications sit above the header and appear only when attention is required.
  • Align the tab underline with the content area and the left module boundary.
  • Reserve a clear action zone on the right side of the header row.
Product Screens

Order Record — Full Detail

The full order record expands the header pattern into a working record: addressee, transport, tour stops and shipments up top, then deep panels for shipping method, business partners, a pickup/delivery timeline and monetary values. It shows how one object scales from summary to complete operational detail.

RegionPurpose
Header cardsAddressee, Transport, Tour Stops, Shipments — the at-a-glance state of the order.
Sub-tabbed cardsSupplier / Receiver / Order switch role (Consignor, Delivery, Pick-Up…) without leaving the page.
TimelineMilestone track with done / in-progress / pending nodes and a dotted future segment.
Monetary valuesInline highlights: customs value (amber) and net worth (red) draw the eye to figures that need review.
Product Screens

Order Quick View

A focused overlay variant of the record for in-context editing — opened over a list with a dismiss control. The left rail switches to General Information (user groups, applications and removable tags) while the partner, timeline and monetary panels stay identical, so users never relearn the layout.

  • State is shown as a colored status word in the subtitle (e.g. In preparation), with provenance (created by, assigned to) beside it.
  • Removable application tags use the blue token chip with a trailing dismiss icon.
  • The overlay keeps the same Supplier/Receiver/Order, timeline and monetary components as the full record.
Product Screens

Master Data — Help & Profile

Contextual panels overlay any list without navigating away. The Help Center explains the current page and links to support and how-to guides; the Profile menu groups account actions. Both are dismissible flyouts anchored to the top bar.

  • Flyouts dim nothing — the underlying list stays visible and operable context.
  • Help is grouped: page help, Support, and How-to-work-with entries with chevrons for drill-in.
  • The Profile menu mirrors the account sub-navigation for consistency.
Product Screens

Account & Profile

The account area uses the standard app frame with a sub-navigation rail. A profile header (avatar, name, role) pairs with a Personal Information form, an isolated Change-password card, and an extensible More Information block.

  • Read-only or system-managed fields (e.g. email) use a muted fill to distinguish them from editable inputs.
  • Destructive or sensitive actions (change password) are separated into their own card.
  • Primary save sits top-right with a secondary Discard link, matching every other detail screen.
Product Screens

Tenant Management — Users & Roles

Administration screens reuse the enterprise table with role-specific affordances: a Select-Action split button, filter pills, per-row enable toggles, semantic status (Active, Inactive, Invited, Pending) and a row action menu. Creating a role opens a focused modal over a dimmed table.

Users list · bulk and row actions
Add New Group · modal
ControlBehavior
Select ActionSplit button opens bulk operations for checked rows.
Enable toggleInline switch; reflects and sets the user's active state.
StatusColor-coded text: green Active, red Inactive, amber Invited / Pending.
Row menuPer-row overflow: Deactivate, Activate, Resend Invitation.
Add role modalDim the table, focus the form; permissions as a checkbox grid.
ecovium Design System · Component Library · Built with love for the supply-chain industry first by Jeton Lakna.