@gunkin/uiify 0.0.16-alpha → 0.0.17-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +34 -9
  2. package/package.json +1 -1
  3. package/skills/uiify/SKILL.md +78 -100
  4. package/skills/uiify/references/compositions/card-rhythm.md +16 -0
  5. package/skills/uiify/references/compositions/destructive-confirmation.md +17 -0
  6. package/skills/uiify/references/compositions/form-grouping.md +16 -0
  7. package/skills/uiify/references/compositions/hero-actions.md +16 -0
  8. package/skills/uiify/references/compositions/page-frame.md +16 -0
  9. package/skills/uiify/references/compositions/pricing-actions.md +15 -0
  10. package/skills/uiify/references/compositions/save-feedback.md +15 -0
  11. package/skills/uiify/references/compositions/table-controls.md +16 -0
  12. package/skills/uiify/references/elements/alert-modal.md +15 -0
  13. package/skills/uiify/references/elements/avatar.md +18 -0
  14. package/skills/uiify/references/elements/badge.md +18 -0
  15. package/skills/uiify/references/elements/bar-chart.md +29 -0
  16. package/skills/uiify/references/elements/button.md +14 -0
  17. package/skills/uiify/references/elements/card.md +14 -0
  18. package/skills/uiify/references/elements/code-block.md +21 -0
  19. package/skills/uiify/references/elements/command-palette.md +22 -0
  20. package/skills/uiify/references/elements/cookie-banner.md +23 -0
  21. package/skills/uiify/references/elements/date-picker.md +19 -0
  22. package/skills/uiify/references/elements/divider.md +18 -0
  23. package/skills/uiify/references/elements/empty-state.md +22 -0
  24. package/skills/uiify/references/elements/feature-grid.md +14 -0
  25. package/skills/uiify/references/elements/field.md +14 -0
  26. package/skills/uiify/references/elements/footer.md +14 -0
  27. package/skills/uiify/references/elements/form.md +14 -0
  28. package/skills/uiify/references/elements/header.md +14 -0
  29. package/skills/uiify/references/elements/hero.md +14 -0
  30. package/skills/uiify/references/elements/image-gallery.md +20 -0
  31. package/skills/uiify/references/elements/inline-alert.md +18 -0
  32. package/skills/uiify/references/elements/input.md +14 -0
  33. package/skills/uiify/references/elements/logo-wall.md +20 -0
  34. package/skills/uiify/references/elements/pagination.md +14 -0
  35. package/skills/uiify/references/elements/password-input.md +19 -0
  36. package/skills/uiify/references/elements/pricing-table.md +13 -0
  37. package/skills/uiify/references/elements/progress-bar.md +19 -0
  38. package/skills/uiify/references/elements/search-input.md +14 -0
  39. package/skills/uiify/references/elements/select.md +14 -0
  40. package/skills/uiify/references/elements/sidebar.md +20 -0
  41. package/skills/uiify/references/elements/stats-bar.md +21 -0
  42. package/skills/uiify/references/elements/stepper.md +20 -0
  43. package/skills/uiify/references/elements/switch.md +14 -0
  44. package/skills/uiify/references/elements/table.md +14 -0
  45. package/skills/uiify/references/elements/testimonial.md +21 -0
  46. package/skills/uiify/references/elements/textarea.md +14 -0
  47. package/skills/uiify/references/elements/timeline.md +20 -0
  48. package/skills/uiify/references/elements/toast.md +13 -0
  49. package/skills/uiify/references/laws/accessibility.md +11 -0
  50. package/skills/uiify/references/laws/error-prevention.md +12 -0
  51. package/skills/uiify/references/laws/feedback.md +9 -0
  52. package/skills/uiify/references/laws/proximity.md +10 -0
  53. package/skills/uiify/references/laws/readability.md +9 -0
  54. package/skills/uiify/references/laws/von-restorff.md +9 -0
package/README.md CHANGED
@@ -46,11 +46,19 @@ In a monorepo with hoisted dependencies, point to the nearest `node_modules/@gun
46
46
 
47
47
  ### `/uiify` page-building skill
48
48
 
49
- The package also includes the `/uiify` AI skill. Use it when an agent is creating or improving a
50
- web page with UIify: it maps the brief to available components, plans the page in `DESIGN.md`,
51
- implements the page in `src/App.tsx` when that file exists, and reports the checks it could run.
52
- It uses the installed package's component references and follows UIify's public styling and
53
- accessibility contracts. Invoke it explicitly so it runs only for page-building work.
49
+ The package also includes the `/uiify` AI skill. Invoke it explicitly when creating or improving a
50
+ web page with UIify. It adds component and UX knowledge to your request while preserving the agent's
51
+ normal workflow: no staged approvals, routine questions or special status output. It follows the
52
+ requested framework route and existing workspace conventions, reads version-matched component
53
+ references and supports custom UI for components UIify does not provide. Existing design decisions
54
+ are reused; invoking the skill does not require creating `DESIGN.md`.
55
+
56
+ The skill ships a compact index plus individually retrievable element, UX-law and composition
57
+ references under `skills/uiify/references/`. During planning it reads recipes for the requested
58
+ elements and relationships between them, then reads the public component docs for matched UIify
59
+ components. It does not load the whole catalog into the prompt. The private harness catalog is the
60
+ source for reviewed knowledge; the package contains only its curated public projection. Knowledge
61
+ is delivered as files, so this workflow does not require an MCP server.
54
62
 
55
63
  Install the skill into the directory your agent reads:
56
64
 
@@ -64,10 +72,15 @@ mkdir -p .claude/skills/uiify
64
72
  cp -R node_modules/@gunkin/uiify/skills/uiify/. .claude/skills/uiify/
65
73
  ```
66
74
 
67
- Then invoke `/uiify <page brief>` in Claude Code, or use the explicit skill invocation supported by
68
- your agent. Add `--auto` to run all stages without confirmation gates. Interactive runs pause at
69
- each stage so you can stop before implementation. The skill writes its design state to `DESIGN.md`
70
- and page code under `src/`; it does not create a page when `src/App.tsx` is absent.
75
+ Claude Code uses `/uiify <page brief>`; other agents use their documented explicit skill invocation.
76
+ No special execution flag is needed. The repository's manual smoke harness exercises Claude Code
77
+ only; activation syntax and token measurements do not establish behavior for other clients.
78
+
79
+ For verification, the skill reuses project tooling. If missing Playwright or axe-core tooling or
80
+ browser binaries are needed, the agent briefly explains what it will install and why before
81
+ installation. This is a notice, not a routine confirmation question. Installation follows project
82
+ rules, uses development dependencies and includes only what is needed. Unavailable checks are
83
+ reported as not run.
71
84
 
72
85
  ### Keeping the skill current when developing UIify
73
86
 
@@ -77,6 +90,18 @@ usage changes, and update the harness catalog when its coverage or gap status ch
77
90
  skill, then checks their tests and freshness. Review and commit generated changes with the component
78
91
  change. `npm run check:ai-harness` runs the focused tests and freshness checks without rewriting files.
79
92
 
93
+ For new design knowledge, inspect the component API and examples; record sourced evidence in the
94
+ private catalog; write a concise `release_body`; review the public projection for privacy and
95
+ usefulness; regenerate the skill; and run package-link and hygiene tests. Private evidence and owner
96
+ rationale stay in the harness source; changing private notes alone does not change what consumers
97
+ receive.
98
+
99
+ The optional paid eval runner records each agent and judge call separately. An unknown cost reserves
100
+ that call's configured cap and blocks later paid calls. `results.json` is atomically checkpointed
101
+ before and after calls and throughout page verification; an existing non-empty output directory is
102
+ not reused. This protects recorded progress but does not measure whether one skill produces better
103
+ designs than another.
104
+
80
105
  Documentation: https://uiify.gunkin.dev/
81
106
 
82
107
  MIT © Anton Gunkin
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gunkin/uiify",
3
- "version": "0.0.16-alpha",
3
+ "version": "0.0.17-alpha",
4
4
  "description": "Native-first, accessible React 19 components that work before hydration.",
5
5
  "keywords": [
6
6
  "accessibility",
@@ -8,160 +8,138 @@ disable-model-invocation: true
8
8
 
9
9
  # /uiify
10
10
 
11
- Brief and flags: $ARGUMENTS
11
+ Page request: $ARGUMENTS
12
12
 
13
- This skill writes only DESIGN.md and files under src/.
13
+ Add UIify component and UX knowledge to the user's request. Follow the agent's normal workflow and the project's instructions; this skill is a reference, not a separate interaction protocol. Do not add approval gates, fixed stages, routine questions or pauses. Use ordinary language in the user's language for useful progress and results, without internal stage names or machine-readable status markers. Proceed with authorized work autonomously; handle genuine missing requirements through the agent's normal workflow.
14
14
 
15
- ## Stage chain
15
+ ## Project context
16
16
 
17
- Run the stages R0 to R4 in order and never skip or reorder one. Each stage has a marker line, a result and, except R4, a gate line after it. Every marker, state and gate line is exact and alone on its own line. The first gate, for example, is `UIIFY:GATE R0>R1 auto`. How you output them depends on the flags above.
17
+ Use the explicit request in the conversation if the client does not substitute `$ARGUMENTS`. Read repository instructions, the relevant package manifest and framework config, and a route example as needed. Resolve `@gunkin/uiify` from the selected workspace, including hoisted dependencies in parent workspaces. Follow the requested framework's route conventions and RSC/client boundaries. Create the requested route rather than replacing the home page; `src/App.tsx` is a destination only when it matches the request.
18
18
 
19
- **Interactive (no `--auto`).** Follow this protocol for every stage:
19
+ Reuse existing design decisions, tokens and conventions, including `DESIGN.md` when present. Do not create `DESIGN.md` or a managed state block merely because this skill was invoked. Create or update planning files only when the user or project workflow calls for them, preserving unrelated content. Keep changes within the requested page and necessary source files; setup and dependency changes follow the user's request and project rules.
20
20
 
21
- 1. Output the stage marker as plain text before you call any tool for that stage.
22
- 2. Do the stage's work; tools are allowed.
23
- 3. Output the stage's result.
24
- 4. Run the gate: ask once with AskUserQuestion ("Continue to the next stage?" with the options Continue and Stop). On Continue print `UIIFY:GATE <from>><to> asked` and go on. On Stop print `UIIFY:STOPPED` and end the run.
21
+ ## Select knowledge for the page
25
22
 
26
- Do not call any tool for a later stage until the current stage's gate line is output. A stage whose marker was not output did not happen.
23
+ Match the needed elements to the Index by name or alias. Use the listed component binding; never invent a binding. A `gap` or an unlisted element needs custom UI, not a guessed UIify API.
27
24
 
28
- **Auto (`--auto`).** Ask nothing. Do all tool work first without commentary: read the project (R0) and create `DESIGN.md` when R2 says to. Then output the whole chain in one final message, in stage order: each stage's marker and result, with `UIIFY:GATE <from>><to> auto` between stages, ending as R4 says. Output nothing else before that message.
25
+ For each selected element with a fourth-column reference path, read that file once. A blank path means no curated recipe is available. From the Composition index, read only relationships where both elements are needed on the page. Read each selected reference and linked law once, including the related laws named by element recipes. Do not load the complete catalog or unrelated component references.
29
26
 
30
- ### R0 activate
27
+ For mapped components, read the resolved package's `agents/index.md` once and the relevant `agents/reference/components/<name>.md`, then adapt a documented example. Import from `@gunkin/uiify/components/<name>`. Inspect Runtime exports and the Types/declaration file before rendering: use the explicit `NameRoot` export when available. A namespace export is not itself a JSX component; use its `.Root` or an explicit root export. Prefer these version-matched references over memory. Use UIify wherever its documented API covers the interaction; for gaps, use semantic native HTML or custom components following UIify's public styling and accessibility contracts.
31
28
 
32
- Marker `UIIFY:R0 activate`. Work: read the project. Does `package.json` list `@gunkin/uiify` under `dependencies` or `devDependencies`, and does `DESIGN.md` exist at the project root? Result: `UIIFY:STATE uiify=<yes|no> design=<found|missing>`.
29
+ ## Design guidance
33
30
 
34
- ### R1 coverage
31
+ Consult `frontend-design` when available for design direction; if absent, use the built-in guidance below. Consult `vercel-react-best-practices` for relevant React performance decisions and `web-design-guidelines` for reviews. These skills are optional references. UIify's public component and styling contracts take precedence over conflicting advice.
35
32
 
36
- Marker `UIIFY:R1 coverage`. Work: split the brief into the page elements it needs and match each one to the index below by name or alias. Result: one line per element, `UIIFY:ELEMENT <name>|<binding>`. For an element the index lists, use its index name and its uiify column as the binding (a uiify component name or `gap`). For an element the index does not list, use a kebab-case name and the binding `unknown`.
33
+ Ground the visual direction in the subject, audience and primary job. Plan clear typography, hierarchy, grouping, purposeful copy and responsive layout using existing semantic color roles. Choose one signature detail appropriate to the subject and keep the rest restrained. Avoid defaulting to a gradient hero, repeated equal cards or decorative numbering without a reason. Preserve visible focus, keyboard-sized targets and reduced-motion behavior.
37
34
 
38
- ### R2 design
35
+ For a settings page, group fields by the decision the person makes, keep labels and validation close to controls, and give one `Button` the save action. Use documented anatomy:
39
36
 
40
- Marker `UIIFY:R2 design`. Work:
41
-
42
- 1. Read `DESIGN.md` and reuse its recorded decisions. If missing, create exactly the skeleton below. Preserve the YAML `tokens` and every byte outside the managed block. If its structure or existing managed block is malformed, report the problem and leave it unchanged.
43
- 2. Use the R1 bindings as the coverage map. The skill package intentionally contains no private element, law or composition catalog files; do not search for `references/elements/`, `references/laws/` or `references/compositions/` under the skill directory. R3 reads UIify's public component documentation when implementing mapped elements.
44
- 3. Consult the `frontend-design` skill when it is available for design direction. Use `web-design-guidelines` only when the task asks for a review, and consult `vercel-react-best-practices` only for a relevant performance decision. These optional skills are references, not dependencies; if absent, use the built-in guidance below. UIify's public component and styling contracts take precedence over any conflicting advice.
45
- 4. Ground the page in its actual subject, audience and primary job. Choose a visual direction that follows the brief and is specific to that subject. Plan a clear typography hierarchy, palette using the project's existing semantic roles, responsive layout, purposeful copy and one memorable signature detail. Use restraint around that signature; don't default to a gradient hero, repeated equal cards or decorative numbering without a reason. Preserve visible focus, keyboard-sized targets and reduced-motion behavior.
46
- 5. Example: for a settings page, group fields by the decision the person is making, keep labels and validation close to each control, and give one `Button` the save action. Use the package's documented anatomy:
47
-
48
- ```tsx
49
- <Field.Root id="email" invalid={invalid} required>
50
- <Field.Label fieldId="email" required>Email</Field.Label>
51
- <Field.Control as="input" fieldId="email" type="email" invalid={invalid} required />
52
- <Field.Error fieldId="email" invalid={invalid}>Enter a valid email address</Field.Error>
53
- </Field.Root>
54
- <Button type="submit">Save changes</Button>
55
- ```
56
-
57
- Don't add an unrelated marketing hero or make every field group an equally prominent card.
58
- 6. Keep existing decisions and plan the page's element order, hierarchy, grouping, actions and visual direction as a decision with id `page-plan`, a concrete `decision`, `why` and `references`. Reuse an existing plan unless the brief requires an explicit revision; retain other decisions. Research only unresolved gaps or open decisions in a subagent, if both delegation and primary-source retrieval tools are available. Request a short summary with dated primary-source links. If those tools are unavailable, report unresolved gaps and keep them `proposed`. Record dates alongside the source URLs in `sources`. Only explicit owner approval can make a gap `accepted`; `--auto` never grants approval. Follow owner prose and report conflicts with the brief; interactive mode can clarify at the normal gate, while `--auto` preserves recorded choices.
59
- 7. Store state only in one JSON block beneath `## Decisions`, delimited by an opening `<!-- uiify:state -->` line and a closing `<!-- /uiify:state -->` line. Its exact shape is `{ "version": 1, "elements": ["R1-name"], "decisions": [{ "id": "page-plan", "decision": "concrete page plan and visual direction", "why": "reason", "references": ["public UIify docs or dated source URLs"] }], "gaps": [{ "element": "gap-name", "status": "proposed", "sources": [] }] }`. Empty lists are allowed; IDs and elements are unique; strings are nonempty. Do not put prose or fences inside the JSON block. Reject duplicate, unclosed, misplaced or invalid blocks. Insert the block immediately after the Decisions heading's newline, without changing surrounding bytes; replace only an existing block and its following newline. If state is unchanged, leave the whole file byte-identical. Keep existing gap acceptance and sources; do not infer approval from research.
60
-
61
- Result: summarize the stored page plan, reused decisions and unresolved gaps, including research limitations.
62
-
63
- ```markdown
64
- ---
65
- tokens: {}
66
- ---
67
-
68
- # Design
69
-
70
- ## Decisions
71
-
72
- ## Gaps
37
+ ```tsx
38
+ <Field.Root id="email" invalid={invalid} required>
39
+ <Field.Label fieldId="email" required>Email</Field.Label>
40
+ <Field.Control as="input" fieldId="email" type="email" invalid={invalid} required />
41
+ <Field.Error fieldId="email" invalid={invalid}>Enter a valid email address</Field.Error>
42
+ </Field.Root>
43
+ <Button type="submit">Save changes</Button>
73
44
  ```
74
45
 
75
- ### R3 build
46
+ Do not add an unrelated marketing hero or make every field group an equally prominent card. For unresolved gaps, explain material limitations in plain language; research only when it helps the request. Research does not grant approval to change the library's public API or mark a catalog gap accepted.
76
47
 
77
- Marker `UIIFY:R3 build`. Work: if `src/App.tsx` exists, write the page into it (new components go under `src/`), following the R1 table and the stored `page-plan` in `DESIGN.md`. Read `node_modules/@gunkin/uiify/agents/index.md` once and adapt a relevant documented example when it matches the page; for each mapped component, read `node_modules/@gunkin/uiify/agents/reference/components/<name>.md`, then import it from `@gunkin/uiify/components/<name>`. Before rendering an export, inspect its Runtime exports and the Types/declaration file for component shape; use the explicit `NameRoot` export when available. A namespace export is not itself a JSX component; use its `.Root` or the explicit root export. For a `gap` or `unknown` element, use semantic native HTML and UIify's public styling contract, and consult public design-system or platform guidance for unresolved behavior when retrieval is available. Write no file outside `src/` and leave `DESIGN.md` as it is. If `src/App.tsx` does not exist, write nothing. Result: one sentence naming what you wrote and where, or where the page would go.
48
+ ## Verification guidance
78
49
 
79
- ### R4 verify
50
+ Use applicable project build, typecheck and test commands when permitted. The optional `node <resolved-skill-directory>/scripts/lint.mjs <project-root>` checks only the static subset enabled by accepted laws in existing design state. No enabled checks is not proof of accessibility. Missing parsers or execution failures mean unavailable, never a pass.
80
51
 
81
- Marker `UIIFY:R4 verify`. Work: when commands are permitted and an execution tool is available, run `node <this-skill-directory>/scripts/lint.mjs <project-root>` and report its actual output. The script runs only the static subset enabled by accepted laws; no enabled checks is not proof of accessibility. Missing TypeScript/parser or another execution failure is unavailable, never a pass. If the consuming task prohibits commands, report "lint not run" with that reason; if no execution tool is available, report that limitation. When a browser tool is available and permitted, inspect the page and requested interactions without creating screenshot artifacts; otherwise report that browser verification was not run. Repair findings only under `src/` in at most two rounds, rerunning available checks after each. Do not edit DESIGN.md during repairs. Result: report executed checks, unavailable checks with reasons, repairs and remaining issues; never claim a check passed without running it. Then print `UIIFY:DONE` and stop.
52
+ Reuse existing browser and accessibility tooling to inspect responsive layouts, keyboard access and requested interactions. When missing tools are needed for quality verification, use Playwright for browser checks and axe-core (or the project's axe integration) for accessibility checks. Before installing missing Playwright or axe-core packages or downloading browser binaries, notify the user briefly in their language, explaining what will be installed and why. For example: “I'll install Playwright and axe-core as development tools to check the page in a browser and catch accessibility issues.” This is a notification, not a confirmation question; continue within existing authorization and respect project installation rules. Use the project's package manager and development dependencies, reuse existing integrations, and install only what is needed.
82
53
 
83
- ## Hard rules
84
-
85
- - Prefer published UIify component documentation over memory when implementing a mapped element.
86
- - Use a uiify component whenever the index names one for the element.
87
- - Ground visual choices in the brief and subject; don't impose one preferred palette or page template.
88
- - Apply optional frontend skills only when available and relevant; UIify's public contracts override generic advice.
89
- - Match elements only against the index: never invent a binding and never use an alias as the element name.
90
- - Run every stage in this conversation and never use context: fork.
91
- - Write only `DESIGN.md` and files under `src/`; R2 changes only its managed state block, R4 repairs only `src/` in at most two rounds.
54
+ Repair findings within the task's scope and rerun the affected checks. If commands, installation or browser execution are unavailable or prohibited, report those checks as not run and explain the limitation. Report actual checks and remaining issues in ordinary language; never claim a check passed without running it.
92
55
 
93
56
  ## Index
94
57
 
95
- One line per element: `element|aliases|uiify component or gap|` (the final field is reserved and empty).
58
+ One line per element: `element|aliases|uiify component or gap|reference path`. A blank final field means no curated reference.
96
59
 
97
60
  ```text
98
61
  accordion|faq-accordion,disclosure|accordion|
99
- alert-modal|confirmation-dialog,alert-dialog|alert-modal|
100
- avatar|profile-picture|gap|
101
- badge|chip,tag|gap|
102
- bar-chart|column-chart|gap|
62
+ alert-modal|confirmation-dialog,alert-dialog|alert-modal|references/elements/alert-modal.md
63
+ avatar|profile-picture|gap|references/elements/avatar.md
64
+ badge|chip,tag|gap|references/elements/badge.md
65
+ bar-chart|column-chart|gap|references/elements/bar-chart.md
103
66
  breadcrumb|breadcrumbs|breadcrumb|
104
- button|cta-button,icon-button,primary-button|button|
67
+ button|cta-button,icon-button,primary-button|button|references/elements/button.md
105
68
  candle-chart|candlestick-chart|candle-chart|
106
- card|content-card|gap|
69
+ card|content-card|gap|references/elements/card.md
107
70
  carousel|testimonial-carousel,image-slider|carousel|
108
71
  checkbox||checkbox|
109
- code-block|code-snippet|gap|
72
+ code-block|code-snippet|gap|references/elements/code-block.md
110
73
  collapsible|expandable-section|collapsible|
111
74
  color-picker||color-picker|
112
75
  combobox|autocomplete,typeahead|combobox|
113
- command-palette|spotlight-search|gap|
76
+ command-palette|spotlight-search|gap|references/elements/command-palette.md
114
77
  context-menu|right-click-menu|context-menu|
115
- cookie-banner|cookie-consent|gap|
116
- date-picker|calendar-picker|gap|
117
- divider|separator|gap|
78
+ cookie-banner|cookie-consent|gap|references/elements/cookie-banner.md
79
+ date-picker|calendar-picker|gap|references/elements/date-picker.md
80
+ divider|separator|gap|references/elements/divider.md
118
81
  drawer|sheet,off-canvas-menu|drawer|
119
82
  dropdown-menu|menu|dropdown-menu|
120
- empty-state|no-results|gap|
121
- feature-grid|feature-cards,feature-list|gap|
122
- field|form-field|field|
83
+ empty-state|no-results|gap|references/elements/empty-state.md
84
+ feature-grid|feature-cards,feature-list|gap|references/elements/feature-grid.md
85
+ field|form-field|field|references/elements/field.md
123
86
  file-upload|file-input,dropzone|file-upload|
124
- footer|site-footer|gap|
125
- form||form|
126
- header|navbar,top-nav|header|
127
- hero|hero-section,hero-banner|gap|
87
+ footer|site-footer|gap|references/elements/footer.md
88
+ form||form|references/elements/form.md
89
+ header|navbar,top-nav|header|references/elements/header.md
90
+ hero|hero-section,hero-banner|gap|references/elements/hero.md
128
91
  hover-card||hover-card|
129
- image-gallery|gallery,lightbox|gap|
130
- inline-alert|banner-alert,callout|gap|
131
- input|text-input|input|
92
+ image-gallery|gallery,lightbox|gap|references/elements/image-gallery.md
93
+ inline-alert|banner-alert,callout|gap|references/elements/inline-alert.md
94
+ input|text-input|input|references/elements/input.md
132
95
  line-chart|sparkline|line-chart|
133
- logo-wall|logo-cloud,customer-logos|gap|
96
+ logo-wall|logo-cloud,customer-logos|gap|references/elements/logo-wall.md
134
97
  modal|dialog|modal|
135
98
  number-field|number-input|number-field|
136
99
  otp-input|pin-input|otp-input|
137
- pagination||pagination|
138
- password-input|show-hide-password|gap|
100
+ pagination||pagination|references/elements/pagination.md
101
+ password-input|show-hide-password|gap|references/elements/password-input.md
139
102
  popup|popover|popup|
140
- pricing-table|pricing,plan-cards,pricing-plans|gap|
141
- progress-bar|progress,linear-progress|gap|
103
+ pricing-table|pricing,plan-cards,pricing-plans|gap|references/elements/pricing-table.md
104
+ progress-bar|progress,linear-progress|gap|references/elements/progress-bar.md
142
105
  radio-group|radio|radio-group|
143
106
  rating|star-rating|rating|
144
- search-input|search-box|gap|
107
+ search-input|search-box|gap|references/elements/search-input.md
145
108
  segmented-control||segmented-control|
146
- select|native-select|select|
147
- sidebar|sidebar-nav,side-nav|gap|
109
+ select|native-select|select|references/elements/select.md
110
+ sidebar|sidebar-nav,side-nav|gap|references/elements/sidebar.md
148
111
  skeleton|skeleton-loader|skeleton|
149
112
  slider|range-slider|slider|
150
113
  spinner|loading-indicator|spinner|
151
- stats-bar|stat-card,metrics|gap|
152
- stepper|step-indicator,wizard-steps|gap|
153
- switch|toggle-switch|switch|
154
- table|data-table,comparison-table|table|
114
+ stats-bar|stat-card,metrics|gap|references/elements/stats-bar.md
115
+ stepper|step-indicator,wizard-steps|gap|references/elements/stepper.md
116
+ switch|toggle-switch|switch|references/elements/switch.md
117
+ table|data-table,comparison-table|table|references/elements/table.md
155
118
  table-of-contents|toc,in-page-nav|table-of-contents|
156
119
  tabs|tab-navigation|tabs|
157
120
  tags-input|token-input|tags-input|
158
- testimonial|testimonials,quote-card|gap|
159
- textarea||textarea|
160
- timeline||gap|
161
- toast|snackbar,toast-notification|toast|
121
+ testimonial|testimonials,quote-card|gap|references/elements/testimonial.md
122
+ textarea||textarea|references/elements/textarea.md
123
+ timeline||gap|references/elements/timeline.md
124
+ toast|snackbar,toast-notification|toast|references/elements/toast.md
162
125
  toggle|toggle-button|toggle|
163
126
  toggle-group|button-group|toggle-group|
164
127
  toolbar||toolbar|
165
128
  tooltip||tooltip|
166
129
  virtual-scroll|virtualized-list|virtual-scroll|
167
130
  ```
131
+
132
+ ## Composition index
133
+
134
+ One line per accepted relationship: `name|element,element|reference path`.
135
+
136
+ ```text
137
+ card-rhythm|feature-grid,card|references/compositions/card-rhythm.md
138
+ destructive-confirmation|alert-modal,button|references/compositions/destructive-confirmation.md
139
+ form-grouping|form,field|references/compositions/form-grouping.md
140
+ hero-actions|hero,button|references/compositions/hero-actions.md
141
+ page-frame|header,footer|references/compositions/page-frame.md
142
+ pricing-actions|pricing-table,button|references/compositions/pricing-actions.md
143
+ save-feedback|button,toast|references/compositions/save-feedback.md
144
+ table-controls|table,pagination|references/compositions/table-controls.md
145
+ ```
@@ -0,0 +1,16 @@
1
+ # card-rhythm
2
+
3
+ Use when both feature-grid and card are present.
4
+
5
+ Law: references/laws/proximity.md
6
+
7
+ ## Rule
8
+
9
+ ## Rule
10
+
11
+ Keep cards in one group only when the items share a purpose and hierarchy. Preserve readable separation and source order as the layout becomes a single column.
12
+
13
+ ## Sources
14
+
15
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
16
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html) (verified 2026-10-16)
@@ -0,0 +1,17 @@
1
+ # destructive-confirmation
2
+
3
+ Use when both alert-modal and button are present.
4
+
5
+ Law: references/laws/error-prevention.md
6
+
7
+ ## Rule
8
+
9
+ ## Rule
10
+
11
+ State the consequence in the dialog title or message. Name both the destructive action and the safe way to cancel, identify the dialog, and follow the modal-dialog focus and keyboard pattern.
12
+
13
+ ## Sources
14
+
15
+ - [www.w3.org](https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/) (verified 2026-10-16)
16
+ - [www.w3.org](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/) (verified 2026-10-16)
17
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html) (verified 2026-10-16)
@@ -0,0 +1,16 @@
1
+ # form-grouping
2
+
3
+ Use when both form and field are present.
4
+
5
+ Law: references/laws/proximity.md
6
+
7
+ ## Rule
8
+
9
+ ## Rule
10
+
11
+ Group related controls with a fieldset and legend. Keep each control labelled and present groups in the order people complete them.
12
+
13
+ ## Sources
14
+
15
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/grouping/) (verified 2026-10-16)
16
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/labels/) (verified 2026-10-16)
@@ -0,0 +1,16 @@
1
+ # hero-actions
2
+
3
+ Use when both hero and button are present.
4
+
5
+ Law: references/laws/von-restorff.md
6
+
7
+ ## Rule
8
+
9
+ ## Rule
10
+
11
+ Make the primary action easy to identify and keep the secondary action visually quieter. Use concrete action labels and retain visible keyboard focus.
12
+
13
+ ## Sources
14
+
15
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html) (verified 2026-10-16)
16
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
@@ -0,0 +1,16 @@
1
+ # page-frame
2
+
3
+ Use when both header and footer are present.
4
+
5
+ Law: references/laws/readability.md
6
+
7
+ ## Rule
8
+
9
+ ## Rule
10
+
11
+ Use consistent page landmarks and repeated navigation order. Align header, main content and footer to one responsive content measure without clipping narrow screens.
12
+
13
+ ## Sources
14
+
15
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html) (verified 2026-10-16)
16
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
@@ -0,0 +1,15 @@
1
+ # pricing-actions
2
+
3
+ Use when both pricing-table and button are present.
4
+
5
+ Law: references/laws/proximity.md
6
+
7
+ ## Rule
8
+
9
+ ## Rule
10
+
11
+ Keep each plan action associated with the plan name, price and included features. Let the page stack plans at narrow widths without changing their reading order.
12
+
13
+ ## Sources
14
+
15
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
@@ -0,0 +1,15 @@
1
+ # save-feedback
2
+
3
+ Use when both button and toast are present.
4
+
5
+ Law: references/laws/feedback.md
6
+
7
+ ## Rule
8
+
9
+ ## Rule
10
+
11
+ Place save feedback near the action it describes and announce the update as a status message. Keep the message understandable without color or motion.
12
+
13
+ ## Sources
14
+
15
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html) (verified 2026-10-16)
@@ -0,0 +1,16 @@
1
+ # table-controls
2
+
3
+ Use when both table and pagination are present.
4
+
5
+ Law: references/laws/proximity.md
6
+
7
+ ## Rule
8
+
9
+ ## Rule
10
+
11
+ Keep labeled search and filters associated with the table they change. Identify the current page and preserve a clear sequence from controls to rows to pagination.
12
+
13
+ ## Sources
14
+
15
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/labels/) (verified 2026-10-16)
16
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
@@ -0,0 +1,15 @@
1
+ # alert-modal
2
+
3
+ Binding: alert-modal
4
+
5
+ Confirm an irreversible action before executing it.
6
+
7
+ Explain the consequence before asking for a decision. Give the dialog a clear title, keep the safe action available, and return focus after the choice.
8
+
9
+ Related laws: references/laws/error-prevention.md, references/laws/accessibility.md
10
+
11
+ ## Sources
12
+
13
+ - [www.w3.org](https://www.w3.org/WAI/ARIA/apg/patterns/alertdialog/) (verified 2026-10-16)
14
+ - [www.w3.org](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/) (verified 2026-10-16)
15
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html) (verified 2026-10-16)
@@ -0,0 +1,18 @@
1
+ # avatar
2
+
3
+ Binding: gap
4
+
5
+ Identify a person or account with a compact image and fallback.
6
+
7
+ When text beside the image already identifies the person, use an empty alt value; otherwise write a concise alternative that identifies the person without repeating nearby text.
8
+
9
+ ```html
10
+ <img src="/people/ada.webp" width="40" height="40" alt="" />
11
+ <span>Ada Lovelace</span>
12
+ ```
13
+
14
+ The empty alternative is appropriate here because the adjacent text already names the person.
15
+
16
+ ## Sources
17
+
18
+ - [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img) (verified 2026-10-16)
@@ -0,0 +1,18 @@
1
+ # badge
2
+
3
+ Binding: gap
4
+
5
+ Mark a short status or category beside related content.
6
+
7
+ Keep a badge short and attach it to the item it qualifies. If the text conveys status, include the status in words and do not rely on color alone.
8
+
9
+ ```html
10
+ <span>Pending review</span>
11
+ ```
12
+
13
+ This is an app-level composition recipe; it does not add a component to UIify.
14
+
15
+ ## Sources
16
+
17
+ - [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span) (verified 2026-10-16)
18
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
@@ -0,0 +1,29 @@
1
+ # bar-chart
2
+
3
+ Binding: gap
4
+
5
+ Compare values across a small set of named categories.
6
+
7
+ Give the chart a concise caption and provide the same values in a readable table. Treat chart color and geometry as supporting views of the values.
8
+
9
+ ```html
10
+ <figure>
11
+ <figcaption>Signups by month</figcaption>
12
+ <svg role="img" aria-label="January 12, February 19">…</svg>
13
+ <table>
14
+ <caption>Signups by month</caption>
15
+ <thead><tr><th scope="col">Month</th><th scope="col">Signups</th></tr></thead>
16
+ <tbody>
17
+ <tr><th scope="row">January</th><td>12</td></tr>
18
+ <tr><th scope="row">February</th><td>19</td></tr>
19
+ </tbody>
20
+ </table>
21
+ </figure>
22
+ ```
23
+
24
+ This is an app-level composition recipe; it does not add a component to UIify.
25
+
26
+ ## Sources
27
+
28
+ - [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figure) (verified 2026-10-16)
29
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
@@ -0,0 +1,14 @@
1
+ # button
2
+
3
+ Binding: button
4
+
5
+ Expose a clear action with its native interaction semantics.
6
+
7
+ Name the action with a concrete verb. Use one visually prominent action for the current decision and keep secondary actions understandable.
8
+
9
+ Related laws: references/laws/von-restorff.md, references/laws/accessibility.md
10
+
11
+ ## Sources
12
+
13
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html) (verified 2026-10-16)
14
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
@@ -0,0 +1,14 @@
1
+ # card
2
+
3
+ Binding: gap
4
+
5
+ Group one feature heading and its explanation.
6
+
7
+ Group related information under a heading. Give a card a link or control only when the entire surface has one clear destination or action.
8
+
9
+ Related laws: references/laws/proximity.md, references/laws/readability.md
10
+
11
+ ## Sources
12
+
13
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
14
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html) (verified 2026-10-16)
@@ -0,0 +1,21 @@
1
+ # code-block
2
+
3
+ Binding: gap
4
+
5
+ Present source text with preserved whitespace.
6
+
7
+ Use preformatted code with a concise caption. Preserve whitespace and provide a separate, clearly named copy action only when copying is available.
8
+
9
+ ```html
10
+ <figure>
11
+ <figcaption>Install the package</figcaption>
12
+ <pre><code>npm install uiify</code></pre>
13
+ </figure>
14
+ ```
15
+
16
+ This is an app-level composition recipe; it does not add a component to UIify.
17
+
18
+ ## Sources
19
+
20
+ - [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre) (verified 2026-10-16)
21
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)