Structural decision trees for container types, form states, table layouts, and page-level patterns. Use before vois-tokens. Routes to righter skill for all microcopy (labels, errors, buttons, helpers). Use when building pages, forms, features, workflows.
You are building the structure of pages and containers for a design system. This skill defines the architectural decisions that come before implementation (tokens, components, styling).
Read this skill first. After you determine structure here, read vois-tokens for implementation details (spacing, typography, components, tokens).
This skill routes to righter skill for all microcopy (button labels, error messages, field descriptions, helper text). Don't guess at words—follow the righter skill.
Before You Write Anything
What is the user trying to accomplish? (Dashboard overview? Edit a record? Confirm an action?)
Pick the container type from the decision tree below.
Read the matching reference file for full template rules.
If a vois_record_pattern_choice tool is available in your environment, call it once you have picked a path, before writing any code. If it isn't available, this step is optional telemetry, not a gate — proceed to the next step.
Tool: vois_record_pattern_choice
Arguments:
skillVersion: <this skill's version, from SKILL.md frontmatter>
pathId: <one of the path IDs listed in the decision tree below, e.g. "PATH-A" or "PATH-C-MEDIUM">
userGoal: <plain-English description of the user goal this path addresses>
thresholdInputs: <key decision inputs used to walk the tree, e.g. { "sectionCount": 3, "reversible": false }>
microcopyUsed: <optional array of contextKeys for any righter microcopy consulted while applying this pattern>
There is no confidence argument on the real tool — decide fit using the thresholds in the decision tree itself. If no path fits well and a vois_report_pattern_gap tool is available, call it instead of forcing a match:
Tool: vois_report_pattern_gap
Arguments:
skillVersion: <this skill's version, from SKILL.md frontmatter>
userGoal: <plain-English description of the goal that didn't fit>
attemptedFallback: <closest path ID used as a fallback, even though it doesn't fit>
reasoning: <why the available decision tree didn't fit this goal>
If neither tool is available, just proceed with your best-fit path and note the low confidence in your own output.
For every word that appears in UI, check righter skill. See references/microcopy-routing.md for the full list of what counts as copy.
Then read vois-tokens for implementation (tokens, spacing, components).
Decision Tree: What Container Type Should I Build?
START: What is the user trying to accomplish?
├─ PATH A: Manage settings or account preferences
│ └─ → read references/settings-pages.md
│ ├─ IF: 2–3 sections only → [PATH-A-DEPTH-SHALLOW]
│ └─ IF: 4+ sections → [PATH-A-DEPTH-DEEP]
│
├─ PATH B: View, filter, and act on a list of items
│ └─ → read references/table-list.md [PATH-B]
│
├─ PATH C: Create a new item OR edit an existing item
│ └─ → read references/forms.md
│ ├─ IF: 1–6 fields → [PATH-C-SIMPLE]
│ ├─ IF: 7–15 fields → [PATH-C-MEDIUM]
│ └─ IF: 15+ fields / complex → [PATH-C-COMPLEX]
│
├─ PATH D: Quick input, confirmation, or selection
│ └─ → read references/dialogs-and-action-sheets.md [PATH-D]
│
└─ PATH E: View details of a single item (read-only or view state)
└─ → read references/detail-pages.md [PATH-E]
Read only the one reference file that matches the path you picked. Each template file is self-contained.
Structured lookup:data/patterns-rules.json holds every tagged [PATH-X]/[PATH-X-Y] node from the tree above as { id, condition, outcome, source_file } — useful for a quick condition/outcome check by pathId without reading a whole file. It doesn't replace the reference files: worked examples, righter-routing call-outs, and untagged conditional branches (e.g. table-list.md's sidebar-vs-modal choice) only exist in the .md files.
Source of truth:data/patterns-rules.json is canonical for a path's condition/outcome. references/*.md may restate a path for readability and carries the worked examples JSON doesn't — but if the two ever disagree, the JSON wins. scripts/check-rule-sync.mjs (repo root) checks in CI that every [PATH-*] tag cited in references/*.md resolves to a real entry in patterns-rules.json and vice versa.
Reference Files
File
Covers
Path ID(s)
references/settings-pages.md
Profile, workspace, billing, notifications, members sections; view/edit state
[PATH-A]
references/table-list.md
Browse/filter/act on lists, sidebar vs modal detail view, pagination
[PATH-B]
references/forms.md
Create/edit forms by complexity tier, validation, save behavior
[PATH-C]
references/dialogs-and-action-sheets.md
Modal vs action sheet by breakpoint, confirmation/selection dialogs
[PATH-D]
references/detail-pages.md
Read-only single-record views
[PATH-E]
references/permissions-and-conditional-logic.md
Hide vs disable by role, parent/child input dependencies, accordions
[PATH-PERM-*][PATH-COND-*] (cross-cutting)
references/microcopy-routing.md
Full list of what counts as UI copy and must route to righter
— (cross-cutting)
Spacing Rules (Quick Reference)
These are implemented via vois-tokens; listed here for context.
24px vertical: heading ↔ body text
24px horizontal: between two input fields
40px vertical: body content ↔ primary action button
20px horizontal: between primary/secondary buttons (bottom right anchored)
Use gap tokens on container div instead of margin-bottom on elements
For exact class/style syntax (Tailwind or StyleX) and token values, see vois-tokens.
Quick Checklist Before Implementation
Container type selected (settings / table / form / dialog / detail)
vois_record_pattern_choice called with skillVersion, pathId, userGoal, and thresholdInputs, if that tool is available
This skill handles structural decisions and microcopy routing
This skill ↔ vois-components:
After picking a container type here, read vois-components to select specific components
vois-components resolves ambiguous pairs — Dialog vs Drawer, Toast vs Banner, Select vs Combobox
If a vois_record_component_choice tool is available, call it after selecting; if not, this step is optional telemetry
This skill ↔ righter skill:
Every word in UI comes from righter
This skill tells you which container type
Righter skill tells you what words go in that container
Always check righter for: button labels, error messages, field descriptions, status copy, confirmations
1---2name: vois-patterns3description: Structural decision trees for container types, form states, table layouts, and page-level patterns. Use before vois-tokens. Routes to righter skill for all microcopy (labels, errors, buttons, helpers). Use when building pages, forms, features, workflows.4---56# Vois Patterns Skill78You are building the *structure* of pages and containers for a design system. This skill defines the architectural decisions that come *before* implementation (tokens, components, styling).910**Read this skill first.** After you determine structure here, read `vois-tokens` for implementation details (spacing, typography, components, tokens).1112This skill routes to `righter` skill for all microcopy (button labels, error messages, field descriptions, helper text). Don't guess at words—follow the righter skill.1314---1516## Before You Write Anything17181. **What is the user trying to accomplish?** (Dashboard overview? Edit a record? Confirm an action?)192. **Pick the container type** from the decision tree below.203. **Read the matching reference file** for full template rules.214. **If a `vois_record_pattern_choice` tool is available in your environment**, call it once you have picked a path, before writing any code. If it isn't available, this step is optional telemetry, not a gate — proceed to the next step.2223 ```24 Tool: vois_record_pattern_choice25 Arguments:26 skillVersion: <this skill's version, from SKILL.md frontmatter>27 pathId: <one of the path IDs listed in the decision tree below, e.g. "PATH-A" or "PATH-C-MEDIUM">28 userGoal: <plain-English description of the user goal this path addresses>29 thresholdInputs: <key decision inputs used to walk the tree, e.g. { "sectionCount": 3, "reversible": false }>30 microcopyUsed: <optional array of contextKeys for any righter microcopy consulted while applying this pattern>31 ```3233 There is no `confidence` argument on the real tool — decide fit using the thresholds in the decision tree itself. If no path fits well and a `vois_report_pattern_gap` tool is available, call it instead of forcing a match:3435 ```36 Tool: vois_report_pattern_gap37 Arguments:38 skillVersion: <this skill's version, from SKILL.md frontmatter>39 userGoal: <plain-English description of the goal that didn't fit>40 attemptedFallback: <closest path ID used as a fallback, even though it doesn't fit>41 reasoning: <why the available decision tree didn't fit this goal>42 ```4344 If neither tool is available, just proceed with your best-fit path and note the low confidence in your own output.45465. **For every word that appears in UI**, check `righter` skill. See `references/microcopy-routing.md` for the full list of what counts as copy.476. Then read `vois-tokens` for implementation (tokens, spacing, components).4849---5051## Decision Tree: What Container Type Should I Build?5253```54START: What is the user trying to accomplish?5556├─ PATH A: Manage settings or account preferences57│ └─ → read references/settings-pages.md58│ ├─ IF: 2–3 sections only → [PATH-A-DEPTH-SHALLOW]59│ └─ IF: 4+ sections → [PATH-A-DEPTH-DEEP]60│61├─ PATH B: View, filter, and act on a list of items62│ └─ → read references/table-list.md [PATH-B]63│64├─ PATH C: Create a new item OR edit an existing item65│ └─ → read references/forms.md66│ ├─ IF: 1–6 fields → [PATH-C-SIMPLE]67│ ├─ IF: 7–15 fields → [PATH-C-MEDIUM]68│ └─ IF: 15+ fields / complex → [PATH-C-COMPLEX]69│70├─ PATH D: Quick input, confirmation, or selection71│ └─ → read references/dialogs-and-action-sheets.md [PATH-D]72│73└─ PATH E: View details of a single item (read-only or view state)74 └─ → read references/detail-pages.md [PATH-E]75```7677Read only the one reference file that matches the path you picked. Each template file is self-contained.7879**Structured lookup:** `data/patterns-rules.json` holds every tagged `[PATH-X]`/`[PATH-X-Y]` node from the tree above as `{ id, condition, outcome, source_file }` — useful for a quick condition/outcome check by `pathId` without reading a whole file. It doesn't replace the reference files: worked examples, righter-routing call-outs, and untagged conditional branches (e.g. table-list.md's sidebar-vs-modal choice) only exist in the `.md` files.8081**Source of truth:** `data/patterns-rules.json` is canonical for a path's `condition`/`outcome`. `references/*.md` may restate a path for readability and carries the worked examples JSON doesn't — but if the two ever disagree, the JSON wins. `scripts/check-rule-sync.mjs` (repo root) checks in CI that every `[PATH-*]` tag cited in `references/*.md` resolves to a real entry in `patterns-rules.json` and vice versa.8283---8485## Reference Files8687| File | Covers | Path ID(s) |88|---|---|---|89| `references/settings-pages.md` | Profile, workspace, billing, notifications, members sections; view/edit state | `[PATH-A]` |90| `references/table-list.md` | Browse/filter/act on lists, sidebar vs modal detail view, pagination | `[PATH-B]` |91| `references/forms.md` | Create/edit forms by complexity tier, validation, save behavior | `[PATH-C]` |92| `references/dialogs-and-action-sheets.md` | Modal vs action sheet by breakpoint, confirmation/selection dialogs | `[PATH-D]` |93| `references/detail-pages.md` | Read-only single-record views | `[PATH-E]` |94| `references/permissions-and-conditional-logic.md` | Hide vs disable by role, parent/child input dependencies, accordions | `[PATH-PERM-*]` `[PATH-COND-*]` (cross-cutting) |95| `references/microcopy-routing.md` | Full list of what counts as UI copy and must route to righter | — (cross-cutting) |9697---9899# Spacing Rules (Quick Reference)100101These are implemented via vois-tokens; listed here for context.102103- 24px vertical: heading ↔ body text104- 24px horizontal: between two input fields105- 40px vertical: body content ↔ primary action button106- 20px horizontal: between primary/secondary buttons (bottom right anchored)107- Use gap tokens on container div instead of margin-bottom on elements108109For exact class/style syntax (Tailwind or StyleX) and token values, see vois-tokens.110111---112113# Quick Checklist Before Implementation114115- [ ] Container type selected (settings / table / form / dialog / detail)116- [ ] `vois_record_pattern_choice` called with `skillVersion`, `pathId`, `userGoal`, and `thresholdInputs`, if that tool is available117- [ ] Page structure sketched (what sections, what's visible, what's hidden by role)118- [ ] Permissions applied (hide/disable rules — see `references/permissions-and-conditional-logic.md`)119- [ ] All copy routed to righter skill and reviewed120- [ ] Ready to read vois-tokens for tokens, spacing, components121- [ ] Mobile breakpoint behavior defined (action sheets vs dialogs, sidebar vs hamburger, etc.)122123---124125# Relationship to Other Skills126127**This skill ↔ vois-tokens:**128129- Read this first (what to build)130- Then read vois-tokens (how to code it correctly)131- vois-tokens handles tokens, spacing, components, animation, accessibility132- This skill handles structural decisions and microcopy routing133134**This skill ↔ vois-components:**135136- After picking a container type here, read vois-components to select specific components137- vois-components resolves ambiguous pairs — Dialog vs Drawer, Toast vs Banner, Select vs Combobox138- If a `vois_record_component_choice` tool is available, call it after selecting; if not, this step is optional telemetry139140**This skill ↔ righter skill:**141142- Every word in UI comes from righter143- This skill tells you which container type144- Righter skill tells you what words go in that container145- Always check righter for: button labels, error messages, field descriptions, status copy, confirmations
Run npx skillmds@latest add ommakes/vois-patterns in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Structural decision trees for container types, form states, table layouts, and page-level patterns. Use before vois-tokens. Routes to righter skill for all microcopy (labels, errors, buttons, helpers). Use when building pages, forms, features, workflows. It is listed under Coding & Dev Tools on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
ommakes (@ommakes) published this skill. Their other Agent Skills are listed on their SkillMD profile.