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.
Get Started Get Started
Card on extracted card recipe
Accent link: #FFFFFF · border #212121

Color palette (dark mode)

RoleValueTailwindUsage
canvasBg#090909bg-[#090909]Primary Polar page canvas
surfaceElevated#111111bg-[#111111]Primary elevated card & bento surface
surfaceSecondary#090909bg-[#090909]Secondary interactive container / hover fill
borderPrimary#212121border-[#212121]Primary structural divider (1px solid #212121)
borderSecondary#212121border-[#212121]Secondary nested module or pill border
textPrimary#FFFFFFtext-whiteHero H1, section H2 & high-contrast foreground
textMuted#858585text-[#858585]Lead paragraphs, descriptions & muted labels
accentPrimary#FFFFFFbg-whitePrimary interactive CTA & brand highlight (9999px (Pill))
accentSecondary#212121text-[#212121]Secondary badge, syntax or telemetry highlight

Typography

Heading PP Neue Montreal · body Inter / PP Neue Montreal · mono GeistMono

LevelComputed spec
Hero H136px | 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 H320px | 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 Block13px | 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 familyMost frequent values (count on page)
Border radius12px ×20 · 7.6px ×10 · 16px ×8
Box shadowrgba(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 gapnormal 16px ×52 · normal 8px ×48 · normal 4px ×31 · 8px normal ×17 · normal 12px ×17 · 4px normal ×17
Container max-width896px ×4 · 1280px ×3
Section vertical padding96px / 96px ×11 · 48px / 48px ×5 · 48px / 64px ×1 · 0px / 96px ×1
Easingcubic-bezier(0.4, 0, 0.2, 1) ×84 · ease ×46 · cubic-bezier(0.2, 0.8, 0.2, 1) ×3
Duration0.075s ×40 · 0.12s ×36 · 0.2s ×26 · 0.15s ×17

Component recipes

Buttons (3 distinct)

RenderedHeightPaddingRadiusBackground / TextBorderFont
Get Started40px12px 20px9999px#FFFFFF
#000000
none14px / 550
Get Started48px16px 20px9999px#FFFFFF
#000000
none14px / 550
Contact Sales40px12px 20px9999px#212121
#FFFFFF
1px solid rgba(255, 255, 255, 0.05)14px / 550

Cards (3 distinct)

#BackgroundBorderRadiusPaddingShadow
1transparent1px solid #1818187.6px48px 48pxnone
2#0909091px solid #18181816px4px 4pxrgba(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#1111111px solid #1818187.6px48px 48pxnone

Rules: what never to do in the Polar style

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 →