Recipes
A recipe is the variant mechanism underneath the Builder: pure data (a base fragment, variant dimensions, an optional compound rule, defaults) that composes into a stylesheet by the options you pick. Nothing here is a React component you import — each snippet below is produced by the same pipeline the render engine runs, so the CSS you copy is exactly what the system emits, every value a token.
Button
Tone, size and a solid/outline variant. The tone is factored into a --btn-bg custom property, so outline reuses it as ink for any tone without a per-combination rule.
The recipe (data)
{
"base": {
"&": {
"--btn-bg": "color.primary",
"--btn-fg": "color.on-primary",
"display": "inline-flex",
"align-items": "center",
"justify-content": "center",
"gap": "space.2",
"border": "1px solid transparent",
"border-radius": "radius.md",
"font-family": "font.family-base",
"cursor": "pointer",
"color": "var(--btn-fg)",
"background": "var(--btn-bg)"
}
},
"variants": {
"tone": {
"primary": {
"&": {
"--btn-bg": "color.primary",
"--btn-fg": "color.on-primary"
}
},
"danger": {
"&": {
"--btn-bg": "color.danger",
"--btn-fg": "color.on-danger"
}
},
"neutral": {
"&": {
"--btn-bg": "color.surface-alt",
"--btn-fg": "color.text"
}
}
},
"size": {
"sm": {
"&": {
"padding": "space.1 space.3"
}
},
"md": {
"&": {
"padding": "space.2 space.5"
}
},
"lg": {
"&": {
"padding": "space.3 space.6"
}
}
},
"variant": {
"solid": {},
"outline": {
"&": {
"background": "transparent",
"color": "var(--btn-bg)",
"border-color": "var(--btn-bg)"
}
}
}
},
"default": {
"tone": "primary",
"size": "md",
"variant": "solid"
}
}.rx-button-0{--btn-bg:var(--fx-color-primary);--btn-fg:var(--fx-color-on-primary);display:inline-flex;align-items:center;justify-content:center;gap:var(--fx-space-2);border:1px solid transparent;border-radius:var(--fx-radius-md);font-family:var(--fx-font-family-base);cursor:pointer;color:var(--btn-fg);background:var(--btn-bg);padding:var(--fx-space-2) var(--fx-space-5)}
.rx-button-1{--btn-bg:var(--fx-color-danger);--btn-fg:var(--fx-color-on-danger);display:inline-flex;align-items:center;justify-content:center;gap:var(--fx-space-2);border:1px solid transparent;border-radius:var(--fx-radius-md);font-family:var(--fx-font-family-base);cursor:pointer;color:var(--btn-fg);background:var(--btn-bg);padding:var(--fx-space-2) var(--fx-space-5)}
.rx-button-2{--btn-bg:var(--fx-color-surface-alt);--btn-fg:var(--fx-color-text);display:inline-flex;align-items:center;justify-content:center;gap:var(--fx-space-2);border:1px solid transparent;border-radius:var(--fx-radius-md);font-family:var(--fx-font-family-base);cursor:pointer;color:var(--btn-fg);background:var(--btn-bg);padding:var(--fx-space-2) var(--fx-space-5)}
.rx-button-3{--btn-bg:var(--fx-color-primary);--btn-fg:var(--fx-color-on-primary);display:inline-flex;align-items:center;justify-content:center;gap:var(--fx-space-2);border:1px solid transparent;border-radius:var(--fx-radius-md);font-family:var(--fx-font-family-base);cursor:pointer;color:var(--btn-bg);background:transparent;padding:var(--fx-space-2) var(--fx-space-5);border-color:var(--btn-bg)}
.rx-button-4{--btn-bg:var(--fx-color-primary);--btn-fg:var(--fx-color-on-primary);display:inline-flex;align-items:center;justify-content:center;gap:var(--fx-space-2);border:1px solid transparent;border-radius:var(--fx-radius-md);font-family:var(--fx-font-family-base);cursor:pointer;color:var(--btn-fg);background:var(--btn-bg);padding:var(--fx-space-1) var(--fx-space-3)}12 distinct tokens, 0 off-system.
Badge
A status pill in four tones — each tone is a paired fill/on-colour from the token set.
The recipe (data)
{
"base": {
"&": {
"--bdg-bg": "color.surface-alt",
"--bdg-fg": "color.text",
"display": "inline-flex",
"align-items": "center",
"padding": "space.1 space.3",
"border-radius": "radius.full",
"font-family": "font.family-base",
"color": "var(--bdg-fg)",
"background": "var(--bdg-bg)"
}
},
"variants": {
"tone": {
"neutral": {
"&": {
"--bdg-bg": "color.surface-alt",
"--bdg-fg": "color.text"
}
},
"success": {
"&": {
"--bdg-bg": "color.success",
"--bdg-fg": "color.on-success"
}
},
"warning": {
"&": {
"--bdg-bg": "color.warning",
"--bdg-fg": "color.on-warning"
}
},
"info": {
"&": {
"--bdg-bg": "color.info",
"--bdg-fg": "color.on-info"
}
}
}
},
"default": {
"tone": "neutral"
}
}.rx-badge-0{--bdg-bg:var(--fx-color-surface-alt);--bdg-fg:var(--fx-color-text);display:inline-flex;align-items:center;padding:var(--fx-space-1) var(--fx-space-3);border-radius:var(--fx-radius-full);font-family:var(--fx-font-family-base);color:var(--bdg-fg);background:var(--bdg-bg)}
.rx-badge-1{--bdg-bg:var(--fx-color-success);--bdg-fg:var(--fx-color-on-success);display:inline-flex;align-items:center;padding:var(--fx-space-1) var(--fx-space-3);border-radius:var(--fx-radius-full);font-family:var(--fx-font-family-base);color:var(--bdg-fg);background:var(--bdg-bg)}
.rx-badge-2{--bdg-bg:var(--fx-color-warning);--bdg-fg:var(--fx-color-on-warning);display:inline-flex;align-items:center;padding:var(--fx-space-1) var(--fx-space-3);border-radius:var(--fx-radius-full);font-family:var(--fx-font-family-base);color:var(--bdg-fg);background:var(--bdg-bg)}
.rx-badge-3{--bdg-bg:var(--fx-color-info);--bdg-fg:var(--fx-color-on-info);display:inline-flex;align-items:center;padding:var(--fx-space-1) var(--fx-space-3);border-radius:var(--fx-radius-full);font-family:var(--fx-font-family-base);color:var(--bdg-fg);background:var(--bdg-bg)}12 distinct tokens, 0 off-system.
Alert
A message block with a tone accent bar — the accent is a custom property re-pointed per tone.
The recipe (data)
{
"base": {
"&": {
"--alt-accent": "color.info",
"display": "flex",
"flex-direction": "column",
"gap": "space.1",
"padding": "space.4 space.5",
"border-radius": "radius.md",
"border-left": "3px solid var(--alt-accent)",
"background": "color.surface-alt",
"color": "color.text"
}
},
"variants": {
"tone": {
"info": {
"&": {
"--alt-accent": "color.info"
}
},
"success": {
"&": {
"--alt-accent": "color.success"
}
},
"warning": {
"&": {
"--alt-accent": "color.warning"
}
},
"danger": {
"&": {
"--alt-accent": "color.danger"
}
}
}
},
"default": {
"tone": "info"
}
}.rx-alert-0{--alt-accent:var(--fx-color-info);display:flex;flex-direction:column;gap:var(--fx-space-1);padding:var(--fx-space-4) var(--fx-space-5);border-radius:var(--fx-radius-md);border-left:3px solid var(--alt-accent);background:var(--fx-color-surface-alt);color:var(--fx-color-text)}
.rx-alert-1{--alt-accent:var(--fx-color-success);display:flex;flex-direction:column;gap:var(--fx-space-1);padding:var(--fx-space-4) var(--fx-space-5);border-radius:var(--fx-radius-md);border-left:3px solid var(--alt-accent);background:var(--fx-color-surface-alt);color:var(--fx-color-text)}
.rx-alert-2{--alt-accent:var(--fx-color-warning);display:flex;flex-direction:column;gap:var(--fx-space-1);padding:var(--fx-space-4) var(--fx-space-5);border-radius:var(--fx-radius-md);border-left:3px solid var(--alt-accent);background:var(--fx-color-surface-alt);color:var(--fx-color-text)}
.rx-alert-3{--alt-accent:var(--fx-color-danger);display:flex;flex-direction:column;gap:var(--fx-space-1);padding:var(--fx-space-4) var(--fx-space-5);border-radius:var(--fx-radius-md);border-left:3px solid var(--alt-accent);background:var(--fx-color-surface-alt);color:var(--fx-color-text)}10 distinct tokens, 0 off-system.
Card
Elevation and an accent border as independent dimensions, with a compound rule for the raised-and-accented case.
The recipe (data)
{
"base": {
"&": {
"display": "flex",
"flex-direction": "column",
"gap": "space.2",
"padding": "space.5",
"background": "color.surface",
"border": "1px solid color.border",
"border-radius": "radius.lg"
}
},
"variants": {
"elevate": {
"flat": {},
"raised": {
"&": {
"box-shadow": "shadow.md"
}
}
},
"tone": {
"plain": {},
"accent": {
"&": {
"border-color": "color.primary"
}
}
}
},
"compound": [
{
"when": {
"elevate": "raised",
"tone": "accent"
},
"style": {
"&": {
"box-shadow": "shadow.md",
"border-color": "color.primary"
}
}
}
],
"default": {
"elevate": "flat",
"tone": "plain"
}
}.rx-card-0{display:flex;flex-direction:column;gap:var(--fx-space-2);padding:var(--fx-space-5);background:var(--fx-color-surface);border:1px solid var(--fx-color-border);border-radius:var(--fx-radius-lg)}
.rx-card-1{display:flex;flex-direction:column;gap:var(--fx-space-2);padding:var(--fx-space-5);background:var(--fx-color-surface);border:1px solid var(--fx-color-border);border-radius:var(--fx-radius-lg);box-shadow:var(--fx-shadow-md)}
.rx-card-2{display:flex;flex-direction:column;gap:var(--fx-space-2);padding:var(--fx-space-5);background:var(--fx-color-surface);border:1px solid var(--fx-color-border);border-radius:var(--fx-radius-lg);border-color:var(--fx-color-primary)}
.rx-card-3{display:flex;flex-direction:column;gap:var(--fx-space-2);padding:var(--fx-space-5);background:var(--fx-color-surface);border:1px solid var(--fx-color-border);border-radius:var(--fx-radius-lg);box-shadow:var(--fx-shadow-md);border-color:var(--fx-color-primary)}7 distinct tokens, 0 off-system.
How this stays honest
Every recipe is checked two ways at build time: the merged spec is scanned for token-namespace paths that are not real tokens (a typo would be caught before it renders), and the compiled CSS is scanned so every --fx-* reference is a registry token. Custom properties like --btn-bg are plumbing — they carry the chosen colour without multiplying variants, and the token scan ignores them by construction. An off-system value would surface here as a failure, not drift silently.