Design System

[reference]

// REFERENCE

Design System

Color tokens, typography, spacing, and components. A reference for AI tools and developers building on Kommit's visual language.

The Kommit logo is a pixelated “K” made from rounded rectangles on a blue square. Available as SVG and PNG.

Kommit logo on dark
Kommit
On dark backgrounds
Kommit logo on light
Kommit
On light backgrounds

Mark: Pixelated “K” — 8 rounded rectangles (4 vertical bar + 2 upper arm + 2 lower arm) on a #2864E9 square background.

Wordmark: “Kommit” in Geist Mono, font-weight 600, tracking -0.02em.

Clear space: Minimum 50% of mark width on all sides.

Minimum size: 16px (mark only), 80px (mark + wordmark).

Files: /logo-mark.svg (vector), /logo-mark.png (2048×2048 raster).

Do not: Rotate, stretch, recolor, add drop shadows, or place on busy backgrounds without sufficient contrast.

Colors[02]

Surfaces

--ds-surface-app#FAFAFA
Full-viewport background (root, dashboard frame)
--ds-surface-card#FFFFFF
Panels, cards, sidebars sitting on the app background
--ds-surface-elevated#FFFFFF
Raised surfaces inside cards (popovers, dropdowns, hover rows)
--ds-surface-subtlergba(0,0,0,0.02)
Faint alternate rows, zebra striping, very gentle section dividers
--ds-surface-mutedrgba(0,0,0,0.04)
Muted chips, inactive tabs, hover state for subtle interactive rows
--ds-surface-overlayrgba(0,0,0,0.5)
Modal / dialog / command-palette scrim

Surfaces nest in a strict hierarchy. A raised popover always sits on a card, which always sits on the app background. Don't skip levels — a dropdown on the app background (no card between) reads as floating and flat.

1 · --ds-surface-appDashboard body, workspace frame
2 · --ds-surface-cardPanel, sidebar, project card
3 · --ds-surface-elevatedPopover, dropdown, tooltip
1App--ds-surface-appDashboard body, workspace frame
2Card / Panel--ds-surface-cardApp sidebar, project card, data-grid panel
3Elevated--ds-surface-elevatedPopover, dropdown menu, command palette, tooltip
4Overlay scrim--ds-surface-overlayBehind a modal or slideover

Borders

--ds-border-subtlergba(0,0,0,0.06)
--ds-border-defaultrgba(0,0,0,0.10)
--ds-border-strongrgba(0,0,0,0.16)

Text

--ds-text-primary#000000
--ds-text-secondary#555555
--ds-text-muted#666666
--ds-text-disabled#AAAAAA

Brand & Status

--ds-primary#2864E9 (blue)
--ds-primary-hover#1D4ED8 (blue (darker))
--ds-success#22C55E (green)
--ds-warning#F59E0B (amber)
--ds-destructive#EF4444 (red)
--ds-info#3B82F6 (blue)

Node Type Colors

Project#60A5FA
Target Audience#6EE7B7
Competitors#FDBA74
Tech Stack#C4B5FD
Features#F9A8D4
Assets#FDE047
Repository#94A3B8

Palette Exceptions

These are the only legitimate reasons to use colors outside the --ds-* token system. If a color doesn't fit one of the three buckets below, it's drift — replace with a token.

1. AI-mode indigo accent

AI-generated / AI-interactive surfaces use indigo to distinguish themselves from the primary (--ds-primary) blue. Use this only on chrome directly connected to AI features: AI sidebar, chat bubbles, AI-mode toggles, generation buttons.

Indigo 500#6366F1AI surfaces — primary accent (AI sidebar, chat avatars, AI-mode icons)
Indigo 400#818CF8Lit / focused AI state (active icon, highlighted bubble)
Indigo 600#5558E6Hover for AI buttons

2. macOS window-control dots

Used only in marketing mockups that imitate a macOS window. Never in real product chrome.

Close#FF5F57macOS-style window close dot (mockups only)
Minimise#FEBC2EmacOS-style window minimise dot
Maximise#28C840macOS-style window maximise dot

3. Third-party brand colors

When rendering a third-party brand mark (Figma logo, GitHub logo, etc.), match the brand's official color exactly. Never use brand colors for anything other than the brand mark itself.

Figma — Red#F24E1E
Figma — Orange#FF7262
Figma — Purple#A259FF
Figma — Green#0ACF83
Typography[03]
40pxMarketing hero headingWhat do you want to build next?
32pxPage headingDesign System
24pxSection headingRecent projects
17pxSubsectionFont Families
15pxLarge bodyStart something new, continue an existing project
14pxBody textPer-node AI conversations
13pxDefault UIManage all registered users.
12pxCaptionLast updated 3m ago
11pxLabelBEFORE
10pxTag/BadgePromoted

Font Families

Space GroteskMajor headings — --font-heading
Geist SansPrimary UI and body font — --font-geist-sans
Geist MonoLabels, counters, code, UI chrome — --font-geist-mono
CaveatHandwriting accent (Google Fonts, landing page only)
Spacing[04]
4px
8px
12px
16px
20px
24px
32px
Border Radius[05]

// We don't use border radius.

All elements are sharp rectangles. border-radius: 0 is the default everywhere — inputs, buttons, cards, dialogs, dropdowns, and modals. The only exception is rounded-full for actual circles (avatar indicators, status dots).

If you find yourself reaching for rounded-md or rounded-lg, stop. The answer is no.

Shadows[06]

// We rarely use shadows.

The primary visual tools are borders and background tints. Shadows add softness and depth we deliberately don't want. Use border border-neutral-200 dark:border-neutral-800 to define containers. Use bg-neutral-50/50 dark:bg-white/[0.02] for subtle surface differentiation.

If a component absolutely needs a shadow (e.g. a floating dropdown or popover), keep it minimal: 0 2px 8px rgba(0,0,0,0.08).

Icons[07]
Librarylucide-react
Default size16px (size-4)
BackgroundsNo colored backgrounds on icons — ever.
FormatAlways SVG from Lucide. No emoji icons.
Design Principles[08]
01Brutalist precision

Sharp corners, no decoration, every element earns its space. If it doesn't serve the user it gets removed.

02Typography with roles

Space Grotesk for major headings. Geist Sans for body and UI text. Geist Mono only for labels, counters, code, and technical chrome.

03Dark-first design

Design for dark mode first, then verify in light. Dark is the primary experience. Light must hold up too.

04Dense but breathable

Pack information tightly, but use whitespace strategically so nothing feels cramped. Density with intent.

05ASCII heritage

Terminal aesthetics, box-drawing characters, `//` comments as labels. We embrace the command-line lineage.

Anti-patterns[09]
×No rounded corners on any interactive element (inputs, buttons, cards, dialogs)
×No colored icon containers
×No gradient accent lines
×No hover:scale transforms
×No shadcn/ui Button/Input/Label on public pages — use native HTML with Tailwind
×No generic AI aesthetics — no blurry gradients, no floating orbs
Component Reference[10]

shadcn/ui components (Base UI adapter, not Radix). Import from @/components/ui/*. On public-facing pages use native HTML + Tailwind — do not import shadcn components into landing pages.

ComponentVariants
Buttondefault, outline, secondary, ghost, destructive, link
Badgedefault, secondary, outline, destructive
Carddefault
Inputdefault
Dialogdefault
Sheetdefault
Tooltipdefault
Dropdown Menudefault
Avatardefault
Separatordefault
Skeletondefault
Tabledefault
Sonner (toast)default
Dashboard Patterns[11]

How the primitives above compose into the recurring surfaces of the product. Each entry names the canonical file — copy from there rather than rebuilding. If a component drifts from these rules, fix it, don't branch from it.

11.1 Navigation chrome

Sidebars, headers, and tab bars. These sit at --ds-surface-card on top of the app background and use the border-b + h-12 header pattern everywhere.

App sidebardashboard/app-sidebar.tsx — 240px wide, collapsible, groups for Projects / Workspace / Account.
Icon raildatabase/workspace-icon-sidebar.tsx — 48px wide, icon-only. Active: bg-accent text-foreground.
Top headerdashboard/dashboard-header.tsx h-12, bg-background/60 backdrop-blur-md, sticky, z-50.
Tab bardatabase/workspace-tabs.tsx — closeable tabs, active uses border-b-2 border-[var(--ds-primary)].
⌘KSearch…
ordersusersproducts

11.2 Overlays

Modals, slideovers, popovers and the command palette. All overlays sit on --ds-surface-elevated above a --ds-surface-overlay scrim. Never use pure black for the scrim — the overlay token is rgba(0,0,0,0.6) in dark mode.

Command palettedashboard/command-palette.tsx — centered, 640px, rounded-xl, shadow-2xl, ⌘K to toggle.
Settings pageapp/(dashboard)/settings/ — full-page settings with left rail nav.
Confirm dialogdashboard/delete-project-dialog.tsx — narrow, destructive CTA in --ds-destructive.
Slideovercanvas/build-plan-slideover.tsx — right-docked, 480px, animates from translate-x-full.
Delete project?
This cannot be undone.
CancelDelete

11.3 Data surfaces

Virtualized grids, filter bars and sort panels. Grid rows are 32px tall, zebra-striped with --ds-surface-subtle. Headers use --ds-surface-muted and stick to the top of the scroll container.

Data griddatabase/data-grid.tsx @tanstack/react-virtual, inline edit, cell selection.
Grid toolbardatabase/data-grid-toolbar.tsx — row count, selection, insert/delete actions.
Filter paneldatabase/filter-panel.tsx — popover anchored to toolbar filter button.
Sort paneldatabase/sort-panel.tsx — multi-sort with drag-to-reorder.
idemailcreated_at
1a@example.com2026-04-01
2b@example.com2026-04-02
3c@example.com2026-04-03

11.4 Status, banners & readiness

Persistent strips that communicate plan state, impersonation, or system notifications. Colored variants use color-mix against a ds-* token so the banner automatically adapts to light/dark.

Plan bannerdashboard/plan-banner.tsx — warning variant uses color-mix(var(--ds-warning) 12%).
Impersonationdashboard/impersonation-banner.tsx — floating, draggable, snaps to corners, solid --ds-primary.
Notification belldashboard/notification-bell.tsx — dot indicator in --ds-destructive when unread.
Readinessdashboard/readiness-indicator.tsx — 0→100 bar, colors ramp warning → success.
Memory healthmemory/memory-health-bar.tsx — segmented bar with tooltip per segment.
Your workspace is in read-only mode. Choose a plan to continue.
Impersonating user@example.com (00:42)Exit

11.5 AI chrome

AI-specific surfaces are the only place indigo is allowed. Everything else must use ds-* tokens. See §02 Palette exceptions for the full rule.

AI sidebardatabase/ai-sidebar.tsx — chat thread, SQL tool calls, permission badge.
Node chatcanvas/node-chat.tsx — per-node chat drawer, same accent rules as sidebar.
Project chatcanvas/project-chat.tsx — full-project chat, persists across nodes.
Chat avatarAI avatar uses #6366F1 background with white Kommit logo.
Kommit AI
I can help you query orders. What would you like to know?

11.6 Cards

Canonical card: dashboard/project-card.tsx. Copy its structure — don't re-invent. All dashboard cards use rounded-lg p-4, a 1px --ds-border-subtle border, and a hover:bg-[var(--ds-surface-elevated)] transition.

Backgroundbg-[var(--ds-surface-card)]
Hoverbg-[var(--ds-surface-elevated)]
Borderborder border-[var(--ds-border-subtle)]
Padding / radiusrounded-lg p-4
Body texttext-[13px] text-[var(--ds-text-secondary)]
Inventory dashboard
6 nodes · 4 filled · Next.js, Postgres
Ready to build
(hover state)
Elevated surface on hover.