Skip to content
Agentmart
Submit a tool

design-token-naming

SUPERSEDED by `token-naming-conventions` (L0) + `udts-naming-convention` (L2, incubating) — see the design-catalog section of the README; kept unchanged…

Skill by thrillmade

IndexedMIT★ 2
Write a review

Chalk Labs

Need help deploying design-token-naming?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/thrillmade-design-token-naming

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

SUPERSEDED by `token-naming-conventions` (L0) + `udts-naming-convention` (L2, incubating) — see the design-catalog section of the README; kept unchanged during the tokenomics migration window, new work should load the successors. Use when designing, auditing, or critiquing a design-token naming scheme. Names the UDTS convention — hyphen-separated names where the prefix declares the token's class (contrast-bound vs free) and kind (text / surface / border / ui / illustration / decorative / brand-spot), with the class redundantly encoded in `$extensions.udts.class`. Names the hue-angle primitive convention (`teal-180` not `accent-teal`), the role + stop convention for color-mode tokens (`primary-contrast-500`, `surface-fixed-100`), the two component-token chain shapes (direct vs via-semantic), and the rule that themes and density go in the theme layer, not the token name. Cite when an agent proposes dot-separated paths, semantic primitive names, or naming patterns where class isn't derivable from the prefix.

Use cases: design, frontend, agent-building

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/design-token-naming

What's inside

Skill name
design-token-naming
Description
SUPERSEDED by `token-naming-conventions` (L0) + `udts-naming-convention` (L2, incubating) — see the design-catalog section of the README; kept unchanged during the tokenomics migration window, new work should load the successors. Use when designing, auditing, or critiquing a design-token naming scheme. Names the UDTS convention — hyphen-separated names where the prefix declares the token's class (contrast-bound vs free) and kind (text / surface / border / ui / illustration / decorative / brand-spot), with the class redundantly encoded in `$extensions.udts.class`. Names the hue-angle primitive convention (`teal-180` not `accent-teal`), the role + stop convention for color-mode tokens (`primary-contrast-500`, `surface-fixed-100`), the two component-token chain shapes (direct vs via-semantic), and the rule that themes and density go in the theme layer, not the token name. Cite when an agent proposes dot-separated paths, semantic primitive names, or naming patterns where class isn't derivable from the prefix.
License
MIT
Instructions
120 lines in SKILL.md · view on GitHub

Files (1)

  • SKILL.md

SKILL.md (first lines)

# Design-token naming

UDTS names tokens so that an agent or linter can derive the token's class and contrast obligation *from the name alone*. The naming convention is hyphen-separated, prefix-loaded, and redundantly encoded in DTCG `$extensions.udts.class` so a validator catches mismatches.

## When to use

- Designing a new token naming convention for a system that needs to be AI-legible.
- Auditing existing tokens that drift across naming styles (dot-paths, BEM, T-shirt-only, etc.).
- Adding a new component or token family — picking the prefix is the load-bearing decision.
- Code review: flag tokens whose prefix doesn't match their class, or tokens that hide their class in metadata instead of the name.

## When NOT to use

- One-off internal tokens that never leave the file (CSS-variable convenience for a single component). The naming discipline isn't earned at that scope.
- Adapting an existing system that uses a different convention (Material 3 roles, Tailwind utilities, Radix layers). Don't propose UDTS naming as a rename project — use it for new systems or for the boundary layer.

## The prefix-loaded convention

Every UDTS token name is `<prefix>-<role-or-kind>-<modifier>-<stop>-<state>`. The first segment — the **prefix** — declares the token's [class](https://github.com/thrillmade/agent-skills/tree/main/skills/apca-contrast) (contrast-bound vs free, defined in [apca-contrast](../apca-contrast/SKILL.md)) and kind (text / surface / border / ui / illustration / decorative / brand-spot, defined in the UDTS spec).

### Contrast-bound prefixes

| Prefix family | Kind | Examples |
|---|---|---|
| `content-*` | text | `content-primary`, `content-secondary`, `content-on-primary`, `content-disabled` |
| `surface-*` | surface | `surface-base`, `surface-raised`, `surface-overlay`, `surface-inverse` |
| `border-*` | border | `border-subtle`, `border-default`, `border-strong`, `border-focus` |
| `button-*`, `chip-*`, `control-*`, `link-*`, `ui-*` | ui | `button-bg-primary-default`, `chip-text-info`, `control-border-error-focus` |

All of these carry the `contrast-bound` class and an APCA + WCAG pairing obligation.

> The `content-*` family's prefix doesn't match its kind (`text`) literally — historical legibility (designers think in "content") outweighs strict 1:1 prefix-to-kind mapping. The `$extensions.udts.kind` field is the canonical kind; the prefix is the canonical class.

### Free prefixes

| Prefix family | Kind | Examples |
|---|---|---|
| `illustration-*` | illustration | `illustration-hero-warm`, `illustration-empty-state-1` |
| `decorative-*` | decorative | `decorative-chart-1`, `decorative-divider-tint` |
| `brand-spot-*` | brand-spot | `brand-spot-red`, `brand-spot-logo-blue` |

All of these carry the `free` class — no APCA + WCAG check at generation, no pairing obligation.

## Hue-angle primitive naming

Color primitives use the **hue angle** in OKLCH degrees, not a semantic label:

```
red-30        orange-60      yellow-90
lime-120      green-150      teal-180
sky-200       blue-220       indigo-260
purple-280    pink-320
```

Adding a new hue doesn't renumber existing ones; the angle is load-bearing. **Reserve semantic labels (`accent-teal`, `primary`, `brand`) for the theme layer above primitives.**

The full primitive name carries the variant and stop: `teal-180-harmony-500`, `purple-280-max-100`.

## Color-mode token naming (varies / fixed)

Color-mode tokens are emitted per (role, stop) combination per palette role. The naming pattern:

```
<role>-<mode-behavior>-<stop>
e.g.
  primary-contrast-500     (varies between light and dark by stop math)
  primary-fixed-500        (same primitive in every declared mode)
  neutral-contrast-100
  danger-fixed-700
```

`contrast-N` is the token-name pattern for `mode-behavior: "varies"`; `fixed-N` is the pattern for `mode-behavior: "fixed"`.

## Component token chain shapes

UDTS has two resolution-chain shapes; the naming reflects which one a token uses:

**Direct shape** (component already names role + stop):
```
button-bg-primary-default        → primary-contrast-500   → palette → primitive
```
The component token binds straight to a color-mode token.

**Via-semantic shape** (component routes through a generic semantic):
```
button-text-primary-default      → content-on-primary     → color-mode token → palette → primitive
```
The component token binds to a semantic (`content-on-primary`), which then routes through the color-mode layer.

Both are fully deterministic. Pick the direct shape for properties where the component already implies the role (`bg-*`); pick the via-semantic shape for properties that route through a generic content/border/surface intermediate (`text-*`).

## Density and theme are NOT in the name

Density modes (dense / balanced / spacious) and color themes (default / halloween / enterprise) are runtime axes the theme layer applies. Tokens are theme-agnostic — `button-bg-primary-default` resolves the same way regardless of which color theme is active, because the theme reassigns what `primary` *means*, not the token.

Anti-pattern: `button-bg-primary-default-dense` (density in the name). Correct: density is a foundation-theme axis; the token's resolved value differs because the theme differs, not because the name differs.

## Cross-references

- **REQUIRED BACKGROUND:** [oklch-color-space](../oklch-color-space/SKILL.md) for the hue-angle convention; [apca-contrast](../apca-contrast/SKILL.md) for the contrast-class concept.
- **For the DTCG schema that mirrors the prefix:** [dtcg-format](../dtcg-format/SKILL.md) — the `$extensions.udts.class` and `$extensions.udts.kind` fields that redundantly encode what the prefix declares.
- **For SemVer behavior on naming changes:** [semver-design-tokens](../semver-design-tokens/SKILL.md) — renames are always major.

## Verification

For each new or modified token:

1. **Prefix is in the family list.** Names whose prefix isn't on the contrast-bound or free list are malformed.
2. **Class matches prefix.** `$extensions.udts.class` agrees with what the prefix declares. A `surface-rainbow` with `class: "free"` is rejected by validation.
3. **Hue primitives use the angle, not a semantic label.** No `primary-500`-as-primitive; only `<hue>-<angle>-<variant>-<stop>`.
4. **No density / theme in the name.** Density and theme are runtime axes, not token-name segments.
5. **Cross-reference resolves.** If the token aliases another (e.g. `surface-base` aliasing a mode-default), the target exists in the catalog.

## Sources

- The UDTS / token.design spec (foundations/color.md, semantics/component-tokens.md, integrations/code-exports.md).
- Spec-PR-B (the load-bearing classification + naming PR for UDTS).
- IBM Carbon, Google Material 3 — UDTS borrows the three-tier (primitive → semantic → component) shape and extends with the class system.

From thrillmade/agent-skills, MIT.

More from thrillmade/agent-skills

Signals

Stars
2
Forks
0
Open issues
40
Last commit (this folder)
Aug 23, 2026 (2 months ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from thrillmade

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get design-token-naming running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying design-token-naming?

CallGet help
Cite this page

design-token-naming skill. Agent Mart. https://agentmart.dev/skills/thrillmade-design-token-naming (last updated 2026-10-24)