Vanilla Framework Design System
This skill provides structured access to the complete documentation for Canonical's Vanilla Framework design system — 49 constructs (UI components, complex components, patterns, and mental models) and 26 concepts (architecture, decision guides, and principles).
CRITICAL: Citation and sourcing rules
Every claim must be sourced from the data and cited. Follow these rules without exception:
NEVER invent or fabricate documentation. Every statement about a construct or concept — its properties, anatomy, usage, behavior, relationships — MUST come from the data files. If something is not documented in the data, say so explicitly: "This is not documented in the Vanilla Framework design system documentation." Do NOT guess, infer, or fill in gaps with general knowledge.
ALWAYS look up the data before answering. Even if you think you know the answer, query the data files to confirm. The data is the single source of truth.
Cite using numbered references. Place a bracketed number at the end of a paragraph or logical grouping of related claims, not after every single sentence. If multiple consecutive sentences come from the same source, use ONE citation at the end of the group. Do NOT repeat the same citation number on every sentence. Collect all references at the end of your response under a ## References heading. Every number used inline MUST appear there. Every entry there MUST be used inline.
Get the URL from the url field in each construct's or concept's data file.
Data structure
The data is organized in two layers for efficient exploration:
Layer 1: Index (data/index.json)
A lightweight catalogue of all constructs and concepts. Use this first to browse, filter, and find items.
Top-level metadata includes: generatedAt, constructCount, conceptCount, constructTypes, constructTiers, conceptTypes.
Each construct entry contains: name, slug, type, tiers, description (full markdown description).
Each concept entry contains: name, slug, type, tier, description.
Layer 2: Per-construct detail files (data/constructs/<slug>.json)
Full documentation for each construct. Fields include:
| Field |
Description |
name, slug |
Construct name and URL-safe identifier |
type |
One of: Component, Complex component, Pattern, Mental model |
tiers |
One of: Global, Sites, Apps |
url |
Canonical documentation URL |
description |
Full markdown description |
usage |
Usage guidelines (markdown) |
examples |
Usage examples (markdown) |
interactions |
Interaction specifications (markdown) |
properties[] |
Each with: name, type, required, description, constraint, options, defaultOption |
anatomy.table[] |
Each with: number, name, description |
mentionedIn[] |
Items that reference this one (name, slug) |
mentionsComponents[] |
Items this one references (name, slug) |
appliedRules[] |
Rule row IDs that apply to this construct |
exceptionFromRules[] |
Rule row IDs this construct is excepted from |
changeLog[] |
Edit history (who, when, what) |
decisionLog[] |
Design decisions (where, what, link, when) |
figmaLink |
Figma design file URL |
codeLink |
Source code URL |
Layer 3: Per-concept detail files (data/concepts/<slug>.json)
Full documentation for each concept. Fields include:
| Field |
Description |
name, slug |
Concept name and URL-safe identifier |
type |
One of: Architecture, Decision guide, Principle |
tier |
One of: Global, Sites |
url |
Canonical documentation URL |
description |
Short description |
content |
Full concept content (markdown) |
mentionedIn[] |
Items that reference this concept (name, slug) |
appliedRules[] |
Rule row IDs that apply to this concept |
exceptedFromRules[] |
Rule row IDs this concept is excepted from |
changeLog[] |
Edit history (who, when, what) |
decisionLog[] |
Design decisions (where, what, link, when) |
How to explore the data
Data files are in the data/ directory next to this file. Always use absolute paths in all commands, resolved from the known location of this file. Do not use bare relative paths like data/index.json — they will fail if the working directory is different.
Use jq and bash to query the JSON data files. Do NOT attempt to load entire files into context. Instead, use targeted jq queries to extract only the fields you need for each question.
Recommended workflow
- Start with the index — query
data/index.json to find relevant constructs or concepts
- Filter — use jq to narrow down to what matches the question
- Drill in — read specific fields from construct or concept detail files
- Cite — include the
url from every item you reference
jq examples
The following are examples to illustrate the kinds of queries you can run. Adapt them to the question at hand — these are not an exhaustive list:
# List all construct names
jq -r '.constructs[].name' data/index.json
# List all concept names
jq -r '.concepts[].name' data/index.json
# Filter constructs by type
jq -r '.constructs[] | select(.type == "Pattern") | .slug' data/index.json
# Filter concepts by type
jq -r '.concepts[] | select(.type == "Architecture") | .slug' data/index.json
# Search construct descriptions for a keyword
jq -r '.constructs[] | select(.description | test("form"; "i")) | .slug' data/index.json
# Get a construct's properties
jq '.properties[] | {name, type, required, defaultOption}' data/constructs/button.json
# Get anatomy parts
jq '.anatomy.table[] | {name, description}' data/constructs/button.json
# What items mention Button?
jq '.mentionedIn[] | .name' data/constructs/button.json
# What items does Button reference?
jq '.mentionsComponents[] | .name' data/constructs/button.json
# Get usage guidelines
jq -r '.usage' data/constructs/input.json
# Get the documentation URL
jq -r '.url' data/constructs/button.json
# List all constructs with their types (compact overview)
jq -r '.constructs[] | "\(.type) | \(.name)"' data/index.json | sort
# List all concepts with their types
jq -r '.concepts[] | "\(.type) | \(.name)"' data/index.json | sort
# Get a concept's full content
jq -r '.content' data/concepts/site.json
# Get counts
jq '{constructCount, conceptCount}' data/index.json
1---2name: explore-existing-ds-docs3description: Explore Canonical's Vanilla Framework design system documentation. Covers 49 UI constructs and 26 concepts including their properties, anatomy, usage guidelines, and relationships. Use when answering questions about Vanilla constructs, concepts, design patterns, or implementation details.4---56# Vanilla Framework Design System78This skill provides structured access to the complete documentation for Canonical's Vanilla Framework design system — 49 constructs (UI components, complex components, patterns, and mental models) and 26 concepts (architecture, decision guides, and principles).910## CRITICAL: Citation and sourcing rules1112**Every claim must be sourced from the data and cited.** Follow these rules without exception:13141. **NEVER invent or fabricate documentation.** Every statement about a construct or concept — its properties, anatomy, usage, behavior, relationships — MUST come from the data files. If something is not documented in the data, say so explicitly: "This is not documented in the Vanilla Framework design system documentation." Do NOT guess, infer, or fill in gaps with general knowledge.15162. **ALWAYS look up the data before answering.** Even if you think you know the answer, query the data files to confirm. The data is the single source of truth.17183. **Cite using numbered references.** Place a bracketed number at the end of a **paragraph or logical grouping of related claims**, not after every single sentence. If multiple consecutive sentences come from the same source, use ONE citation at the end of the group. Do NOT repeat the same citation number on every sentence. Collect all references at the end of your response under a `## References` heading. Every number used inline MUST appear there. Every entry there MUST be used inline.1920Get the URL from the `url` field in each construct's or concept's data file.2122## Data structure2324The data is organized in two layers for efficient exploration:2526### Layer 1: Index (`data/index.json`)2728A lightweight catalogue of all constructs and concepts. Use this first to browse, filter, and find items.2930Top-level metadata includes: `generatedAt`, `constructCount`, `conceptCount`, `constructTypes`, `constructTiers`, `conceptTypes`.3132Each construct entry contains: `name`, `slug`, `type`, `tiers`, `description` (full markdown description).3334Each concept entry contains: `name`, `slug`, `type`, `tier`, `description`.3536### Layer 2: Per-construct detail files (`data/constructs/<slug>.json`)3738Full documentation for each construct. Fields include:3940| Field | Description |41| ---------------------- | -------------------------------------------------------------------------------- |42| `name`, `slug` | Construct name and URL-safe identifier |43| `type` | One of: Component, Complex component, Pattern, Mental model |44| `tiers` | One of: Global, Sites, Apps |45| `url` | Canonical documentation URL |46| `description` | Full markdown description |47| `usage` | Usage guidelines (markdown) |48| `examples` | Usage examples (markdown) |49| `interactions` | Interaction specifications (markdown) |50| `properties[]` | Each with: name, type, required, description, constraint, options, defaultOption |51| `anatomy.table[]` | Each with: number, name, description |52| `mentionedIn[]` | Items that reference this one (name, slug) |53| `mentionsComponents[]` | Items this one references (name, slug) |54| `appliedRules[]` | Rule row IDs that apply to this construct |55| `exceptionFromRules[]` | Rule row IDs this construct is excepted from |56| `changeLog[]` | Edit history (who, when, what) |57| `decisionLog[]` | Design decisions (where, what, link, when) |58| `figmaLink` | Figma design file URL |59| `codeLink` | Source code URL |6061### Layer 3: Per-concept detail files (`data/concepts/<slug>.json`)6263Full documentation for each concept. Fields include:6465| Field | Description |66| --------------------- | ----------------------------------------------- |67| `name`, `slug` | Concept name and URL-safe identifier |68| `type` | One of: Architecture, Decision guide, Principle |69| `tier` | One of: Global, Sites |70| `url` | Canonical documentation URL |71| `description` | Short description |72| `content` | Full concept content (markdown) |73| `mentionedIn[]` | Items that reference this concept (name, slug) |74| `appliedRules[]` | Rule row IDs that apply to this concept |75| `exceptedFromRules[]` | Rule row IDs this concept is excepted from |76| `changeLog[]` | Edit history (who, when, what) |77| `decisionLog[]` | Design decisions (where, what, link, when) |7879## How to explore the data8081Data files are in the `data/` directory next to this file. **Always use absolute paths in all commands, resolved from the known location of this file.** Do not use bare relative paths like `data/index.json` — they will fail if the working directory is different.8283Use `jq` and `bash` to query the JSON data files. Do NOT attempt to load entire files into context. Instead, use targeted jq queries to extract only the fields you need for each question.8485### Recommended workflow86871. **Start with the index** — query `data/index.json` to find relevant constructs or concepts882. **Filter** — use jq to narrow down to what matches the question893. **Drill in** — read specific fields from construct or concept detail files904. **Cite** — include the `url` from every item you reference9192### jq examples9394The following are examples to illustrate the kinds of queries you can run. Adapt them to the question at hand — these are not an exhaustive list:9596```bash97# List all construct names98jq -r '.constructs[].name' data/index.json99100# List all concept names101jq -r '.concepts[].name' data/index.json102103# Filter constructs by type104jq -r '.constructs[] | select(.type == "Pattern") | .slug' data/index.json105106# Filter concepts by type107jq -r '.concepts[] | select(.type == "Architecture") | .slug' data/index.json108109# Search construct descriptions for a keyword110jq -r '.constructs[] | select(.description | test("form"; "i")) | .slug' data/index.json111112# Get a construct's properties113jq '.properties[] | {name, type, required, defaultOption}' data/constructs/button.json114115# Get anatomy parts116jq '.anatomy.table[] | {name, description}' data/constructs/button.json117118# What items mention Button?119jq '.mentionedIn[] | .name' data/constructs/button.json120121# What items does Button reference?122jq '.mentionsComponents[] | .name' data/constructs/button.json123124# Get usage guidelines125jq -r '.usage' data/constructs/input.json126127# Get the documentation URL128jq -r '.url' data/constructs/button.json129130# List all constructs with their types (compact overview)131jq -r '.constructs[] | "\(.type) | \(.name)"' data/index.json | sort132133# List all concepts with their types134jq -r '.concepts[] | "\(.type) | \(.name)"' data/index.json | sort135136# Get a concept's full content137jq -r '.content' data/concepts/site.json138139# Get counts140jq '{constructCount, conceptCount}' data/index.json141```