Skip to content

Now in the official shadcn registry directory.

Start free
Back to gallery
developer tools · saas · content

Lightdash

The open-source BI landing that earns the attention of both engineering leads and design-minded PMs — a page that reads like well-typeset documentation wrapped around a dashboard. Lightdash commits to three unfashionable choices at once: pure black primary ink against an off-white canvas, a small-foundry display face (Britti Sans Variable) paired with Inter Variable as the only typographic voices, and the preserved native #0000ee hyperlink blue as an editorial credibility signal. Elevation runs on a multi-layer soft shadow grammar (up to four stacked layers) that makes cards feel printed rather than floated.

lightdash.comAdded 2026-04-23
Lightdash - 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 Lightdash’s language, not just a screenshot.

Paste into your agent. No signup, no cost.
Light-first editorial data landing. Off-white #eceff3 primary canvas (freq 283) paired with pure #000 primary ink (freq 3368 — the decisive rejection of near-black). Secondary text descends through #272835 → #36394a → #666d80 for progressive de-emphasis. Typography carries the entire personality: Britti Sans Variable (Trial Regular / Trial Semibold / Medium) for display, Inter / Inter Variable for body — a two-foundry duet with 129 @font-face declarations delivered from Framer's CDN (zero preload). Accent is signature purple #625df5, plus the preserved native #0000ee hyperlink blue used unmodified as an editorial credibility signal. Integration chips (Slack / Google / Google Sheets hues) are first-class palette citizens. Elevation is a multi-layer soft shadow grammar (up to four stacked layers on the flagship) that makes cards feel printed rather than floated. Motion stays moderate — Framer Motion in use, colour 0.5s ease dominant, plus a single cubic-bezier(0.44, 0, 0.56, 1) for chroma micro-interaction.
Main prompt
Use this capture as a design language transfer brief for my project. Adopt the palette (light-first #eceff3 off-white canvas + pure #000 primary ink + near-black descender ladder + signature purple #625df5 + preserved #0000ee native-link blue + integration-chip palette where relevant), typographic duet (Britti Sans Variable for display paired with Inter Variable for body, delivered via @font-face without preload), 2px base spacing scale with peaks at 8 / 16 / 10, four-tier graduated container ladder 724 / 836 / 1080 / 1280, multi-layer soft shadow grammar (three-layer for cards, four-layer for flagship surfaces), three-only gradient system (1px rail separators + soft fade, no decorative colour gradients), border-radius peaks at 8 / 12 + full-pill 80px, moderate Framer Motion with color 0.5s ease dominant and cubic-bezier(0.44, 0, 0.56, 1) for chroma micro-interactions, and a custom md=810 breakpoint. Treat this as my project's constitution — every new component should pass as if crafted in the same studio. Apply the language, not the source brand's copy or identity. When I ask you to build a page or component, enforce these rules by default, and call out any decision that deviates.
Layout
Grid
Content width
Bounded
Framing
Flat
Grid strength
Moderate

Light-first canvas — cool off-white #eceff3 (freq 283) as primary background, with #ffffff (freq 97) reserved for elevated surfaces like cards and tables. Pure #000 text does the dominant reading (freq 3368 — the decisive choice). Secondary descender: #272835 → #36394a → #666d80 for progressive de-emphasis. Signature accent is purple #625df5 (freq 156); the native #0000ee hyperlink blue is preserved unmodified (freq 160) as an editorial credibility signal. Integration chip palette — #2eb67d, #ecb22e, #36c5f0, #ea4335, #4285f4, #e01e5a — used exclusively to identify partner products and third-party services, not as decorative brand colour.

Mode strategylight-first
  • Primary reading pair: pure #000 text on #eceff3 off-white canvas (measured 3368 + 283 occurrences — dominant surface)
  • Elevated surfaces: #ffffff for cards, table rows and modals against the off-white canvas
  • Secondary descender: #272835 (muted body) → #36394a (cooler secondary) → #666d80 (captions / labels)
  • Signature accent: #625df5 purple for primary CTAs, brand moments and product feature emphasis
  • Preserved native link: #0000ee for inline anchor text — do not substitute a branded blue
  • Integration chip palette (Slack / Google / Google Sheets / Figma brand hues) reserved for partner-product identification only

Gradients (paste-ready)

linear-gradient(rgba(0, 0, 0, 0) 1px, rgb(255, 255, 255) 0px)
linear-gradient(90deg, rgba(0, 0, 0, 0) 1px, rgb(255, 255, 255) 0px)
linear-gradient(rgb(248, 250, 251) 0%, rgba(248, 250, 251, 0) 100%)
  • Display family: Britti Sans Variable (Trial Regular / Trial Semibold / Medium) — a small-foundry grotesque with editorial weight. Delivered via @font-face from framerusercontent.com; no preload observed. Licensing note: Trial variants are for evaluation — production use requires a commercial licence.
  • Body family: Inter / Inter Variable — the default body companion. Do not swap to a second display family; the Britti + Inter duet is the identity.
  • Size ladder observed: 12 / 15 / 16 / 18 / 20 / 24 / 48 / 76 px. Display hero at 48/48 with letter-spacing -0.96px (Britti Trial Regular or Semibold); XXL hero at 76/68.4 with normal tracking; sub-display at 24/31.2 with -0.48px (Britti Medium).
  • Body at 16/24 with letter-spacing -0.16px (Inter) or 18/30.6 with -0.18px (Inter Variable) — the negative px tracking compensates at reading sizes.
  • Britti Medium is used for UI labels at 16/32 (line-height 32 creates generous space), 20/24 for compact headers. Do not substitute the Medium weight — it is the secondary emphasis step.
  • Do not use italic. Britti Sans has no observed italic cut; emphasis in body is carried via weight (Inter 500+).
  • Paragraph max 55-70 ch at body 16-18px — echoes the 724 / 836 narrow container tiers.
  • 2px base unit. Observed scale: 2 / 4 / 6 / 8 / 10 / 12 / 14 / 16 / 18 / 20 / 22 / 24 px. Dominant usage: 8 (freq 227) / 16 (168) / 10 (118) / 20 (71) / 12 (69) / 24 (57).
  • Four-tier graduated container ladder: 724 / 836 / 1080 / 1280 px. Use 724 for narrow reading-forward sections, 836 for medium editorial, 1080 for product-forward feature sections, 1280 as the full site rail (dominant, freq 8).
  • Flex gap peaks at 8px and 16px — keep gutters on these steps wherever possible.
  • Card padding scale: 16 / 20 / 24 / 32 px. Table cell padding typically 10-12 vertical, 16 horizontal.
  • Section vertical rhythm: 48 / 64 / 96 px desktop, 32 / 48 / 64 mobile.
Surface styleSoft
  • Default cards: shadow-xs three-layer soft stack — 'rgba(0,0,0,0.05) 0px 2px 5px 0px, rgba(0,0,0,0.04) 0px 9px 9px 0px, rgba(0,0,0,0.02) 0px 20px ...' — the stacked layers produce a printed-on-paper feel rather than a drop.
  • Hairline outline: shadow-md 'rgba(39,40,53,0.1) 0px 0px 0px 1px' — a 1px indigo-tinted ring for pure outline separation.
  • Card + ring: shadow-sm 'rgba(18,18,18,0.1) 0px 1px 1px 0px, rgba(18,18,18,0.1) 0px 0px 0px 1px' — a tiny drop plus a hairline ring for mild elevation.
  • Flagship cards: shadow-lg and shadow-xl stack a hairline ring with a larger offset drop — e.g. 'rgba(39,40,53,0.1) 0px 0px 0px 1px, rgba(39,40,53,0.08) 0px 24px 24px -12px, ...' — reserve for hero feature surfaces.
  • Extreme elevation: shadow-2xl four-layer stack with 21-30px blurs — used only once in the capture on the dashboard hero card. Use sparingly.
  • Do not substitute a single-layer drop shadow — the multi-layer stack is the identity.

Techniques

Three-layer soft card stack

Default cards use three stacked shadows at progressive blur radii (2/5 + 9/9 + 20+ with decreasing opacity 0.05/0.04/0.02). The layers compound into a paper-like depth cue rather than a single floating drop.

Ring + offset flagship elevation

Flagship surfaces combine a 1px hairline ring (rgba(39,40,53,0.1) 0 0 0 1px) with a long-offset drop (0 24 24 -12 or larger). The negative spread draws the shadow inward so the card feels set into the page.

Radii2 / 6 / 8 / 12 / 16 / 26 / 80Icon treatmentStroke-forward, 1.5-2px weightIcon setsCustom Lightdash glyphs, Lucide, Phosphor
  • Double-peak base: 12px (freq 28) for feature cards and image frames, 8px (freq 24) for inline controls and buttons.
  • Secondary radii: 6px for small chips and badges, 16px for large surface cards, 26px for the distinctive medium-large radius used on hero image frames.
  • Full pill (80px radius, freq 7) for indicator badges, integration chips and tag-sized controls — note 80px, not 100px, produces a slightly tighter pill that matches Britti's letterform proportions.
  • Do not use radii between 16 and 26 — the jump is intentional.
  • Border widths: 1px default (absence of explicit borderWidths tokens means default stroke is 1px throughout).
  • three-layer-card
    backgroundColor
    #ffffff
    textColor
    #000000
    radius
    12px
    padding
    24px
    border
    none
    boxShadow
    rgba(0, 0, 0, 0.05) 0px 2px 5px 0px, rgba(0, 0, 0, 0.04) 0px 9px 9px 0px, rgba(0, 0, 0, 0.02) 0px 20px 12px 0px
    fontFamily
    Britti Sans, Inter, ui-sans-serif

    Tailwind

    rounded-xl bg-white p-6 text-black shadow-[rgba(0,0,0,0.05)_0px_2px_5px_0px,rgba(0,0,0,0.04)_0px_9px_9px_0px,rgba(0,0,0,0.02)_0px_20px_12px_0px]
  • hairline-outline-surface
    backgroundColor
    #eceff3
    textColor
    #000000
    radius
    12px
    padding
    20px
    border
    none
    boxShadow
    rgba(39, 40, 53, 0.1) 0px 0px 0px 1px
    fontFamily
    Inter Variable

    Tailwind

    rounded-xl bg-[#eceff3] p-5 text-black shadow-[rgba(39,40,53,0.1)_0px_0px_0px_1px]
  • purple-cta
    backgroundColor
    #625df5
    textColor
    #ffffff
    radius
    8px
    padding
    10px 20px
    border
    none
    boxShadow
    rgba(18, 18, 18, 0.1) 0px 1px 1px 0px, rgba(18, 18, 18, 0.1) 0px 0px 0px 1px
    fontFamily
    Britti Sans Medium
    fontSize
    16px
    transition
    color 0.5s ease, filter 0.5s ease

    Tailwind

    inline-flex min-h-[44px] items-center gap-2 rounded-lg bg-[#625df5] px-5 py-2.5 text-[16px] font-medium text-white shadow-[rgba(18,18,18,0.1)_0px_1px_1px_0px,rgba(18,18,18,0.1)_0px_0px_0px_1px] transition-[color,filter] duration-500 ease-in-out hover:brightness-110
  • integration-chip
    backgroundColor
    #ffffff
    textColor
    #272835
    radius
    80px
    padding
    6px 14px
    border
    none
    boxShadow
    rgba(39, 40, 53, 0.1) 0px 0px 0px 1px
    fontFamily
    Inter
    fontSize
    15px
    iconColor
    #36c5f0

    Tailwind

    inline-flex items-center gap-2 rounded-full bg-white px-3.5 py-1.5 text-[15px] text-[#272835] shadow-[rgba(39,40,53,0.1)_0px_0px_0px_1px]
  • link-inline
    color
    #0000ee
    textDecoration
    underline
    textDecorationThickness
    1px
    textUnderlineOffset
    2px
    transition
    color 200ms ease

    Tailwind

    text-[#0000ee] underline decoration-[1px] underline-offset-2 transition-colors duration-200 ease-[cubic-bezier(0.44,0,0.56,1)] visited:text-[#551a8b] hover:opacity-80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[#0000ee]
LevelmoderateDurations0.2s / 0.5s / 0.8s

Easings

easecubic-bezier(0.44, 0, 0.56, 1)
HoverColour transition: 0.5s ease (dominant, freq 25), Filter + opacity: 0.5s ease (for image / icon hover reveals), Chroma micro-interaction: 0.2s cubic-bezier(0.44, 0, 0.56, 1) for focused controls

Scroll patterns

  • Framer Motion detected — moderate-level scroll reveal with in-view triggers
  • No parallax. Colour / filter transitions only; no translate transforms on scroll
  • Moderate motion level — deliberate reduction from expressive. Colour is the primary animated property.
  • Default hover transition: color 0.5s ease — unhurried, editorial tempo.
  • Focused chroma uses a custom cubic-bezier(0.44, 0, 0.56, 1) at 0.2s for crisp state change.
  • Framer Motion handles scroll-reveal on below-the-fold sections; use once:true viewport triggers.
  • Respect prefers-reduced-motion — Framer Motion's useReducedMotion disables all reveals.
  • Do not introduce spring or bounce — moderate ease and the single cubic-bezier only.
  • Hover states lean on colour, not elevation. Ink darkens, accent brightens, but cards stay in place.
  • Links: preserved #0000ee for inline anchors — do not substitute a branded blue without a deliberate reason.
  • Integration chips: 80px pill + 1px hairline ring + 3rd-party brand colour icon + Inter text. Use as navigation cues for partner-product sections.
  • Buttons escalate through one tier — secondary (outline + hairline ring) to primary (purple filled) to accent hero (purple + three-layer soft shadow).
  • Focus rings use the signature purple #625df5 with 2px offset.
Approachdesktop-first

Desktop-first with a custom md=810 breakpoint instead of the Tailwind default 768. The 30-extra-pixels space is intentional — it pushes dense product imagery onto a larger viewport before collapsing to mobile layout. Six measured media queries include 809.98 / 810 / 1099.98 / 1199 bounds — per-breakpoint tweaks rather than fluid guessing.

  • Breakpoints: sm 640 / md 810 / lg 1024 / xl 1280 / 2xl 1536. Note the custom md=810.
  • Four-tier container ladder 724 / 836 / 1080 / 1280 maps to reading / editorial / product / full-site modes — pick based on content density.
  • Below md 810, collapse to single-column reading flow. Britti Sans display scales from 76/68.4 down to 48/48 to 32/36.
  • Hide-on-mobile is banned — controls reflow to accordion or drawer, not disappear.
  • Tap targets minimum 44×44 on touch; 40×40 on pointer.
  • Primary reading pair pure #000 on #eceff3 = 19.5:1 (AAA). Secondary #272835 on #eceff3 = ~14:1 (AAA). #666d80 on #eceff3 = ~4.9:1 (AA).
  • Accent #625df5 on white = ~4.7:1 (AA for normal text, AAA for large text 18+). Test for UI controls that need AA on smaller text.
  • Preserved link colour #0000ee on #eceff3 = ~8:1 (AAA) — one of the reasons the classic link colour still works.
  • Focus rings mandatory: 2px solid #625df5 with 2px offset for form fields and interactive elements.
  • Integration chip colours are decorative and must be paired with icon + text for meaning; do not rely on chip colour alone.
  • prefers-reduced-motion must disable Framer Motion scroll reveals and collapse color transitions to 0ms.
  • Tap targets minimum 44×44 touch, 40×40 pointer.
Framer (hosting)Framer Motion@font-face delivery

Lightdash ships on Framer — images are served via framerusercontent.com, the 129 @font-face declarations point to Framer's font CDN, and scroll-reveal motion is handled by Framer Motion (the only observed runtime motion library, level=moderate). Zero fonts are preloaded via <link rel='preload'> — Framer handles font orchestration at render time. No CSS custom properties observed in the cascade; the palette lives in compiled classes.

  • If replicating the type system, source Britti Sans from the original foundry (with proper licensing), not from Framer's CDN
  • Use Framer Motion for scroll reveals with useReducedMotion guards; keep level at moderate, not expressive
  • Adopt Tailwind custom breakpoint md=810 to match the density rhythm
  • No CSS custom properties required — compiled utility classes are the token surface
  • Icons stroke-based at 1.5-2px weight; integration chips use the partner's own brand icon at its brand colour
  • Use Britti Sans Variable + Inter Variable as the only two typographic voices.
  • Keep primary text pure #000 on an off-white #eceff3 canvas — commit to the decisive contrast.
  • Preserve native #0000ee for inline anchors when the editorial tone demands credibility.
  • Use the three-layer soft shadow stack for cards instead of a single drop-shadow.
  • Treat partner integration colours as first-class palette citizens when your product is a connector.
  • Keep motion moderate — Framer Motion at 0.5s ease is the tempo signature.
  • Pick the container tier (724 / 836 / 1080 / 1280) based on content density, not layout convenience.
  • Do not ship Britti Sans Trial in production without a commercial licence — it is trial-licensed on the source.
  • Do not replace #0000ee with a branded hyperlink colour — the preserved default is the brand choice.
  • Do not substitute a single-layer drop shadow for the multi-layer stack — identity breaks immediately.
  • Do not use the integration chip palette as decoration — only to identify partner products.
  • Do not invent the #eceff3 canvas without testing — pure white often looks washed-out by comparison.
  • Do not adopt the 810px md breakpoint without justifying it; if unsure, fall back to Tailwind's 768.
  • Typography must render with variable-weight Britti Sans and Inter — static substitutes break the duet tension.
  • All shadows must honour the observed rgba stacks exactly — the multi-layer grammar only works with the measured opacities.
  • Accents must pass AA contrast against the surface they sit on; promote to #625df5 on white, demote to pure #000 on #eceff3 otherwise.
  • Custom md breakpoint must be documented in the Tailwind config; do not silently override the 768 default in other stylesheets.
  • Motion durations are quantised — 0.2s or 0.5s only.
  • Does primary body text render in pure #000 against an off-white canvas (#eceff3 or equivalent), not near-black on white?
  • Do cards use the three-layer soft shadow stack (shadow-xs) rather than a single drop-shadow?
  • Is Britti Sans Variable paired exclusively with Inter Variable, with no third display family in sight?
  • Are integration chips rendered at 80px radius with 1px hairline ring and partner brand colour icon?
  • Does the layout pick one of four container tiers (724 / 836 / 1080 / 1280) based on content density?
  • Is scroll-reveal motion handled via Framer Motion at moderate level (0.5s ease or the single cubic-bezier(0.44, 0, 0.56, 1)) with useReducedMotion guards?

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. 7 nodes across 7 levels, shallow to deep by color.

  • body1
    • div1
      • div1
        • div1
          • div1
            • div1
              • Nav

Accessibility

Contrast matrix

286 combinations - 82 pass AA - 38 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
#000000
bg
#ECEFF3
APCA Lc
+96
Use
foreground on background
Normal text passes AAALarge text passes AAA
fg
#ECEFF3
bg
#000000
APCA Lc
-97
Use
background on foreground
Normal text passes AAALarge text passes AAA
fg
#272835
bg
#FFFFFF
APCA Lc
+101
Use
foreground on background
Normal text passes AAALarge text passes AAA
fg
#FFFFFF
bg
#272835
APCA Lc
-104
Use
background on foreground
Normal text passes AAALarge text passes AAA
fg
#000000
bg
#CCCCCC
APCA Lc
+77
Use
foreground on foreground
Normal text passes AAALarge text passes AAA
fg
#CCCCCC
bg
#000000
APCA Lc
-76
Use
foreground on foreground
Normal text passes AAALarge text passes AAA
fg
#ECEFF3
bg
#272835
APCA Lc
-94
Use
background on foreground

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
14%
Format mix
  • png47 · 84%
  • svg8 · 14%
  • jpg1 · 2%

Hero image

https://framerusercontent.com/images/P2NoiVxdHWdFiufYmridWJYiBtc.png?width=504&height=952
Format
PNG
Dimensions
543x1025
Loading
auto
srcset
yes
srcset descriptor
https://framerusercontent.com/images/P2NoiVxdHWdFiufYmridWJYiBtc.png?width=504&height=952 504w
Industry
developer-tools
Industry
saas
Industry
content
Theme
Light
Added
2026-04-23

FAQ

Questions people ask about Lightdash

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