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.
npx agentmods add skills/tryghost/ghost/shade-input-surface-recipenpx skills add TryGhost/Ghost --skill shade-input-surface-recipegit clone --depth 1 https://github.com/TryGhost/GhostWrote 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.
[](https://agentmods.dev/skills/tryghost/ghost/shade-input-surface-recipe)<a href="https://agentmods.dev/skills/tryghost/ghost/shade-input-surface-recipe"><img src="https://agentmods.dev/badge/skills/tryghost/ghost/shade-input-surface-recipe.svg" alt="Measured on agentmods" height="20"></a>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.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00044 | $0.01071 |
| Opus 5 | $0.00022 | $0.00535 |
| Sonnet 5 | $0.00009 | $0.00214 |
| Haiku 4.5 | $0.00004 | $0.00107 |
Grade A, and why
Shade inputSurface recipe 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 4d 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.
How it starts
The opening of the file, as written. The whole thing — 112 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Shade — inputSurface recipe
Form controls share one visual rule: border, background, radius, transition, focus ring, invalid state. That rule lives in inputSurface (apps/shade/src/components/ui/input-surface.ts) and is used by Input, Textarea, InputGroup, and the Select trigger. Don't duplicate the chrome — compose the recipe.
import {inputSurface, inputSurfaceClasses} from '@/components/ui/input-surface';
import {cn} from '@/lib/utils';
Two common modes
inputSurface('self') — directly on the focusable element
Use on <input>, <textarea>, or any element that itself receives focus.
<input
className={cn(
inputSurface('self'),
'flex h-9 w-full px-3 py-1 text-control placeholder:text-muted-foreground',
className
)}
{...props}
/>
Covers: base chrome + focus-visible: ring + aria-[invalid=true] styling + disabled: opacity.
inputSurface('within') — on a wrapper containing a focusable child
Use when the styled element is the wrapper (e.g. InputGroup) and focus state should react to any focusable descendant via :has().
<div className={cn(
inputSurface('within'),
'flex h-9 items-center gap-2 px-3',
className
)}>
<Icon />
<input className="bg-transparent outline-hidden focus:outline-hidden" />
</div>
Covers: base chrome + has-[:focus-visible]: ring + has-[[aria-invalid=true]]: styling. (No disabled atom — wrappers don't get a disabled HTML attribute.)
Edge case — only one specific child triggers focus state
When 'within' is too broad (e.g. a wrapper with multiple focusables but only one should drive chrome), compose atoms manually so Tailwind's JIT can statically detect the class string:
import {inputSurfaceClasses} from '@/components/ui/input-surface';
<div className={cn(
inputSurfaceClasses.base,
inputSurfaceClasses.invalidWithin,
// Literal class string — Tailwind needs to see it as text
'has-[[data-slot=control]:focus-visible]:border-focus-ring',
'has-[[data-slot=control]:focus-visible]:ring-2',
'has-[[data-slot=control]:focus-visible]:ring-focus-ring/25'
)} />
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.
- 4d ago First seen · 112 lines · 44 tokens per session scan A 583229b0482d
Shade inputSurface recipe is a skill published in the GitHub repository TryGhost/Ghost (55,149 stars, last pushed today), licensed MIT. It adds 44 tokens to every session and 1,071 once invoked, about $0.0002 per session on Opus 5. 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.
Other skills, from other repositories
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.
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".
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.
intlayer-next-js
Integrates Intlayer internationalization with Next.js App Router and Pages Router. Use when the user asks to "setup Next.js i18n", use "useIntlayer" in Server Components, or handle client-side translations in Next.js.
intlayer-react
Integrates Intlayer internationalization with React component. Use when the user asks to "setup React i18n", create a new translated component, use the "useIntlayer" hook, or configure providers.
intlayer-cli
Manages Intlayer dictionaries and configuration via the Command Line Interface. Use when the user asks to "audit translations", "build dictionaries", "sync content", or run "intlayer" commands.