taste-skill / Style guides / Loops style

How to build a UI in the Loops style

Loops (loops.so) reads as Warm Editorial SaaS & Newsreader Serif Craft — Warm ivory #FDFDFC / #F9F9F8 canvas with #E9E8E6 stone borders, #21201C espresso ink, refined 44px Newsreader serif display headlines (-0.02em), and #7D1B0C oxblood / #21201C 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://loops.so on 2026-10-26 by the taste-skill extractor. Brand fonts may be proprietary; previews fall back to Inter / system fonts. Loops is a trademark of its owner; this page documents publicly visible styling for reference and is not affiliated with Loops.

Live preview with Loops tokens

Loops style · light
Ship the product, not the pixels.
Preview text rendered with the extracted Loops canvas, text, muted and accent tokens.
Start for free Start for free
Card on extracted card recipe
Accent link: #7D1B0C · border #E9E8E6

Color palette (light mode)

RoleValueTailwindUsage
canvasBg#FDFDFCbg-[#FDFDFC]Primary Loops page canvas
surfaceElevated#F9F9F8bg-[#F9F9F8]Primary elevated card & bento surface
surfaceSecondary#F1F0EFbg-[#F1F0EF]Secondary interactive container / hover fill
borderPrimary#E9E8E6border-[#E9E8E6]Primary structural divider (1px solid #E9E8E6)
borderSecondary#DAD9D6border-[#DAD9D6]Secondary nested module or pill border
textPrimary#21201Ctext-[#21201C]Hero H1, section H2 & high-contrast foreground
textMuted#63625Etext-[#63625E]Lead paragraphs, descriptions & muted labels
accentPrimary#7D1B0Cbg-[#7D1B0C]Primary interactive CTA & brand highlight (40px (Pill))
accentSecondary#FDFDFCtext-[#FDFDFC]Secondary badge, syntax or telemetry highlight

Typography

Heading Newsreader · body Inter · mono SF Mono

LevelComputed spec
Hero H144px | line-height 47.5px (leading-[1.08]) | letter-spacing -0.88px (tracking-[-0.02em]) | weight 500 (font-[500]) | color #21201C (text-[#21201C]) | font Newsreader
Section H2 (Primary)44px | line-height 48px (leading-[1.09]) | letter-spacing -1.6px (tracking-[-0.036em]) | weight 500 (font-[500]) | color #FFF4EC (text-[#FFF4EC]) | font Newsreader
Section H2 (Secondary)25.3px | line-height 29.1px (leading-[1.15]) | letter-spacing 0px (tracking-[0em]) | weight 500 (font-[500]) | color #21201C (text-[#21201C]) | font Newsreader
Card / Feature H330px | line-height 33.6px (leading-[1.12]) | letter-spacing -0.6px (tracking-[-0.02em]) | weight 400 (font-[400]) | color #21201C (text-[#21201C]) | font ui-serif
Body Copy (Paragraph)20px | line-height 28px (leading-[1.4]) | letter-spacing -0.2px (tracking-[-0.01em]) | weight 400 (font-[400]) | color #63635E (text-[#63635E]) | font Inter
Monospace / Code Block13px–14px | line-height 1.5 (leading-relaxed) | font "Fragment Mono"

Spacing, radius, depth and motion

Token familyMost frequent values (count on page)
Border radius6px ×15 · 4px ×6 · 7px ×5 · 8px ×4 · 9px ×3 · 14px ×2
Box shadowrgba(33, 32, 28, 0.04) 0px 1px 2px 0px ×4 · rgba(255, 255, 255, 0.05) 0px 1px 2px 0px inset, rgba(28, 25, 23, 0.14) 0px 2px 5px 0px, rgba(28, 25, 23, 0.3) 0px 8px 18px -12px ×1 · rgb(218, 217, 214) 0px 0px 0px 1px inset, rgba(33, 32, 28, 0.05) 0px 1px 2px -1px, rgba(33, 32, 28, 0.22) 0px 24px 48px -24px ×1
Grid / flex gap10px ×22 · 8px ×6 · 9px ×5 · 2px ×5 · 4px ×2 · 12px ×2
Container max-width1296px ×2 · 1000px ×2 · 800px ×2 · 1440px ×1
Section vertical padding141px / 34px ×1 · 0px / 89px ×1
Easingcubic-bezier(0.16, 1, 0.3, 1), cubic-bezier(0.16, 1, 0.3, 1) ×11 · ease ×6 · cubic-bezier(0.12, 0.23, 0.5, 1), cubic-bezier(0.12, 0.23, 0.5, 1), cubic-bezier(0.12, 0.23, 0.5, 1), cubic-bezier(0.12, 0.23, 0.5, 1) ×3
Duration0.42s, 0.42s ×11 · 0.15s, 0.15s, 0.15s, 0.15s ×3 · 0.15s, 0.15s ×3 · 0.12s ×3

Component recipes

Buttons (10 distinct)

RenderedHeightPaddingRadiusBackground / TextBorderFont
Start for free44px10px 20px40px#21201C
#0000EE
none12px / 400
Start for free52px14px 18px999px#FFF4EC
#FDFDFC
none12px / 400
Start for free40px8px 14px999pxtransparent
#FDFDFC
none12px / 400
Segments and filters33px7px 13px999px#F9F9F8
#63635E
1px solid #E9E8E614px / 400
Acquisition36px0px 12px8px#FDFDFC
#21201C
1px solid #E9E8E615.5px / 600

Cards (3 distinct)

#BackgroundBorderRadiusPaddingShadow
1#F1F0EF1px solid rgba(38, 38, 26, 0.08)12px4px 4pxrgba(33, 32, 28, 0.16) 0px 18px 46px 0px, rgba(33, 32, 28, 0.08) 0px 3px 10px 0px
2#F9F9F81px solid #E9E8E68px0px 0pxnone
3#FDFDFC1px solid #E9E8E614px0px 0pxrgba(0, 0, 0, 0.024) 0px 1px 2px 0px, rgba(0, 0, 0, 0.055) 0px 18px 44px 0px, color(srgb 0.992157 0.992157 0.988235 / 0.9) 0px 1px 0px 0px inset

Rules: what never to do in the Loops style

Copy-paste kit

CSS variables
:root {
  /* Loops style — extracted from loops.so by taste-skill */
  --canvas: #FDFDFC;
  --surface: #F9F9F8;
  --text: #21201C;
  --text-muted: #63625E;
  --accent: #7D1B0C;
  --border: #E9E8E6;
  --font-heading: Newsreader, Inter, system-ui, -apple-system, sans-serif;
  --font-body: Inter, Inter, system-ui, -apple-system, sans-serif;
  --font-mono: 'SF Mono', 'JetBrains Mono', ui-monospace, monospace;
  --h1-size: 44px;
  --h1-tracking: -0.02em;
  --h1-weight: 500;
  --radius-button: 40px;
  --radius-common: 6px;
  --shadow-common: rgba(33, 32, 28, 0.04) 0px 1px 2px 0px;
  --ease: cubic-bezier(0.16, 1, 0.3, 1), cubic-bezier(0.16, 1, 0.3, 1);
  --duration: 0.42s, 0.42s;
}
tailwind.config.js
// tailwind.config.js — Loops style tokens (taste-skill)
module.exports = {
  theme: {
    extend: {
      colors: {
        canvas: "#FDFDFC",
        surface: "#F9F9F8",
        ink: "#21201C",
        muted: "#63625E",
        accent: "#7D1B0C",
        line: "#E9E8E6",
      },
      fontFamily: {
        heading: ["Newsreader", 'Inter', 'system-ui', 'sans-serif'],
        sans: ["Inter", 'Inter', 'system-ui', 'sans-serif'],
        mono: ["SF Mono", 'ui-monospace', 'monospace'],
      },
      fontSize: { display: ["44px", { letterSpacing: "-0.02em", fontWeight: "500" }] },
      borderRadius: { button: "40px", card: "6px" },
      boxShadow: { brand: "rgba(33, 32, 28, 0.04) 0px 1px 2px 0px" },
      transitionTimingFunction: { brand: "cubic-bezier(0.16, 1, 0.3, 1), cubic-bezier(0.16, 1, 0.3, 1)" },
    },
  },
};
.cursor/skills/loops-style/SKILL.md
---
name: loops-style
description: Build UI in the Loops visual style (Warm Editorial SaaS & Newsreader Serif Craft). Use when the user asks for a Loops-like look.
---

# Loops Style — Quick Rules (source: loops.so, extracted by taste-skill)

## Tokens
- canvasBg: #FDFDFC — Primary Loops page canvas
- surfaceElevated: #F9F9F8 — Primary elevated card & bento surface
- surfaceSecondary: #F1F0EF — Secondary interactive container / hover fill
- borderPrimary: #E9E8E6 — Primary structural divider (1px solid #E9E8E6)
- borderSecondary: #DAD9D6 — Secondary nested module or pill border
- textPrimary: #21201C — Hero H1, section H2 & high-contrast foreground
- textMuted: #63625E — Lead paragraphs, descriptions & muted labels
- accentPrimary: #7D1B0C — Primary interactive CTA & brand highlight (40px (Pill))
- accentSecondary: #FDFDFC — Secondary badge, syntax or telemetry highlight

## Typography
- Heading font: Newsreader; body: Inter; mono: SF Mono
- Hero H1: 44px | line-height 47.5px (leading-[1.08]) | letter-spacing -0.88px (tracking-[-0.02em]) | weight 500 (font-[500]) | color #21201C (text-[#21201C]) | font Newsreader
- Section H2 (Primary): 44px | line-height 48px (leading-[1.09]) | letter-spacing -1.6px (tracking-[-0.036em]) | weight 500 (font-[500]) | color #FFF4EC (text-[#FFF4EC]) | font Newsreader
- Section H2 (Secondary): 25.3px | line-height 29.1px (leading-[1.15]) | letter-spacing 0px (tracking-[0em]) | weight 500 (font-[500]) | color #21201C (text-[#21201C]) | font Newsreader
- Card / Feature H3: 30px | line-height 33.6px (leading-[1.12]) | letter-spacing -0.6px (tracking-[-0.02em]) | weight 400 (font-[400]) | color #21201C (text-[#21201C]) | font ui-serif

## Components
- Primary button: height 44px, padding 10px 20px, radius 40px, bg #21201C, text #0000EE, 12px / 400
- Card: bg #F1F0EF, border 1px solid rgba(38, 38, 26, 0.08), radius 12px, padding 4px 4px

## Never
- NEVER substitute generic uncalibrated gray backgrounds for Loops’s exact #FDFDFC canvas and #F9F9F8 surface pairing.
- NEVER replace Newsreader display typography or ignore its signature scale (44px / -0.02em (w500)).
- NEVER use thick opaque borders that clash with #E9E8E6 (1px solid #E9E8E6).
- NEVER deviate from the signature button geometry (40px (Pill)) or introduce off-brand saturated gradients.
- NEVER use default browser monospace when rendering code or telemetry—always pair with SF Mono.

Full 120-line spec: https://taste-skill.pages.dev/taste/loops/
Or install the full spec
npx taste-skill add loops

Related

Similar styles

Get all 30 full SKILL.md specs (Cursor / Claude Code / Codex ready) plus the Pro growth skills.

See taste-skill Pro →