Shade no dark variants

Shade no dark variants is a skill for Claude Code, Codex from TryGhost/Ghost. It costs 0 tokens per session (564 once invoked), scanned A, original, MIT.

A coding rule for Shade-based admin apps that use shared colour tokens for light and dark mode. It says to use those tokens instead of separate Tailwind `dark:` colour classes.

In plain words
What is it for?
Use it when editing TSX colour classes for surfaces, text, borders, or similar UI elements in Shade-consuming apps.
Why use it?
It prevents duplicate or conflicting colour rules and keeps dark-mode behaviour in one place. It also avoids raw colour choices that do not follow the app's design system.

Skill for Claude CodeCodex

About the project

Ghost is a publishing platform for creating websites, blogs, memberships, subscriptions, and newsletters. Publishers and developers can use it through managed hosting or run it themselves, while contributors work on its monorepo, themes, and API.

TryGhost/Ghost · 55,162 stars · on GitHub

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add skills/tryghost/ghost/shade-no-dark-variants
Any agent
npx skills add TryGhost/Ghost --skill shade-no-dark-variants
Clone the repo
git clone --depth 1 https://github.com/TryGhost/Ghost

Made for: Claude Code, Codex.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for Shade no dark variants

README.md
[![agentmods](https://agentmods.dev/badge/skills/tryghost/ghost/shade-no-dark-variants.svg)](https://agentmods.dev/skills/tryghost/ghost/shade-no-dark-variants)
Your own site
<a href="https://agentmods.dev/skills/tryghost/ghost/shade-no-dark-variants"><img src="https://agentmods.dev/badge/skills/tryghost/ghost/shade-no-dark-variants.svg" alt="Measured on agentmods" height="20"></a>
Per session 0 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 564 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00000 $0.00564
Opus 5 $0.00000 $0.00282
Sonnet 5 $0.00000 $0.00113
Haiku 4.5 $0.00000 $0.00056

Measured 5d ago against content hash dfd1ea160b07, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

Shade no dark variants scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.agents/skills/shade-no-dark-variants/SKILL.md · 51 lines

How it starts

The opening of the file, as written. The whole thing — 51 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Shade — don't use dark: for colour

Shade's semantic tokens (bg-background, text-foreground, border-border-default, bg-surface-elevated, …) already flip between light and dark mode. Writing dark:bg-... / dark:text-... / dark:border-... means the engineer reached for a raw, non-semantic token — fix the token, don't patch with a dark: variant.

Correct

<div className="bg-surface-elevated border border-border-default text-foreground">
    <p className="text-muted-foreground">Hint text</p>
</div>

Incorrect

// BAD — using dark: to patch a raw palette utility
<div className="bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100">

// BAD — redundant: the semantic token already flips itself, so the dark: variant adds a duplicate rule that does nothing. Reading it suggests dark mode is special-cased here when it isn't.
<div className="bg-surface-elevated dark:bg-surface-elevated">

How to fix a dark: smell

  1. Identify what the class describes — surface? text? border? hover?
  2. Pick the matching semantic token (see the shade-tokens-not-hex skill for the inventory).
  3. Drop both the light and the dark: halves; the token handles both modes.

Exceptions

Assets that are genuinely different in dark mode and can't be expressed as a token:

  • Logos and brand marks
  • Illustrations / SVG art
  • Screenshots or imagery

For these, dark: is fine because there's nothing semantic to express.

Some existing Shade components also use dark: for ring opacity (e.g. dark:ring-destructive/40 inside inputSurface). When a token doesn't exist for the variant you need and the value is an opacity modifier on an existing token, a narrow dark: is acceptable — but first check whether a new token belongs in theme-variables.css.

When debugging dark mode

If something looks wrong only in dark mode, the fix is almost always wrong token, not missing dark: variant. Re-pick from the semantic surface table; check apps/shade/theme-variables.css for what each token resolves to.

Read the full file on GitHub · 51 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 5d ago First seen · 51 lines · 0 tokens per session scan A dfd1ea160b07

Subscribe to this mod's changes

Shade no dark variants is a skill published in the GitHub repository TryGhost/Ghost (55,162 stars, last pushed today), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 564 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.

Related

Other skills, from other repositories

cms-metadata-writer

Writes structured metadata fields — title tag, meta description, tags, category, slug, and Open Graph text — for a CMS entry, optimized for search discoverability and social sharing.

ur-grue/autopunk-media-skills · 42 tokens

cms-metadata-tagger

Takes a finished piece of content and produces a complete, archive-ready metadata record — including descriptive tags, subject classifications, rights notes, and an archival summary — for entry into a content management or digital archive system.

ur-grue/autopunk-media-skills · 49 tokens

ui4-review

Review UI4 CSS migrations for proper token usage. Checks that CSS variables are used instead of hardcoded values.

payloadcms/payload · 26 tokens

video-shot-demos

为视频/课程/解说文案制作"每镜头一个 HTML"的高完成度网页演示动画(分镜演示页、视频配套演示动画、录屏用动画网页、科普/技术/产品发布可视化镜头)。只要用户提到:给视频做演示动画网页、分镜 HTML、shot 页面、把口播稿/大纲做成动画、视频画面设计网页版、录一段网页动画、或要求改造升级一批已有演示页——就用本 Skill。核心是统一的电影化播放器机制 + 每页完全不同的视觉风格 + 镜头语言 + 同步音效 + 角色表情吐槽,内容完全开放不设限。.

Unclecheng-li/AI_Animation · 166 tokens

intlayer-content

Define rich content structures using Intlayer content nodes. Use when the user asks to "create translations", "handle pluralization", "use markdown in content", or implement "conditional content".

aymericzip/intlayer · 41 tokens

intlayer-angular

Integrates Intlayer internationalization with Angular applications. Use when the user asks to "setup Angular i18n", create a new translated component, use the "useIntlayer" composable, or configure providers.

aymericzip/intlayer · 47 tokens