taste-skill / Style guides / Polar style
How to build a UI in the Polar style
Polar (polar.sh) reads as Nordic Dark Monetization & PP Neue Montreal Minimalist — Deep #090909 obsidian canvas with #111111 cards and #181818 / #212121 borders, refined 36px PP Neue Montreal display headings, GeistMono revenue counters, and #FFFFFF pill CTAs. This guide turns its extracted computed styles into an implementation kit: a live preview, the exact palette and type scale, real button and card recipes, the rules to avoid, and drop-in CSS variables, Tailwind config and a Cursor / Claude Code SKILL.md snippet.
Source: computed styles extracted from
https://polar.sh on 2026-10-26 by the taste-skill extractor. Brand fonts may be proprietary; previews fall back to Inter / system fonts. Polar is a trademark of its owner; this page documents publicly visible styling for reference and is not affiliated with Polar.Live preview with Polar tokens
Polar style · dark
Ship the product, not the pixels.
Preview text rendered with the extracted Polar canvas, text, muted and accent tokens.
Card on extracted card recipe
Accent link: #FFFFFF · border
#212121Color palette (dark mode)
| Role | Value | Tailwind | Usage |
|---|---|---|---|
| canvasBg | #090909 | bg-[#090909] | Primary Polar page canvas |
| surfaceElevated | #111111 | bg-[#111111] | Primary elevated card & bento surface |
| surfaceSecondary | #090909 | bg-[#090909] | Secondary interactive container / hover fill |
| borderPrimary | #212121 | border-[#212121] | Primary structural divider (1px solid #212121) |
| borderSecondary | #212121 | border-[#212121] | Secondary nested module or pill border |
| textPrimary | #FFFFFF | text-white | Hero H1, section H2 & high-contrast foreground |
| textMuted | #858585 | text-[#858585] | Lead paragraphs, descriptions & muted labels |
| accentPrimary | #FFFFFF | bg-white | Primary interactive CTA & brand highlight (9999px (Pill)) |
| accentSecondary | #212121 | text-[#212121] | Secondary badge, syntax or telemetry highlight |
Typography
Heading PP Neue Montreal · body Inter / PP Neue Montreal · mono GeistMono
| Level | Computed spec |
|---|---|
| Hero H1 | 36px | line-height 45px (leading-[1.25]) | letter-spacing 0px (tracking-[0em]) | weight 400 (font-[400]) | color #FFFFFF (text-white) | font PP Neue Montreal |
| Section H2 (Primary) | 48px | line-height 60px (leading-[1.25]) | letter-spacing 0px (tracking-[0em]) | weight 400 (font-[400]) | color #FFFFFF (text-white) | font PP Neue Montreal |
| Section H2 (Secondary) | 30px | line-height 41.3px (leading-[1.38]) | letter-spacing 0px (tracking-[0em]) | weight 400 (font-[400]) | color #FFFFFF (text-white) | font PP Neue Montreal |
| Card / Feature H3 | 20px | line-height 27.5px (leading-[1.38]) | letter-spacing 0.24px (tracking-[0.012em]) | weight 400 (font-[400]) | color #FFFFFF (text-white) | font PP Neue Montreal |
| Body Copy (Paragraph) | 16px | line-height 24px (leading-[1.5]) | letter-spacing 0.24px (tracking-[0.015em]) | weight 450 (font-[450]) | color #858585 (text-[#858585]) | font PP Neue Montreal |
| Monospace / Code Block | 13px | line-height 24px (leading-[1.85]) | letter-spacing 0.24px (tracking-[0.018em]) | weight 450 (font-[450]) | color #FFFFFF (text-white) | font GeistMono |
Spacing, radius, depth and motion
| Token family | Most frequent values (count on page) |
|---|---|
| Border radius | 12px ×20 · 7.6px ×10 · 16px ×8 |
| Box shadow | rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.75) 0px 16px 40px -12px ×8 · rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, oklab(0.999994 0.0000455678 0.0000200868 / 0.1) 0px 0px 0px 1px inset, rgba(0, 0, 0, 0) 0px 0px 0px 0px ×4 |
| Grid / flex gap | normal 16px ×52 · normal 8px ×48 · normal 4px ×31 · 8px normal ×17 · normal 12px ×17 · 4px normal ×17 |
| Container max-width | 896px ×4 · 1280px ×3 |
| Section vertical padding | 96px / 96px ×11 · 48px / 48px ×5 · 48px / 64px ×1 · 0px / 96px ×1 |
| Easing | cubic-bezier(0.4, 0, 0.2, 1) ×84 · ease ×46 · cubic-bezier(0.2, 0.8, 0.2, 1) ×3 |
| Duration | 0.075s ×40 · 0.12s ×36 · 0.2s ×26 · 0.15s ×17 |
Component recipes
Buttons (3 distinct)
| Rendered | Height | Padding | Radius | Background / Text | Border | Font |
|---|---|---|---|---|---|---|
| Get Started | 40px | 12px 20px | 9999px | #FFFFFF#000000 | none | 14px / 550 |
| Get Started | 48px | 16px 20px | 9999px | #FFFFFF#000000 | none | 14px / 550 |
| Contact Sales | 40px | 12px 20px | 9999px | #212121#FFFFFF | 1px solid rgba(255, 255, 255, 0.05) | 14px / 550 |
Cards (3 distinct)
| # | Background | Border | Radius | Padding | Shadow |
|---|---|---|---|---|---|
| 1 | transparent | 1px solid #181818 | 7.6px | 48px 48px | none |
| 2 | #090909 | 1px solid #181818 | 16px | 4px 4px | rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.75) 0px 16px 40px -12px |
| 3 | #111111 | 1px solid #181818 | 7.6px | 48px 48px | none |
Rules: what never to do in the Polar style
- NEVER substitute generic uncalibrated gray backgrounds for Polar’s exact
#090909canvas and#111111surface pairing. - NEVER replace
PP Neue Montrealdisplay typography or ignore its signature scale (36px / 1.25 (w400)). - NEVER use thick opaque borders that clash with
#212121(1px solid #212121). - NEVER deviate from the signature button geometry (
9999px (Pill)) or introduce off-brand saturated gradients. - NEVER use default browser monospace when rendering code or telemetry—always pair with
GeistMono.
Copy-paste kit
CSS variables
:root {
/* Polar style — extracted from polar.sh by taste-skill */
--canvas: #090909;
--surface: #111111;
--text: #FFFFFF;
--text-muted: #858585;
--accent: #FFFFFF;
--border: #212121;
--font-heading: 'PP Neue Montreal', Inter, system-ui, -apple-system, sans-serif;
--font-body: 'Inter / PP Neue Montreal', Inter, system-ui, -apple-system, sans-serif;
--font-mono: 'GeistMono', 'JetBrains Mono', ui-monospace, monospace;
--h1-size: 36px;
--h1-tracking: 0em;
--h1-weight: 400;
--radius-button: 9999px;
--radius-common: 12px;
--shadow-common: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.75) 0px 16px 40px -12px;
--ease: cubic-bezier(0.4, 0, 0.2, 1);
--duration: 0.075s;
}tailwind.config.js
// tailwind.config.js — Polar style tokens (taste-skill)
module.exports = {
theme: {
extend: {
colors: {
canvas: "#090909",
surface: "#111111",
ink: "#FFFFFF",
muted: "#858585",
accent: "#FFFFFF",
line: "#212121",
},
fontFamily: {
heading: ["PP Neue Montreal", 'Inter', 'system-ui', 'sans-serif'],
sans: ["Inter / PP Neue Montreal", 'Inter', 'system-ui', 'sans-serif'],
mono: ["GeistMono", 'ui-monospace', 'monospace'],
},
fontSize: { display: ["36px", { letterSpacing: "0em", fontWeight: "400" }] },
borderRadius: { button: "9999px", card: "12px" },
boxShadow: { brand: "rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.75) 0px 16px 40px -12px" },
transitionTimingFunction: { brand: "cubic-bezier(0.4, 0, 0.2, 1)" },
},
},
};.cursor/skills/polar-style/SKILL.md
--- name: polar-style description: Build UI in the Polar visual style (Nordic Dark Monetization & PP Neue Montreal Minimalist). Use when the user asks for a Polar-like look. --- # Polar Style — Quick Rules (source: polar.sh, extracted by taste-skill) ## Tokens - canvasBg: #090909 — Primary Polar page canvas - surfaceElevated: #111111 — Primary elevated card & bento surface - surfaceSecondary: #090909 — Secondary interactive container / hover fill - borderPrimary: #212121 — Primary structural divider (1px solid #212121) - borderSecondary: #212121 — Secondary nested module or pill border - textPrimary: #FFFFFF — Hero H1, section H2 & high-contrast foreground - textMuted: #858585 — Lead paragraphs, descriptions & muted labels - accentPrimary: #FFFFFF — Primary interactive CTA & brand highlight (9999px (Pill)) - accentSecondary: #212121 — Secondary badge, syntax or telemetry highlight ## Typography - Heading font: PP Neue Montreal; body: Inter / PP Neue Montreal; mono: GeistMono - Hero H1: 36px | line-height 45px (leading-[1.25]) | letter-spacing 0px (tracking-[0em]) | weight 400 (font-[400]) | color #FFFFFF (text-white) | font PP Neue Montreal - Section H2 (Primary): 48px | line-height 60px (leading-[1.25]) | letter-spacing 0px (tracking-[0em]) | weight 400 (font-[400]) | color #FFFFFF (text-white) | font PP Neue Montreal - Section H2 (Secondary): 30px | line-height 41.3px (leading-[1.38]) | letter-spacing 0px (tracking-[0em]) | weight 400 (font-[400]) | color #FFFFFF (text-white) | font PP Neue Montreal - Card / Feature H3: 20px | line-height 27.5px (leading-[1.38]) | letter-spacing 0.24px (tracking-[0.012em]) | weight 400 (font-[400]) | color #FFFFFF (text-white) | font PP Neue Montreal ## Components - Primary button: height 40px, padding 12px 20px, radius 9999px, bg #FFFFFF, text #000000, 14px / 550 - Card: bg transparent, border 1px solid #181818, radius 7.6px, padding 48px 48px ## Never - NEVER substitute generic uncalibrated gray backgrounds for Polar’s exact #090909 canvas and #111111 surface pairing. - NEVER replace PP Neue Montreal display typography or ignore its signature scale (36px / 1.25 (w400)). - NEVER use thick opaque borders that clash with #212121 (1px solid #212121). - NEVER deviate from the signature button geometry (9999px (Pill)) or introduce off-brand saturated gradients. - NEVER use default browser monospace when rendering code or telemetry—always pair with GeistMono. Full 120-line spec: https://taste-skill.pages.dev/taste/polar/
Or install the full spec
npx taste-skill add polar
Related
Similar styles
Get all 30 full SKILL.md specs (Cursor / Claude Code / Codex ready) plus the Pro growth skills.
See taste-skill Pro →