Contributing
Nasaq is developed in the open at github.com/fadymondy/nasaq. Bug reports, fixes, accessibility findings and new components are welcome. For anything larger than a fix, open an issue first so the shap
Nasaq is developed in the open at github.com/fadymondy/nasaq. Bug reports, fixes, accessibility findings and new components are welcome. For anything larger than a fix, open an issue first so the shape can be agreed before you invest the time.
Set up
You need Node 22 or newer and pnpm 11.
git clone https://github.com/fadymondy/nasaq.git
cd nasaq
pnpm install
pnpm lab # this Storybook, on http://localhost:6106The checks
CI runs these, and so should you before opening a pull request:
pnpm typecheck # TypeScript across every package
pnpm lint # logical properties only, no raw hex colours
pnpm test # includes the token contrast matrix
pnpm check:components # every component has a valid README and a story
pnpm --filter @nasaq/site registry # build and validate the shadcn registryLayout of the repo
| Path | What is there |
|---|---|
packages/web | The components (src/components/<name>/), provider and base styles |
packages/tokens | DTCG token source, generated CSS and the contrast tests |
packages/brands | Brand manifests and the official marks |
packages/native, packages/electron | React Native kit and Electron window chrome |
packages/mcp | The MCP server |
packages/nasaq | The published npm package that re-exports the others |
apps/lab | This Storybook: stories, these docs |
apps/site | The registry builder and the docs sync used by the landing site |
docs/ | Design rules and the component README spec |
Adding or changing a component
- Create
packages/web/src/components/<name>/with<name>.tsxand anindex.tsthat re-exports it. Build on a Base UI primitive when one exists. - Write its manual,
README.md, in the format indocs/COMPONENT-README.md: frontmatter, when to use it, API tables, accessibility, RTL notes. The manual feeds the docs tab, the registry and the MCP server, so it has to match the code. - Write its story in
apps/lab/stories/. The story id is the lowercased title with spaces and slashes turned into dashes, and the README'sstory:field must point at it. Cover the states and an Arabic story. - Export it from
packages/web/src/index.ts. - Run the checks above.
House rules
- Logical properties only.
ms-*,pe-*,text-start,start-0,border-s,rounded-s. Neverml-,pr-,left-,text-left. In comments say "context-click", not the physical mouse-button word, because lint scans them. - Tokens, not colours. No raw hex in components. If a token is missing, add it to
packages/tokens/src/dtcgand rebuild. - Direction-safe. Directional icons go through
Icon; user text of unknown direction goes throughBdiorBidiText. - Accessible by default. Keyboard operable, visible focus, labelled, no colour-only state. The lab runs axe on every story.
- No new runtime dependencies in
packages/webwithout discussing it first. - Official brand marks are never recoloured, mirrored or redrawn. Use
ProductMark. - Do not add font files, logos or images you do not have the right to redistribute.
Commits and releases
Use short, imperative commit messages. Releases are managed with Changesets: a change that affects a published package needs a changeset (pnpm changeset), which says which packages change and whether it is a patch, minor or major. See Changelog and versioning.
Security
Please do not open public issues for vulnerabilities. Follow the policy in SECURITY.md in the repository.
Licence
By contributing you agree that your contribution is released under the project's MIT licence.
Page templates
Every category in the sidebar ends with a Pages folder of complete screens, each built only from Nasaq components and tokens with no page-specific CSS. They answer "what does a real settings screen, a
Changelog and versioning
This is the first public release. The components are used daily in the author's own products, but the API has not been through outside use, so treat everything as 0.x: minor versions may contain break