UI Style Guide
Canonical visual style for Clapilot pages and bundled modules.
Clapilot UI should feel quiet, dense, and useful.
Use white/neutral surfaces, deep navy actions, compact controls, clear divided lists, pale AI highlights, and practical workbench layouts.
Inter/system for UI. Avenir Next/SF Pro Display only for modest page/module titles.
Use the 4px scale: 8px toolbar gaps, 12px compact groups, 16px form/panel rhythm.
Segmented controls, toggles, compact 32px buttons, circular icon utilities.
No beige/orange themes, marketing heroes, nested cards, giant pills, black outline boxes, or fake UI images.
This document is the canonical style reference for Clapilot UI and bundled modules. It is written for anyone building or reviewing web app pages and module UIs; native iOS/macOS work should read the Apple Native Style Guide alongside it.
For design-to-implementation reviews, use this page together with the Design QA + Redesign Prep workflow. AI-generated mockups are reference material only; final UI must still map to existing Clapilot components, tokens, and agent/tool expectations.
Visual reference page: /clapilot-styleguide.html.
Apple native companion: Apple Native Style Guide and /clapilot-ios-styleguide.html.
Core principles
- Prefer clean outlined surfaces over elevated boxes.
- Avoid full-page outer rectangle borders.
- Keep visual hierarchy through spacing, radius, fill, and subtle borders first; reserve shadow for true overlays such as dialogs, menus, floating launchers, and drag previews.
- Keep control styles consistent across app pages and module UIs.
- Build work surfaces, not marketing pages: headers stay compact, controls stay close to the data they affect, and the main workflow should be visible in the first viewport.
- New UI should feel first-party next to Dashboard, E-Mails, Dokumente, Aufgaben, Kalender, Spezial-Agenten/Agents, and Einstellungen.
Localization
- Web UI strings live in the keyed translation map in
src/lib/i18n.ts; client components should read the current language throughuseUiLanguage()and uset("key")instead of inline German copy. - Apple native UI strings live in
clients/apple/ClapilotApple/Sources/Clapilot/Support/L10n.swift; views should resolve copy withL10n.text(_:language:)usingmodel.currentUser?.uiLanguage ?? .de. - Supported UI languages are German (
de), English (en), and Italian (it). German remains the default and should preserve existing wording when migrating strings. - Before handing off localization work, run
npm run i18n:auditto measure remaining likely hardcoded UI strings across the web and Apple clients. The audit is intentionally conservative and may include prompt/demo/provider literals that need human triage. - Generated email replies default to the detected sender message language across the supported language set. In the email detail view, prepared-answer drafts can be regenerated between the sender language and the user's current UI language.
Surface pattern
- Primary shell class for app pages:
clapilot-surface-card. - Soft supporting shell class:
clapilot-soft-panel. - Segmented control shell class:
clapilot-segmented-control. - Field shell class:
clapilot-field. - Required visual behavior:
- standard rounded corners (
14px) - white surface
- subtle neutral
1pxouter border - no default shadow
- standard rounded corners (
Use this for:
- page-level content shells (tables, kanban columns, panel wrappers)
- module outer containers (workspace shells, canvas wrappers, side panels)
Do not use this for:
- destructive/warning alert boxes (keep semantic alert styling)
- fine-grained internal grid lines (for example calendar or spreadsheet cell separators)
Borders and separators
- Outer panel borders: use the shared subtle neutral surface border by default.
- Internal separators: keep subtle neutral lines where needed (
border-border/70style intensity). - Stacked entity lists should default to separate outlined row blocks instead of one big heavily divided container.
- Only use row dividers when the UI is intentionally a dense data table or grid, not for normal module list rows.
- Input and control borders are allowed and should remain light/neutral.
Typography
- Use one UI text system by default:
Inter, system UI, and platform sans-serif fallbacks. - Use Avenir Next / SF Pro Display style type only for top-level page and module titles.
- Do not use Avenir/display typography for card headings, row titles, labels, buttons, badges, body copy, or metadata.
- Keep display titles modest:
- page titles around
24px - module/workspace titles around
27-30px - regular weight (
400) - slight positive tracking only (
0.012em)
- page titles around
- Section/card headings use Inter/system semibold at compact sizes (
17-18pxfor sections,14-15pxfor small card headings). - Body copy uses Inter/system around
14px; metadata uses12-13pxmuted text; labels use12pxsemibold. - Reading text for generated email/document content uses Inter/system at
14px / 1.6withpre-wrap. Never render user-facing content (email bodies, drafts, summaries) in monospace; monospace is reserved for code, IDs, and prompt blocks. - Uppercase group labels (section markers inside cards such as
CONTEXT/REPLY EMAIL, and sticky list group headers) use11pxsemibold,0.06emletter spacing, uppercase, muted color. - Do not introduce new font families inside modules. Imported web fonts, serif display faces, condensed fonts, and highly stylized type are not first-party Clapilot defaults.
Spacing
- Use a compact 4px-based spacing scale:
4, 8, 12, 16, 20, 24, 32. - Default page/module shell gap:
18-24px. - Default panel padding:
16-18px. - Default form row gap:
16px. - Default compact group/card/list gap:
12px. - Default toolbar/action gap:
8px. - Default label-to-field gap:
6px. - In forms, the row-to-row gap must be visibly larger than the label-to-field gap so labels read as belonging to the field below, not the field above.
Color and controls
- Brand primary color is navy blue (
primarytoken). - Default module branding should stay in the primary/navy + neutral palette.
- Primary text buttons use the navy-rim style: navy fill, darker navy
2pxrim, white label/icon, compact radius, and subtle top highlight. - Secondary text buttons use the outline-quiet style: white fill, fine navy hairline, navy text/icon, and no heavy shadow.
- Primary and secondary text buttons must share the same compact
32pxheight, padding rhythm, radius, and text size; only fill, border color, weight, and elevation should change. - Primary and secondary text buttons must support both text-only and leading-icon variants. Use a leading icon only when it improves recognition of the command.
- Segmented controls use a white outlined shell with the same
10pxcontrol radius as fields/dropdowns, and the inner selected tab/button boxes use that same radius rather than pill rounding. Selected tabs use the deeper navy action color (#466197) rather than the brighter legacy primary blue. - Avoid hardcoded custom action colors where tokenized classes exist.
- Do not use beige / amber / yellow as the default visual identity for a new module surface; reserve warm tones for actual warning states.
- Avoid oversized pill buttons with extra-bold labels in standard CRUD/module flows.
- Single-object actions such as edit, save, delete, archive, refresh, close, and more-options should default to iOS-like circular icon buttons.
- Circular icon buttons should be compact (
40pxin main toolbars; smaller only inside dense repeated rows), outlined by default, and include accessible labels/tooltips. Uselucide-reacticons in React app surfaces and inline SVG icons in plain bundled-module HTML. - Binary settings should use app-styled on/off toggles. Use checkboxes only when the UI is intentionally a form checklist, not when the user is turning a feature, connection, automation, or visibility state on/off.
- Inputs, selects, and textareas should read like Clapilot fields:
- white fill
- light neutral border
- tighter
10pxcorner radius, distinct from the14pxbox/panel radius - no default shadow
- subtle primary focus state
- Semantic colors are allowed only for semantic meaning:
- green/success for completed, healthy, or positive fit states
- amber/yellow only for warnings or pending attention
- red only for destructive/error states
- blue/navy remains the default action and selection language
- Calendar provider colors are normalized into restrained Clapilot shades before rendering or storing; do not display raw external neon colors in event chips.
- Repeated boxes may use subtle shared background tints when it helps users distinguish module families or work states. Prefer neutral/blue utilities such as
clapilot-box-bg-field,clapilot-box-bg-navy-wash,clapilot-box-bg-ice-blue, andclapilot-box-bg-slate-bluefor non-semantic differentiation. - Use
clapilot-box-bg-success-soft,clapilot-box-bg-warning-soft, andclapilot-box-bg-danger-softonly when the box itself carries completed/healthy, pending/warning, or overdue/error meaning.
AI gradient surfaces
- Use subtle blue header gradients for normal widget and workspace headers instead of repeating the lavender AI gradient everywhere.
- The static styleguide previews candidate neutral header variants named Ice, Deeper Navy, Softer Indigo, Slate Blue, and Blue Gray. Treat these as visual options until one or more are promoted into shared app utilities.
- The static styleguide also previews non-gradient blue tint options, including the current primary only as a comparison and clearer blue candidates such as App Blue, Azure, Sky, Cyan Blue, and Ice Blue. Use these when a flat header/background tint feels calmer than a gradient.
- The static styleguide previews box background tint utilities separately from header gradients. These are meant for cards, task rows, widget bodies, and grouped box backgrounds rather than page-scale bands.
- Dashboard widget headers, Tasks Kanban column headers, and the Documents page toolbar use the flat Ice Blue tint (
rgba(96, 165, 250, 0.14)) with a subtle Ice Blue border (rgba(96, 165, 250, 0.26)) viaclapilot-widget-header-ice-blue. - When a neutral gradient is the top band inside a bordered card, it should keep the top radius and avoid duplicate top/side borders, matching the
clapilot-ai-headerstructure. - Use the
clapilot-ai-surfacetreatment for AI-assisted search/header rows, smart inbox controls, AI summaries, recommendations, and agent-assisted work areas. - The AI gradient is pale blue/lavender, not a marketing hero. It should stay attached to functional controls or contextual AI content.
- Use this treatment for compact headers like the E-Mails and Mandanten search/filter bar: search field on the left, mode/filter controls on the right.
- Keep the gradient subtle:
- no saturated rainbow gradients
- no dark hero banners
- no module-specific brand gradients
- no warm beige/orange/yellow AI surfaces
- Use
clapilot-ai-badgeorclapilot-ai-highlightfor small AI labels, prepared draft states, or generated-summary callouts.
Asset and image generation
Use generated images sparingly. Clapilot is a productivity workspace, so assets should support recognition, empty states, module thumbnails, documentation, onboarding, or generated user content. They should not turn module screens into marketing pages.
For standard UI icons, prefer lucide-react in app code and inline SVG icons in bundled module HTML. Generate custom icons only for module/app identity, store thumbnails, empty-state art, or domain-specific symbols that do not exist in the icon set.
Asset generation prompt
Use this prompt as the base when generating Clapilot images, icons, module thumbnails, or empty-state illustrations:
Create a first-party Clapilot visual asset for a quiet professional SaaS workspace.
Style: clean, restrained, premium productivity UI; white and soft-neutral surfaces; deep navy action color (#466197), Clapilot primary blue (#5b6ff8) only as a controlled accent, pale blue/lavender AI glow only when the asset represents AI assistance.
Geometry: softly rounded shapes, subtle depth, compact composition, clear silhouette, no heavy outlines, no cartoon style, no glossy 3D mascot, no marketing hero treatment.
Typography: do not render text inside the image unless explicitly requested. If text is required, use short Inter/system-style labels only.
Icons: simple, flat, vector-like shape language with a clear silhouette, 2px rounded stroke, balanced optical weight, and no decorative extras. Use the existing navigation icons for Kunden, Kalender, Aufgaben, Dokumente, and Notizen as the quality reference.
Navigation/sidebar icons: fill the icon canvas/border. The symbol should occupy roughly 90-96% of the artboard, with no decorative empty margin and no floating miniature object in the middle. Keep the stroke safely inside the canvas so it is not clipped, but use the full available size.
Module and utility icons: center on transparent or white background, works at 16-32px for UI icons and 64-128px for module icons.
Images/illustrations: light, airy, work-focused, document/email/task/agent/productivity context; no stock-photo look, no people posing, no decorative blobs, no saturated rainbow gradients.
Background: transparent for icons and cutouts; white or very pale neutral for thumbnails and empty states. For thumbnails and empty states, keep enough padding so the asset is not clipped in rounded cards. For navigation/sidebar icons, do not add extra padding beyond the safe stroke inset.
Avoid: orange, beige, amber/yellow brand palettes, black outline cards, dark hero banners, loud gradients, fake app screenshots that conflict with Clapilot UI, unreadable tiny UI text, logos from other brands, 3D shopfronts/mascots/scenes, sparkles or badges unless explicitly requested for AI assistance, and decorative assets that do not clarify the workflow.
Reference patterns
Use these existing screens as the default visual source when creating new work:
- Dashboard: compact metric widgets, functional cards, practical first viewport, no marketing hero.
- E-Mails: dense split-pane workspace, compact tabs/filters, soft list rows, focused detail pane.
- Dokumente: card/list views, search/filter toolbar, restrained empty/loading states, compact file metadata.
- Aufgaben: kanban/list cards with clear state, priority, owner, and due-date hierarchy.
- Kalender: toolbar-first planning surface with app-styled segmented controls and subtle grid separators.
- Spezial-Agenten/Agents: list + dialog management pattern with compact rows, scoped actions, and soft settings panels.
- Einstellungen panels: grouped settings surfaces, label + helper text + control rhythm.
Layout patterns
Page or module shell
- Root background uses the app dot pattern or the host app background.
- Root gutter is around
24-32pxon desktop and10-16pxon mobile so bordered surfaces have enough breathing room. - The first row is a compact title/description plus primary actions, not a tall hero.
- Main content should use one of:
- toolbar + table/list
- list/detail split view
- kanban/grid + detail drawer
- settings groups
Toolbar and filters
- Keep filters and actions in a compact outlined row.
- Use segmented controls for view modes and tab-like state.
- Search fields should use
clapilot-fieldbehavior. - Primary create/run/send actions use the raised navy-rim button; secondary filters, imports, cancel, and load actions use the outline-quiet button.
- Primary and secondary buttons can be text-only or use a leading icon. Do not replace named text buttons with icon-only controls unless the action is a compact repeated utility.
- Use circular icon buttons for repeated utility actions in toolbar rows, especially edit, save, delete, archive, refresh, and close.
- Use an on/off toggle for enabled/disabled settings in toolbars, rows, dialogs, and settings panels.
Lists and rows
- Mailbox/customer-style data lists may use one divided surface with sticky date/status group headers, compact rows, and subtle dividers.
- Divided list rows should follow the E-Mails/Mandanten rhythm: optional unread dot, avatar/icon, title + subject, one muted metadata line, and time/status/actions at the end.
- Normal work-item lists use separated outlined rows with small gaps.
- Rows should be compact and scannable: title, one metadata line, status/owner/date, and a small action cluster.
- Use table dividers only for truly dense spreadsheet-like data.
- Use sticky uppercase group headers for temporal buckets such as
Heute,Gestern,Diese Wochewhen a list benefits from grouping. - Avoid expanding large detail content inline inside rows; use a detail pane, full page, dialog, or sheet.
Details and forms
- Detail panes use a
clapilot-surface-cardshell with a compact header. - Form groups use labels, helper text where needed, and soft fields.
- Long content scrolls inside the content region while bottom action/composer bars remain visible when applicable.
Empty, loading, and error states
- Empty states are compact panels inside the normal workspace, not full-page illustrations.
- Loading states should preserve the expected layout size.
- Generic web UI loading states use the shared
LoadingAnimation, and native Apple loading states useClapilotLoadingAnimation. Both render the Clapilot logo with a clockwise fill. Chat assistant answer/work indicators use the profile activity selection: the compact animated three-dot bubble is the default, and an explicitly selected Profile Pet replaces it. Neither should be replaced by the generic loader. - Errors use inline banners or app-styled overlays/toasts; do not use browser-native dialogs for normal UX.
- Toast notifications use the shared top-center pattern for transient success, error, and status feedback. On web, place the stack at the viewport top center and keep each toast around
300-450pxwide (420pxdefault, constrained on mobile) so copy can wrap into multiple rows. - Toast surfaces use the same pale blue/white/lavender gradient as AI-assisted headers, with the shared
14pxcontinuous box radius. Keep semantic color on the icon only; do not use full green/red alert boxes for transient notifications. - Toast content should prefer a left icon in a white circular well, a short title, and optional secondary message text. Use inline banners only for contextual validation or persistent page-level errors that must stay attached to a form or panel.
Radius and shadow
- Standard box radius:
14px, exposed through--radiusandrounded-lg/rounded-md/rounded-sm. - Form controls, dropdown controls, segmented-control shells, and segmented selected boxes use the tighter
10pxcontrol radius exposed through--clapilot-control-radius. - Use the standard box radius for cards, panels, rows, dialogs, and larger rectangular controls.
- Keep true circles, avatars, icon wells, and pill/capsule controls on
rounded-full/circle/capsule shapes. - Standard content panels use borders instead of box shadows. Reserve shadows for true overlays such as dialogs, menus, floating launchers, and drag previews.
Bundled modules
Bundled module UIs must follow the same shell pattern as app pages:
- outer cards/panels use bordered, shadowless surfaces
- avoid stacked section borders as primary grouping
- row-based module lists should use compact outlined rows with spacing, not heavy list wrappers with horizontal separators
- use spacing and surface blocks for grouping
- keep module controls aligned with the app’s primary/secondary button language
- avoid custom visual systems per module unless the feature explicitly needs one
- do not ship black outline cards, oversized bold action pills, or custom orange primary buttons as defaults
- do not ship beige / amber / yellow hero gradients or outlined stat tiles as the default module shell
- keep a root page gutter (around
24-32px) so bordered surfaces have enough breathing room at iframe edges - do not use browser-native dialogs (
window.alert,window.confirm,window.prompt) for normal module UX - use app-styled overlays, sheets, inline banners, or toasts for errors and confirmations instead
- model new module structure after Dashboard, E-Mails, Dokumente, Aufgaben, and Agents when no feature-specific first-party reference exists
- do not create standalone app-style navigation, marketing hero pages, or strong custom brand themes inside an iframe module
When scaffolding bundled modules, templates should start with this style by default.
Module host pages must not add an extra rounded/filled outer wrapper around the embedded module iframe.
