Skip to content

Now in the official shadcn registry directory.

Start free
Back to gallery
developer tools · saas

ToDesktop

Web-to-native desktop app platform marketing site that inherits the Geist design system editorial vocabulary and re-tunes it for the web-to-desktop register. ToDesktop pairs Inter and Geist Mono on a hairline-bordered light canvas, uses signature Geist easing for micro-interactions, and reserves a dual orange-and-blue accent for CTAs only — closer to a Vercel docs preview than a runtime product page.

todesktop.comAdded 2026-04-30
ToDesktop - Desktop

Editorial disclaimer

Editorial note

This entry documents observable design-language patterns for educational transfer and AI-agent briefing. Screenshots and trademarks are property of their respective owners. AI2 Design is not affiliated with or endorsed by the featured brand. Inspiration here is about language and rhythm - do not reproduce brand identity, logo, product copy, or proprietary features.

Fair Use & Gallery Policy
FreePrompt kit

Copy the full design language into your agent

A typed, paste-ready design system brief - philosophy, tokens, rules, techniques, and fitness checks. Drop it into Claude, Cursor, v0 or any coding agent and it builds in ToDesktop’s language, not just a screenshot.

Paste into your agent. No signup, no cost.
Light-first developer-tool editorial precision at 1px spatial resolution. The canvas is near-white (#ffffff ground + #e5e7eb hairline border + #000000 / #141414 ink); Inter handles prose and Geist Mono handles numerics + inline code labels. A semantic CSS-variable color system (`--body-light-loud #141414 / --body-light-muted #656565 / --body-light-ghost #A4A4A4` with `--body-stroke-lighter #1616160F / --body-stroke-muted #1616161F`) replaces hardcoded values across the surface. Dual-accent palette — `#f79942` warm orange and `#1f6af2` blue — appears at <2% surface area as CTA highlights and pivot signals, never as background fills. Elevation is delivered through 3-4 stacked box-shadows (white inset highlight + tinted drop + outer halo) on hairline-bordered surfaces. Motion is anchored by the Geist signature easing `cubic-bezier(0.6, 0.6, 0, 1)` across 50-450ms durations.
Main prompt
Use this capture as a design language transfer brief for my project. Adopt the palette (light-first #ffffff ground + #e5e7eb hairline border + #000000 / #141414 ink + dual-accent orange #f79942 + blue #1f6af2 reserved for CTA + pivot signals only), typographic rhythm (Inter for prose + Geist Mono for numerics and inline code labels, weight ladder 400/500, size scale 11/12/14/16 px with tight line-heights), 1/4/8/12/16/24 px-base spacing scale with narrow container rails (324-960 px), border-first elevation via 1px hairline + 3-4 stacked box-shadows (white inset highlight + tinted drop + outer halo), 12 atmospheric gradients drifting at 6-12% opacity rather than hero illustration, Geist signature easing `cubic-bezier(0.6, 0.6, 0, 1)` with 50/200/300/400/450/600/1000 ms durations, and a semantic CSS-variable color foundation across every page and component I ship. Treat this as my project's constitution — any new component I author should pass as if crafted in the same studio. Apply the language, not the source brand's specific copy or identity.
Layout
Stack
Content width
Bounded
Framing
Flat
Grid strength
Medium

Light-first developer-tool canvas — #ffffff primary background paired with #e5e7eb hairline border (1647 measured occurrences, the structural unit) and #000000 ink (1521 occurrences) doing the dominant work. Mid-tone descender #707070 / #999999 / #c2c2c2 handles captions, dividers, de-emphasized labels. Dual-accent palette is `#f79942` (warm orange) and `#1f6af2` (blue), each appearing only as CTA highlights and pivot signals — surface area < 2% combined. Semantic CSS variables encode the system: `--body-light-loud #141414` (primary text), `--body-light-muted #656565` (secondary), `--body-light-ghost #A4A4A4` (tertiary), `--body-stroke-lighter #1616160F` (hairline), `--body-stroke-muted #1616161F` (border). Dark mode is staged but not the primary register: `--body-dark-loud #FFFFFFCC / --body-dark-muted #FFFFFF99`.

Mode strategylight-first
  • Hairline border #e5e7eb handling ~1647 measured occurrences — the structural unit that carries elevation and grouping
  • Ink #000000 + #141414 (loud) + #707070 (muted) + #999999 (ghost) — three-tier text descender
  • Background pair #ffffff (page) + atmospheric gradient panels (rgba 5,6,27 / 0.72) for hero overlays
  • Orange #f79942 reserved for primary CTA + recommendation badges — never as fill background
  • Blue #1f6af2 reserved for secondary action + link emphasis — never as background block

Gradients (paste-ready)

linear-gradient(rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0)) — frosted highlight
linear-gradient(0deg, rgba(5, 6, 27, 0.72), rgba(5, 6, 27, 0.72)) — deep blueish overlay (hero)
linear-gradient(rgb(255, 255, 255), rgba(255, 255, 255, 0.8)) — soft fade
linear-gradient(rgb(242, 242, 242), rgb(237, 237, 237)) — subtle off-white panel shift
linear-gradient(0deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.12)) — top edge fade
  • Primary family: Inter (prose, headings, UI labels). Counterpart family: Geist Mono (numerics, inline code labels, kbd, version strings). No serif partner.
  • Weight ladder: 400 (reading body + most UI) / 500 (emphasis + small labels). Do not introduce 600 — the 500 stops the ladder.
  • Size scale: 11 / 12 / 14 / 16 px on body and UI. Display headings extend up the same scale; no magic numbers between steps.
  • Line-height pattern: Geist Mono tight (lh 16 on 11-12 px size, lh 32 on 12 px display variant); Inter standard (lh 20 on 14 px, lh 24-26 on 16 px).
  • Geist Mono signals developer affinity — use it on numerics, version pills, terminal-adjacent UI. Don't use it for prose paragraphs; that flips the register.
  • Numerics in Geist Mono inherit tabular alignment automatically — no `tabular-nums` override needed.
  • Mixed-base rhythm — 1px hairline (188 measured occurrences) + 4px (283) + 8px (281) + 12px (212) + 16px (190) dominate. The 1px is the structural unit, not noise.
  • Standard scale beyond hairline: 4 / 6 / 8 / 10 / 12 / 14 / 16 / 18 / 20 / 22 / 24 px. Pick from scale; never invent values between steps.
  • Container max-width set: 324 / 516 / 600 / 628 / 936 / 960 px — narrower than typical SaaS landings. Editorial column rhythm.
  • Section vertical rhythm: pick from 16-24 px scale × multipliers, never freehand. The narrow container demands the rhythm.
  • Card padding: 16-24 px on desktop, 12-16 px on mobile. Hairline border at 1px before reaching for shadow.
Surface styleFlat
  • Primary elevation is the 1px hairline — `border: 1px solid #e5e7eb` (or `#1616161F` via `--body-stroke-muted`) before any shadow is considered.
  • When shadow is needed, use 3-4 stacked layers: white inset highlight + tinted drop + outer halo. Never a single bloom.
  • Inset highlight pattern: `rgba(255,255,255,0.06) 0px 1px 3px 0px inset, rgba(255,255,255,0.06) 0px 0.5px 0.5px 0px inset` — top-edge crispness on dark surfaces.
  • Drop pattern: `rgba(0,0,0,0.04) 0px 12px 12px -3px, rgba(0,0,0,0.02) 0px 6px 6px -3px, rgba(0,0,0,0.02) 0px 3px 3px -1.5px, rgba(0,0,0,0.03) 0px 1px 1px 0px` — multi-distance falloff that reads as a single soft elevation.
  • Layering depth: hairline border → 1-key drop shadow → 4-key stacked shadow → atmospheric gradient overlay. Pick the lightest tool that earns the surface.

Techniques

Stacked 4-key shadow as faux single elevation

Cards default to four overlaid `box-shadow` rules that read as one. Pattern: `rgba(0,0,0,0.04) 0 12px 12px -3px, rgba(0,0,0,0.02) 0 6px 6px -3px, rgba(0,0,0,0.02) 0 3px 3px -1.5px, rgba(0,0,0,0.03) 0 1px 1px 0px`. Each layer covers a different distance band; together they feel lit without bloom.

Inset highlight + drop combo on accent surfaces

Accent buttons (orange, blue) and dark hero panels get an inset white highlight on the top edge plus a tinted drop. Pattern: `rgba(255,255,255,0.06) 0 1px 3px 0 inset, rgba(255,255,255,0.06) 0 0.5px 0.5px 0 inset, rgba(1,9,44,0.24) 0 4px 8px 0`. The inset is what makes the surface look pressed-in rather than flat.

Radii4 / 6 / 8Icon treatmentStrokeIcon setsLucide-style monoline (Geist DS default)
  • Radius scale 4-8 px for cards, buttons, inputs. Pill radii avoided — corners stay editorial.
  • Hairline borders dominate (1px); never substitute a 2px border for emphasis — change color or weight instead.
  • Icons are monoline Lucide-style (Geist DS default), never filled glyphs. Stroke 1.5-2 px.
  • Geist Mono numerics inherit width = 1ch; align grid columns to character grid where possible.
  • Primary CTA button (orange)
    background
    #f79942
    text
    #ffffff
    border
    1px solid transparent
    radius
    6px
    padding
    8px 16px
    font
    Inter 500 14px / 20px
    shadow
    rgba(255,255,255,0.12) 0px 1px 3px 0px inset, rgba(255,255,255,0.12) 0px 0.5px 0.5px 0px inset, rgba(101,101,101,0.16) 0px 4px 8px 0px
    transition
    0.2s cubic-bezier(0.6, 0.6, 0, 1) on color, background-color, border-color

    Tailwind

    inline-flex items-center justify-center rounded-md bg-[#f79942] px-4 py-2 text-sm font-medium leading-tight text-white shadow-[rgba(255,255,255,0.12)_0_1px_3px_0_inset,rgba(255,255,255,0.12)_0_0.5px_0.5px_0_inset,rgba(101,101,101,0.16)_0_4px_8px_0] transition-colors duration-200 ease-[cubic-bezier(0.6,0.6,0,1)] hover:bg-[#f79942]/90
  • Secondary CTA button (blue)
    background
    #1f6af2
    text
    #ffffff
    border
    1px solid transparent
    radius
    6px
    padding
    8px 16px
    font
    Inter 500 14px / 20px
    transition
    0.2s cubic-bezier(0.6, 0.6, 0, 1) on color, background-color, border-color

    Tailwind

    inline-flex items-center justify-center rounded-md bg-[#1f6af2] px-4 py-2 text-sm font-medium leading-tight text-white transition-colors duration-200 ease-[cubic-bezier(0.6,0.6,0,1)] hover:bg-[#1f6af2]/90
  • Hairline-bordered card
    background
    #ffffff
    text
    #141414
    border
    1px solid #e5e7eb
    radius
    8px
    padding
    16px 20px
    shadow
    rgba(0,0,0,0.04) 0px 12px 12px -3px, rgba(0,0,0,0.02) 0px 6px 6px -3px, rgba(0,0,0,0.02) 0px 3px 3px -1.5px, rgba(0,0,0,0.03) 0px 1px 1px 0px

    Tailwind

    rounded-lg border border-[#e5e7eb] bg-white p-5 text-[#141414] shadow-[rgba(0,0,0,0.04)_0_12px_12px_-3px,rgba(0,0,0,0.02)_0_6px_6px_-3px,rgba(0,0,0,0.02)_0_3px_3px_-1.5px,rgba(0,0,0,0.03)_0_1px_1px_0]
  • Geist Mono version pill
    background
    transparent
    text
    #656565
    border
    1px solid #e5e7eb
    radius
    4px
    padding
    2px 8px
    font
    Geist Mono 500 11px / 16px

    Tailwind

    inline-flex items-center rounded-sm border border-[#e5e7eb] bg-transparent px-2 py-0.5 font-mono text-[11px] font-medium leading-4 text-[#656565]
  • Nav link
    text
    #656565
    font
    Inter 500 14px / 20px
    padding
    6px 10px
    radius
    4px
    hoverText
    #141414
    transition
    0.2s cubic-bezier(0.6, 0.6, 0, 1) on color, background-color, border-color

    Tailwind

    rounded-sm px-2.5 py-1.5 text-sm font-medium leading-tight text-[#656565] transition-colors duration-200 ease-[cubic-bezier(0.6,0.6,0,1)] hover:text-[#141414]
  • Atmospheric hero overlay
    background
    linear-gradient(0deg, rgba(5, 6, 27, 0.72), rgba(5, 6, 27, 0.72))
    usage
    Hero panel deep-blue tint over light-leak background image

    Tailwind

    bg-[linear-gradient(0deg,rgba(5,6,27,0.72),rgba(5,6,27,0.72))]
LevelexpressiveDurations50ms / 200ms / 300ms / 400ms / 450ms / 600ms / 1000ms

Easings

cubic-bezier(0.6, 0.6, 0, 1)cubic-bezier(0.76, 0, 0.24, 1)
HoverColor + background-color + border-color transitions at 200ms with Geist easing — the dominant micro-interaction, Quick tap feedback at 50ms for button press states, All-property transitions at 400-450ms for surface state changes (focus, active)

Scroll patterns

  • Opacity-only transitions at 1s with `cubic-bezier(0.76, 0, 0.24, 1)` (easeInOutQuart) for slow scroll-revealed sections
  • All-property transitions at 600ms for moderate-speed reveal sequences
  • Honor `prefers-reduced-motion` everywhere — collapse scroll choreography to static when set
  • Two easing curves only: `cubic-bezier(0.6, 0.6, 0, 1)` (Geist signature, micro-interactions) + `cubic-bezier(0.76, 0, 0.24, 1)` (slow scroll reveals).
  • Duration ladder is varied: 50 / 200 / 300 / 400 / 450 / 600 / 1000 ms — never freehand timings.
  • Geist signature easing on hover/focus, Quart on scroll/section reveals. Don't cross-pollinate.
  • All-property transitions reserved for state changes, not for individual property tweens.
  • Hover states: color + background-color shift at 200ms with Geist easing — never transform on text.
  • Focus rings inherit semantic tokens (--body-stroke-muted #1616161F default; can elevate to accent on form fields).
  • Orange accent reserved for primary CTA + recommendation; blue for secondary action + link emphasis. Don't mix them in the same component.
  • Geist Mono pills act as silent metadata — version strings, status badges, kbd shortcuts. They never receive hover treatment.
Approachmobile-first

5-step Tailwind defaults: sm 400px / md 768px / lg 957px / xl 1200px / 2xl 1536px. Note the lg break at 957 (not the Tailwind default 1024) — ToDesktop's breakpoint set is custom-tuned. Narrow container set (324-960 px) keeps content rails tight even on 2xl.

  • Mobile-first authoring; lg/xl introduce columned layouts but never widen the inner content rail past 960 px.
  • Container max-width set: 324 / 516 / 600 / 628 / 936 / 960 px — pick the narrowest that fits the module's information density.
  • Section vertical rhythm shrinks ~40% on mobile.
  • Atmospheric gradients render identically across breakpoints; never gate them behind md+.
  • Foreground/background contrast: #000000 on #ffffff = 21:1 (AAA Large + Normal). #141414 on #ffffff = 16.7:1 (AAA). #656565 on #ffffff = 5.7:1 (AA Normal). #999999 on #ffffff = 2.85:1 (FAILS AA — reserve for >24 px ghost labels only).
  • Audit accent contrasts: #f79942 (orange) on #ffffff = 2.6:1 (FAILS AA Normal — use #ffffff text on #f79942 background = 3:1, AA Large only). #1f6af2 (blue) on #ffffff = 4.5:1 (AA Normal pass).
  • Honor `prefers-reduced-motion` — collapse scroll choreography (1s opacity tweens) to static when set.
  • Focus rings use semantic --body-stroke-muted at 1-2 px; visible against #ffffff without an outer glow.
  • Geist Mono numerics maintain accessible contrast — never apply opacity reductions below 0.7 to monospace metadata.
  • All interactive controls keyboard-reachable; Tab + Enter parity with click on every button + link.
Next.js (next/font Inter + Geist Mono inline, atmospheric hero PNG)Geist Design System inheritance — semantic CSS variables (--body-light-loud / muted / ghost + --body-stroke-lighter / muted), signature easing curveTailwind CSS (custom breakpoint set: sm 400 / md 768 / lg 957 / xl 1200 / 2xl 1536)Pure CSS transitions (no Framer Motion runtime detected; transitions vocabulary lives in CSS)

ToDesktop builds on the Geist DS semantic token foundation and re-tailors it to a web-to-desktop platform register. Hero atmospheric background lives as a 1530×1761 PNG light leak (loading=auto). 30 captured images, 0 preloaded fonts at runtime — Inter + Geist Mono ship through next/font hashed bundles.

  • CSS variables in `:root` defining `--body-light-{loud,muted,ghost}` + `--body-stroke-{lighter,muted}` + `--body-dark-{loud,muted}` for theme-ready surfaces.
  • Tailwind custom breakpoint config: `screens: { sm: '400px', md: '768px', lg: '957px', xl: '1200px', '2xl': '1536px' }`.
  • Geist easing as a Tailwind theme extension: `transitionTimingFunction: { geist: 'cubic-bezier(0.6, 0.6, 0, 1)', quart: 'cubic-bezier(0.76, 0, 0.24, 1)' }`.
  • Atmospheric gradients live as page-level background layers; never as component-level chrome.
  • Default to the light-first canvas (#ffffff + #e5e7eb hairline + #141414 ink) for every surface unless dark mode is explicitly required.
  • Use Inter for prose + Geist Mono for numerics and inline code labels.
  • Reserve orange (#f79942) for primary CTA + recommendation; blue (#1f6af2) for secondary action + link emphasis.
  • Use semantic CSS variables (--body-light-loud / muted / ghost) instead of hardcoded hex in components.
  • Anchor every transition with `cubic-bezier(0.6, 0.6, 0, 1)` (Geist) for micro-interactions, `cubic-bezier(0.76, 0, 0.24, 1)` for scroll reveals.
  • Don't paint surfaces with the orange or blue accent — accents stay micro-surface (CTA + pivot).
  • Don't use Geist Mono for prose — it's a developer-trust signal, not a body typeface.
  • Don't substitute a 2px border for emphasis — change color/value instead, keep the 1px discipline.
  • Don't introduce a third easing curve — the Geist + Quart pair is the motion fingerprint.
  • Don't replace stacked 4-key shadows with a single bloom — the layered approach is the elevation language.
  • Two typefaces only (Inter + Geist Mono) — no third family.
  • Two-accent palette (#f79942 orange + #1f6af2 blue) — no expansion to a chromatic accent system.
  • Container max-width capped at 960 px on the inner content rail.
  • Motion duration ladder fixed: 50 / 200 / 300 / 400 / 450 / 600 / 1000 ms — no freehand timings.
  • Semantic CSS variable foundation must remain the token source — do not bypass with hex literals in component code.
  • Hex grep — #ffffff and #e5e7eb dominate; #f79942 and #1f6af2 appear only on CTA + pivot signals (< 2% surface).
  • Font stack inspection — Inter for prose, Geist Mono for numerics + inline code; no third family present.
  • Container max-width audit — every inner rail measures ≤ 960 px on desktop screenshots.
  • Easing audit — `transition-timing-function` reads `cubic-bezier(0.6, 0.6, 0, 1)` for hover/focus and `cubic-bezier(0.76, 0, 0.24, 1)` for scroll reveals; no third curve.
  • Semantic token check — `--body-light-loud`, `--body-light-muted`, `--body-light-ghost`, `--body-stroke-lighter`, `--body-stroke-muted` defined in `:root`.
  • Shadow audit — primary cards carry a 4-key stacked drop shadow; accent surfaces add a 2-key inset highlight.

Design tokens

Observed token system

Color, type, spacing, gradients, and stacking order captured from the live page and rendered here as living, paste-ready previews.

Inspector

Observable layers

Structure, breakpoints, motion, fonts, and images captured from the live page and kept paste-ready alongside the tokens.

Depth-first walk of the meaningful sections. 6 nodes across 2 levels, shallow to deep by color.

  • body5
    • div (×3)
    • Section (×2)
    • div
    • Section (×4)
    • [+12 more]

Accessibility

Contrast matrix

302 combinations - 144 pass AA - 110 pass AAA. Each pair is previewed with its real foreground on background; APCA Lc sits alongside the WCAG 2.1 ratio for draft WCAG 3 awareness.

Normal text passes AAALarge text passes AAA
fg
#000000
bg
#FFFFFF
APCA Lc
+106
Use
foreground on background
Normal text passes AAALarge text passes AAA
fg
#FFFFFF
bg
#000000
APCA Lc
-108
Use
background on foreground
Normal text passes AAALarge text passes AAA
fg
#FFFFFF
bg
#05061B
APCA Lc
-108
Use
background on accent
Normal text passes AAALarge text passes AAA
fg
#05061B
bg
#FFFFFF
APCA Lc
+106
Use
accent on background
Normal text passes AAALarge text passes AAA
fg
#000000
bg
#E6FFF7
APCA Lc
+103
Use
foreground on background
Normal text passes AAALarge text passes AAA
fg
#E6FFF7
bg
#000000
APCA Lc
-104
Use
background on foreground
Normal text passes AAALarge text passes AAA
fg
#000000
bg
#FFF4F4
APCA Lc
+101
Use
foreground on background
Normal text passes AAALarge text passes AAA
fg
#FFF4F4
bg
#000000
APCA Lc
-102
Use
background on foreground
Normal text passes AAALarge text passes AAA
fg
#05061B
bg
#E6FFF7
APCA Lc
+102
Use
accent on background

Images

Image strategy

Observable image posture - total count, lazy-loading ratio, and format mix. The hero image is measured above the fold.

Total images
30
Lazy loaded
76%
Format mix
  • png79 · 99%
  • jpg1 · 1%

Hero image

https://www.todesktop.com/electron/images/page-background-lights.png
Format
PNG
Dimensions
1530x1761
Loading
auto
srcset
no
Industry
developer-tools
Industry
saas
Theme
Light + Dark
Added
2026-04-30

FAQ

Questions people ask about ToDesktop

3questions

Answers are pulled from the curator verdict and design brief - the same text your AI agent sees when it paste-reads this page.

Compare this with