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 skills add zakariaf/Flutter-Skills --skill design-system-structuregit clone --depth 1 https://github.com/zakariaf/Flutter-SkillsWrote 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/zakariaf/flutter-skills/design-system-structure)<a href="https://agentmods.dev/skills/zakariaf/flutter-skills/design-system-structure"><img src="https://agentmods.dev/badge/skills/zakariaf/flutter-skills/design-system-structure/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/zakariaf/flutter-skills/design-system-structure"><img src="https://agentmods.dev/badge/skills/zakariaf/flutter-skills/design-system-structure.svg" alt="Reviewed on agentmods" width="80" 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.1 | $0.00211 | $0.04462 |
| Opus 5.5 | $0.00084 | $0.01785 |
| Sonnet 5.5 | $0.00042 | $0.00892 |
| Haiku 4.5 | $0.00021 | $0.00446 |
Grade A, and why
design-system-structure 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 2mo 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 — 195 lines — stays where its author put it; the contents beside it link to each section on GitHub.
design-system-structure
A design system is code that is incapable of holding a stray opinion: every aesthetic value lives in one directory, and every widget reads it back through a named slot. This skill owns how tokens, themes, components, and shapes are structured and consumed — not which colors or radii to pick (that belongs to your design source of truth). Getting the structure right makes a reskin a diff lib/theme/ and turns a stray Color(0xFF…) in feature code into a build failure instead of a style nit.
Read the reference for the task at hand:
references/token-tiers-and-themeextension.md— two-tier token naming, ThemeExtension mechanics, the assertingof(), hand-authoredColorSchemevsfromSeed, honestlerp.references/motion-and-reduced-motion.md— the three animations Material mounts by default, whyNoSplashis not enough, reduced-motion-means-zero,pumpAndSettlebans in tests.references/typography-and-fonts.md— bundling fonts,LicenseRegistry,FontWeightdriveswght, silentFontVariationno-ops, subsetting without instancing, per-script fallback cascades.references/contrast-and-redundant-encoding.md— AA as a unit test, ≥3 grayscale-legible signals per meaning, reading a11y flags fromMediaQuery.
Run scripts/check_raw_values.sh and scripts/check_font_bundling.sh before a PR.
Non-negotiable rules
- No raw aesthetic value outside
lib/theme/**— the gate is the law. AColor(0x…)/Colors.*(excepttransparent) /Curves.*/Duration(milliseconds:|seconds:(exceptDuration.zero) / literalBorderRadius.circular(n)/fontSize: nin feature or shared UI code failsscripts/check_raw_values.sh. A legitimate new need is a new token slot, never a// ignore— one place to diff is the whole point. - Two token tiers; widgets read only the semantic tier. Tier 1 = primitives named by the measured value (
neutral12= OKLCH lightness ×100), never by rank (grey700), appearance (darkGrey), or brand (brandPrimary). Tier 2 = semantic slots named by role (surface,onSurface,hairline,accent). A widget that reaches a Tier-1 primitive has hardcoded one theme. WHY: rank scales have no room to insert and lie in dark mode; appearance names invert catastrophically; brand names die with the brand. - Read tokens through a
ThemeExtensionand an assertingof(context). Never a staticconstclass, never anInheritedWidgetside channel.of()asserts on a missing extension — it does not?? fallback. WHY:MaterialAppdrives light/dark switching and correct-by-construction invalidation; a fallback silently ships a theme no test verified, and loud-in-debug beats wrong-in-field. - Hand-author
ColorScheme; neverColorScheme.fromSeed(ordynamic_color) for identity.fromSeed's per-role overrides do not propagate — overridesurfaceandsurfaceContainerHighstays seed-derived. State every role you consume, keep the M3 role names so Material widgets theme themselves, and let unstated roles takeColorScheme's own defaults, not a seed's opinion. WHY: "seed plus a few overrides" means owning the ~9 roles you chose and every seam of the ~40 you didn't. - Layer the system: tokens → theme → modifiers/components → shapes. Author light and dark by hand (dark is never an auto-flip), each passing AA independently, and attach every extension to both
ThemeDatas. Inject the theme exactly once, at the composition root. WHY: theming the app must touch one directory; a palette-only dark theme ships light's ratios into the dark. lerphonestly or snap deliberately;copyWithis mandatory. Interpolate colors and doubles; snap non-interpolables (font families,ShapeBorder) att < 0.5. If your app bans theme animation and you snap everything, leave a comment — a bare step-lerpreads as unfinished and the next reader will "fix" it. WHY: a new field silently forgotten inlerpis the classic design-system rot.- Color is a derived token, computed LAST — never a status's only channel. Color is a pure function of a canonical value object (an enum/small class), resolved through a semantic slot at the end; status is never read from color, and the supporting color is a slot read, not a literal. The never-color-alone floor itself — ≥3 non-color signals (glyph, label, weight/position) per stateful meaning — is owned by
accessibility-as-code; this skill only enforces that the color reinforcing them is a derived slot. WHY: a color not derived from the value object drifts out of sync, and a widget that leans on color alone dies in grayscale. - Reduced motion collapses to zero, not "gentler." Read
MediaQuery.disableAnimationsOf(context)and resolve toDuration.zero/ a cross-fade to the end state — never a shorter duration or a softer curve. Motion is never the only signal for a state change. WHY: a user who asked the OS to stop animations asked for stop. - Restore the persisted theme before first paint. Load the saved theme mode / variant before
runApp, from the same versioned settings the rest of the app uses (not an asyncshared_preferencesread that lands a frame late). An unknown or corrupt stored value falls back explicitly and visibly, never to anullthat leavesof()asserting on a device with no debugger. WHY: a flash of the wrong theme is a sudden luminance change the user did not cause. - Bundle fonts; never
google_fontsat runtime. Declare fonts inpubspec.yaml, ship the license text and register it viaLicenseRegistry, and drive weight withFontWeight(which drives thewghtaxis) — not a redundantFontVariation('wght', …). Declare a per-scriptfontFamilyFallbackcascade that ends in a known-good face. WHY:google_fontsships an HTTP code path by default;FontVariation('opsz'|'ital', …)silently no-ops on a font that lacks the axis, so a "working" italic is invisible in review. - Painters snapshot tokens;
paint()never readsBuildContext. ResolveTheme.of(context).extension<T>()once at the widget layer and pass the values into theCustomPainter/Scenefields. WHY: keepspaint()allocation-free and testable without aMaterialApp; seecustom-canvas-and-gestures. - The reduced-motion flag is read from
MediaQuery(disableAnimationsOf), never app state — it feedsresolveMotion(this skill's helper, below). Reading the other platform a11y flags (boldTextOf,highContrastOf,textScaler) fromMediaQueryrather than a stale app-state copy is owned byaccessibility-as-code.
What ships with it
9 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
- examples/app_theme.dart 8.3 KB
- examples/reduced_motion.dart 4.0 KB
- examples/status_encoding.dart 2.7 KB
- references/contrast-and-redundant-encoding.md 4.5 KB
- references/motion-and-reduced-motion.md 4.6 KB
- references/token-tiers-and-themeextension.md 6.5 KB
- references/typography-and-fonts.md 6.5 KB
- scripts/check_font_bundling.sh 1.1 KB runs code
- scripts/check_raw_values.sh 1.8 KB runs code
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.
- 2mo ago First seen · 195 lines · 211 tokens per session scan A cae59a80a8d3
design-system-structure is a skill published in the GitHub repository zakariaf/Flutter-Skills (66 stars, last pushed 1mo ago), licensed MIT. It adds 211 tokens to every session and 4,462 once invoked, about $0.0008 per session on Opus 5.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-31.
design-system-structure compared with skills from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| design-system-structurezakariaf/Flutter-Skills | Skill | 66 | 1mo ago | MIT | A | 211 | Claude Code |
| android-edge-to-edgeHoangNguyen0403/agent-skills-standard | Skill | 584 | yesterday | MIT | A | 52 | Claude Code, Codex |
| common-mobile-animationHoangNguyen0403/agent-skills-standard | Skill | 584 | yesterday | MIT | A | 52 | Claude Code, Codex |
| flutter-design-systemHoangNguyen0403/agent-skills-standard | Skill | 584 | yesterday | MIT | A | 32 | Claude Code, Codex |
| accessibilityVeryGoodOpenSource/vgv-ai-flutter-plugin | Skill | 179 | 5d ago | MIT | A | 119 | Claude Code |
| common-mobile-ux-coreHoangNguyen0403/agent-skills-standard | Skill | 584 | yesterday | MIT | A | 45 | Claude Code, Codex |
| material-themingVeryGoodOpenSource/vgv-ai-flutter-plugin | Skill | 179 | 5d ago | MIT | A | 137 | Claude Code |