list-view
Skill2 starsChanged 13 days agoMITView on GitHub
Conventions for list pages in the Patio web UI (web/src) such as Skills, and any new list of user-managed items (servers, templates, presets). Use when building or changing a page that lists items with enable/disable, edit, remove, sort, or a create flow.
In this repository11 other files it gives its agents.
- AGENTS.mdAGENTS.md
- accessibilitySkill
- connector-requiredSkill
- dropdown-buttonSkill
- frontend-designSkill
- golang-patternsSkill
- golang-testingSkill
- icon-buttonSkill
- releaseSkill
- searchable-dropdownSkill
- seoSkill
The file
We split this skill into the rules it gives an agent
6 rules. About 0 are common, 3 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 12
Ask in one message, with defaults, before writing code:
- Very specific: line 15
Sort options?: Default: Most recent (created_at DESC) and Alphabetical (name).
- Distinctive: line 16
Enable/disable?: Only if the item has an on/off state that changes behavior elsewhere.
- Distinctive: line 42
After create, go back to the list.
- Very specific: line 48
No colored accent stripes on box edges.
- Very specific: line 51
Verify with pnpm --dir web build and make app.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
List view conventions
Reference implementation: web/src/Skills.tsx, plus the shared web/src/Menu.tsx and web/src/Switch.tsx. Copy its shape; don't invent a new layout.
Before building, ask the user
Ask in one message, with defaults, before writing code:
- Pagination? Will this list grow past ~50 items? Default: no pagination; client-side sort only. If yes: server-side
?limit=&offset=(or a cursor for timestamp-sorted lists), page size 25, "Previous / Next" buttons under the list with "1–25 of N", and the sort applied on the server so pages stay consistent. - Sort options? Default: Most recent (
created_atDESC) and Alphabetical (name). - Enable/disable? Only if the item has an on/off state that changes behavior elsewhere.
Page layout
- Heading row (
.page-heading):.eyebrowsection name,<h1>, then actions on the right: secondary actions (for example Import) first, then one.primary"New<thing>" button. - One muted sentence under the heading explaining what the items do.
ErrorTextfor load and action errors.
Empty state
A centered .panel card (see .skill-empty, max 640 px) with an icon mark, <h2>No <things> yet</h2>, one sentence on what a <thing> is, an optional example, and the same actions as the heading. Never put the empty state in a narrow column.
The list
- Toolbar above the list (
.list-toolbar): item count on the left ("3 skills"), the sort dropdown on the right. - One
.panel<ul>with a row per item; rows are separated byvar(--border)lines; the whole row highlights on hover. - Row content is a button that opens the item's page (for example,
/ai/skills/<id>): the name (monospace, bold) over the description (muted, clamped to 2 lines). Disabled items render faded. - Right side of each row, in order:
<Switch>for enable/disable (showLabel={false}, labelEnable <name>). Never a checkbox for on/off state.⋯menu (<Menu>withbuttonClassName="icon ghost"), items in this order: Disable<thing>/ Enable<thing>(pause/play icon, toggles immediately), Edit, a<hr className="menu-divider" role="separator" />, then Remove (danger-text, asksconfirm()first).
- Sorting happens on the client unless the list is paginated. The choice persists in
localStorageunder a singular-item key such asskill-sort. The sort control is a<Menu>withrole="menuitemradio"+aria-checkeditems, never a native<select>.
Item page (create and edit)
- Routes use the section prefix, for example
/ai/skills/newand/ai/skills/<id>, with a "←<Things>" back button (.back) and the item name as<h1>. - A
.panelform. Save is disabled until something changed. An "Enabled"<Switch>sits next to Save when the item has that state. - After create, go back to the list. After save on an existing item, stay on the page and show "Saved" briefly. After delete, go back to the list.
- Autofocus the first field so keyboard focus lands somewhere after navigating from a menu.
Rules that apply everywhere
- Reuse
Menu,Switch,IconButton,ErrorText, and existing CSS classes before adding new ones. - No colored accent stripes on box edges; plain
var(--border)borders only (AGENTS.md). - Accessibility: every control has a visible or
sr-onlylabel; menus support arrow keys, Escape (returns focus to the trigger), and click-outside; respectprefers-reduced-motion. - Rendered Markdown goes through
web/src/Markdown.tsx(DOMPurify). - Verify with
pnpm --dir web buildandmake app.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

