본문으로 건너뛰기

cloudflare/vibesdk

An open-source vibe coding platform that helps you build your own vibe-coding platform, built entirely on Cloudflare stack

https://skillcdn.ai/gh/cloudflare/vibesdk

내 AI에 이 주소를 연결하면 이 스킬을 쓸 수 있어요. 연결 방법 보기

  • 미확인
  • 기본 브랜치main
  • 커밋32c9e42
  • 라이선스MIT
  • 검색단어와 의미
GitHub에서 보기

frontend-design-saas

S-tier SaaS dashboard and product UI reference. Use this skill when building application shells, data tables, settings panels, billing pages, dashboards, auth flows, admin tools, or any internal/customer-facing SaaS product UI. Inspired by Stripe, Linear, Vercel, Airbnb, Notion. Covers neutral-led design tokens, sidebar+content shells, dense data UIs, form-heavy configuration pages, command palettes, empty states, and the accessibility (WCAG AA+) bar these products clear.

경로
worker/agents/think/skills/frontend-design-saas/SKILL.md
라이선스
MIT

SaaS Design System (Stripe / Linear / Vercel lineage)

AI-Optimized Design Reference for building S-tier SaaS dashboards, admin consoles, billing pages, settings UIs, data-dense application shells, and product surfaces.

Tonal anchors: stripe.com/dashboard, linear.app, vercel.com/dashboard, notion.so/teamspace, clerk.com, planetscale.com/console.


Quick Reference (TL;DR)

Brand Accent:    #5E6AD2 (indigo) - replace with product brand
Neutrals:        #FFFFFF → #F8FAFC → #F1F5F9 → #E2E8F0 → #94A3B8 → #475569 → #0F172A
Text:            #0F172A (primary) / #475569 (muted) / #94A3B8 (subtle)
Border:          #E2E8F0 (default) / #CBD5E1 (strong)
Font Sans:       "Inter", "Geist", system-ui (NOT Arial, NOT Roboto)
Font Mono:       "JetBrains Mono", "Geist Mono", ui-monospace
Base Spacing:    4px (scale: 4, 8, 12, 16, 20, 24, 32, 40, 48, 64)
Border Radius:   Buttons/inputs = 6-8px (NOT pill), Cards = 8-12px, Modals = 12-16px
Shadow:          Tight, low-spread, single-direction (NOT diffuse marketing shadows)
Density:         Compact-to-comfortable; row heights 36-44px, button heights 32-36px

The fastest way to get this wrong: use marketing-page aesthetics (huge type, generous whitespace, pill buttons, gradient hero shadows) in a product surface. SaaS UIs are dense, neutral, fast, and quiet. The brand color appears in <5% of the pixels and earns its weight by marking only what's interactive or active.


1. Brand Foundation

Design Philosophy
PrincipleDescription
Users FirstWorkflows, keyboard navigation, and information density beat decoration.
Quiet by DefaultNeutrals dominate; the brand color is reserved for primary action, active state, and focus.
Speed & DensitySnappy transitions (≤200ms), compact row heights, no entrance animations on every page load.
Opinionated DefaultsSingle canonical pattern per surface (one button hierarchy, one date picker, one empty state).
Meticulous Craft1px borders aligned to pixel grid, focus rings 2px offset 2px, motion uses ease-out not linear.
Accessible (WCAG AA+)4.5:1 text contrast, 3:1 UI element contrast, every interactive surface keyboard-reachable.
PredictableSame component looks/behaves identically on every page; no marketing-grade variants.
Visual Identity Rules
  • Do not use pure black on pure white. Use #0F172A on #FFFFFF (or #0B1220 on #0A0E1A in dark mode).
  • Brand color is the accent, never the dominant. If the brand color fills more than ~5% of the viewport in steady state, something is wrong.
  • Avoid pill buttons (border-radius: 9999px) for SaaS actions. Pills read as marketing/consumer; SaaS uses 6-8px radius for buttons and inputs.
  • No glassmorphism, no blur, no gradient borders. The aesthetic is precision, not richness.
  • Shadows are tight and downward. Not diffuse, not multi-direction. Reserved for floating layers (popovers, modals, dropdowns).
  • One font. Inter / Geist / IBM Plex Sans / native system stack. Avoid mixing display + body fonts; SaaS uses a single workhorse sans.
  • Mono for IDs, code, tokens, money. Tabular figures (font-variant-numeric: tabular-nums) for any column of numbers.
Reference apps to mentally calibrate against
Surface to buildLook at
Application shellLinear, Vercel, Stripe Dashboard
Data tableStripe /payments, Linear backlog, PlanetScale branches
Settings pageVercel project settings, Clerk dashboard, GitHub repo settings
Billing / invoiceStripe billing, Vercel usage
Empty stateLinear, Notion, Vercel deployments
Command paletteLinear ⌘K, Vercel ⌘K, Raycast
AuthClerk hosted pages, Stripe Connect onboarding
Onboarding checklistStripe Atlas, Vercel project import

2. Color System

2.1 Neutral Scale (the backbone)

SaaS UIs are 80–90% neutrals. The neutral scale carries the entire interface; brand is sprinkled on top. Use a slightly cool neutral (slate) by default — it reads more "product" than warm grays which feel marketing/lifestyle.

TokenHexUsage
--neutral-0#FFFFFFPage background (light mode), surface lifted onto canvas
--neutral-50#F8FAFCCanvas background, alternating row stripe
--neutral-100#F1F5F9Hover background, subtle fill, table header
--neutral-200#E2E8F0Default border, divider
--neutral-300#CBD5E1Strong border, input border on focus-within parent
--neutral-400#94A3B8Subtle text (placeholders, disabled, captions)
--neutral-500#64748BTertiary text, icon default
--neutral-600#475569Muted text (descriptions, secondary labels)
--neutral-700#334155Strong icon, hover text
--neutral-800#1E293BHeading in dense UIs, code text
--neutral-900#0F172APrimary text, primary icons
--neutral-950#020617Highest contrast (rare; only for critical labels)
2.2 Brand Accent (single color, used sparingly)

Pick one accent. Use a 6-step ramp so hover/active/focused/disabled all derive from the same hue. Defaults below use indigo (#5E6AD2, Linear's accent) — swap the hue for your brand but keep the structure.

TokenHexUsage
--brand-50#EEF0FBSelected row background, badge background, focus ring background
--brand-100#DDE0F7Hover on brand surfaces
--brand-200#B9C0EFDisabled brand button, decorative
--brand-500#7B85DCBrand hover surface stroke
--brand-600#5E6AD2Primary brand — default button bg, link text, focus ring, active nav item
--brand-700#4A56C0Hover state for primary button
--brand-800#3A45A8Active/pressed state
--brand-900#2A3284High-contrast brand text on light background
2.3 Semantic / Status Colors

Used for state — never for decoration. Each has a text, bg, border triplet so badges and inline messages stay legible.

Statetextbg (filled)bg-subtle (badge)border
Success#15803D#16A34A#DCFCE7#86EFAC
Warning#A16207#CA8A04#FEF9C3#FDE68A
Error / Destructive#B91C1C#DC2626#FEE2E2#FCA5A5
Info#1D4ED8#2563EB#DBEAFE#93C5FD
Neutral (default badge)#334155#64748B#F1F5F9#CBD5E1

Rules:

  • Inline form errors: text color on bg-subtle background, border for the input.
  • Toasts: bg-subtle panel, text heading, --neutral-700 body.
  • Status badges: text on bg-subtle + 1px border. Never use solid bg for badges (too loud).
2.4 Data Visualization Palette

When you need >1 color for charts. Categorical — visually distinct, similar luminance. Avoid the brand color in this palette so brand reads as "interactive" elsewhere.

--chart-1: #2563EB  (blue)
--chart-2: #16A34A  (green)
--chart-3: #CA8A04  (amber)
--chart-4: #DC2626  (red)
--chart-5: #9333EA  (violet)
--chart-6: #0891B2  (cyan)
--chart-7: #DB2777  (pink)
--chart-8: #65A30D  (lime)
2.5 Dark Mode Mapping

SaaS dark modes are not just inverted. They are slightly desaturated, slightly lifted, with carefully tuned elevation. Use #0A0E1A (or #0B0F1C) as the canvas — NEVER #000000. Pure black creates harsh contrast and exposes any banding in shadows.

TokenLightDark
--bg-canvas#F8FAFC#0A0E1A
--bg-surface#FFFFFF#111827
--bg-elevated#FFFFFF#1F2937
--bg-overlay (popover/modal)#FFFFFF#1F2937
--text-primary#0F172A#F1F5F9
--text-muted#475569#94A3B8
--text-subtle#94A3B8#64748B
--border-default#E2E8F0#1F2937
--border-strong#CBD5E1#374151
--brand-bg-subtle#EEF0FBrgba(94, 106, 210, 0.16)
--brand-fg#5E6AD2#A5B4FC

In dark mode the brand color shifts lighter (toward --brand-500/400 instead of --brand-600/700) to maintain contrast against the dark canvas.


3. Typography

3.1 Font Stack
--font-sans: "Inter", "Geist", -apple-system, BlinkMacSystemFont, "Segoe UI",
             "SF Pro Text", system-ui, sans-serif;
--font-mono: "JetBrains Mono", "Geist Mono", "SF Mono", "Menlo", "Consolas",
             ui-monospace, monospace;

Hard rules:

  • Never use Arial, Helvetica, Roboto, or Times in a SaaS UI. These read as default/unstyled. If you can't load a webfont, fall through to system-ui instead.
  • Never mix two display fonts. One sans + one mono is the entire stack.
  • font-feature-settings: "cv11", "ss01", "ss03" for Inter (or whatever stylistic sets your font has) — small caps and alternate forms make tables look intentional.
  • font-variant-numeric: tabular-nums on EVERY column that contains numbers (money, dates, IDs, counts). Non-tabular figures make rows shimmer.
3.2 Type Scale (SaaS-tuned — denser than marketing)
TokenSizeLine HeightWeightLetter SpacingUse
text-2xs11px / 0.6875rem1.36 (15px)5000.04emMicrolabels (uppercase metadata, table column tags)
text-xs12px / 0.75rem1.33 (16px)400/5000Captions, badge text, table secondary
text-sm13px / 0.8125rem1.38 (18px)400/5000Default UI text: table rows, buttons, form labels
text-base14px / 0.875rem1.43 (20px)400/5000Body text, paragraph copy in panels
text-md15px / 0.9375rem1.47 (22px)400/5000Comfortable reading (descriptions, modals)
text-lg16px / 1rem1.5 (24px)500/600-0.005emCard headings, sidebar section labels
text-xl18px / 1.125rem1.44 (26px)600-0.01emSubsection headings
text-2xl20px / 1.25rem1.4 (28px)600-0.015emPage subheadings
text-3xl24px / 1.5rem1.33 (32px)600-0.02emPage title (h1 in dashboards)
text-4xl30px / 1.875rem1.2 (36px)600/700-0.025emMarketing-adjacent hero in settings

Critical: the default UI size in SaaS is 13px or 14px, NOT 16px. Stripe is 14px. Linear is 13px. Vercel is 14px. 16px feels too big and creates pages that scroll forever.

3.3 Weights
WeightValueUse
Regular400Body, table cells, descriptions
Medium500Default for buttons, labels, table headers, navigation, badge text
Semibold600Headings, emphasized stats, active nav
Bold700Rare — only marketing-adjacent surfaces or KPI numbers

Never use weight 800 or 900 in a SaaS UI.

3.4 Letter Spacing
ContextValue
Body / table0
Headings ≥18px-0.01em to -0.025em (tighter as size grows)
Microlabels / uppercase0.04em to 0.06em
Mono0
3.5 Text Rendering
html {
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  font-feature-settings: "kern" 1, "liga" 1, "calt" 1;
}

.numeric, table, [data-numeric] {
  font-variant-numeric: tabular-nums;
}

4. Spacing System

4.1 Base Unit
--space-unit: 4px;
4.2 Scale
TokenpxremCommon Use
space-000Reset
space-px1—Hairlines, dividers
space-0.520.125Tight icon-to-text gaps
space-140.25Inline tight
space-1.560.375—
space-280.5Default tight gap, icon-text, badge padding
space-2.5100.625Input vertical padding (compact)
space-3120.75Input vertical padding (default), small card
space-4161Default card/panel padding, form field gaps
space-5201.25Section subheading gap
space-6241.5Card padding (comfortable), section internal
space-8322Page section gap, large card padding
space-10402.5Major section gap
space-12483Page-level section gap
space-16644Hero, max page-section

Density convention (which scale value to default to):

  • Buttons: 8px 12px (sm), 8px 14px (md), 10px 16px (lg) — vertical padding stays tight
  • Inputs: 8px 12px (sm), 9px 12px (md), 10px 14px (lg)
  • Cards: 16px (sm), 20-24px (md), 32px (lg / settings panel)
  • Table cells: 10px 16px (compact), 12px 16px (default), 16px 20px (comfortable)
  • Page padding: 24px (mobile) → 32px (desktop) → 48px (wide settings)

5. Border Radius

TokenValueUse
--radius-none0Table cells, full-bleed sections
--radius-sm4pxBadges, tags, small chips
--radius-md6pxDefault: buttons, inputs, dropdowns, menu items
--radius-lg8pxCards, panels, popovers
--radius-xl12pxModals, large surfaces, sheets
--radius-2xl16pxMarketing-adjacent (pricing card, onboarding)
--radius-full9999pxAvatars, status dots, NOT buttons

Rules:

  • Buttons in SaaS UIs use 6px, not pill (9999px). Pills are for marketing/consumer apps. The exception is a "tag" or "chip" inside a table cell.
  • Match input and button radius. If button = 6px, input = 6px. Visual consistency in form rows.
  • Cards never share radius with modals. Cards = 8px, modals = 12px+. This is how the modal reads as a different elevation layer.

6. Shadow System (Elevation)

SaaS shadows are tight, downward, single-direction. They mark elevation; they do not decorate. No glows, no colored shadows, no inset highlights, no large spread radii.

6.1 Elevation Tokens
/* Light mode */
--shadow-xs:  0 1px 2px 0 rgba(15, 23, 42, 0.04);
--shadow-sm:  0 1px 2px 0 rgba(15, 23, 42, 0.05),
              0 1px 3px 0 rgba(15, 23, 42, 0.06);
--shadow-md:  0 2px 4px -1px rgba(15, 23, 42, 0.06),
              0 4px 6px -2px rgba(15, 23, 42, 0.04);
--shadow-lg:  0 4px 6px -2px rgba(15, 23, 42, 0.05),
              0 10px 15px -3px rgba(15, 23, 42, 0.08);
--shadow-xl:  0 8px 10px -4px rgba(15, 23, 42, 0.06),
              0 20px 25px -5px rgba(15, 23, 42, 0.10);
--shadow-2xl: 0 25px 50px -12px rgba(15, 23, 42, 0.18);

/* Focus ring (NOT a shadow, but the only "glow" allowed) */
--ring-focus: 0 0 0 3px rgba(94, 106, 210, 0.20);
--ring-error: 0 0 0 3px rgba(220, 38, 38, 0.16);

/* Dark mode: shadows almost invisible; elevation is conveyed via background lightening */
--shadow-xs-dark:  0 1px 2px 0 rgba(0, 0, 0, 0.30);
--shadow-sm-dark:  0 1px 3px 0 rgba(0, 0, 0, 0.40);
--shadow-md-dark:  0 4px 8px -2px rgba(0, 0, 0, 0.50);
--shadow-lg-dark:  0 12px 20px -6px rgba(0, 0, 0, 0.55);
6.2 Elevation → Component Mapping
LayerShadowExamples
0 (flat on canvas)noneSidebar, page body, inline rows
1 (resting card)--shadow-xs or none + 1px borderDefault card on --bg-canvas
2 (hovered card)--shadow-smCard with :hover state
3 (dropdown, popover)--shadow-mdMenu, popover, select dropdown
4 (modal, dialog)--shadow-xlDialog, slide-over
5 (toast over modal)--shadow-2xlToast, command palette over modal backdrop
6.3 Border-vs-Shadow Decision

For most cards, prefer a 1px border over a shadow. Borders are crisper at any DPI and read more "product". Use shadow only when:

  • The element is floating over content (popover, modal, dropdown, toast)
  • A drag-and-drop ghost is rendered
  • A row is "lifted" to indicate selection while dragging

7. Animation System

7.1 Principle

SaaS motion is fast, ease-out, and only on user-initiated events. No entrance animations on page mount, no decorative parallax, no stagger on every grid. Motion's job is to confirm an action happened, not to entertain.

7.2 Easing
/* Default — used for most state transitions */
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);   /* expo-out, snappy */

/* For things that recoil (modal entrance, popover) */
--ease-out-back: cubic-bezier(0.34, 1.56, 0.64, 1);

/* Press / active (deceleration in
스킬의 지침이 아직 전부 로드되지 않았습니다. 계속 읽어 상위 폴더의 규칙과 필수 내용을 확인하세요.

이 스킬의 파일

이 스킬에는 보조 파일이 없습니다.

지원 파일 전체 둘러보기