Atelier foundations
Atelier - a premium, anti-slop frontend design skill suite for Claude Code: 11 skills + a deepdive knowledge base.
npx -y skills add luminary19/atelier --skill atelier-foundationsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Atelier suite — the design-system engine. Build the token foundation that makes a frontend look coherent and "expensive": a perceptual OKLCH color system (ramps + semantic tokens + accessible dark mode), a modular + fluid type scale, an 8-point spacing scale, and depth (radii, shadows, grain). Outputs ready-to-use CSS custom properties, Tailwind v4 @theme (mapped to shadcn/ui theme variables), or W3C/DTCG design tokens. Use this whenever starting any frontend that needs a consistent visual system, when building a color palette / design tokens / chart & data-viz palettes / theme / dark mode, or when colors, spacing, or sizing feel inconsistent, muddy, or generic. Run after atelier-direction; before building components. (Choosing and setting the actual fonts → atelier-typography; scaffolding and building components → atelier-components.)
SKILL.md
11.5 KB, as published. Nobody here has run it
Atelier — Design-System Foundations
The engine of the suite. "Expensive" is not a trick — it's a system showing through. Coherent
color, spacing, and type tokens are what separate bespoke-looking work from a pile of one-off values.
This skill turns a Direction Doc into a real, reusable token system that atelier-typography and
atelier-layout (and your components) consume.
Project memory: if
ATELIER.mdexists, read it first and honor its register, palette mood, and anti-references. Identity preservation wins: if the project already has committed brand colors/tokens (existing CSS vars, a theme file, recognizable brand hexes), preserve them and build the system around them — don't regenerate a palette over a real brand. Capture the result back inATELIER.md's Tokens section. Set up memory with/atelier init(theatelierrouter).Inputs: the Direction Doc from
atelier-direction(palette mood, type voice, density, light/dark). Outputs: tokens as CSS vars / Tailwind v4@theme/ DTCG JSON. Deep reference:references/fundamentals-deepdive.md(§7 Color, §8 Layout & Composition → spacing, §9 Design Systems → DTCG tokens).Data —
atelier-data(seed only): per-product-type shadcn-token palettes viascripts/search.py "<product>" --domain color. These are raw Tailwind hex stops — use as a starting hue set, then rebuild the system here in OKLCH and re-check contrast before shipping.
Token architecture (build in this order)
Three tiers, always. This is what makes theming and dark mode trivial later.
- Primitive / ramp — raw values, no meaning:
--blue-50 … --blue-950,--space-1 … --space-12. - Semantic / alias — intent, referencing primitives:
--bg,--surface,--border,--text,--text-muted,--primary,--danger. This tier carries the brand and enables theming — dark mode = remap semantics, never touch components. - Component (optional) — component-scoped:
--button-bg,--card-padding, referencing semantics.
Rule: components consume tier 2/3, never hard-code a primitive. Get this right and dark mode is a 20-line remap instead of a rewrite.
1. Color — build in OKLCH
Build the whole color system in OKLCH, not HSL/hex. HSL lies about lightness (same L% looks far
brighter for yellow than blue), so HSL ramps are perceptually uneven and dark themes go muddy. OKLCH is
perceptually uniform, hue-stable, and P3-capable. Full method, ready-to-tweak ramps, and the Radix
12-step role mapping are in references/color-oklch.md. The short version:
- Brand ramp: fix the hue
H, sweep lightnessLevenly from ~0.97 (step 50) to ~0.20 (step 950), and curve chromaC— low at the light end, peaking around step 500–600, tapering at the dark end.oklch(L C H). - Neutrals: a gray ramp with a tiny chroma tinted toward the brand temperature (
C ≈ 0.01–0.02). Pure-gray neutrals read clinical; a whisper of brand tint reads designed. - Accent: usually one. Monochrome + a single saturated accent is the safest "premium" move.
- Avoid the cream/sand/beige default. The warm-neutral band (OKLCH
L 0.84–0.97, C < 0.06, hue 40–100) reads as paper/parchment no matter what you name it, and is the saturated AI body background of 2026. Token names like--paper,--cream,--sand,--bone,--linen,--parchment,--ivory,--oatare tells in themselves (theatelier-perf-a11ydetector flags them). If the brief says "warm / editorial / cozy," carry the warmth in the accent + type + imagery, not the body bg: pick a saturated brand body, a true off-white at chroma ~0, or a clearly-branded mid-tone. Tint neutrals toward the brand hue by onlyC ≈ 0.005–0.02, deliberately — never "warm by default." - Map semantics to ramp steps using the Radix 12-step roles (1 app bg → 9 solid/CTA → 12 high- contrast text). See the reference for the full table.
- Relative color for variants:
oklch(from var(--primary) calc(l - 0.08) c h)for a hover state — keeps hue/chroma locked. Orcolor-mix(in oklch, …)(Baseline Widely Available Nov 2025) to derive state/tint ramps from a semantic token (color-mix(in oklch, var(--primary) 12%, transparent)for a scrim) — no Sass. Mix inoklch, not sRGB, or midpoints muddy. - Support: base
oklch()~93%, relative-color syntax ~86% — both production-safe behind a plain-color fallback declaration. Keep the brand ramp inside sRGB; treat extra chroma as a P3 opt-in (@media (color-gamut: p3)), since out-of-gamut values gamut-map per-engine and can shift. - Data-viz palettes — categorical (rotate hue at fixed L/C), sequential, diverging, and colorblind-safe
rules + the
--chart-Ntokens live inreferences/color-oklch.md, built foratelier-datavizto consume.
2. Type scale (tokens only — craft lives in atelier-typography)
Emit the scale here as tokens; atelier-typography picks the actual fonts and detailing.
- Modular scale: base 16–18px × a ratio (1.2 conservative UI, 1.25 web default, 1.333+ marketing, 1.618 dramatic). Keep it to ~5–7 steps — fewer sizes = more consistent.
- Fluid: make each step
clamp(min, intercept_rem + slope·100vw, max). Always keep aremterm in the preferred value or you break browser zoom (WCAG 1.4.4). The math + a generator is inreferences/tokens-and-output.md; or compute via utopia.fyi. - Token names:
--text-xs … --text-5xl, plus--leading-tight/normal/relaxedand--tracking-tight.
3. Spacing, radii, depth
- Spacing: 8-point grid (
--space-1: 4pxsub-unit, then 8/16/24/32/48/64…). Viewport widths divide cleanly by 8; it kills decision fatigue and gives consistent rhythm. Tight UIs may use the 4px sub-unit more. - Density (from the Direction Doc) sets where on the scale you live + the
--section-ymacro rhythm: airy → bias to the larger steps, wide--section-y(clamptoward the top); balanced → mid; packed → lean on the 4px sub-unit and tighter steps. Same scale, different default reach. - Radii: a small scale (
--radius-sm/md/lg/xl, e.g. 6/10/16/24px). Pick one family and stick to it (sharp = brutalist/Swiss; large/continuous = soft/premium). - Depth: elevation via soft, layered, low-opacity shadows (ambient + direct) in light mode; in
dark mode use lighter surfaces, not shadows (shadows are nearly invisible on dark). See
references/dark-mode-and-depth.md. - Grain: the single highest-ROI "expensive" tactic — an SVG
feTurbulenceoverlay at opacity 0.03–0.08 withmix-blend-mode: overlay. Kills gradient banding, adds analog depth. Recipe in the depth reference.
4. Dark mode
If the direction is dark (or supports both), build it as a semantic remap, not a second palette:
- Base is charcoal/ink, never
#000(oklch(~0.16–0.22 …)≈#0a0a0f–#141416). Pure black causes text halation and leaves no room to show elevation. - Elevation by lightness: surfaces step lighter (
rgba(255,255,255,.03)→.06→.09overlays, or stepped L), not by shadow. - Desaturate accents ~10–15% — full-saturation brand colors vibrate on dark.
- Text: off-white (~
L 0.92), muted ~L 0.70. Re-check contrast (APCA is better here than WCAG 2 ratios). - Authoring: the cleanest way to express each semantic token is
light-dark()(Baseline; needscolor-scheme: light darkon:root) —color: light-dark(<light>, <dark>)follows the theme toggle with no[data-theme]media query. - Beyond dark: the same semantic remap yields multi-theme for free — sub-brands, a first-class
high-contrast variant, and a one-hue user-customizable accent. Recipes in
references/dark-mode-and-depth.md.
5. Output
Detect the stack first. If the project already uses Tailwind (a tailwindcss dependency or
@import "tailwindcss"), default to Tailwind v4 + shadcn/ui (the suite's house stack) — emit tokens as
@theme in CSS and map them to shadcn's semantic token names so components inherit the system for free.
If there's no Tailwind (vanilla, Rails, Laravel, Django, Astro-no-Tailwind), default to CSS custom
properties instead — don't impose Tailwind on a codebase that isn't using it. Use DTCG JSON when a design
team / multi-platform pipeline exists. Full copy-paste templates in
references/tokens-and-output.md:
- Tailwind v4 + shadcn (DEFAULT) —
@theme { --color-…; --spacing-…; --font-… }in CSS (v4 is CSS-first, OKLCH-native, notailwind.config.js) + the shadcn--background/--foreground/--primary/…mapping. - CSS custom properties (
:root+[data-theme="dark"]) — portable fallback for vanilla / other frameworks. - DTCG / W3C design tokens JSON (+ Style Dictionary) — when a design team / multi-platform pipeline exists.
6. Contrast gate (don't ship without it)
- Conformance: WCAG 2.2 AA — body text ≥ 4.5:1, large text & UI/icons/focus ≥ 3:1 (WebAIM checker).
- Design with APCA for fidelity, especially dark mode (Lc 90 body / 75 min / 45 headlines). APCA is not yet a conformance standard — certify with 2.x, tune with APCA.
- Never rely on color alone (pair with text/icon/shape). Verify the
--primarysolid and all text tokens against their backgrounds before handoff. - For a dynamic/data-driven accent, let the browser pick the readable foreground:
contrast-color(var(--brand))(Baseline Apr 2026) returns black or white — kills the "is white text readable on this accent?" guess for buttons/badges. Returns black/white only; provide a static@supportsfallback for older engines. - This is the design-time check;
atelier-perf-a11yre-verifies contrast at ship time (computed from rendered pixels, in every theme) — the accent-as-text-on-light pair is the usual failure.
Operating principles
- Three tiers or it isn't a system. Hard-coded hex/px scattered through components is the #1 cause of incoherent, cheap-looking UI.
- OKLCH everywhere. It's why the ramps look evenly stepped and the dark theme isn't muddy.
- One accent, tinted neutrals, real grain. These three quietly do most of the "expensive" work.
- Default to Tailwind v4
@theme+ shadcn token names; drop to CSS custom properties or DTCG only when the project clearly isn't Tailwind. One source of truth either way — components reference semantic names, never primitives.