Skip to content
Back to skills

Css Theming

ASecurity

Build a custom-property token system with primitive and semantic tiers that supports runtime theme switching. Use when setting up design tokens, adding themes, or refactoring hardcoded colors.

  • 7 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 5, 2026
ai-agentsrefactoring

Security analysis

A100/100

Scanned September 5, 2026

npx -y skills add Amey-Thakur/AI-SKILLS --skill css-theming --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Css Theming?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Css Theming
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/amey-thakur-css-theming/badge)](https://www.skillsdirectory.com/skills/amey-thakur-css-theming)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: css-theming
description: Build a custom-property token system with primitive and semantic tiers that supports runtime theme switching. Use when setting up design tokens, adding themes, or refactoring hardcoded colors.
---

# CSS theming

A theme is a mapping from meaning to value. Components consume meaning
("surface", "accent"); themes redefine the values; nobody touches
component CSS to restyle the product.

## Method

1. **Two tiers of tokens.** Primitives name values
   (`--blue-600: #2563eb`); semantics name roles
   (`--color-accent: var(--blue-600)`). Components use only semantic
   tokens. The primitive tier changes when the palette changes; the
   semantic tier changes when design language changes; components change
   for neither.
2. **Scope themes to an attribute on :root.**
   `:root { ... }` holds the default;
   `:root[data-theme="dark"] { --color-surface: ... }` overrides only
   semantic values. Switching is one attribute flip, inheritable
   everywhere, no class sprawl.
3. **Name by role, not appearance.** `--color-danger`, not `--color-red`:
   the danger color may not be red in every theme. Scale names
   (`--space-1..8`, `--text-sm/base/lg`) beat value names (`--space-4px`)
   because the scale can be retuned.
4. **Keep the semantic set small and complete.** Surface, surface-raised,
   border, text (2-3 strengths), accent, danger/success/warning, focus
   ring. Every hardcoded hex in component CSS is a future theming bug;
   lint for raw color values outside the token files.
5. **Respect the user first paint.** Apply the stored theme before CSS
   loads (inline script setting `data-theme`), default from
   `prefers-color-scheme`, and set the `color-scheme` property so form
   controls and scrollbars match. A white flash before dark mode is a
   token system applied too late.
6. **Derive sparingly with color functions.** `color-mix(in oklch, ...)`
   and `oklch()` relative colors can generate hover states from base
   tokens, cutting token count; keep derivations in the token layer so
   components stay ignorant of the math.

## Boundaries

- Tokens do not enforce contrast; themes need their own accessibility
  pass (see color-contrast).
- Per-component theme overrides (a dark card on a light page) work by
  re-scoping the semantic tokens on that subtree, not by forking the
  component's CSS.
- Design-tool token sync (Figma variables to CSS) is a build pipeline
  concern; hand-editing generated token files breaks the loop.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…