Archivo
Headlines and display (Archivo)
- Weight 500 Deadlines under control
- Weight 700 Deadlines under control
- Weight 800 Deadlines under control
The design language of EagleDesk: refined industrial-electric. Graphite as the foundation, bone as breathing room, amber as the one precisely placed accent. This page is reference and proof at once: it is built entirely from its own tokens, and every value can be copied with a click.
Every value with a dashed outline can be copied to the clipboard with a click or Enter.
Essence
Anyone who places temporary workers keeps a machinery of deadlines, contracts and responsibility running. EagleDesk gives that machinery a calm, dependable surface: technical, precise, trustworthy. No playful start-up pastels, no sterile office grey, but brushed graphite with a single point of amber light.
Core values: dependable · precise · sovereign · Austrian matter-of-fact
01 — Colours
Dominance instead of an even split: bone is the ground, graphite carries, amber is the light and never surface without a reason. Each tile names the token and hex value (both copyable with a click) and the calculated WCAG 2.x contrast to bone and to graphite.
Roughly 70 % bone ground, 22 % graphite, 8 % amber. If you need more amber, you usually have too many main actions.
Only pairings that pass by calculation. Body text needs at least 4.5:1 (AA), large text and controls at least 3:1. The ratio is truncated to one decimal, never rounded up.
| Sample | Foreground | Background | Use | Ratio | Minimum | Result |
|---|---|---|---|---|---|---|
| Body text | 16.3:1 AAA | 4.5:1 | passed | |||
| Body text | 17.7:1 AAA | 4.5:1 | passed | |||
| Body text | 8.6:1 AAA | 4.5:1 | passed | |||
| Body text | 13.7:1 AAA | 4.5:1 | passed | |||
| Body text | 14.9:1 AAA | 4.5:1 | passed | |||
| Body text | 9.5:1 AAA | 4.5:1 | passed | |||
| Body text | 10.4:1 AAA | 4.5:1 | passed | |||
| Body text | 16.3:1 AAA | 4.5:1 | passed | |||
| Body text | 13.7:1 AAA | 4.5:1 | passed | |||
| Body text | 9.5:1 AAA | 4.5:1 | passed | |||
| Body text | 17.7:1 AAA | 4.5:1 | passed | |||
| Body text | 14.9:1 AAA | 4.5:1 | passed | |||
| Body text | 10.4:1 AAA | 4.5:1 | passed | |||
| Body text | 8.6:1 AAA | 4.5:1 | passed | |||
| Body text | 7.3:1 AAA | 4.5:1 | passed | |||
| Body text | 5.5:1 AA | 4.5:1 | passed | |||
| Body text | 6.0:1 AA | 4.5:1 | passed | |||
| Body text | 6.6:1 AA | 4.5:1 | passed | |||
| Body text | 7.2:1 AAA | 4.5:1 | passed | |||
| Body text | 4.7:1 AA | 4.5:1 | passed | |||
| Body text | 5.1:1 AA | 4.5:1 | passed | |||
| UI and graphics | 3.4:1 AA large | 3.0:1 | passed | |||
| Body text | 5.3:1 AA | 4.5:1 | passed | |||
| Body text | 5.8:1 AA | 4.5:1 | passed | |||
| Body text | 4.8:1 AA | 4.5:1 | passed | |||
| Large text | 4.4:1 AA large | 3.0:1 | passed | |||
| UI and graphics | 3.6:1 AA large | 3.0:1 | passed |
02 — Typography
Archivo (grotesque, angular, 800) for display and headlines, set tight, with an amber underline as the signature. IBM Plex Sans for running text (humanist, calm). IBM Plex Mono for labels, data and eyebrows, the technical voice.
Headlines and display (Archivo)
Running text (IBM Plex Sans)
Data, labels, eyebrow (IBM Plex Mono)
The table lists the real values from ci.css; the samples next to it are capped at 60 px.
| Role | Typeface | Size | Line height | Weight | Letter spacing | CSS |
|---|---|---|---|---|---|---|
| Display | Archivo --font-display |
clamp(40px,7vw,82px) | .98 | 800 | -.035em | |
| Title (H1) | Archivo --font-display |
clamp(30px,5vw,46px) | 1.04 | 800 | -.02em | |
| Headline (H2) | Archivo --font-display |
20px | 1.04 | 700 | -.02em | |
| Subline (H3) | IBM Plex Sans --font-body |
16px | 1.65 | 600 | normal | |
| Lead | IBM Plex Sans --font-body |
17px | 1.65 | 400 | normal | |
| Body text | IBM Plex Sans --font-body |
16px | 1.65 | 400 | normal | |
| Small (navigation, footer) | IBM Plex Sans --font-body |
14.5px | 1.65 | 400 | normal | |
| Eyebrow | IBM Plex Mono --font-mono |
12px | 1.65 | 500 | 2px | |
| Button | IBM Plex Mono --font-mono |
14px | 1.65 | 500 | .3px | |
| Data (mono) | IBM Plex Mono --font-mono |
13.5px | 1.9 | 500 | normal |
Archivo and IBM Plex are served as woff2 files from /fonts on our own domain. Loading the page transfers no data to third parties. The adapted versions of IBM Plex (subsets, SIL OFL 1.1; licence text at /fonts/LIZENZ-OFL.txt) are called AK Sans and AK Mono in the stylesheets.
Files:
/fonts/archivo-500.woff2
/fonts/archivo-700.woff2
/fonts/archivo-800.woff2
/fonts/plexsans-400.woff2
/fonts/plexsans-500.woff2
/fonts/plexsans-600.woff2
/fonts/plexmono-500.woff2
03 — Shapes
Few, repeatable shape values. Every preview is built with the real token, and the CSS next to it can be copied directly.
Cards and panels use --radius-md (14 px, as --radius before), pills use --radius-pill. Inputs keep their 11 px; the buttons of the previous marketing site are square, marketing site D is rounded (shape language D, below).
Card radius (legacy, = radius-md)
Pills, chips, badges
Small elements: tags, code chips
Cards, panels, tables
Large surfaces: hero cards, dialogs
Graphite-tinted, widely diffused and pulled inwards: shadows lift, they do not dramatise. The glow belongs to the main action only.
Subtle lift: chips, table rows
Cards on hover, select lists
Dialogs and overlays
Amber halo behind the main action
Gradients are built exclusively from existing colour tokens. Use the signal gradient (amber to copper) sparingly and never behind body text.
Signal: amber to copper, sparingly for hero accents
Dark surfaces: graphite gradient
A 4 px grid with eight steps. Padding and gaps come from this series, no in-between values.
Tight: icon to text
Compact: chips, rows
Padding of small elements
Default: small card padding
Groups and form fields
Card padding, block spacing
Small section spacing
Large section spacing
Marketing site D is rounded (plan 3.5): the square surfaces of the previous marketing site are gone. The main roles use the radius tokens below. Fixed values remain on small controls (icon, menu and small buttons, skip link: 12 px), on tabs (22 and 26 px), on the phone device frame (40 and 28 px) and on identifiers (8 px); marketing site D does not use --radius-sm yet. The System D section shows the layers E0 to E3.
| Role | Token | Value | Preview |
|---|---|---|---|
| Chips, status pill, toggles | 999px | ||
| Buttons and input fields | 14px | ||
| Cards, panels, glass tiles | 22px | ||
| Large surfaces (band, symbolic photos, form and closing card) | 28px |
04 — Tokens
All CSS custom properties from :root in /css/ci.css, complete and with their role. Build on these and you build on brand.
64 tokens in 9 groups
| Token | Value | Role | In CSS |
|---|---|---|---|
| Colours | |||
| Graphite | |||
| Graphite light | |||
| Graphite line | |||
| Bone | |||
| Bone light | |||
| Hairline | |||
| Hairline strong | |||
| High-voltage amber | |||
| Amber dark | |||
| Amber deep | |||
| Copper | |||
| Amber glow | |||
| Warm grey | |||
| Success | |||
| Roles (light and dark) | |||
| Page background (bone in light, graphite in dark) | |||
| Cards, fields, tables | |||
| Inverted surface: table header, toast, read-only mode | |||
| Text on an inverted surface | |||
| Primary text | |||
| Secondary text, lead | |||
| Help text, placeholders, icons at rest | |||
| Dividers (decorative) | |||
| Stronger lines (decorative) | |||
| Outlines of inputs and controls (at least 3:1) | |||
| Amber for small text and active marks | |||
| Focus ring | |||
| Typefaces | |||
| Headlines and display (Archivo) | |||
| Running text (IBM Plex Sans) | |||
| Data, labels, eyebrow (IBM Plex Mono) | |||
| Layout | |||
| Maximum content width | |||
| Radii | |||
| Card radius (legacy, = radius-md) | |||
| Pills, chips, badges | |||
| Small elements: tags, code chips | |||
| Cards, panels, tables | |||
| Large surfaces: hero cards, dialogs | |||
| Shadows | |||
| Subtle lift: chips, table rows | |||
| Cards on hover, select lists | |||
| Dialogs and overlays | |||
| Amber halo behind the main action | |||
| Gradients | |||
| Signal: amber to copper, sparingly for hero accents | |||
| Dark surfaces: graphite gradient | |||
| Spacing | |||
| Tight: icon to text | |||
| Compact: chips, rows | |||
| Padding of small elements | |||
| Default: small card padding | |||
| Groups and form fields | |||
| Card padding, block spacing | |||
| Small section spacing | |||
| Large section spacing | |||
| Motion | |||
| Hover and colour change | |||
| Menus and overlays | |||
| Reveal on load | |||
| Default curve: quick in, soft out | |||
| Press and toggle | |||
| Colour-mode change, expand and collapse | |||
| Reveal on scroll, bars | |||
| Numbers count up (once) | |||
| Width animation of the main headline | |||
| Lines draw, the conduit extends (once) | |||
| In (same as the default curve) | |||
| Out | |||
| Flow, sheen, breathing | |||
| Stagger, at most eight steps | |||
| Distance when revealing | |||
/css/ci.css is authoritative. This table comes from the same data source as the tiles and is checked against the file automatically.
05 — Logo
Three lines from the workflow: the top one bends into a hooked beak, the middle one becomes the lower beak, the amber lamp is the eye. Rows – dispatch, assignments, hours – become an eagle head: the overview. The wordmark sets “Eagle” bold and “Desk” lighter.
Four variants: horizontal and vertical, each for light and for dark backgrounds. On light, mark and wordmark are graphite; on dark, bone and paper; the eye is always amber. The files are cropped to the artwork; the clear space is added when you place them.
The mark on its own for avatars, loading indicators or watermarks; the wordmark on its own close to body text or in very wide formats. For stamps, fax, engraving and foil, every form also comes in single-colour black and white (in the brand kit).
The clear space derives from H, the height of the mark (for the horizontal logo, the logo height). At least 0.5 × H around the logo stays free: no text, no edge, no other logo.
Below these sizes the logo loses its shape. When space gets tighter, use only the mark, never a shrunken wordmark; below 24 px the compact version (favicon, from 16 px). The mail header is at least 20 px high. The examples are shown at actual size.
Horizontal logo
Width 100 px · print 25 mm
Vertical logo
Width 64 px · print 18 mm
Mark
Edge length 24 px · print 6 mm
Wordmark
Width 80 px · print 20 mm
Six typical misuses, recreated with the real logo files. Each one is labelled as a mistake and does not belong in use. Also: do not add or rearrange lines, do not move the lamp or let it blink, never write the name with a space or in all caps in running text.
06 — In use
Seven mockups in HTML and CSS, using the real logo files, as the target picture of the logo system: existing surfaces are being aligned step by step. With tenant white label, the tenant logo appears, the EagleDesk logo at most as a discreet “powered by”.
At the top left of the sidebar sits the horizontal logo in the variant of the colour mode: light uses “Horizontal logo, light”, dark uses “Horizontal logo, dark”.
Only the compact mark appears in the tab, never the wordmark. It stays recognisable at 16 px: the SVG adapts to light and dark tabs, ICO and PNG sit on the graphite tile.

The app icon shows the compact mark in light lines on the graphite tile with an amber eye: it stays legible in any crop, whether round, rounded or square.
The horizontal logo at the top left, below it the sender line, at the bottom the mandatory details. All texts are placeholders; no company and no number appears. For a tenant, the tenant logo appears instead.
[Company name] · [Street no.] · [Postcode City]
[Recipient] / [Address]
[Company register] · [VAT ID] · [Bank]
Operator
[Company name] · [Street no.] · [Postcode City]
[Recipient] / [Address]
[Company register] · [VAT ID] · [Bank]
powered by EagleDesk
Tenant
The header belongs to the tenant: tenant logo or app name. The EagleDesk logo does not appear there, at most a discreet “powered by” at the end of the page. Mockup at 375 px width.
powered by EagleDesk
Platform mails, for example about the trial, carry the brand mail header on graphite at the top. Tenant mails show the tenant logo, the EagleDesk logo only discreetly as “powered by”.
[Mail subject]
Platform mail
[Mail subject]
powered by EagleDesk
Tenant mail
07 — Downloads
Every asset as SVG (vector, lettering converted to paths) and as PNG, plus the complete brand kit as a ZIP. The files are ready on the server; nothing is generated on request.
All files in this list in one ZIP, plus a README with the short rules in German and English.
All URLs are absolute and carry a version parameter (?v=) that changes with the file. After a replacement, caches never show the old version.
| Preview | Asset and use | SVG | PNG |
|---|---|---|---|
|
|
Mark, light Mark for light backgrounds: graphite lines, amber eye. Avatar, loading indicator, watermark. | SVG | PNG |
|
|
Mark, dark Mark for dark backgrounds: bone lines, amber eye. | SVG | PNG |
|
|
Mark, black Single colour black: stamps, fax, engraving, foil. | SVG | PNG |
|
|
Mark, white Single colour white: on dark and coloured areas with enough contrast. | SVG | PNG |
| Preview | Asset and use | SVG | PNG |
|---|---|---|---|
|
|
Wordmark, light The lettering only, for light backgrounds, in graphite. | SVG | PNG |
|
|
Wordmark, dark The lettering only, for dark backgrounds, in paper white. | SVG | PNG |
|
|
Wordmark, black Lettering in single colour black: stamps, fax, engraving. | SVG | PNG |
|
|
Wordmark, white Lettering in single colour white: on dark and coloured areas. | SVG | PNG |
| Preview | Asset and use | SVG | PNG |
|---|---|---|---|
|
|
Horizontal logo, light Standard for light backgrounds: headers, website, letterhead, presentations. | SVG | PNG |
|
|
Horizontal logo, dark Standard for dark backgrounds: footers, dark slides, videos. | SVG | PNG |
|
|
Horizontal logo, black Horizontal, single colour black: stamps, fax, engraving, foil. | SVG | PNG |
|
|
Horizontal logo, white Horizontal, single colour white: on dark and coloured areas. | SVG | PNG |
|
|
Vertical logo, light Vertical for light backgrounds: square or tall areas, cover pages, trade-fair walls. | SVG | PNG |
|
|
Vertical logo, dark Vertical for dark backgrounds: title slides, roll-ups. | SVG | PNG |
|
|
Vertical logo, black Vertical, single colour black: stamps, fax, engraving, foil. | SVG | PNG |
|
|
Vertical logo, white Vertical, single colour white: on dark and coloured areas. | SVG | PNG |
| Preview | Asset and use | SVG | PNG |
|---|---|---|---|
|
|
Favicon Browser tab and bookmarks: the compact mark on the graphite tile (16 to 48 px). On the website the SVG favicon adapts to light and dark tabs. | SVG | PNG |
|
|
App icon App icon and profile picture: the compact mark on the graphite tile with an amber eye; the system rounds the corners itself. | SVG | PNG |
| Preview | Asset and use | SVG | PNG |
|---|---|---|---|
|
|
Mail header, light Small horizontal logo for mail headers and signatures on light backgrounds, from 20 px high (mail programs do not show SVG: use the PNG). | SVG | PNG |
|
|
Mail header, dark Small horizontal logo for mail headers on dark backgrounds, from 20 px high; this is how it appears in platform mails. | SVG | PNG |
08 — Sharing
The preview image for link previews: the brand only, for both languages, for dark and light backgrounds. The meta snippet embeds it with absolute URLs.
To paste into the head of a page that should show the preview image. The URLs are absolute and carry the version parameter; the page itself sets title and description.
<meta property="og:image" content="https://eagledesk.at/brand/og/og-dunkel.png?v=1792121061">
<meta property="og:image:type" content="image/png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Logo von EagleDesk: Adlerkopf-Zeichen und Schriftzug.">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://eagledesk.at/brand/og/og-dunkel.png?v=1792121061">
<meta name="twitter:image:alt" content="Logo von EagleDesk: Adlerkopf-Zeichen und Schriftzug.">
<meta property="og:image" content="https://eagledesk.at/brand/og/og-dunkel.png?v=1792121061">
<meta property="og:image:type" content="image/png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="The EagleDesk logo: eagle-head mark and wordmark.">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://eagledesk.at/brand/og/og-dunkel.png?v=1792121061">
<meta name="twitter:image:alt" content="The EagleDesk logo: eagle-head mark and wordmark.">
09 — Components
Buttons, pills, badges, banners, cards, tables, empty states and toasts, rendered with the real CI classes. Every example has a copyable HTML snippet. Principles: one main action per area, status with text and a mark rather than colour alone, focus always visible. Adapt IDs and heading levels in the copied code to your own page.
The buttons of the marketing site: 52 px tall (M 46 px, S 40 px), square, Archivo in capitals. Amber (.btn-volt) belongs to the one main action only. All other actions sit quietly next to it: position and label rank them, not colour.
Primary is amber. Secondary (.btn-primary) and ghost (.btn-ghost) carry a graphite outline and look the same on the marketing site; the ranking comes from position and label.
<div class="ci-reihe">
<button type="button" class="btn btn-volt">Create assignment</button>
<button type="button" class="btn btn-primary">Log in</button>
<button type="button" class="btn btn-ghost">Learn more</button>
</div>
Copper surface with light text for deleting and irreversible actions. Always with a confirmation, never as a primary next to an amber button.
<div class="ci-reihe">
<button type="button" class="btn btn-danger">Delete permanently</button>
</div>
The disabled attribute for buttons without an alternative. aria-disabled when the button should stay reachable and explain why.
Approving is only possible once all hours are confirmed.
<div class="ci-reihe">
<button type="button" class="btn btn-volt" disabled>Save</button>
<button type="button" class="btn btn-ghost" aria-disabled="true" aria-describedby="btn-grund">Approve</button>
</div>
<p class="feld-hilfe" id="btn-grund">Approving is only possible once all hours are confirmed.</p>
The icon comes before the text for actions and after it for follow-ups. A button with only an icon carries an aria-label and a 44 px target.
<div class="ci-reihe">
<button type="button" class="btn btn-volt"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 4.5v15m7.5-7.5h-15"/></svg>Create assignment</button>
<button type="button" class="btn btn-ghost">Learn more<svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M13.5 4.5 21 12m0 0-7.5 7.5M21 12H3"/></svg></button>
<button type="button" class="btn btn-ghost btn-icon" aria-label="Delete"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"/></svg></button>
</div>
Default 52 px, M 46 px, S 40 px tall (marketing site). In the back office Filament sets the sizes.
<div class="ci-reihe">
<button type="button" class="btn btn-volt btn-s">Small</button>
<button type="button" class="btn btn-volt btn-m">Medium</button>
<button type="button" class="btn btn-volt">Default</button>
</div>
Pills name a state in one line: trial, read-only mode, project status. Round (--radius-pill), AK Mono, with a mark before the text: ring = trial, square = read-only, hatched = in development, half filled = beta, diamond = new. The shape carries the meaning; colour only supports it.
Trial, read-only mode, in development, beta, new. The trial length comes from the product configuration.
<div class="ci-reihe">
<span class="pille pille-test">Trial · 14 days</span>
<span class="pille pille-lesen">Read-only mode</span>
<span class="pille pille-dev">Open beta · Since 19 October 2026</span>
<span class="pille pille-beta">Beta</span>
<span class="pille pille-neu">New</span>
</div>
Badges are the compact form for lists and tables: dot plus text. Grey is neutral. The identifiers are the values in the product: the licence status of a tenant and the level of an announcement.
Trial, active, cancelled, read-only mode.
<div class="ci-reihe">
<span class="badge b-volt">Trial</span>
<span class="badge b-ok">Active</span>
<span class="badge b-grau">Cancelled</span>
<span class="badge b-ink">Read-only mode</span>
</div>
Info, new, maintenance, urgent.
<div class="ci-reihe">
<span class="badge b-grau">Info</span>
<span class="badge b-volt">New</span>
<span class="badge b-ink">Maintenance</span>
<span class="badge b-copper">Urgent</span>
</div>
| Group | Identifier | Meaning |
|---|---|---|
| Licence status | Trial running: full scope of functions until the trial ends. | |
| Licence status | Running contract, full operation. An empty value counts as active. | |
| Licence status | Contract cancelled: full operation until the end, read-only mode afterwards. | |
| Licence status | Data stays readable and exportable; changes are possible again once a plan has been chosen. | |
| Announcement | General notice, can be dismissed. | |
| Announcement | New feature or improvement, can be dismissed. | |
| Announcement | Planned maintenance window, can be dismissed. | |
| Announcement | Incident or security notice, cannot be dismissed. |
The same classes and values as in the panel (akw-lizenz-banner, akw-ankuendigung): trial = light amber, read-only mode and maintenance = graphite, cancellation and urgent = light red. Every banner states the situation in text and, where there is one, the next step.
Sits above every page of the tenant. role=status with aria-live=polite; links only when the target exists.
<div class="ci-banner-stapel">
<div class="akw-lizenz-banner akw-lizenz-banner--test" role="status" aria-live="polite">
<span class="akw-lizenz-banner-text">Trial Premium All In: 14 days left (until DD.MM.)</span>
</div>
<div class="akw-lizenz-banner akw-lizenz-banner--nur_lesen" role="status" aria-live="polite">
<span class="akw-lizenz-banner-text">Read-only mode since 9 Oct 2026 – your data is kept</span>
<span class="akw-lizenz-banner-links">
<a class="akw-lizenz-banner-link" href="#">Choose a plan</a>
<a class="akw-lizenz-banner-link" href="#">Export data</a>
</span>
</div>
<div class="akw-lizenz-banner akw-lizenz-banner--gekuendigt" role="status" aria-live="polite">
<span class="akw-lizenz-banner-text">Contract cancelled as of 31 Dec 2026 – read-only mode afterwards, your data is kept</span>
</div>
</div>
Title in bold, text beside it. Urgent notices cannot be dismissed and carry role=alert in operation; the preview stays silent, the snippet carries the real role.
All deadlines of a tenant in one view, with a traffic light.
From 02:00 to 03:00 the system is briefly unavailable.
The time tracking import is disrupted. We are working on a fix.
The manual now includes the chapter on month-end closing.
<div class="akw-ankuendigungen">
<div class="akw-ankuendigung akw-ankuendigung--neu" role="status">
<div class="akw-ankuendigung-inhalt">
<strong class="akw-ankuendigung-titel">New: deadline dashboard</strong>
<div class="akw-ankuendigung-text"><p>All deadlines of a tenant in one view, with a traffic light.</p></div>
</div>
<button type="button" class="akw-ankuendigung-schliessen" aria-label="Dismiss">×</button>
</div>
<div class="akw-ankuendigung akw-ankuendigung--wartung" role="status">
<div class="akw-ankuendigung-inhalt">
<strong class="akw-ankuendigung-titel">Maintenance on Sunday</strong>
<div class="akw-ankuendigung-text"><p>From 02:00 to 03:00 the system is briefly unavailable.</p></div>
</div>
<button type="button" class="akw-ankuendigung-schliessen" aria-label="Dismiss">×</button>
</div>
<div class="akw-ankuendigung akw-ankuendigung--dringend" role="alert">
<div class="akw-ankuendigung-inhalt">
<strong class="akw-ankuendigung-titel">Incident</strong>
<div class="akw-ankuendigung-text"><p>The time tracking import is disrupted. We are working on a fix.</p></div>
</div>
</div>
<div class="akw-ankuendigung" role="status">
<div class="akw-ankuendigung-inhalt">
<strong class="akw-ankuendigung-titel">Notice</strong>
<div class="akw-ankuendigung-text"><p>The manual now includes the chapter on month-end closing.</p></div>
</div>
</div>
</div>
Cards group, tables compare, empty states lead to the next action, toasts report the result. The sample data are placeholders.
Card with icon tile. Lifts 2 px on hover (transform and shadow, 150 ms).
Seven sources, one traffic light. Reminder, warning, expired: automatic, separated by tenant.
<div class="ccard">
<div class="ic"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z"/></svg></div>
<h5>Deadline engine</h5>
<p>Seven sources, one traffic light. Reminder, warning, expired: automatic, separated by tenant.</p>
</div>
One or two sentences and the one main action: an empty state guides instead of apologising.
Create the first assignment. It then appears in scheduling and in time tracking.
<div class="leer">
<div class="ic"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5m-9-6h.008v.008H12v-.008ZM12 15h.008v.008H12V15Zm0 2.25h.008v.008H12v-.008ZM9.75 15h.008v.008H9.75V15Zm0 2.25h.008v.008H9.75v-.008ZM7.5 15h.008v.008H7.5V15Zm0 2.25h.008v.008H7.5v-.008Zm6.75-4.5h.008v.008h-.008v-.008Zm0 2.25h.008v.008h-.008V15Zm0 2.25h.008v.008h-.008v-.008Zm2.25-4.5h.008v.008H16.5v-.008Zm0 2.25h.008v.008H16.5V15Z"/></svg></div>
<h5>No assignments yet</h5>
<p>Create the first assignment. It then appears in scheduling and in time tracking.</p>
<button type="button" class="btn btn-volt btn-m"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 4.5v15m7.5-7.5h-15"/></svg>Create assignment</button>
</div>
Graphite header row in mono capitals, numbers right-aligned and tabular, status as a badge. On narrow screens the region scrolls sideways and can be reached by keyboard.
| No. | Customer | Hours | Status |
|---|---|---|---|
| E-0001 | Musterbau GmbH | 38,5 | approved |
| E-0002 | Sample Logistics Ltd | 40,0 | expires soon |
| E-0003 | Demo Metall e. U. | 12,0 | expired |
<div class="tabelle-wrap" role="region" tabindex="0" aria-label="Sample table, scrolls horizontally">
<table class="tabelle">
<caption>Assignments with hours and status</caption>
<thead>
<tr>
<th scope="col">No.</th>
<th scope="col">Customer</th>
<th scope="col" class="num">Hours</th>
<th scope="col">Status</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">E-0001</th>
<td>Musterbau GmbH</td>
<td class="num">38,5</td>
<td><span class="badge b-ok">approved</span></td>
</tr>
<tr>
<th scope="row">E-0002</th>
<td>Sample Logistics Ltd</td>
<td class="num">40,0</td>
<td><span class="badge b-volt">expires soon</span></td>
</tr>
<tr>
<th scope="row">E-0003</th>
<td>Demo Metall e. U.</td>
<td class="num">12,0</td>
<td><span class="badge b-copper">expired</span></td>
</tr>
</tbody>
</table>
</div>
Short feedback after an action. role=status when shown, role=alert for errors. Errors do not disappear on their own.
<div class="ci-toast-stapel">
<div class="toast toast-ok" role="status">
<svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/></svg> <span>Assignment saved</span>
</div>
<div class="toast" role="status">
<svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z"/></svg> <span>The export is being prepared. You will receive a message.</span>
</div>
<div class="toast toast-fehler" role="alert">
<svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"/></svg> <span>Cannot save: the end date is before the start date.</span>
</div>
</div>
From site-2026.css: status bar, status and plan badges and grid of the previous marketing site (design switch “alt”). The patterns of marketing site D follow in the next block.
.statusbar · mono, capitals. The text comes from the marketing site itself, so the preview always shows the real wording.
<div class="statusbar">
<div class="sb-in">
<span class="sb-led" aria-hidden="true"></span>
<p class="sb-text"><strong>Open beta</strong><span class="sb-sep"> · </span>Since 19 October 2026</p>
<span class="sb-link"><span class="sb-long">See the roadmap</span><span class="sb-short">Roadmap</span><span aria-hidden="true">→</span></span>
</div>
</div>
Square instead of round: shape instead of colour. Solid = available, hatched = in development. Plans: dashed (Premium), solid line (PremiumPlus), filled (Premium All In).
<div class="ci-reihe">
<span class="st-badge b-live">Available now</span>
<span class="st-badge b-dev">In development</span>
<span class="tier tier-premium">Premium</span>
<span class="tier tier-premium_plus">PremiumPlus</span>
<span class="tier tier-all_in">Premium All In</span>
</div>
.grid-bg: grid behind hero areas, purely decorative and hidden from screen readers.
<div class="gridmini grid-bg" aria-hidden="true"></div>
Building blocks of marketing site D “Lichtwerk” (views public/v2027/*): prefix .w-* for home and shared parts, .u-* for the sub-pages; drawn only via role tokens --d-*. Visible to everyone from design switch “new” (today: “new”).
| Pattern | Class | Pages | Rule |
|---|---|---|---|
| Glass header (layer 3) | all pages | Blur only here and in the menu; below 1100 px a full-screen menu with a focus trap. | |
| Status pill | all pages | Project status from the beta texts, visible exactly once per screen width, links to the roadmap. | |
| Pause button | all pages | “Pause animations” in header, menu and footer; the state is in aria-pressed. | |
| Colour mode | all pages | Follow the system (default), light or dark; remembered in the browser and set before the first paint. | |
| Glow button and glass button | all pages | One main action per page in the glow gradient — on the marketing site “Request beta access” (header, menu, hero, closing), on the trial page the enquiry form; all other actions as glass buttons. | |
| Kinetic H1 | home page | Archivo 800, width 76 %, capitals; starts visible and moves only via transform and filter. | |
| Glow word | home page | Exactly one word per page in the glow gradient. | |
| Energy core | home page | See graphic system D in the System D section. | |
| Flow line | home page | Six step cards on the line; the detail text sits in a disclosure. | |
| Glass card with pointer light | home page | Layer 1, lifts by 3 px on hover; the light follows the pointer only on pointer devices and not when paused. | |
| Status chip | all pages | “Available now” (dot), “In development” (ring), “Current” (filled): shape and text, never colour alone. | |
| Package selector | home page | Filters counters and building blocks at once; the chosen level carries a tick and an inner ring, the message sits in a status region. | |
| Tabs | home page | Tabs with arrow keys, Home and End; without script all areas stand one below the other. | |
| Timeline | all pages | Bars grow once; the cut-over date sits on its own line. | |
| Accordion (FAQ) | all pages | Disclosures with a shared name: at most one answer open; the content is fully in the document (FAQPage 1:1). | |
| Form card | home page | Light in both modes; input outline at least 3 : 1, focus ring from --d-fokus, errors with symbol and text. | |
| Sub-page header | sub-pages | Breadcrumbs, kicker, H1 and a line that draws itself once. | |
| Toolbar (features) | sub-pages | Search, status filter, open or close all, result message; sticky only on large screens. | |
| Table of contents (legal texts) | sub-pages | Built from the subheadings; the current section is marked. | |
| Footer with settings | all pages | Language, colour mode and pause; contact links at least 32 px high. |
10 — Forms
Label, help text, required mark, error message, focus ring, consent, honeypot and the trial registration form as a pattern. Every example is copyable and linked for accessibility.
Every field has a visible label (for and id), a help text via aria-describedby and, when needed, an error message in text. The outline of an input is --muted (1.5 px, well above 3:1 against the background), not the hairline --line-2.
Label above the field, help text below. The asterisk marks it as required, and the required attribute tells assistive technology as well.
We send the confirmation link to this address.
<div class="feld">
<label class="feld-label" for="bsp-feld-email">Email address<span class="pflicht" aria-hidden="true">*</span></label>
<input class="inp" type="email" id="bsp-feld-email" name="email" autocomplete="email" required aria-describedby="bsp-feld-email-hilfe">
<p class="feld-hilfe" id="bsp-feld-email-hilfe">We send the confirmation link to this address.</p>
</div>
aria-invalid and aria-describedby connect field and message. The message is text with an icon below the field, and the outline carries an extra bar: colour is never the only cue.
We send the confirmation link to this address.
Please enter a valid email address.
<div class="feld">
<label class="feld-label" for="bsp-fehler-email">Email address<span class="pflicht" aria-hidden="true">*</span></label>
<input class="inp" type="email" id="bsp-fehler-email" name="email" value="name@" autocomplete="email" required aria-invalid="true" aria-describedby="bsp-fehler-email-hilfe bsp-fehler-email-meldung">
<p class="feld-hilfe" id="bsp-fehler-email-hilfe">We send the confirmation link to this address.</p>
<p class="feld-fehler" id="bsp-fehler-email-meldung"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"/></svg>Please enter a valid email address.</p>
</div>
Required field
Focus is always visible: a 2 px outline in --ci-fokus (graphite in light, bone in dark) with an offset, plus the amber glow as an addition. The glow alone is never enough, and the outline is never switched off.
Left: click into the field or tab into it. Right: the same ring as a permanent state of the preview. The CSS uses tokens only.
Focus it with Tab to see the ring.
Preview only (class is-fokus).
.inp:focus-visible {
outline: 2px solid var(--ci-fokus);
outline-offset: 2px;
border-color: var(--volt);
box-shadow: 0 0 0 4px var(--glow);
}
Agreements are checkboxes of their own: never preselected, never bundled, with clear text. Required (trial terms) and optional (setup tips) stay separate.
One required agreement and one optional consent. Both start empty.
<label class="chk" for="bsp-einw-bedingungen">
<input type="checkbox" id="bsp-einw-bedingungen" name="bedingungen" value="1" required>
<span>I accept the trial terms and have read the privacy notice. (<a href="#">privacy notice</a>)<span class="pflicht" aria-hidden="true">*</span></span>
</label>
<label class="chk" for="bsp-einw-tipps">
<input type="checkbox" id="bsp-einw-tipps" name="tipps" value="1">
<span>Yes, I would like to receive setup tips by email during the trial (voluntary, can be withdrawn at any time).</span>
</label>
A hidden field catches simple bots without a CAPTCHA. People do not see it, assistive technology skips it, and whoever fills it in is quietly turned away.
The preview makes the field visible so you can see it. In the snippet it sits outside the screen.
Invisible in the application (class hp).
<div class="hp" aria-hidden="true">
<label for="website">Website (please leave empty)</label>
<input type="text" id="website" name="website" tabindex="-1" autocomplete="off">
</div>
The target pattern modelled on the registration form of the marketing site, static and with all building blocks: honeypot, required fields, separate consents and exactly one main action.
Static: the fields can be filled in, nothing is sent. In the application this is a POST form with a CSRF token.
<form class="ci-formular" method="post" action="#" novalidate aria-labelledby="bsp-reg-titel">
<h5 class="ci-formular-titel" id="bsp-reg-titel">Try it free for 14 days</h5>
<!-- Insert CSRF token and form timestamp (_ts) -->
<div class="hp" aria-hidden="true">
<label for="bsp-reg-website">Website (please leave empty)</label>
<input type="text" id="bsp-reg-website" name="website" tabindex="-1" autocomplete="off">
</div>
<div class="feld">
<label class="feld-label" for="bsp-reg-firma">Company<span class="pflicht" aria-hidden="true">*</span></label>
<input class="inp" type="text" id="bsp-reg-firma" name="firma" maxlength="150" autocomplete="organization" required>
</div>
<div class="ci-feld-reihe">
<div class="feld">
<label class="feld-label" for="bsp-reg-vorname">First name<span class="pflicht" aria-hidden="true">*</span></label>
<input class="inp" type="text" id="bsp-reg-vorname" name="vorname" maxlength="80" autocomplete="given-name" required>
</div>
<div class="feld">
<label class="feld-label" for="bsp-reg-nachname">Last name<span class="pflicht" aria-hidden="true">*</span></label>
<input class="inp" type="text" id="bsp-reg-nachname" name="nachname" maxlength="80" autocomplete="family-name" required>
</div>
</div>
<div class="feld">
<label class="feld-label" for="bsp-reg-email">Business email<span class="pflicht" aria-hidden="true">*</span></label>
<input class="inp" type="email" id="bsp-reg-email" name="email" maxlength="190" autocomplete="email" required>
</div>
<div class="feld">
<label class="feld-label" for="bsp-reg-uid">VAT ID (optional)</label>
<input class="inp" type="text" id="bsp-reg-uid" name="uid" maxlength="20" autocomplete="off" aria-describedby="bsp-reg-uid-hilfe">
<p class="feld-hilfe" id="bsp-reg-uid-hilfe">ATU followed by eight digits, or another EU VAT ID</p>
</div>
<label class="chk" for="bsp-reg-bedingungen">
<input type="checkbox" id="bsp-reg-bedingungen" name="bedingungen" value="1" required>
<span>I accept the trial terms and have read the privacy notice. (<a href="#">privacy notice</a>)<span class="pflicht" aria-hidden="true">*</span></span>
</label>
<label class="chk" for="bsp-reg-tipps">
<input type="checkbox" id="bsp-reg-tipps" name="tipps" value="1">
<span>Yes, I would like to receive setup tips by email during the trial (voluntary, can be withdrawn at any time).</span>
</label>
<p class="feld-hilfe"><span aria-hidden="true">*</span> Required</p>
<button type="submit" class="btn btn-volt">Request trial access</button>
<p class="feld-hilfe">You will receive an email with a confirmation link. Only then do you set your password.</p>
</form>
11 — Icons and imagery
Heroicons outline as in the back office, three sizes, amber only in the active state. Images show real working environments, with consent and without recognisable people lacking approval.
Heroicons, outline variant: the same symbols as in the back office (Filament). An icon shows an action or a state and never replaces text. Every SVG can be copied.
Heroicons (Tailwind Labs) are released under the MIT licence. The paths are embedded in the page; nothing is loaded from elsewhere.
The icons are drawn on a 24 grid with a stroke weight of 1.5. A class sets the size on screen, and the stroke scales with it.
From left to right: .ico-16 in buttons and running text, .ico (20 px) as the default, .ico-24 in tiles and empty states.
<div class="ci-reihe ci-icon-groessen">
<svg class="ico ico-16" viewBox="0 0 24 24" aria-hidden="true"><path d="m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z"/></svg> <svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z"/></svg> <svg class="ico ico-24" viewBox="0 0 24 24" aria-hidden="true"><path d="m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z"/></svg> </div>
| Size | Class | Stroke on screen | Use |
|---|---|---|---|
| 16 px | 1 px | In buttons, badges and running text | |
| 20 px | 1.25 px | Default in lists and navigation | |
| 24 px | 1.5 px | In tiles, cards and empty states |
Muted grey at rest, text colour on hover, amber only in the active state and never as the only cue there: a bar, bold text and aria-current come with it. Amber icons on a light background use --volt-d (via --ci-akzent-text), on graphite --volt.
The active item carries amber on the icon, a bar on the left and bold text.
<nav class="ci-nav-demo" aria-label="Sample navigation">
<a class="navpunkt" href="#"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5m-9-6h.008v.008H12v-.008ZM12 15h.008v.008H12V15Zm0 2.25h.008v.008H12v-.008ZM9.75 15h.008v.008H9.75V15Zm0 2.25h.008v.008H9.75v-.008ZM7.5 15h.008v.008H7.5V15Zm0 2.25h.008v.008H7.5v-.008Zm6.75-4.5h.008v.008h-.008v-.008Zm0 2.25h.008v.008h-.008V15Zm0 2.25h.008v.008h-.008v-.008Zm2.25-4.5h.008v.008H16.5v-.008Zm0 2.25h.008v.008H16.5V15Z"/></svg>Assignments</a>
<a class="navpunkt" href="#" aria-current="page"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.477m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z"/></svg>Staff</a>
<a class="navpunkt" href="#"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z"/></svg>Documents</a>
</nav>
Real working environments instead of stock clichés: construction site, warehouse, shop floor. Images show work, not poses, and only people who have agreed.
Three aspect ratios. The dashed box is the safe margin (10 %): subject and text stay inside.
12 — Dark mode
The mapping of tokens from light to dark, the calculated contrast pairs and the rules: no pure black, amber stays an accent.
Components write their colours through roles (--ci-*). In the scope .ci-dunkel the roles point at dark values, identical to the dark mode of the marketing site. No new colour is created. Every value can be copied.
| Role | Light | Dark | Marketing site variable | Use |
|---|---|---|---|---|
| Page background (bone in light, graphite in dark) | ||||
| Cards, fields, tables | ||||
| Inverted surface: table header, toast, read-only mode | ||||
| Text on an inverted surface | ||||
| Primary text | ||||
| Secondary text, lead | ||||
| Help text, placeholders, icons at rest | ||||
| Dividers (decorative) | ||||
| Stronger lines (decorative) | ||||
| no counterpart | Outlines of inputs and controls (at least 3:1) | |||
| Amber for small text and active marks | ||||
| Focus ring |
The roles live in /css/ci.css: light in :root, dark in .ci-dunkel, with data-theme dark and with a dark system setting. The values are matched with those of the marketing site. The back office panel deliberately stays light only.
Every pair is calculated: semi-transparent text is mixed over the background first and then compared according to WCAG 2.x. Running text reaches at least 4.5:1 everywhere. Copper and success green sit only just above 3:1 on graphite, so they are marks or outlines, never text.
| Sample | Foreground | Background | Use | Light | Dark | Minimum | Result |
|---|---|---|---|---|---|---|---|
| Body text | 16.3:1 AAA | 16.3:1 AAA | 4.5:1 | passed | |||
| Body text | 17.7:1 AAA | 15.0:1 AAA | 4.5:1 | passed | |||
| Body text | 9.5:1 AAA | 11.7:1 AAA | 4.5:1 | passed | |||
| Body text | 10.4:1 AAA | 10.9:1 AAA | 4.5:1 | passed | |||
| Body text | 5.3:1 AA | 7.9:1 AAA | 4.5:1 | passed | |||
| Body text | 5.8:1 AA | 7.5:1 AAA | 4.5:1 | passed | |||
| Body text | 5.5:1 AA | 8.6:1 AAA | 4.5:1 | passed | |||
| Body text | 6.0:1 AA | 7.9:1 AAA | 4.5:1 | passed | |||
| Body text | 8.6:1 AAA | 7.3:1 AAA | 4.5:1 | passed | |||
| Body text | 17.7:1 AAA | 13.7:1 AAA | 4.5:1 | passed | |||
| Body text | 8.6:1 AAA | 8.6:1 AAA | 4.5:1 | passed | |||
| Body text | 5.1:1 AA | 5.1:1 AA | 4.5:1 | passed | |||
| UI and graphics | 5.3:1 AA | 7.9:1 AAA | 3.0:1 | passed | |||
| UI and graphics | 5.8:1 AA | 7.5:1 AAA | 3.0:1 | passed | |||
| UI and graphics | 16.3:1 AAA | 16.3:1 AAA | 3.0:1 | passed | |||
| UI and graphics | 17.7:1 AAA | 15.0:1 AAA | 3.0:1 | passed | |||
| UI and graphics | 4.7:1 AA | 3.4:1 AA large | 3.0:1 | passed | |||
| UI and graphics | 5.1:1 AA | 3.1:1 AA large | 3.0:1 | passed | |||
| UI and graphics | 4.4:1 AA large | 3.6:1 AA large | 3.0:1 | passed | |||
| UI and graphics | 4.8:1 AA | 3.3:1 AA large | 3.0:1 | passed |
The preview is a container with the class ci-dunkel. All components inside use the same classes as in light mode.
Buttons, pills, badges, card, error field and toast inside the scope ci-dunkel.
Seven sources, one traffic light. Reminder, warning, expired: automatic, separated by tenant.
Please enter a valid email address.
<div class="ci-dunkel ci-dunkel-demo">
<div class="ci-reihe">
<button type="button" class="btn btn-volt">Create assignment</button>
<button type="button" class="btn btn-ghost">Learn more</button>
<button type="button" class="btn btn-danger">Delete permanently</button>
</div>
<div class="ci-reihe">
<span class="pille pille-test">Trial · 14 days</span>
<span class="pille pille-lesen">Read-only mode</span>
<span class="pille pille-beta">Beta</span>
<span class="pille pille-neu">New</span>
</div>
<div class="ci-reihe">
<span class="badge b-volt">expires soon</span>
<span class="badge b-ok">approved</span>
<span class="badge b-copper">expired</span>
<span class="badge b-ink">Sec. 12 AÜG</span>
<span class="badge b-grau">Info</span>
</div>
<div class="ci-feld-reihe">
<div class="ccard">
<div class="ic"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z"/></svg></div>
<h5>Deadline engine</h5>
<p>Seven sources, one traffic light. Reminder, warning, expired: automatic, separated by tenant.</p>
</div>
<div class="feld">
<label class="feld-label" for="dm-email">Email address<span class="pflicht" aria-hidden="true">*</span></label>
<input class="inp" type="email" id="dm-email" name="email" value="name@" autocomplete="email" required aria-invalid="true" aria-describedby="dm-email-meldung">
<p class="feld-fehler" id="dm-email-meldung"><svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"/></svg>Please enter a valid email address.</p>
</div>
</div>
<div class="toast toast-ok" role="status">
<svg class="ico" viewBox="0 0 24 24" aria-hidden="true"><path d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/></svg> <span>Assignment saved</span>
</div>
</div>
13 — Motion
Duration and easing tokens, the permitted motions, the duty to honour prefers-reduced-motion and a demo with a switch.
Three durations and one curve: 150 ms for hover and colour changes, 260 ms for overlays, 700 ms for fading in on load, all with --ease. The CSS contains tokens only, never numbers.
| Motion | Duration | Curve | Properties | CSS |
|---|---|---|---|---|
| Fade in | 700ms | cubic-bezier(.2,.7,.2,1) | opacity, transform | |
| Hover lift | 150ms | cubic-bezier(.2,.7,.2,1) | transform, box-shadow | |
| Colour and shadow change | 150ms | cubic-bezier(.2,.7,.2,1) | background-color, border-color, color | |
| Overlays and toasts | 260ms | cubic-bezier(.2,.7,.2,1) | opacity, transform |
Addition for motion system D: press, colour mode, reveal on scroll, counting, lines and staggering. The values live in the :root of ci.css; they are in use on marketing site D (akw-bewegung.css/.js, the site-2027 stylesheets), back office and portals follow with their stages. Endless loops only run with a run lock (visible, not paused, no reduced motion), see motion D.
| Token | Value | Use |
|---|---|---|
| Press and toggle | ||
| Colour-mode change, expand and collapse | ||
| Reveal on scroll, bars | ||
| Numbers count up (once) | ||
| Width animation of the main headline | ||
| Lines draw, the conduit extends (once) | ||
| In (same as the default curve) | ||
| Out | ||
| Flow, sheen, breathing | ||
| Stagger, at most eight steps | ||
| Distance when revealing |
On load, content rises 16 px and fades in (700 ms), staggered in 150 ms steps. One orchestrated build-up per page, no scattered micro-animations.
Cards lift 2 px on hover and gain a shadow (150 ms). Buttons on the marketing site do not move; only shadow and colour change there.
Buttons, fields and links change background, outline and colour in 150 ms. Nothing moves in the process.
Menus, dialogs and toasts fade in within 260 ms (opacity, transform). Closing may happen at once.
Marketing site D is live: every loop has a run lock, a pause button and an idle pause (WCAG 2.2.2). The earlier deviation of the previous marketing site no longer applies.
How marketing site D “Lichtwerk” moves: tell once, then rest. Loops exist only there, only while visible and always with a pause; content never depends on motion. The building blocks live in akw-bewegung.css/.js, the page rules in site-2027.css and site-2027-start.css.
| Motion | Type | Duration | With “reduce motion” or pause |
|---|---|---|---|
| Kinetic H1: stretch and blur resolve to sharp | once per view | final state at once; the H1 starts visible (LCP) | |
| Sheen across the glow word | once per view | 2,8 s | omitted |
| Reveal on scroll, staggered | once per view | visible at once | |
| Key figures count up | once per view | final value at once; screen readers only read the final value | |
| Lines and bars draw themselves (line, timeline) | once per view | final state at once | |
| Ring of the “current” lamp: three runs, then rest | once per view | 2,4 s × 3 | static |
| Aura breathes | loop with run lock | 9–12 s | static |
| Floor grid moves | loop with run lock | 3,6 s | static; level “lean”: hidden |
| Energy core: orbit of the areas, sphere pulse, rotating rings | loop with run lock | 46 s / 4,8 s / 30–60 s | static row of tiles with all areas |
| Line: pulse runs, nodes light up | loop with run lock | 7,2 s | line static, nodes static |
| Tab change in the product tour | feedback to an action | jumps | |
| Accordion opens smoothly (FAQ, details) | feedback to an action | opens at once | |
| Page change (view transitions) | feedback to an action | off |
Desktop: glass with blur in header and menu, energy core with all areas, aura and grid in motion.
Up to 900 px, with “reduce transparency” or data saver: no blur, aura static, no floor grid, six instead of 9 cards in orbit.
With “reduce motion” or pause: everything in its final state, no loop.
Anyone who selects “reduce motion” in the operating system gets no animation and no transition: everything is in its final state at once. The rule lives in /css/ci.css and applies to every page that loads it. New motion needs no exception of its own.
The block is read verbatim from ci.css here, so it can never differ from the file.
No preview: the block works through the operating system setting.
@media (prefers-reduced-motion: reduce) {
*,*::before,*::after{
animation-duration:.001ms!important;
animation-iteration-count:1!important;
animation-delay:0s!important;
transition-duration:.001ms!important;
transition-delay:0s!important;
scroll-behavior:auto!important;
}
.ccard:hover{transform:none}
}
Three cards fade in one after another and lift on hover. The switch simulates “reduce motion” on the stage; the real system setting affects the whole page.
The switch lets you check the reduced mode without changing the system setting.
System setting: motion normal. The switch is off.
Sample card for the fade in.
Sample card for the fade in.
Sample card for the fade in.
<div class="ccard einblenden">…</div>
<div class="ccard einblenden einblenden-2">…</div>
<div class="ccard einblenden einblenden-3">…</div>
14 — Accessibility
WCAG 2.2 AA as a checklist: contrast, focus, target sizes, language, error messages as text and keyboard operation.
The CI builds on WCAG 2.2, level AA. Each row names the success criterion and the rule that follows from it for design and build. Motion deliberately goes beyond AA.
| Topic | Criterion | Level | Rule in the CI |
|---|---|---|---|
| Contrast | 1.4.3 | AA | Running text at least 4.5:1, large text at least 3:1. Only approved pairs apply (colours, dark mode); amber is not text on bone. |
| Controls and graphics | 1.4.11 | AA | Outlines of fields, focus rings and marks at least 3:1 against the background. The input outline is --muted, never the hairline. |
| Never colour alone | 1.4.1 | A | Status carries text, shape or an icon: pill with a mark, error with icon and text, active item with a bar. |
| Focus visible | 2.4.7 · 2.4.11 | AA | 2 px outline with an offset, never switched off. Fixed headers do not cover the focus (anchor offset in the CSS). |
| Target size | 2.5.8 | AA | At least 24 × 24 px, touch elements 44 × 44 px. Spacing counts. |
| Keyboard | 2.1.1 | A | Everything works with Tab, Enter and Space, no keyboard traps, a skip link at the top, a logical order. |
| Language | 3.1.1 · 3.1.2 | AA | lang on the html element (de-AT, en-GB), foreign-language text with its own lang, one content per language. |
| Errors and help | 3.3.1 · 3.3.3 | AA | The error message is text next to the field and linked via aria-describedby. It says what to do. |
| Names and roles | 4.1.2 · 2.5.3 | A | Every field has a label (for and id). The accessible name contains the visible text; icons without text have an aria-label. |
| Motion | 2.2.2 · 2.3.3 | AAA | prefers-reduced-motion stops animations. Nothing moves for longer than 5 seconds without a stop, nothing flashes. |
| Reflow | 1.4.10 | AA | Content wraps without sideways scrolling of the page (test width 375 px). Wide tables and code blocks scroll inside a focusable region. |
From the same contrast class as the colours: the ratio in light and in dark mode, not estimated.
| What for | Pair | Light | Dark | Minimum |
|---|---|---|---|---|
| Input outline | --ci-kontur / --ci-flaeche |
5.8:1 AA | 7.5:1 AAA | 3.0:1 |
| Focus ring | --ci-fokus / --ci-grund |
16.3:1 AAA | 16.3:1 AAA | 3.0:1 |
| Amber text (active state) | --ci-akzent-text / --ci-flaeche |
6.0:1 AA | 7.9:1 AAA | 4.5:1 |
| Help text | --ci-gedaempft / --ci-flaeche |
5.8:1 AA | 7.5:1 AAA | 4.5:1 |
At least 24 × 24 px, for touch 44 × 44 px. The squares are drawn at their real size.
Every element of the page works without a mouse, including the copy buttons of this manual and the scrollable tables.
| Key | Effect |
|---|---|
| Tab | Move to the next operable element |
| Shift + Tab | Move to the previous element |
| Enter | Activate a button or link, copy a value |
| Space | Activate a button, toggle a checkbox or switch |
| Arrow keys | Scroll sideways inside a scrollable region (table, jump bar) |
| Esc | Close an overlay, menu or dialog |
The html element carries the language of the page (de-AT or en-GB). Foreign words and sentences get their own lang attribute so that screen readers pronounce them correctly.
The lang attribute on the enclosing element.
The legal term Arbeitskräfteüberlassung stays in German.
<p>The legal term <span lang="de">Arbeitskräfteüberlassung</span> stays in German.</p>
15 — White label
Every output has exactly one branding source: the tenant (logo, app name and colours from the tenant profile) or the operator (EagleDesk). The table names the source per output and is checked against the code.
Every output carries either the tenant’s branding or the operator’s, in principle never a mix. The tenant appears with its own name and, where connected, with logo and primary colour; the table below shows where. The operator appears where EagleDesk itself speaks: the website, this handbook, platform emails and the platform.
Comes centrally from the tenant profile: logo, app name and three colours. This is the intended single source; new outputs do not read company fields directly.
EagleDesk: logo, wordmark and the colours of this handbook. Tenant colours and tenant logos never appear in these outputs.
Logo (light and dark), app name and three colours from the tenant profile make up the branding. The column “Effective today in” lists the main outputs that read the value.
| Block | Effective today in |
|---|---|
| Logo | letterhead of the PDF documents, back office, careers page |
| Logo (dark) | in no output that is wired up (at most as a placeholder in document templates) |
| Primary colour | letterhead of the PDF documents, Employee Web App and customer portal, business card, email signature, careers page, public tenant pages (status, approval and signature links), whistleblowing channel |
| Secondary colour | in no output that is wired up (at most as a placeholder in document templates) |
| Accent colour | in no output that is wired up (at most as a placeholder in document templates) |
| App name | back office, Employee Web App and customer portal, letterhead of the PDF documents, careers page, public tenant pages (status, approval and signature links), whistleblowing channel |
Exactly one source per row. The statements are checked against the code and updated when it changes.
| Output | Source | What appears | Note |
|---|---|---|---|
| Tenant branding | |||
| Section 11 employment statement (PDF) | Tenant | Logo or app name and primary colour in the letterhead, company details in header and footer. | — |
| Section 12 notification (PDF) | Tenant | Like the employment statement: logo or app name and primary colour in the letterhead, company details in header and footer. | — |
| Tenant invoice (PDF) | Tenant | Logo or app name, primary colour, company and bank details; a location can have its own header, footer and bank details. | This is the tenant’s invoice to its customer, not the operator’s invoice to the tenant. |
| Workplace information (PDF) | Tenant | Like the employment statement: logo or app name and primary colour in the letterhead, company details in header and footer. | — |
| Employee Web App | Tenant | App name and primary colour in the header bar and on the main button; the text on it is white or graphite. | Today without a tenant logo in the header bar; the logo there is a target picture. |
| Customer portal | Tenant | App name and primary colour in the header bar and on the main button; the text on it is white or graphite. | Today without a tenant logo in the header bar; the logo there is a target picture. |
| Tenant emails | Tenant | Sender name (app name) and sender address of the tenant, where stored; sending runs only through the tenant’s own SMTP access. | Without a configured access the email waits; the platform never sends it as a substitute. The emails are plain and have no logo header. |
| Business card (PDF) | Tenant | Company name and primary colour of the tenant, plus contact details of the person and the address of the company. | — |
| Email signature | Tenant | Name of the person and links in the tenant’s primary colour, plus company name and contact details. | — |
| Back office: logo and app name | Tenant | The tenant logo in the top bar, if one is stored; the tenant’s app name appears in the page title (browser tab). | Without a stored tenant logo the top bar shows the EagleDesk logo. |
| Operator branding | |||
| Back office: accent colour | Operator | Always amber; the tenant’s primary colour has no effect in the back office. | The back office is light; graphite and bone stay fixed. |
| Favicon and app icon of back office and portals | Operator | The EagleDesk mark, also as the app icon when the web app or customer portal is added to the home screen. The app name remains the tenant’s. | There is no tenant favicon or app icon today. |
| Website | Operator | EagleDesk: logo, wordmark, graphite, bone and amber. | — |
| Brand handbook (this page) | Operator | EagleDesk, fixed to light mode. | — |
| Platform emails | Operator | Graphite header with wordmark, amber stripe and the operator’s mandatory details in the footer: trial, contract, invitations, system notices. | Sent through the platform’s mail access, never through a tenant’s SMTP access. The back office’s sign-in and security emails (password, email confirmation) use the standard layout. |
| Platform invoices | Operator | Invoices from the operator to the tenant for the subscription, shown in the back office as a list with a link to the invoice at the payment provider. | Issued by the operator’s payment provider, not from the tenant’s branding. |
| Platform console | Operator | Always the operator brand; the page title names “Platform”. Never the colour or logo of a tenant. | A visible brand line “Platform” next to the logo is a target picture; blocked for search engines (noindex). |
A discreet “powered by EagleDesk” at the bottom of the page (10 px at most) is intended as an option if the operator allows it. The product has neither a switch nor an output for it; the models in the section “In use” show it only as a target picture.
16 — Documents and PDF
Letterhead structure, type and table style in the PDF, and four examples (section 11 employment statement, section 12 notification, invoice, timesheet) as A4 models of the fictitious Musterfirma Personal GmbH. All values are placeholders; the template in the system is always authoritative.
The models show the target picture of the document design with the fictitious Musterfirma Personal GmbH. Where today’s PDF layout differs, it is noted (“Today”). This handbook does not change the templates in the system.
Everything in square brackets is a placeholder. The samples contain no real data, no VAT number and no company register number.
The zones of a document from top to bottom. Fold and punch marks sit at the left edge.
[Company] · [Street No.] · [Postcode City]
[Recipient]
[Address]
[Document title]
[Number] · [Date] · [Legal basis]
[Company] · VAT [VAT no.] · [Register no.] · IBAN [IBAN]Page [n] / [N]
Example, abridged – the template in the system is authoritative
| No. | Zone | Rule | Today |
|---|---|---|---|
| 1 | Logo zone | Top left the tenant logo (in the product at most 46 px high and 220 px wide) or, without a logo, the app name in the primary colour. To its right the company details of the tenant. | Yes |
| 2 | Sender line and address field | A small line with company and address above the address field (window envelope). Today the sender is a block at the top right of the header; there is no separate sender line. | No |
| 3 | Title | A level-1 heading with the document type, below it a grey line with number, date and legal basis, for example “pursuant to § 12 AÜG”. | Yes |
| 4 | Content | Sections with a level-2 heading, details as a two-column table (label left, value right), items as a table. | Yes |
| 5 | Footer with mandatory details | Company, VAT number, company register number and IBAN of the tenant in one line, “Page n / N” on the right. If a detail is missing in the tenant profile, it is left out. Today the line also carries the document name and a confidentiality note. | Partly |
| 6 | Fold and punch marks | Small ticks at the left edge for folding and punching (form B of DIN 5008: fold marks at 105 and 210 mm, punch mark at 148.5 mm). They belong on the tenant’s letterhead paper; the system does not draw them. | No |
Target picture: IBM Plex Sans in two weights (400 and 600). The samples are shown at real size (1 pt = 1.33 px) and include the smallest permitted size.
| Role | Size | Weight | Sample |
|---|---|---|---|
| Title | 14 pt | 600 | Temporary agency work 1,234.50 |
| Section heading | 11 pt | 600 | Temporary agency work 1,234.50 |
| Body text | 10 pt | 400 | Temporary agency work 1,234.50 |
| Table text | 9 pt | 400 | Temporary agency work 1,234.50 |
| Table header | 9 pt | 600 | Temporary agency work 1,234.50 |
| Footer | 9 pt | 400 | Temporary agency work 1,234.50 |
The smallest type in the PDF is 9 pt. Below that even a footer is hard to read on paper.
Today the PDF layout uses DejaVu Sans, a font bundled with the PDF generator; AK Sans would need to be embedded as a TrueType file. Body text is 11 px (8.25 pt), the footer 8 px (6 pt) and thus below the minimum. The handbook shows the target picture; changing the layout is a separate undertaking.
Calm and print-friendly: no filled areas, and colour never carries the meaning on its own.
| No. | Service | Qty | Rate | Amount |
|---|---|---|---|---|
| [No.] | [Service] | [Hrs] | [Rate] | [Amount] |
| [No.] | [Service] | [Hrs] | [Rate] | [Amount] |
| [No.] | [Service] | [Hrs] | [Rate] | [Amount] |
| Total net | [Amount] | |||
Today the PDF layout fills the table header with a light amber tone; the target picture omits it.
A4 models of the fictitious Musterfirma Personal GmbH with demo branding. The header and the first sections are shown; the rest is abridged with “…”.
Employment contract / statement
pursuant to section 11 of the Temporary Agency Work Act (AÜG)
Lessor (employer)
| Company | Musterfirma Personal GmbH |
| Address | [Address] |
| VAT number | [VAT no.] |
Employee
| Name | [Name] |
| Personnel number | [Personnel no.] |
| Address | [Address] |
§ 1 Start, type and area of the employment
| Start | [Date] |
| Type of employment | [Type] |
| Area of assignment | [Area] |
…
[Company] · VAT [VAT no.] · [Register no.] · IBAN [IBAN]
Example, abridged – the template in the system is authoritative
Assignment notification
pursuant to section 12 of the Temporary Agency Work Act (AÜG) · Assignment no. [Assignment no.]
Lessor
| Company | Musterfirma Personal GmbH |
| VAT number | [VAT no.] |
Leased worker
| Name | [Name] |
| Personnel number | [Personnel no.] |
User undertaking (place of assignment)
| Company | [User undertaking] |
| Address | [Address] |
Terms of the assignment
| Start of assignment | [Date] |
| Expected duration | [Duration] |
| Activity / use | [Activity] |
| Grading under the temporary agency work collective agreement | [Grade] |
…
[Company] · VAT [VAT no.] · [Register no.] · IBAN [IBAN]
Example, abridged – the template in the system is authoritative
Invoice
Invoice no. [Number] · Date [Date]
Invoice recipient
| Company | [Customer] |
| Address | [Address] |
| Service period | [from] – [to] |
Services
| No. | Service | Qty | Rate | Amount |
|---|---|---|---|---|
| [No.] | [Service] | [Hrs] | [Rate] | [Amount] |
| [No.] | [Service] | [Hrs] | [Rate] | [Amount] |
| Net amount | [Amount] |
| VAT [rate] | [Amount] |
| Invoice total | [Amount] |
Payment terms
Payable by [date] to [IBAN].
[Company] · VAT [VAT no.] · [Register no.] · IBAN [IBAN]
Example, abridged – the template in the system is authoritative
Timesheet
Enclosure to invoice [Number] of [Date]
Assignment [Assignment no.] · [Name] · [Month]
| Date | Time type | from | to | Break | Hours |
|---|---|---|---|---|---|
| [DD.MM.] | [Time type] | [hh:mm] | [hh:mm] | [min] | [Hrs] |
| [DD.MM.] | [Time type] | [hh:mm] | [hh:mm] | [min] | [Hrs] |
| [DD.MM.] | [Time type] | [hh:mm] | [hh:mm] | [min] | [Hrs] |
| Total hours (customer side) | [Hrs] |
| Approval note | Approved on [date] · Customer approval: [name] |
…
[Company] · VAT [VAT no.] · [Register no.] · IBAN [IBAN]
Example, abridged – the template in the system is authoritative
17 — Portals
Employee Web App and customer portal at 375 px width, with the rules for target sizes, tenant colour and contrast.
The models below show the layout at 375 px width. Surfaces and type are the target picture in CI tokens; the tenant colour comes from the tenant profile.
Home, assignment schedule and entering hours. All details are placeholders.
Next assignment
[Date] · [Place] · [from] – [to]
Schedule
[Weekday] [DD.MM.]
[Place] · [from] – [to]
[Weekday] [DD.MM.]
[Place] · [from] – [to]
[Weekday] [DD.MM.]
[Place] · [from] – [to]
Enter hours
Approving hours: one card per assignment with one main action “Approve”; rejecting is the second choice.
Hours approval
Assignment [Assignment no.]
[Activity]
Period [MM/YYYY] · Hours [Hrs]
For text on the tenant colour the portal chooses white or graphite, whichever gives the higher contrast. With an amber that is too light, that is graphite. The values are calculated according to WCAG 2.x.
| Tenant colour | Text | Contrast | Sample |
|---|---|---|---|
Light amber #f59e0b |
Graphite | 8.3:1 AAA | Approve |
Dark petrol #1d5d7a |
White | 7.2:1 AAA | Approve |
Orange #e0603a |
Graphite | 5.0:1 AA | Approve |
Mid grey (limit case) #7a7a7a |
White | 4.2:1 AA large | Approve |
Limit: the portal chooses only between these two text colours. If a tenant colour is such that neither reaches 4.5:1 (example: mid grey), the better choice stays, and the tenant profile does not warn. In the PDF the primary colour is the line and, without a logo, the colour of the app name on white; nothing is checked there. Recommendation: check the tenant colour against white and graphite when setting it up.
18 — Filament admin
The panel’s class catalogue is built from the stylesheet on every request. Plus live examples, a sidebar and a table model, and the rule: Filament components before custom views.
Two models from HTML and CSS with the values of the panel stylesheet: group heading in AK Mono, active item with an amber tint, cards with a 14 px radius. On the desktop the logo sits in the top bar; it appears in the sidebar only on smartphones.
| Name | Personnel no. | Status |
|---|---|---|
| [Name] | [No.] | Active |
| [Name] | [No.] | Active |
| [Name] | [No.] | On assignment |
Building blocks from the panel stylesheet, rendered here without Filament. Every akw class in these examples is in the catalogue and works without a Filament selector. Banners and announcements are in the section “Components”.
In the panel these places hold Filament components (section, button, badge); the snippet shows only the akw classes.
The core workflow on the dashboard: next step and six stations with open tasks.
<div class="akw-ablauf-rahmen">
<div class="akw-ablauf-next">
<span class="akw-ablauf-next-body">
<span class="akw-ablauf-next-label">Next step</span>
<span class="akw-ablauf-next-titel">Check hours</span>
<span class="akw-ablauf-next-text">Timesheets for several assignments are ready for approval.</span>
</span>
</div>
<ol class="akw-ablauf-leiste" aria-label="Core workflow">
<li class="akw-ablauf-li">
<a class="akw-ablauf-schritt is-offen" href="#">
<span class="akw-ablauf-nr">Step 1</span>
<span class="akw-ablauf-titel">Request</span>
<span class="akw-ablauf-zahl">2</span>
<span class="akw-ablauf-text">open</span>
</a>
</li>
<li class="akw-ablauf-li">
<a class="akw-ablauf-schritt is-offen" href="#">
<span class="akw-ablauf-nr">Step 2</span>
<span class="akw-ablauf-titel">Assignment</span>
<span class="akw-ablauf-zahl">1</span>
<span class="akw-ablauf-text">open</span>
</a>
</li>
<li class="akw-ablauf-li">
<a class="akw-ablauf-schritt is-offen" href="#">
<span class="akw-ablauf-nr">Step 3</span>
<span class="akw-ablauf-titel">Hours</span>
<span class="akw-ablauf-zahl">5</span>
<span class="akw-ablauf-text">open</span>
</a>
</li>
<li class="akw-ablauf-li">
<a class="akw-ablauf-schritt is-offen" href="#">
<span class="akw-ablauf-nr">Step 4</span>
<span class="akw-ablauf-titel">Approval</span>
<span class="akw-ablauf-zahl">3</span>
<span class="akw-ablauf-text">open</span>
</a>
</li>
<li class="akw-ablauf-li">
<a class="akw-ablauf-schritt is-offen" href="#">
<span class="akw-ablauf-nr">Step 5</span>
<span class="akw-ablauf-titel">Invoice</span>
<span class="akw-ablauf-zahl">1</span>
<span class="akw-ablauf-text">open</span>
</a>
</li>
<li class="akw-ablauf-li">
<a class="akw-ablauf-schritt is-offen" href="#">
<span class="akw-ablauf-nr">Step 6</span>
<span class="akw-ablauf-titel">Payment</span>
<span class="akw-ablauf-zahl">4</span>
<span class="akw-ablauf-text">open</span>
</a>
</li>
</ol>
</div>
Four states, each with text: colour reinforces the meaning, it never carries it alone.
<div class="ci-reihe">
<span class="akw-kalk-ampel akw-kalk-ampel--gruen">Within range</span>
<span class="akw-kalk-ampel akw-kalk-ampel--gelb">Tight</span>
<span class="akw-kalk-ampel akw-kalk-ampel--rot">Exceeded</span>
<span class="akw-kalk-ampel akw-kalk-ampel--grau">No data</span>
</div>
Small cards with a label and a value in AK Mono; a negative value gets the class for deviations.
<div class="akw-db">
<div class="akw-db-kennzahlen">
<div class="akw-db-kz">
<span class="akw-db-kz-label">Revenue</span>
<span class="akw-db-kz-wert">[Amount]</span>
</div>
<div class="akw-db-kz">
<span class="akw-db-kz-label">Costs</span>
<span class="akw-db-kz-wert">[Amount]</span>
</div>
<div class="akw-db-kz">
<span class="akw-db-kz-label">Contribution margin</span>
<span class="akw-db-kz-wert akw-db-neg">[−Amount]</span>
</div>
</div>
</div>
Progress bar and list of steps with example steps: completed steps struck through, open ones with an action.
<div class="akw-einrichtung-kopf">
<span class="akw-einrichtung-zaehler">1 of 3 steps completed</span>
<span class="akw-einrichtung-balken"><span class="akw-einrichtung-balken-wert" style="width:33%"></span></span>
</div>
<ul class="akw-einrichtung-liste" role="list">
<li class="akw-einrichtung-schritt is-erledigt">
<span class="akw-einrichtung-ic" aria-hidden="true">✓</span>
<span class="akw-einrichtung-body">
<span class="akw-einrichtung-titel">Company details<span class="sr-only"> (done)</span></span>
<span class="akw-einrichtung-text">Name, address and VAT number in the tenant profile.</span>
</span>
</li>
<li class="akw-einrichtung-schritt">
<span class="akw-einrichtung-ic" aria-hidden="true">2</span>
<span class="akw-einrichtung-body">
<span class="akw-einrichtung-titel">Logo and colour</span>
<span class="akw-einrichtung-text">Upload the logo and choose the primary colour.</span>
</span>
<span class="akw-einrichtung-aktion"><a class="btn btn-ghost" href="#">Open</a></span>
</li>
<li class="akw-einrichtung-schritt">
<span class="akw-einrichtung-ic" aria-hidden="true">3</span>
<span class="akw-einrichtung-body">
<span class="akw-einrichtung-titel">Mail access</span>
<span class="akw-einrichtung-text">Set up your own SMTP access.</span>
</span>
<span class="akw-einrichtung-aktion"><a class="btn btn-ghost" href="#">Open</a></span>
</li>
</ul>
A column with a counter and cards, next to it an empty column with a dashed border.
<div class="akw-kanban" role="region" tabindex="0" aria-label="Board with two columns">
<div class="akw-kanban-col">
<div class="akw-kanban-colhead">
<span class="akw-kanban-coltitle">New</span>
<span class="akw-kanban-count">2</span>
</div>
<div class="akw-kanban-cards">
<div class="akw-kanban-card">
<div class="akw-kanban-card-title">[Name]</div>
<div class="akw-kanban-card-sub">[Position]</div>
</div>
<div class="akw-kanban-card">
<div class="akw-kanban-card-title">[Name]</div>
<div class="akw-kanban-card-sub">[Position]</div>
<div class="akw-kanban-card-ok">Documents complete</div>
</div>
</div>
</div>
<div class="akw-kanban-col">
<div class="akw-kanban-colhead">
<span class="akw-kanban-coltitle">In review</span>
<span class="akw-kanban-count">0</span>
</div>
<div class="akw-kanban-cards">
<div class="akw-kanban-empty">No cards</div>
</div>
</div>
</div>
This catalogue is built from the panel’s stylesheet on every request: a new class appears here by itself, a removed one disappears. “Standalone” means there is a rule for the class that requires neither Filament (classes and variables) nor dark mode; only such classes can be shown as a live example without the panel.
769 classes in 51 families, 765 of them standalone.
| Family | Meaning | Classes | Standalone | List |
|---|---|---|---|---|
akw-ablauf-* |
Dashboard workflow bar | 23 | 23 / 23 |
Show: akw-ablauf
|
akw-ankuendigung-* |
Platform announcements | 9 | 9 / 9 |
Show: akw-ankuendigung
|
akw-ankuendigungen-* |
Container of the announcements | 1 | 1 / 1 |
Show: akw-ankuendigungen
|
akw-anruf-* |
Caller display of the telephony integration | 17 | 17 / 17 |
Show: akw-anruf
|
akw-ansicht-* |
View switcher | 1 | 0 / 1 |
Show: akw-ansicht
|
akw-anzeige-* |
Comparison of job ad versions | 3 | 3 / 3 |
Show: akw-anzeige
|
akw-azg-* |
Working time warning | 1 | 1 / 1 |
Show: akw-azg
|
akw-azm-* |
Working time notice | 1 | 1 / 1 |
Show: akw-azm
|
akw-befehl-* |
Command palette | 28 | 28 / 28 |
Show: akw-befehl
|
akw-br-* |
Demand radar (also used by the margin radar) | 43 | 43 / 43 |
Show: akw-br
|
akw-cell-* |
Day status cells of the planning board | 13 | 13 / 13 |
Show: akw-cell
|
akw-db-* |
Contribution margin and key figures | 19 | 18 / 19 |
Show: akw-db
|
akw-dc-* |
Deal check (margin guard) | 14 | 14 / 14 |
Show: akw-dc
|
akw-ds-* |
Dispatcher statistics | 2 | 1 / 2 |
Show: akw-ds
|
akw-einrichtung-* |
Setup assistant | 14 | 14 / 14 |
Show: akw-einrichtung
|
akw-einst-* |
Settings: topic tiles | 19 | 19 / 19 |
Show: akw-einst
|
akw-eu-* |
Assignment overview | 28 | 28 / 28 |
Show: akw-eu
|
akw-fg-* |
Approvals | 19 | 19 / 19 |
Show: akw-fg
|
akw-fibu-* |
Accounting audit report | 6 | 6 / 6 |
Show: akw-fibu
|
akw-glbg-* |
Job ad: equal treatment check | 5 | 5 / 5 |
Show: akw-glbg
|
akw-hilfe-* |
Help window | 20 | 20 / 20 |
Show: akw-hilfe
|
akw-isk-* |
Insights: key figure tiles | 1 | 1 / 1 |
Show: akw-isk
|
akw-kalender-* |
Appointment calendar | 15 | 15 / 15 |
Show: akw-kalender
|
akw-kalk-* |
Calculation and rate tables with traffic light | 11 | 11 / 11 |
Show: akw-kalk
|
akw-kanban-* |
Kanban boards | 21 | 20 / 21 |
Show: akw-kanban
|
akw-karte-* |
Map | 27 | 27 / 27 |
Show: akw-karte
|
akw-ki-* |
AI: sources and transcript | 2 | 2 / 2 |
Show: akw-ki
|
akw-kic-* |
AI insights chat | 19 | 19 / 19 |
Show: akw-kic
|
akw-kp-* |
Customer portfolio | 16 | 16 / 16 |
Show: akw-kp
|
akw-link-* |
External links | 1 | 1 / 1 |
Show: akw-link
|
akw-lizenz-* |
Licence status banner | 7 | 7 / 7 |
Show: akw-lizenz
|
akw-ma-* |
Month-end closing | 6 | 6 / 6 |
Show: akw-ma
|
akw-mr-* |
Margin radar | 17 | 17 / 17 |
Show: akw-mr
|
akw-paket-* |
Book a package | 2 | 2 / 2 |
Show: akw-paket
|
akw-plantafel-* |
Planning board | 76 | 76 / 76 |
Show: akw-plantafel
|
akw-plausi-* |
Plausibility notices | 3 | 3 / 3 |
Show: akw-plausi
|
akw-preis-* |
no description | 30 | 30 / 30 |
Show: akw-preis
|
akw-profil-* |
User profile: image preview | 5 | 5 / 5 |
Show: akw-profil
|
akw-rl-* |
Invoice run | 17 | 17 / 17 |
Show: akw-rl
|
akw-schicht-* |
Shift plan | 22 | 22 / 22 |
Show: akw-schicht
|
akw-sigpad-* |
Signature pad | 6 | 6 / 6 |
Show: akw-sigpad
|
akw-sn-* |
Timesheet overview | 35 | 35 / 35 |
Show: akw-sn
|
akw-sr-* |
Screen readers only | 1 | 1 / 1 |
Show: akw-sr
|
akw-sso-* |
Sign-in with company account | 8 | 8 / 8 |
Show: akw-sso
|
akw-sz-* |
Review form for timesheets | 9 | 9 / 9 |
Show: akw-sz
|
akw-tw-* |
Reproduction of a few Tailwind utilities | 1 | 1 / 1 |
Show: akw-tw
|
akw-ueberblick-* |
Overview tiles | 1 | 1 / 1 |
Show: akw-ueberblick
|
akw-ze-* |
Time recording | 87 | 87 / 87 |
Show: akw-ze
|
akw-zi-* |
Time import: preview | 4 | 4 / 4 |
Show: akw-zi
|
akw-zt-* |
Surcharge types | 6 | 6 / 6 |
Show: akw-zt
|
akw-zu-* |
Time overview and matrix tables | 27 | 27 / 27 |
Show: akw-zu
|
19 — Emails and platform
The operator’s platform email compared with the tenant email, and how the platform console is labelled.
This is how the two email types are built today. All tenant emails are plain. All texts in the models are placeholders.
[Salutation]
[Heading]
[Tenant signature]
Musterfirma Personal GmbH
| Feature | Platform email | Tenant email |
|---|---|---|
| Sender | Operator, through the platform’s mail access | Tenant, through the tenant’s own SMTP access |
| Header | Graphite band with kicker line in amber, brand mail header and amber stripe | none: text on a white ground |
| Logo | Brand mail header as a PNG embedded in the email (not loaded from the web); without images the name shows as alternative text | none |
| Width | up to 600 px, full width below | up to 640 px |
| Font | Segoe UI with fall-back to system fonts | Arial |
| Footer | Mandatory details of the operator | Signature of the tenant; unsubscribe link in promotional bulk emails |
| Exceptions | none | none |
Implemented: the header of the platform email shows the brand mail header (section “In use”). The image is embedded in the email and not loaded from the web; tenant emails stay without images.
The colours are set in the email layout itself; the handbook calculates the contrast for them. Emails use inline colours because mail clients do not know tokens.
| Role | Text | Ground | Contrast |
|---|---|---|---|
| Platform email: kicker line | #f2a516 |
#15171c |
8.6:1 AAA |
| Platform email: wordmark | #ffffff |
#15171c |
17.9:1 AAA |
| Platform email: text | #4a4742 |
#fffefb |
9.1:1 AAA |
| Platform email: footer | #6b6358 |
#fffefb |
5.8:1 AA |
| Tenant email: text | #15171c |
#ffffff |
17.9:1 AAA |
The operator’s platform console always carries the operator brand; its name appears in every page title.
Back office (tenant)
Platform
20 — Voice and tone
We talk like a dependable foreman, not like an ad agency. Active instead of passive, numbers instead of adjectives, plain British English. Never hype, never scare tactics, never officialese.
The examples above show the tone; these five rules say how to recognise it. They apply to the marketing site, back office, portals, e-mails and documents.
One spelling per term, derived from the back office glossary and the existing texts. “Applies to” names where the rule is enforced today.
| Meant | We write | Not like this | Applies to | Note |
|---|---|---|---|---|
| People in the employee records | employee · employees | worker · temp staff · agency staff | Back office, help, tours | “Leased worker” (heading of the § 12 notification), “assigned worker” (other texts on assignments under the AÜG) and “active workers” (quota of the plan) are the only places for “worker”. |
| Worker as a legal term and in the pricing model | assigned worker · active workers | worker (on its own) | Back office, help, tours | For the person in the employee records, use “employee”. The marketing site uses “workforce” and “workers” more broadly, for example in the claim; the rule does not apply there. |
| The business and the companies | temporary staffing · temporary agency work | — | Marketing site, back office, portals | In German, “Personalleasing” appears only as an explanation in brackets after “Arbeitskräfteüberlassung”. |
| The company where an employee is deployed | client company · customer | — | Marketing site, back office, portals | The client company in the legal context, the customer in the business relationship (customer records, invoice, customer portal). |
| The deployment of an employee at the client company | assignment · assignments | job | Marketing site, back office, portals | Recruiting compounds such as job board and job profile stay. |
| People in the application process | applicant · applicants | candidate | Back office, help, tours | “Candidate profile” stays. |
| Access for the customers’ contact persons | customer portal | client portal · Portal active · Portal access | Back office, help, tours | — |
| Access for employees in the browser or on the home screen | Employee Web App | — | Marketing site, back office, portals | Older and abbreviated app names are replaced in all texts and deliberately not listed here. |
| The three packages | Premium · PremiumPlus · Premium All In | Premium Plus · Premium All-In | Marketing site, back office, portals | — |
Every German-language output addresses people formally (“Sie”), regardless of the author’s taste. The table describes what exists today; each example appears word for word in the German texts. The English texts use “you” throughout.
| Output | Address | Example from the texts |
|---|---|---|
| Marketing site (public pages) | formal “Sie” | „Sprechen Sie mit uns“ |
| Trial registration | formal “Sie” | „Sie erhalten eine E-Mail mit einem Bestätigungslink.“ |
| Back office, help and tours | formal “Sie” | „Die Personen in Ihrem Mitarbeiterstamm“ |
| Employee Web App and customer portal | formal “Sie” | „Bitte vergeben Sie ein neues, persönliches Passwort“ |
| Platform e-mails | formal “Sie” | „Sie haben diese Nachricht nicht erwartet?“ |
| Legal texts (legal notice, privacy, withdrawal) | formal “Sie” | „informiert Sie umfassend darüber“ |
These statements appear in no text: not on the marketing site, nor in e-mails, documents or sharing texts. When unsure, describe what the system does today.
The sentences come unchanged from the marketing site’s texts; when a sentence changes there, it changes here too. They are copied unchanged: a reworded sentence would be a new claim.
The number of trial days comes from the platform setting (currently 14 days).
Used in: footer of every public page
Everything in view. Software for temporary staffing – from request to invoice.
Used in: home page, header area
Your workforce. Everything in view . Software for temporary staffing.
Used in: home page, below the title
Software for temporary staffing.
Used in: status bar of every public page
Open beta · Since 19 October 2026
Used in: sharing texts in the kit (no longer on the public site)
14-day free trial — after a personal conversation
Used in: home page, trial section
In the open beta we set up every trial account personally: after a short conversation you receive an invitation and try EagleDesk free of charge and without obligation for 14 days. There is no self-registration.
21 — Principles
These principles apply to every surface: landing page, panel, PDF, e-mail, portal.
The brand is a default, not a constraint. Every tenant overrides name, logo and CI colours: no hard-coded brand name.
An accent, not the theme. Graphite and bone carry; amber shows only what matters most: action, status, output.
Self-hosted fonts, no third-party CDN at runtime. No tracking on public pages. Data minimisation made visible.
Small text uses --volt-d (at least 4.5:1). Focus always visible (graphite outline, amber glow on top). Motion respects prefers-reduced-motion.
Mono for data and labels. Tabular numbers. Precision is shown, not claimed.
One orchestrated load with a staggered rise beats scattered micro-animations. −2 px hover, never fidgety.
Colours, radii and typefaces come from /css/ci.css. No value is invented in the markup.
22 — Company data
The operator’s details from the platform’s operator configuration, each one copyable. The legal notice remains authoritative; if a detail is missing, it is not shown here.
The source is the platform’s operator configuration. The legal notice remains authoritative; if a detail is missing, it is not shown here.
| Detail | Value |
|---|---|
| Company | |
| Product | |
| Owner | |
| Address | |
| Commercial register number | |
| Register court | |
| VAT ID | |
| Phone | |
| Website |
For footers of e-mails and letters: company, address, commercial register and VAT ID in one line.
Webagentur Hochmeir e.U. · Moorweg 7, 4845 Rutzenmoos, Österreich · FN 597527 t · Landesgericht Wels · VAT ID ATU78855106
One line per detail, with its label.
Company: Webagentur Hochmeir e.U. Product: EagleDesk Owner: Jonathan Hochmeir Address: Moorweg 7, 4845 Rutzenmoos, Österreich Commercial register number: FN 597527 t Register court: Landesgericht Wels VAT ID: ATU78855106 Phone: +43 680 2208354 E-mail: hello@eagledesk.at Website: https://eagledesk.at
23 — E-mail signature
A generator for the operator’s e-mail signature: inputs, live preview and copying as rich text or plain text. Everything runs in the browser; nothing is stored or sent.
For the operator, not for tenants
This generator creates the operator’s signatures. Tenants use their own e-mail signature instead: it is built in the back office from the business card and the tenant profile.
Copy as rich text and paste it into the signature settings of the e-mail program. Programs without rich-text signatures take the plain text.
With country code; it becomes the tel link.
It becomes the mailto link.
The company lines below the logo come from the company data above.
24 — Sharing texts
Three texts for LinkedIn and e-mail, each in German and English. They consist only of sentences from the marketing site, state the beta status and end with the link.
Each text consists only of sentences from the marketing site plus the link, and states the beta status. The number of trial days comes from the platform setting (currently 14 days).
25 — System D (marketing site live)
The tokens of the new design: roles for dark and light, glass, glow, layers, type scale and a calculated contrast matrix down to the worst point over the aura. They apply only inside their own scope. The marketing site already uses the new design; the back office, the Employee Web App and the customer portal follow.
Marketing site live, back office and portals to follow
The tokens deliberately do not live on the root element but in a scope of their own. Existing pages do not carry it and therefore inherit nothing. Light is the default. Dark applies with data-theme="dark" on the scope or on an ancestor, and without either it follows the system setting; data-theme="light" on the scope or on the root element forces light. A nested scope without its own data-theme follows the root element and the system setting, not the scope above it: whoever forces a mode repeats data-theme on every nested scope. Building blocks do not carry d-system themselves, because the scope sets the ground and the text colour.
A container with the class d-system or the attribute data-design="2027" (for the whole page on body, the mode as data-theme on html if needed) switches the tokens on. The d-t-… classes of the type scale need the scope for their font family.
<!-- Standard hell, nach Systemeinstellung -->
<div class="d-system">…</div>
<!-- Dunkel erzwingen (auch an einem Vorfahren möglich) -->
<div class="d-system" data-theme="dark">…</div>
<!-- Ganze Seite: Scope am body, Modus bei Bedarf am html -->
<html data-theme="dark">
<body data-design="2027">
Both surfaces sit in the same document and resolve the tokens through data-theme on the scope. The preview consists of text and shapes only; nothing in it is operable.
Dark · Assignment 0042
An example in glow.
Łukasz Wiśniewski · Ștefan Țurcanu · Győző Szűcs · Iğdır
What needs doing?
Three assignments are waiting for approval. The next step is marked.
Light · Assignment 0042
An example in glow.
Łukasz Wiśniewski · Ștefan Țurcanu · Győző Szűcs · Iğdır
What needs doing?
Three assignments are waiting for approval. The next step is marked.
Components write roles, never hex values and never the product name. Each role has a dark and a light value; constants apply in both modes. Every value can be copied.
| Token | Dark | Light | Role |
|---|---|---|---|
| Ground and surfaces | |||
| Page ground (dark for apps, light sand) | |||
| Page ground of the marketing site (dark slightly deeper, light same as the ground) | |||
| Solid surface: nodes, fields, overlays without transparency | |||
| Glass and edges | |||
| Glass surface for cards, panels and tiles, light | |||
| Glass surface, strong (hover, highlighted card) | |||
| Layer 1: glass as a gradient, no blur | |||
| Edge of glass surfaces (decorative) | |||
| Stronger edge (decorative) | |||
| Outline of inputs and controls (at least 3:1) | |||
| Text | |||
| Primary text | |||
| Body text | |||
| Help text and labels (not free on the aura) | |||
| Accent and glow | |||
| Amber: main action, active step, lamp; in the portals the tenant colour | |||
| Amber as text or icon | |||
| Text and icon on an accent surface | |||
| Glow gradient for the one display word per page (large type only) | |||
| Light glow for shadows, derived from the accent | |||
| Focus ring (2 px, offset 3 px) | |||
| Status | |||
| Done, in order | |||
| Due soon (always with text and shape) | |||
| Overdue, fault | |||
| Information (steel, replaces the Filament blue) | |||
| Tracks in charts (decorative; data carries shape and text) | |||
| Atmosphere (aura) | |||
| Amber aura, peak value (decorative) | |||
| Steel aura, peak value (decorative) | |||
| Layers | |||
| Layer 2: shadow of the raised card | |||
| Same in both modes | Layer 2: amber edge on hover | ||
| Same in both modes | Layer 3: surface for header bars, menus and the bottom bar | ||
| Same in both modes | Layer 3: blur, allowed only here | ||
| Shapes | |||
| Same in both modes | Largest rounding: Today card, phone surfaces | ||
| Same in both modes | Edge width (2 px with more contrast) | ||
| Target sizes | |||
| Same in both modes | Smallest target size (WCAG 2.5.8) | ||
| Same in both modes | Target size of main actions | ||
| Same in both modes | Target size in the portals | ||
| Fonts | |||
| Same in both modes | Display: Archivo with width axis | ||
| Same in both modes | Text and controls: AK Sans | ||
| Same in both modes | Labels and identifiers: AK Mono | ||
The RD-0-01 block at the end of /css/ci.css is authoritative. This table comes from the same data source as the preview and is checked against the file automatically.
Eleven roles as d-t-… classes in ci.css. Display and numbers use the Archivo width axis (76 to 100 %); portals and backoffice body text stay in AK Sans. Capitals only for display roles; sentence case applies in portals.
For ÄÖÜ Staffing
From order to invoice
Time tracking
Overview
What needs doing?
1,284
Good morning, Ștefan
A paragraph that introduces a topic.
Łukasz Wiśniewski, Ștefan Țurcanu, Győző Szűcs, Iğdır, Žofia Černá
Help text below a field.
Assignment 0042 · Identifier
Calculated to WCAG 2.x, not asserted: semi-transparent colours are mixed over their background, and backgrounds are layers (ground, aura, glass, overlay). The auras stand for the worst case, the lightest point behind text in dark mode and the darkest in light mode. Body text needs 4.5:1, large type and graphics 3:1; for a gradient the least favourable stop decides.
Each cell gives the calculated ratio and the use it is approved for: text (4.5:1), large (display type, 3:1) or graphic (lamps, lines, outlines, 3:1). “not allowed” means the ratio is below the threshold of that use; the test proves it. “not intended” says nothing about the contrast.
| Foreground | Ground | Ground of the marketing site | Surface | Glass, strong | Accent surface | Amber aura | Amber aura on the marketing ground | Steel aura | Glass card over the amber aura | Both auras on top of each other | Glass card over both auras (lightest point) | Glow behind the glow word over the aura | Overlay over the amber aura |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 17.6:1 text | 17.9:1 text | 16.0:1 text | 14.9:1 text | 1.8:1 text: not allowed | 8.6:1 text | 8.9:1 text | 13.4:1 text | 7.0:1 text | 6.6:1 text | 5.5:1 text | not intended | 15.2:1 text | |
| 11.3:1 text | 11.4:1 text | 10.5:1 text | 9.9:1 text | not intended | 6.2:1 text | 6.4:1 text | 9.0:1 text | 5.2:1 text | 4.9:1 text | 4.1:1 text: not allowed | not intended | 10.1:1 text | |
| 7.0:1 text | 7.0:1 text | 6.8:1 text | 6.5:1 text | not intended | 4.4:1 text: not allowed | not intended | 6.0:1 text | 3.8:1 text: not allowed | 3.6:1 text: not allowed | 3.2:1 text: not allowed | not intended | 6.5:1 text | |
| 12.9:1 text | 13.1:1 text | 11.7:1 text | 10.9:1 text | 1.3:1 text: not allowed | 6.3:1 text | 6.5:1 text | 9.8:1 text | 5.1:1 text | 4.9:1 text | 4.0:1 text: not allowed | not intended | 11.1:1 text | |
| 9.2:1 text | 9.3:1 text | 8.3:1 text | 7.8:1 text | not intended | 4.5:1 graphic | 4.6:1 graphic | 7.0:1 text | 3.6:1 graphic text: not allowed | 3.4:1 graphic text: not allowed | 2.8:1 text: not allowedgraphic: not allowed | not intended | 7.9:1 text | |
| 7.2:1 text | 7.3:1 text | 6.5:1 text | 6.1:1 text | not intended | 3.5:1 graphic text: not allowed | 3.6:1 graphic text: not allowed | 5.4:1 text | 2.8:1 text: not allowedgraphic: not allowed | 2.7:1 text: not allowedgraphic: not allowed | 2.2:1 text: not allowedgraphic: not allowed | not intended | 6.2:1 text | |
| 8.4:1 text | 8.5:1 text | 7.6:1 text | 7.1:1 text | not intended | 4.1:1 graphic text: not allowed | 4.2:1 graphic text: not allowed | 6.4:1 text | 3.3:1 graphic text: not allowed | 3.2:1 graphic text: not allowed | 2.6:1 text: not allowedgraphic: not allowed | not intended | 7.2:1 text | |
| 9.4:1 graphic | 9.5:1 graphic | 8.5:1 graphic | 7.9:1 graphic | not intended | 4.6:1 graphic | 4.7:1 graphic | 7.1:1 graphic | 3.7:1 graphic | 3.5:1 graphic | 2.9:1 graphic: not allowed | not intended | not intended | |
| 6.7:1 graphic | 6.7:1 graphic | 6.4:1 graphic | 6.2:1 graphic | not intended | 4.2:1 graphic | 4.3:1 graphic | 5.8:1 graphic | 3.6:1 graphic | 3.5:1 graphic | 3.1:1 graphic | not intended | not intended | |
| 12.9:1 graphic | 13.1:1 graphic | 11.7:1 graphic | 10.9:1 graphic | not intended | 6.3:1 graphic | 6.5:1 graphic | 9.8:1 graphic | 5.1:1 graphic | 4.9:1 graphic | 4.0:1 graphic | not intended | 11.1:1 graphic | |
| 8.2:1 large | 8.3:1 large | 7.4:1 large | 6.9:1 large | not intended | 4.0:1 large | 4.1:1 large | 6.2:1 large | 3.2:1 large | 3.1:1 large | 2.5:1 large: not allowed | 1.6:1 large: not allowed | not intended | |
| not intended | not intended | not intended | not intended | 8.6:1 text | not intended | not intended | not intended | not intended | not intended | not intended | not intended | not intended |
| Foreground | Ground | Surface | Glass | Accent surface | Amber aura | Steel aura | Both auras on top of each other | Overlay over the amber aura |
|---|---|---|---|---|---|---|---|---|
| 15.0:1 text | 17.7:1 text | 16.8:1 text | not intended | 13.3:1 text | 12.8:1 text | 11.6:1 text | 14.5:1 text | |
| 9.5:1 text | 11.3:1 text | 10.7:1 text | not intended | 8.4:1 text | 8.1:1 text | 7.4:1 text | 9.2:1 text | |
| 6.1:1 text | 7.2:1 text | 6.8:1 text | not intended | 5.4:1 text | 5.2:1 text | 4.7:1 text | 5.9:1 text | |
| 5.1:1 text | 6.0:1 text | 5.7:1 text | 2.9:1 text: not allowed | 4.5:1 text | 4.3:1 text: not allowed | 3.9:1 text: not allowed | 4.9:1 text | |
| 4.1:1 graphic text: not allowed | 4.8:1 text | 4.6:1 text | not intended | 3.6:1 graphic text: not allowed | 3.5:1 graphic text: not allowed | 3.2:1 graphic text: not allowed | 4.0:1 graphic text: not allowed | |
| 4.3:1 graphic text: not allowed | 5.1:1 text | 4.8:1 text | not intended | 3.8:1 graphic text: not allowed | 3.7:1 graphic text: not allowed | 3.3:1 graphic text: not allowed | 4.2:1 graphic text: not allowed | |
| 5.3:1 text | 6.3:1 text | 6.0:1 text | not intended | 4.7:1 text | 4.5:1 text | 4.1:1 graphic text: not allowed | 5.1:1 text | |
| 4.4:1 graphic | 4.6:1 graphic | 4.6:1 graphic | not intended | 4.2:1 graphic | 4.1:1 graphic | 4.0:1 graphic | 4.3:1 graphic | |
| 15.0:1 graphic | 17.7:1 graphic | 16.8:1 graphic | not intended | 13.3:1 graphic | 12.8:1 graphic | 11.6:1 graphic | 14.5:1 graphic | |
| 4.3:1 large | 5.1:1 large | 4.8:1 large | not intended | 3.8:1 large | 3.7:1 large | 3.3:1 large | 4.2:1 large | |
| not intended | not intended | not intended | 8.6:1 text | not intended | not intended | not intended | not intended | |
| 1.7:1 graphic: not allowed | 2.0:1 graphic: not allowed | 1.9:1 graphic: not allowed | not intended | 1.5:1 graphic: not allowed | not intended | not intended | not intended |
| Background | Build-up (bottom to top) | Dark | Light |
|---|---|---|---|
| Ground | --d-grund | #0b0d11 | #efebe3 |
| Ground of the marketing site | --d-grund-werbung | #090b0f | #efebe3 |
| Surface | --d-flaeche | #151920 | #fffefb |
| Glass | --d-grund → --d-glas | #16171b | #f9f8f5 |
| Glass, strong | --d-grund → --d-glas-2 | #1e1f23 | #fdfdfc |
| Accent surface | --d-akzent | #f2a516 | #f2a516 |
| Amber aura | --d-grund → --d-aura-1 | #5a4113 | #f0dcb6 |
| Amber aura on the marketing ground | --d-grund-werbung → --d-aura-1 | #583f11 | #f0dcb6 |
| Steel aura | --d-grund → --d-aura-2 | #21292f | #dadbd6 |
| Glass card over the amber aura | --d-grund → --d-aura-1 → --d-glas-2 | #664f25 | #fefcf8 |
| Both auras on top of each other | --d-grund → --d-aura-2 → --d-aura-1 | #685327 | #dfcfac |
| Glass card over both auras (lightest point) | --d-grund → --d-aura-2 → --d-aura-1 → --d-glas-2 | #736037 | #fcfaf7 |
| Glow behind the glow word over the aura | --d-grund → --d-aura-1 → --d-glow | #ae7815 | #f1ca83 |
| Overlay over the amber aura | --d-grund → --d-aura-1 → --d-ebene-3 | #231d12 | #efe7d6 |
The tokens react to two operating system settings by themselves, in every mode. Forced colours (forced-colors) are up to the components: system colours, lamps keep their shape.
| Setting | Token | Value |
|---|---|---|
| Reduce transparency prefers-reduced-transparency:reduce |
||
| Increase contrast prefers-contrast:more |
||
Seven building blocks carry the imagery of D. Whatever glows or flows stands for a real process; every block also shows its state as text and shape.
| Building block | Use | Rule |
|---|---|---|
| Energy core | Home page: sphere with the brand mark, the areas in orbit; names and counters from the feature catalogue. | Role “image” with a complete text list; calm as a static row of tiles; never fixed numbers in the code. |
| Line | Core flow request → assignment → hours → approval → invoice → payment as a glowing line with nodes; horizontal from 1160 px, otherwise vertical. | Pulse only under the run lock; every node carries number and text. |
| Lamps | State per step: filled = done, amber with ring = active, outline = open, triangle = fault. | Always with text, never colour alone; system colours in Windows high contrast, the shape stays. |
| Gauges | Arc gauge, segment ring, stack, sparkline and line for back office and portals. | SVG with a table alternative; colours from the data palette; never on the aura. |
| Pictograms | 24 px grid, 1.5 stroke, round caps, colour via currentColor; one sprite for all areas. | Same meaning, same symbol; decorative without a name, otherwise with a title. |
| Symbolic photos | Photos from Unsplash, self-hosted (AVIF/WebP), used sparingly alongside the graphics. | No identifiable people, no manufacturer brands, never as evidence of customers or places; credits in the imprint (decisions 127 and 137). |
| Atmosphere | Aura (radial glow), floor grid and grain, only on the marketing site and only decorative. | Hidden from assistive technology; no helper text (text-3) on top; hidden with more contrast and reduced transparency. |
The chart building blocks with invented sample values in the d-system scope. State is shown as text, shape and colour.
Dark
| Label | Value |
|---|---|
| Utilisation (sample value) | 72% |
Light
| Label | Value |
|---|---|
| Utilisation (sample value) | 72% |
Fixed order for charts: Amber · Steel · Glow · Sand · Copper · Green. Only this order keeps every neighbour pair in both modes at ΔE ≥ 15 for normal vision and ΔE ≥ 8 for colour vision deficiency; every colour reaches at least 3.0 : 1 on ground, surface and glass. Charts never sit on the aura. Handbook and charts read order and values from the same source in the code.
| No. | Colour | Token | Dark | Light | Lowest contrast (dark / light) | Distance to the next colour (ΔE dark / light) |
|---|---|---|---|---|---|---|
| 1 | Amber | 7.97 : 1 / 3.20 : 1 | 20.6 / 22.6 | |||
| 2 | Steel | 7.18 : 1 / 5.36 : 1 | 21.8 / 25.8 | |||
| 3 | Glow | 6.99 : 1 / 3.16 : 1 | 15.3 / 15.4 | |||
| 4 | Sand | 6.09 : 1 / 4.21 : 1 | 17.9 / 15.1 | |||
| 5 | Copper | 3.86 : 1 / 4.36 : 1 | 29.4 / 22.9 | |||
| 6 | Green | 7.83 : 1 / 4.15 : 1 | last colour |