tasteskill: Anti-Slop Frontend Skill

SkillMedia

Anti-slop frontend skill for landing pages, portfolios, and redesigns. The agent reads the brief, infers the right design direction, and ships interfaces that do not look templated. Real design systems when applicable, audit-first on redesigns, strict pre-flight check.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the tasteskill: Anti-Slop Frontend Skill skill

What this skill tells your AI

The instructions your AI receives, as published by wannabespace/conar in .agents/skills/design-taste-frontend/SKILL.md and read by ahel’s review.

Landing pages, portfolios, and redesigns. Not dashboards, not data tables, not multi-step product UI. Every rule below is contextual. None of it fires automatically. First read the brief, then pull only what fits.


0. BRIEF INFERENCE (Read the Room Before Anything Else)

Before touching code or tweaking dials, infer what the user actually wants. Most LLM design output is bad because the model jumps to a default aesthetic instead of reading the room.

0.A Read these signals first

  1. Page kind - landing (SaaS / consumer / agency / event), portfolio (dev / designer / creative studio), redesign (preserve vs overhaul), editorial / blog.
  2. Vibe words the user used - "minimalist", "calm", "Linear-style", "Awwwards", "brutalist", "premium consumer", "Apple-y", "playful", "serious B2B", "editorial", "agency-y", "glassy", "dark tech".
  3. Reference signals - URLs they linked, screenshots they pasted, products they named, brands they're competing with.
  4. Audience - B2B procurement panel vs. design-conscious consumer vs. recruiter scanning a portfolio. The audience picks the aesthetic, not your taste.
  5. Brand assets that already exist - logo, color, type, photography. For redesigns, these are starting material, not optional input (see Section 11).
  6. Quiet constraints - accessibility-first audiences, public-sector, regulated industries, trust-first commerce, kids' products. These constraints OVERRIDE aesthetic preference.

0.B Output a one-line "Design Read" before generating

Before any code, state in one line: "Reading this as: <page kind> for <audience>, with a <vibe> language, leaning toward <design system or aesthetic family>."

Example reads:

  • "Reading this as: B2B SaaS landing for technical buyers, with a Linear-style minimalist language, leaning toward Tailwind utilities + Geist + restrained motion."
  • "Reading this as: solo designer portfolio for hiring managers, with an editorial / kinetic-type language, leaning toward native CSS + scroll-driven animation + custom typography."
  • "Reading this as: redesign of a public-sector service site, with a trust-first language, leaning toward GOV.UK Frontend or USWDS."

0.C If the brief is ambiguous, ask one question, do not guess

Ask exactly one clarifying question - never a multi-question dump - and only when the design read genuinely diverges. Example: "Should this feel closer to Linear-clean or Awwwards-experimental?"

If you can confidently infer from context, do not ask. Just declare the design read and proceed.

0.D Anti-Default Discipline

Do not default to: AI-purple gradients, centered hero over dark mesh, three equal feature cards, generic glassmorphism on everything, infinite-loop micro-animations everywhere, Inter + slate-900. These are the LLM defaults. Reach past them deliberately based on the design read.


1. THE THREE DIALS (Core Configuration)

After the design read, set three dials. Every layout, motion, and density decision below is gated by these.

  • DESIGN_VARIANCE: 8 - 1 = Perfect Symmetry, 10 = Artsy Chaos
  • MOTION_INTENSITY: 6 - 1 = Static, 10 = Cinematic / Physics
  • VISUAL_DENSITY: 4 - 1 = Art Gallery / Airy, 10 = Cockpit / Packed Data

Baseline: 8 / 6 / 4. Use these unless the design read overrides them. Do not ask the user to edit this file - overrides happen conversationally.

1.A Dial Inference (design read → dial values)

SignalVARIANCEMOTIONDENSITY
"minimalist / clean / calm / editorial / Linear-style"5-63-42-3
"premium consumer / Apple-y / luxury / brand"7-85-73-4
"playful / wild / Dribbble / Awwwards / experimental / agency"9-108-103-4
"landing page / portfolio / marketing site (default)"7-96-83-5
"trust-first / public-sector / regulated / accessibility-critical"3-42-34-5
"redesign - preserve"match existing+1match existing
"redesign - overhaul"+2+2match existing

1.B Use-Case Presets

Use caseVARIANCEMOTIONDENSITY
Landing (SaaS, mainstream)764
Landing (Agency / creative)983
Landing (Premium consumer)763
Portfolio (Designer / studio)873
Portfolio (Developer)654
Editorial / Blog643
Public-sector service325
Redesign - preservematchmatch+1match
Redesign - overhaul+2+2match

1.C How the Dials Drive Output

Use these (or user-overridden values) as global variables. Cross-references throughout this document refer to these exact variable names - never invent aliases like LAYOUT_VARIANCE or ANIM_LEVEL.


2. BRIEF → DESIGN SYSTEM MAP

Once you have the design read (Section 0) and dials (Section 1), pick the right foundation. Do not invent CSS for things that have an official package. Do not pretend an aesthetic trend is an official system.

2.A When to reach for a real design system (use official packages)

Brief reads as…Reach forWhy
Microsoft / enterprise SaaS / dashboards@fluentui/react-components or @fluentui/web-componentsOfficial Fluent UI, Microsoft tokens, accessibility done
Google-ish UI, Material-flavored product@material/web + Material 3 tokensOfficial, theme-able via Material Theming
IBM-style B2B / enterprise analytics@carbon/react + @carbon/stylesOfficial Carbon, mature data-density patterns
Shopify app surfacespolaris.js web components / Polaris ReactRequired for Shopify admin UI
Atlassian / Jira-style product@atlaskit/* + @atlaskit/tokensOfficial Atlassian DS
GitHub-style devtool / community page@primer/css or @primer/react-brandOfficial Primer; Brand variant for marketing
Public-sector UK servicegovuk-frontendLegally / regulatorily expected
US public-sector / trust-firstuswdsSame
Fast local-business / agency MVPBootstrap 5.3Boring, fast, works
Modern accessible React foundation@radix-ui/themesPrimitives + polished theme
Modern SaaS where you own the componentsshadcn/ui (npx shadcn@latest add ...)You own the code, easy to customise; never ship default state
Tailwind-based modern SaaS / AI marketingTailwind v4 utilities + dark: variantDefault for indie + small team builds

Honesty rule: if the brief reads as one of the systems above, install and use the official package. Do not recreate its CSS by hand. Do not import a system's tokens but then override 90% of them.

One system per project. Do not mix Fluent React with Carbon in the same tree. Do not import shadcn/ui components into a Material 3 app.

2.B When the brief is an aesthetic, not a system

For these directions, there is no single official package. Build with native CSS + Tailwind + a maintained component library. Be honest in code comments about what is borrowed inspiration vs. official material.

AestheticHonest implementation
Glassmorphism / "frosted glass"backdrop-filter, layered borders, highlight overlays. Provide solid-fill fallback for prefers-reduced-transparency.
Bento (Apple-style tile grids)CSS Grid with mixed cell sizes. No single library owns this.
BrutalismNative CSS, monospace, raw borders. No library.
Editorial / magazineSerif type, asymmetric grid, generous whitespace. No library.
Dark tech / hackerMono + accent neon, terminal motifs. No library.
Aurora / mesh gradientsSVG or layered radial gradients. No library.
Kinetic typographyNative CSS animations, scroll-driven animations, GSAP for hijacks. No library.
Apple Liquid GlassApple documents this for Apple platforms only. There is no official liquid-glass.css. Web implementations are approximations using backdrop-filter + layered borders + highlights. Label clearly as approximation.

3. DEFAULT ARCHITECTURE & CONVENTIONS

Unless the design read picks a real design system (Section 2.A), these are the defaults:

3.A Stack

  • Framework: React or Next.js. Default to Server Components (RSC).
    • RSC SAFETY: Global state works ONLY in Client Components. In Next.js, wrap providers in a "use client" component.
    • INTERACTIVITY ISOLATION: Any component using Motion, scroll listeners, or pointer physics MUST be an isolated leaf with 'use client' at the top. Server Components render static layouts only.
  • Styling: Tailwind v4 (default). Tailwind v3 only if the existing project demands it.
    • For v4: do NOT use tailwindcss plugin in postcss.config.js. Use @tailwindcss/postcss or the Vite plugin.
  • Animation: Motion (the library formerly known as Framer Motion). Import from motion/react (import { motion } from "motion/react"). The framer-motion package still works as a legacy alias - prefer motion/react in new code.
  • Fonts: Always use next/font (Next.js) or self-host with @font-face + font-display: swap. Never link Google Fonts via <link> in production.

3.B State

  • Local useState / useReducer for isolated UI.
  • Global state ONLY for deep prop-drilling avoidance - Zustand, Jotai, or React context.
  • NEVER use useState to track continuous values driven by user input (mouse position, scroll progress, pointer physics, magnetic hover). Use Motion's useMotionValue / useTransform / useScroll. useState re-renders the React tree on every change and collapses on mobile.

3.C Icons

  • Allowed libraries (priority order): @phosphor-icons/react, hugeicons-react, @radix-ui/react-icons, @tabler/icons-react.
  • Discouraged: lucide-react. Acceptable only when the user explicitly asks for it or the project already depends on it.
  • NEVER hand-roll SVG icons. If a glyph is missing, install a second library or compose from primitives - do not draw icon paths from scratch.
  • One family per project. Do not mix Phosphor with Lucide in the same component tree.
  • Standardize strokeWidth globally (e.g. 1.5 or 2.0).

3.D Emoji Policy

Discouraged by default in code, markup, and visible text. Replace symbols with icon-library glyphs. Override: allow emojis only when the user explicitly asks for a playful / chat-style / social-native vibe - and even then use them sparingly with intent.

3.E Responsiveness & Layout Mechanics

  • Standardize breakpoints (sm 640, md 768, lg 1024, xl 1280, 2xl 1536).
  • Contain page layouts using max-w-[1400px] mx-auto or max-w-7xl.
  • Viewport Stability: NEVER use h-screen for full-height Hero sections. ALWAYS use min-h-[100dvh] to prevent layout jumping on mobile (iOS Safari address bar).
  • Grid over Flex-Math: NEVER use complex flexbox percentage math (w-[calc(33%-1rem)]). ALWAYS use CSS Grid (grid grid-cols-1 md:grid-cols-3 gap-6).

3.F Dependency Verification (mandatory)

Before importing ANY 3rd-party library, check package.json. If the package is missing, output the install command first. Never assume a library exists.


4. DESIGN ENGINEERING DIRECTIVES (Bias Correction)

LLMs default to clichés. Override these defaults proactively. Each rule has a context-aware override path.

4.1 Typography

  • Display / Headlines: Default text-4xl md:text-6xl tracking-tighter leading-none.

  • Body / Paragraphs: Default text-base text-gray-600 leading-relaxed max-w-[65ch].

  • Sans font choice:

    • Discouraged as default: Inter. Pick Geist, Outfit, Cabinet Grotesk, Satoshi, or a brand-appropriate serif first.
    • Override: Inter is acceptable when the user explicitly asks for a neutral / standard / Linear-style feel, or when the brief is a public-sector / accessibility-first site.
  • Pairings to know: Geist + Geist Mono, Satoshi + JetBrains Mono, Cabinet Grotesk + Inter Tight, GT America + IBM Plex Mono.

  • SERIF DISCIPLINE (VERY DISCOURAGED AS DEFAULT):

    • Serif is very discouraged as the default font for any project. "It feels creative / premium / editorial" is NOT a reason to reach for serif. The agent's default mental model that "creative brief = serif" is the single most-tested AI tell in production rounds.
    • Serif is only acceptable when ONE of these is explicitly true:
      • The brand brief literally names a serif font, OR
      • The aesthetic family is genuinely editorial / luxury / publication / manuscript / heritage / vintage AND you can articulate why this specific serif fits this specific brand
    • For everything else (creative agency, design studio, modern brand, premium consumer, portfolio, lifestyle), default sans-serif display (Geist Display, ABC Diatype, Söhne Breit, Cabinet Grotesk Display, Migra Sans, GT Walsheim, Inter Display, PP Neue Montreal). Sans display fonts are not "boring" — they are the default for the same reason black is the default in fashion.
    • EMPHASIS RULE (related): When you want to emphasize a word within a headline (the kinetic "and spatial design" type move), use italic or bold of the SAME font. Do NOT inject a random serif word into a sans headline (or vice versa) just to add visual interest. Mixed-family emphasis is amateur. Italic/bold emphasis in the same family is the right move.
    • Specifically BANNED as defaults: Fraunces and Instrument_Serif (the two LLM-favorite display serifs).
    • If a serif is justified (rare, per the above), rotate from this pool, do NOT reuse the same serif across consecutive projects: PP Editorial New, GT Sectra Display, Cardinal Grotesque, Reckless Neue, Tiempos Headline, Recoleta, Cormorant Garamond, Playfair Display, EB Garamond, IvyPresto, Migra, Editorial Old, Saol Display, Söhne Breit Kursiv, Domaine Display, Canela, Schnyder, Tobias, NB Architekt, ITC Galliard.
  • ITALIC DESCENDER CLEARANCE (mandatory): When italic is used in display type and the word contains a descender letter (y g j p q), leading-[1] or leading-none will clip the descender. Use leading-[1.1] minimum and add pb-1 or mb-1 reserve on the wrapping element. Audit every italic word in display headlines before shipping.

4.2 Color Calibration

  • Max 1 accent color. Saturation < 80% by default.

  • THE LILA RULE: The "AI Purple / Blue glow" aesthetic is discouraged as a default. No automatic purple button glows, no random neon gradients. Use neutral bases (Zinc / Slate / Stone) with high-contrast singular accents (Emerald, Electric Blue, Deep Rose, Burnt Orange, etc.).

  • Override: if the brand or brief explicitly asks for purple / violet / lila, embrace it. But execute with intent: consistent palette, harmonised neutrals, restrained gradients. Not generic AI gradient slop.

  • One palette per project. Do not fluctuate between warm and cool grays within the same project.

  • COLOR CONSISTENCY LOCK (mandatory): Once an accent color is chosen for a page, it is used on the WHOLE page. A warm-grey site does not suddenly get a blue CTA in section 7. A rose-accented site does not get a teal status badge in the footer. Pick one accent, lock it, audit every component before shipping.

  • PREMIUM-CONSUMER PALETTE BAN (mandatory, second-most-recurring AI-tell):

    • For premium-consumer briefs (cookware, wellness, artisan, luxury, heritage craft, DTC home goods, etc.) the LLM default is warm beige/cream + brass/clay/oxblood/ochre + espresso/ink dark text. Concretely banned hex families as default backgrounds and accents:
      • Backgrounds: #f5f1ea, #f7f5f1, #fbf8f1, #efeae0, #ece6db, #faf7f1, #e8dfcb (all "warm paper / cream / chalk / bone")
      • Accents: #b08947, #b6553a, #9a2436, #9c6e2a, #bc7c3a, #7d5621 (all "brass / clay / oxblood / ochre")
      • Text: #1a1714, #1a1814, #1b1814 (all "espresso / warm near-black")
    • This palette is BANNED as the default reach for premium-consumer briefs. Every premium-consumer site you have ever shipped uses this exact palette. The brand becomes invisible.
    • Default alternatives (rotate, do not reuse):
      • Cold Luxury: silver-grey + chrome + smoke (think Tesla, Apple Watch Hermes-without-the-leather)
      • Forest: deep green + bone + amber accent (think Filson, Patagonia premium)
      • Black and Tan: true off-black + warm tan, sharp contrast, no beige
      • Cobalt + Cream: saturated blue against a single neutral, no brass
      • Terracotta + Slate: warm rust against cool grey, no brass
      • Olive + Brick + Paper: muted olive plus brick-red accent
      • Pure monochrome + single saturated pop: off-white + off-black + one bright accent (electric blue, emerald, hot pink, etc.)
    • Palette-rotation rule: if the previous premium-consumer project you generated used the beige+brass family, this one MUST use a different family. Do not ship the same warm-craft palette twice in a row.
    • Override: the beige+brass+espresso palette is acceptable ONLY when the brand brief explicitly names those colors, or when the brand identity is genuinely vintage / artisan / warm-craft AND you can articulate why this specific palette fits this specific brand. Default-reaching for it because "this is a cookware brief" is banned.

4.3 Layout Diversification

  • ANTI-CENTER BIAS: Centered Hero / H1 sections are avoided when DESIGN_VARIANCE > 4. Force "Split Screen" (50/50), "Left-aligned content / right-aligned asset", "Asymmetric white-space", or scroll-pinned structures.
  • Override: centered hero is OK for editorial / manifesto / launch-announcement briefs where the message itself is the design.

4.4 Materiality, Shadows, Cards

  • Use cards ONLY when elevation communicates real hierarchy. Otherwise group with border-t, divide-y, or negative space.
  • When a shadow is used, tint it to the background hue. No pure-black drop shadows on light backgrounds.
  • For VISUAL_DENSITY > 7: generic card containers are banned. Data metrics breathe in plain layout.
  • SHAPE CONSISTENCY LOCK (mandatory): Pick ONE corner-radius scale for the page and stick to it. Options: all-sharp (radius 0), all-soft (radius 12-16px), all-pill (full radius for interactive). Mixed systems are allowed only when there is a documented rule (e.g. "buttons are full-pill, cards are 16px, inputs are 8px") and that rule is followed everywhere. Round buttons in a square layout, or square cards on a pill-button page, is broken design.

4.5 Interactive UI States

LLMs default to "static successful state only." Always implement full cycles:

  • Loading: Skeletal loaders matching the final layout's shape. Avoid generic circular spinners.
  • Empty States: Beautifully composed; indicate how to populate.
  • Error States: Clear, inline (forms), or contextual (toasts only for transient).
  • Tactile Feedback: On :active, use -translate-y-[1px] or scale-[0.98] to simulate a physical push.
  • BUTTON CONTRAST CHECK (mandatory, a11y): Before shipping any button, verify the button text is readable against the button background. White button + white text, bg-white CTA with text-white label, transparent button against the page background with no border → all banned. Audit every CTA: contrast ratio WCAG AA min (4.5:1 for body, 3:1 for large text 18px+). Same rule applies to ghost buttons over photographic backgrounds (use a backdrop, scrim, or stroke).
  • CTA BUTTON WRAP BAN (mandatory): Button text MUST fit on one line at desktop. If a label like "VIEW SELECTED WORK" wraps to 2 or 3 lines, the button is broken. Fix by EITHER shortening the label (3 words max for primary CTAs, ideally 1-2) OR widening the button (do not artificially constrain max-width on CTAs). Wrapped CTAs at desktop are a Pre-Flight Fail.
  • NO DUPLICATE CTA INTENT (mandatory): Two CTAs with the same intent on one page is a Pre-Flight Fail. Examples of same intent: "Get in touch" + "Contact us" + "Let's talk" + "Start a project" + "Start something" + "Reach out" = all "contact" intent → pick ONE label and use it everywhere on the page (nav, hero, footer). Same for "Try free" + "Get started" + "Sign up free" (all "signup" intent) and "View work" + "See selected work" + "Browse projects" (all "portfolio" intent). One label per intent.
  • FORM CONTRAST CHECK (mandatory, a11y): Form inputs, placeholder text, focus rings, helper text, and error text all pass WCAG AA contrast against the section background. Light placeholders on a near-white form, white form on white page section, form labels grayer than 4.5:1 contrast → all banned. Audit every form before shipping.

4.6 Data & Form Patterns

  • Label ABOVE input. Helper text optional but present in markup. Error text BELOW input. Standard gap-2 for input blocks.
  • No placeholder-as-label. Ever.

4.7 Layout Discipline (Hard Rules. Failing any of these is shipping broken work)

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
1k
Forks
107
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
design-taste-frontend-wannabespace
Source
github.com/wannabespace/conar