217 lines
7.6 KiB
Markdown
217 lines
7.6 KiB
Markdown
# Cadence UI
|
|
|
|
Cadence UI is a source-owned React component system built in a `pnpm` workspace.
|
|
The repo keeps the `Radix + Tailwind + source-owned components` model, but replaces
|
|
default styling with its own tokens, motion recipes, and component contract.
|
|
|
|
## What this repo contains
|
|
|
|
- `packages/tokens`: theme tokens, motion tokens, and theme helpers
|
|
- `packages/ui`: component source, variants, contracts, and tests
|
|
- `apps/docs`: Storybook docs and usage reference
|
|
- `registry`: generated registry metadata plus the source-copy install contract
|
|
- `tests/e2e`: Playwright smoke coverage for high-value Storybook flows
|
|
|
|
## Current status
|
|
|
|
- The foundation, token layer, authoring contract, Storybook docs, and unit coverage are in place.
|
|
- The public UI surface now includes the core form and overlay set plus advanced patterns such as `DataTable`, `Command`, `Combobox`, `Sheet`, and `EmptyState`.
|
|
- The default distribution path is package-first: `@ai-ui/ui` and `@ai-ui/tokens` are versioned and validated for package consumption.
|
|
- The internal source-copy registry flow remains available as an optional mode for teams that want local ownership of copied component source.
|
|
- The active visual direction is documented in [DESIGN.md](/Users/xd/project/cadence-ui/DESIGN.md): a single Material You inspired language with dynamic color, tonal surfaces, large radii, and one shared motion system.
|
|
|
|
## System principles
|
|
|
|
- Source owned: components live in this repo and are modified directly.
|
|
- Token first: colors, type, radius, shadow, and motion decisions come from tokens.
|
|
- Component contract over component count: stable APIs matter more than shipping many one-off parts.
|
|
- Accessibility by default: keyboard, focus, ARIA, and reduced motion are baseline expectations.
|
|
- Motion with purpose: animation should communicate state and hierarchy, not decorate at random.
|
|
|
|
## System Of Record
|
|
|
|
When changing public visuals, docs, or interaction behavior, treat these files as the baseline
|
|
context before making non-trivial changes:
|
|
|
|
- [DESIGN.md](/Users/xd/project/cadence-ui/DESIGN.md)
|
|
- [README.md](/Users/xd/project/cadence-ui/README.md)
|
|
- [CONTRIBUTING.md](/Users/xd/project/cadence-ui/CONTRIBUTING.md)
|
|
- [roadmap.md](/Users/xd/project/cadence-ui/roadmap.md)
|
|
- [packages/ui/src/lib/contracts.ts](/Users/xd/project/cadence-ui/packages/ui/src/lib/contracts.ts)
|
|
- [apps/docs/src/component-authoring.stories.tsx](/Users/xd/project/cadence-ui/apps/docs/src/component-authoring.stories.tsx)
|
|
- [docs/harness-engineering.md](/Users/xd/project/cadence-ui/docs/harness-engineering.md)
|
|
- [docs/orchestration.md](/Users/xd/project/cadence-ui/docs/orchestration.md)
|
|
|
|
## Getting started
|
|
|
|
Requirements:
|
|
|
|
- `node >= 24`
|
|
- `pnpm >= 10`
|
|
|
|
Install dependencies:
|
|
|
|
```bash
|
|
pnpm install
|
|
```
|
|
|
|
Start Storybook:
|
|
|
|
```bash
|
|
pnpm dev:docs
|
|
```
|
|
|
|
Build the packages:
|
|
|
|
```bash
|
|
pnpm build
|
|
```
|
|
|
|
Build Storybook:
|
|
|
|
```bash
|
|
pnpm build:docs
|
|
```
|
|
|
|
Build the registry metadata:
|
|
|
|
```bash
|
|
pnpm registry:build
|
|
```
|
|
|
|
Run tests:
|
|
|
|
```bash
|
|
pnpm test
|
|
pnpm test:package:consumer
|
|
pnpm test:registry:consumer
|
|
pnpm test:e2e:smoke
|
|
```
|
|
|
|
Run lint and typecheck:
|
|
|
|
```bash
|
|
pnpm lint
|
|
pnpm typecheck
|
|
```
|
|
|
|
## Package consumption
|
|
|
|
Package consumption is the default path for downstream apps:
|
|
|
|
```bash
|
|
pnpm add @ai-ui/ui
|
|
```
|
|
|
|
Prefer a single CSS entrypoint from `@ai-ui/ui`:
|
|
|
|
```tsx
|
|
import { Button } from "@ai-ui/ui";
|
|
```
|
|
|
|
```css
|
|
@import "tailwindcss";
|
|
@import "@ai-ui/ui/styles.css";
|
|
@source "../node_modules/@ai-ui/ui/src";
|
|
```
|
|
|
|
This keeps the app on one UI package import path while still pulling in token and skin
|
|
styles together. Consumers that want lower-level control can still import
|
|
`@ai-ui/tokens/styles.css` and `@ai-ui/ui/skins.css` separately. If you need token helpers
|
|
such as `setTheme` or `setDynamicColor`, add `@ai-ui/tokens` directly as well.
|
|
|
|
If you need source ownership instead of package upgrades, use the optional registry
|
|
installer to copy component source into another project:
|
|
|
|
```bash
|
|
pnpm registry:install --project ../acme-app button dialog
|
|
```
|
|
|
|
Package release details live in [docs/releasing.md](/Users/xd/project/cadence-ui/docs/releasing.md).
|
|
Source-copy install and upgrade details live in [docs/registry.md](/Users/xd/project/cadence-ui/docs/registry.md).
|
|
|
|
## Workspace structure
|
|
|
|
```txt
|
|
apps/
|
|
docs/ Storybook docs and interaction examples
|
|
packages/
|
|
tokens/ Theme and motion tokens
|
|
ui/ Component source, variants, tests, and contracts
|
|
tests/
|
|
e2e/ Playwright smoke specs
|
|
registry/ Generated item metadata for copy-in installs
|
|
```
|
|
|
|
## How the component system is organized
|
|
|
|
The system is layered:
|
|
|
|
1. Tokens define semantic color, type, surface, radius, shadow, and motion values.
|
|
2. Primitives build on Radix where accessibility and interaction behavior matter.
|
|
3. Motion recipes provide reusable transition patterns instead of ad hoc animation rules.
|
|
4. Components compose tokens, primitives, and recipes into the public API.
|
|
|
|
The current public component layer lives in `packages/ui/src/components`, with shared
|
|
helpers in `packages/ui/src/lib`.
|
|
|
|
## Optional Source-Copy Flow
|
|
|
|
Cadence UI still ships a registry installer for teams that want to copy component source
|
|
into their own app and keep editing it there. This is the advanced customization path,
|
|
not the default distribution path.
|
|
|
|
- Registry metadata lives in `registry/index.json` and is generated by `pnpm registry:build`.
|
|
- The generated index tracks transitive local helpers in addition to component entrypoints, so helper-import changes need a registry rebuild before merge.
|
|
- The installer copies components into `src/cadence-ui`, adds missing package dependencies,
|
|
and writes `src/cadence-ui/.install-manifest.json` so upgrades can reuse the same item set.
|
|
- `pnpm test:registry:consumer` creates a temporary consumer app, runs the installer, and
|
|
verifies the copied source typechecks and builds.
|
|
- Install and upgrade instructions live in [docs/registry.md](/Users/xd/project/cadence-ui/docs/registry.md).
|
|
|
|
## Docs and QA
|
|
|
|
Storybook is the main usage reference and review surface. Component stories are expected
|
|
to document more than the default playground when behavior is non-trivial. The repo also
|
|
uses:
|
|
|
|
- Vitest + Testing Library for unit and interaction coverage
|
|
- package consumer smoke coverage for published-package consumption
|
|
- Storybook interaction coverage for representative examples
|
|
- Playwright smoke coverage for core Storybook flows
|
|
- Storybook a11y checks as part of the docs review surface
|
|
|
|
## Harness engineering
|
|
|
|
Cadence UI now includes a first-pass harness workflow for agent-friendly engineering. The goal is
|
|
to make the repository easier to understand, plan against, and validate mechanically.
|
|
|
|
- System guidance lives in [docs/harness-engineering.md](/Users/xd/project/cadence-ui/docs/harness-engineering.md).
|
|
- Non-trivial work should start with an execution plan under
|
|
[docs/exec-plans](/Users/xd/project/cadence-ui/docs/exec-plans/README.md).
|
|
- Shared validation suites are exposed through the root `pnpm harness:*` scripts.
|
|
- Worktree-oriented orchestration defaults live in
|
|
[docs/orchestration.md](/Users/xd/project/cadence-ui/docs/orchestration.md).
|
|
|
|
Useful commands:
|
|
|
|
```bash
|
|
pnpm harness:select
|
|
pnpm harness:suites
|
|
pnpm harness:validate:static
|
|
pnpm harness:validate:changed
|
|
pnpm harness:validate:component
|
|
pnpm harness:validate:docs
|
|
pnpm harness:validate:docs-smoke
|
|
pnpm harness:validate:consumers
|
|
pnpm harness:validate:pr
|
|
pnpm harness:validate:release
|
|
pnpm harness:orch -- status --run <run-id>
|
|
```
|
|
|
|
## Contributing
|
|
|
|
Read [CONTRIBUTING.md](/Users/xd/project/cadence-ui/CONTRIBUTING.md) before adding or
|
|
changing components. It documents the component contract, story expectations, reduced
|
|
motion and theme requirements, and the minimum validation workflow.
|