Best for
- Use when styling pattern JSX or writing a UI design doc.
commontoolsinc/labs/skills/pattern-ui/SKILL.md
Design and polish pattern UIs with cf- components - theme-first styling via cf-theme, layout with cf-screen/cf-vstack, two-way binding ($value/$checked), and PerSession/PerUser/PerSpace UI-state scoping. Use when styling pattern JSX or writing a UI design doc.
Decision brief
In a build/polish pass, apply this only after logic is verified and tests pass. In a design phase (e.g. Pattern Factory uidesign), use this guidance to write the UI design document — specify theme, layout composition, and state scoping; do not write implementation code.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/commontoolsinc/labs --skill "skills/pattern-ui"Inspect the Agent Skill "pattern-ui" from https://github.com/commontoolsinc/labs/blob/b0ff67d2dde1812680849aa2373df1f49b6faa2f/skills/pattern-ui/SKILL.md at commit b0ff67d2dde1812680849aa2373df1f49b6faa2f. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
When polishing a non-trivial UI, default to this workflow:
docs/common/components/COMPONENTS.md - Full component reference; consult on
clear visual hierarchy
Before touching JSX (or, in a design phase, as the core of the design doc), decide all of the following:
Embedded UI should be themed through context and public styling hooks, not by
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 85/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 37 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
In a build/polish pass, apply this only after logic is verified and tests pass. In a design phase (e.g. Pattern Factory ui_design), use this guidance to write the UI design document — specify theme, layout composition, and state scoping; do not write implementation code.
docs/common/components/COMPONENTS.md - Full component reference; consult on
demand before assuming a component does or does not existpackages/patterns/catalog/stories/vignette-recipe-story.tsx (warm, editorial
light) or packages/patterns/catalog/stories/vignette-finance-story.tsx
(dark, dashboard-style)docs/common/patterns/style.md - for deeper rationale behind the theme-first
guidance this skill already digestsIf needed:
docs/common/patterns/ui-cookbook.md - Themed layout scaffolds and vignette
referencesdocs/common/patterns/two-way-binding.md - $value, $checked bindingspackages/ui/README.md - Current notes on CSS custom properties and partspackages/ui/LLM-COMPONENT-INSTRUCTIONS.md - Agent-oriented component and
theme system notesAim for:
Before touching JSX (or, in a design phase, as the core of the design doc), decide all of the following:
cf-* components,
local fonts, and public CSS custom properties?Do not drift into an undifferentiated default. Commit to a direction and execute it cleanly.
Treat transient UI state as part of the design brief, not as incidental
implementation detail. Active tab, selected item, selected room, open modal,
local filter text, and focused item should usually be PerSession<>. A useful
test: if the user opens the same instance in a new tab, should this state carry
over? If not, it is probably PerSession<>. User preferences, display names,
and personal drafts are usually PerUser<>. Shared records and canonical
content are usually PerSpace<>.
When polishing a non-trivial UI, default to this workflow:
theme object first.<cf-theme theme={theme}>.cf-screen, cf-vstack, cf-hstack, cf-vgroup,
cf-hgroup, and cf-card.cf-screen's default slot scrolls automatically when it
overflows. Use cf-vscroll only when you need snap-to-bottom (chat),
fade-edges, or styled scrollbar. Use cf-hscroll for wide tabular content.If cf-theme is clearly unavailable in the environment, fall back gracefully.
Otherwise, prefer it over scattered ad hoc overrides.
iframe / artifact case, not an excuse to guess at
unsupported structure.Layout: cf-theme, cf-screen, cf-vstack, cf-hstack, cf-vgroup,
cf-hgroup, cf-card, cf-vscroll, cf-hscroll Input: cf-input,
cf-textarea, cf-checkbox, cf-select Action: cf-button, cf-chip
Display: cf-label, cf-heading, cf-badge, cf-alert
Many more exist — cf-modal, cf-tabs, cf-table, cf-switch,
cf-radio-group, cf-slider, cf-progress, cf-toast, cf-avatar,
cf-accordion, ... — check docs/common/components/COMPONENTS.md before
concluding a component doesn't exist.
If a needed component doesn't exist, name the design-system gap in your output;
do not create Lit components or use component internals (applyThemeToElement,
@consume, shadow selectors) — component authoring is the lit-component
skill's domain, for packages/ui work only. In pattern JSX the theme is passed
as theme={...}, not Lit's .theme=${...}.
Avoid generic AI-looking UI: timid white cards, purple-gradient-on-white defaults, or layouts that read like a raw form dump.
Two-way binding:
<cf-input $value={field} />
<cf-checkbox $checked={done} />
If a control is already bound to a cell, usually via $value or $checked, do
not add a change handler that simply writes the same value back into that same
cell. Use handlers only for dependent state updates or other side effects.
Scoped UI state:
interface MultiUserUiState {
sharedBoard: PerSpace<Board>;
displayName: PerUser<string | Default<"">>;
selectedCard: PerSession<CardSelection | Default<{}>>;
}
Use ordinary data-shaped inputs when the public API should stay simple. Use
Writable cell aliases inside the scope wrapper when handlers need stable cell
handles for .key(...), .equals(...), or per-item bindings.
Layout structure:
<cf-screen>
<cf-heading slot="header" level={2}>My Pattern</cf-heading>
<cf-vstack gap="4" padding="4">
<cf-hstack gap="3">
{/* horizontal items — scrolls automatically if content overflows */}
</cf-hstack>
</cf-vstack>
</cf-screen>;
Theme wrapper:
const theme = {
fontFamily: "'Georgia', 'Times New Roman', serif",
borderRadius: "1rem",
density: "comfortable" as const,
colorScheme: "light" as const,
colors: {
primary: "#8b4513",
primaryForeground: "#fff8f0",
background: "#fff8f0",
surface: "#fff0e0",
text: "#2c1810",
textMuted: "#8b7355",
border: "#e8d5c0",
accent: "#c84c09",
accentForeground: "#fff8f0",
},
};
<cf-theme theme={theme}>
<cf-screen>
<cf-heading slot="header" level={2}>My Pattern</cf-heading>
<cf-vstack gap="4" padding="4">
{/* ... */}
</cf-vstack>
</cf-screen>
</cf-theme>;
Prefer these before browsing arbitrary pattern code:
packages/patterns/catalog/stories/vignette-recipe-story.tsxpackages/patterns/catalog/stories/vignette-finance-story.tsxpackages/patterns/catalog/stories/Use existing production patterns only when you specifically need to understand a domain flow, not as the first place to copy styling from.
In a design phase, the artifact is the design doc (ui-design.md in the
factory), not a rendering UI: done when the doc commits to a theme, layout
composition, and explicit UI-state scoping. In a build/polish pass:
cf-theme strategy is used intentionally when availablecf-screen (auto-scrolls); cf-vscroll only for
chat/fade-edgesPerSession<>
unless cross-session persistence is intentionalAlternatives
theBGuy/GitDesktop
Guide for implementing smooth, native-feeling animations using React's View Transition API (`<ViewTransition>` component, `addTransitionType`, and CSS view transition pseudo-elements). Use this skill whenever the user wants to add page transitions, animate route changes, create shared element animations, animate enter/exit of components, animate list reorder, implement directional (forward/back) navigation animations, or integrate view transitions in Next.js. Also use when the user mentions view
ConardLi/garden-skills
Build or redesign polished browser-rendered visual artifacts with HTML/CSS/JavaScript/React: pages, dashboards, prototypes, slide decks, animations, UI mockups, and data visualizations. Use for visual front-end creation, design-system exploration, design critique, or explicit browser acceptance / QA of a web artifact. Not for back-end, CLI, non-visual coding, source-to-longform article conversion, or narration-driven click-through video presentations.
aAAaqwq/AGI-Super-Team
UI/UX design intelligence. 50 styles, 21 palettes, 50 font pairings, 20 charts, 9 stacks (React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui). Actions: plan, build, create, design, implement, review, fix, improve, optimize, enhance, refactor, check UI/UX code. Projects: website, landing page, dashboard, admin panel, e-commerce, SaaS, portfolio, blog, mobile app, .html, .tsx, .vue, .svelte. Elements: button, modal, navbar, sidebar, card, table, form, chart. Styles: g
vercel-labs/agent-skills
Guide for implementing smooth, native-feeling animations using React's View Transition API (`<ViewTransition>` component, `addTransitionType`, and CSS view transition pseudo-elements). Use this skill whenever the user wants to add page transitions, animate route changes, create shared element animations, animate enter/exit of components, animate list reorder, implement directional (forward/back) navigation animations, or integrate view transitions in Next.js. Also use when the user mentions view