Skip to content

Latest commit

 

History

History
52 lines (38 loc) · 2.39 KB

CONTRIBUTING.md

File metadata and controls

52 lines (38 loc) · 2.39 KB

Contributing

Development

bun install
bun run check

bun run check runs typecheck, lint, format check and unit tests. bun run format rewrites the tree.

Contributors sign the CLA on their first PR; the CLA bot explains how.

bun run test:e2e checks the built package: every exports target exists and the root entry loads under Node with every optional peer blocked, and unit-tests the contrast maths the stories sweep uses (e2e/contrast.ts), then packs the package into a Vite host and runs the Playwright specs in e2e/ against it. Each scenario is a route in e2e/fixtures.tsx. The same run builds the Storybook stories and fails on any serious or critical axe violation in any story. Run bun run build first, and bunx playwright install chromium once. CI also runs bun run contrast-test (theme contrast floors, reads dist/styles.css) and bun run dep-guard (forbidden imports, see AGENTS.md) after the build.

Theme and stories

Change tokens in src/theme.css, then run bun run build; dist/ is generated. A failing contrast pair prints FAIL <ratio>:1 (>=<floor>) <mode> <pair>. Fix it with a naming rule in checksFor, never a hardcoded hex pair.

bun run stories starts the Storybook workbench over every component against src/theme.css; bun run stories:build writes a static copy to build/. A new component ships with a story for each meaningful state (loading, empty, error).

Commit messages

Commit subjects and PR titles follow Conventional Commits: feat, fix, refactor, test, docs, build, ci, perf, and chore(release): x.y.z for releases. Add ! only for public API breaks: removed or renamed exports, changed signatures, newly required params. Peer and dependency range changes are build(deps): with no !. Keep subjects imperative, lowercase after the colon, 72 characters or less, and free of ticket IDs. Every PR links its issue with a Closes <issue id> line in the PR body. Corbits Triage closes a pull request that has none.

Releasing

Releases are manual. On a clean, up-to-date main:

npm version <patch|minor> -m "chore(release): %s"
git push --follow-tags
gh release create "v$(node -p 'require("./package.json").version')" --generate-notes
npm publish

Bump minor only for breaking API changes; everything else is a patch. prepack builds dist/ from the tagged commit.