Thanks for your interest in contributing! Babelize Elements is a community-built library — every component you see was contributed by someone like you.
We need Localization UI components: language switchers, locale pickers, translation widgets, RTL-aware layouts, pluralization UI, locale-aware date/time and currency inputs, and anything else localized apps need.
Browse open issues — issues labeled good first issue and help wanted are great starting points. No matching issue? Open one to propose the component before building it. Use the Component Request template to propose new components.
When opening or triaging issues, use these labels:
component+ a category label (language-switcher,locale-picker,rtl-layout,translation-widget,date-time,currency,pluralization,accessibility)needs-triageon new issues until classifiedneeds-reviewon PRs awaiting maintainer reviewpriority: high/priority: medium/priority: lowfor urgencystatus: blockedif external dependency or decision is needed
- Fork the repository.
- Clone your fork and install dependencies:
git clone https://github.com/<your-username>/babelize-elements.git cd babelize-elements npm ci
- Create a branch for your work.
- Build your component in
src/registry/components/.
Read ARCHITECTURE.md first — it explains how the library, the registry, and the docs site relate, the conventions every component follows, and the six files a new component touches. The docs code blocks section covers how a demo file becomes the Code tab on a docs page.
Before opening a pull request, make sure your component:
- Is TypeScript-first, with exported interfaces for all props
- Is localization-aware — handles locale codes, pluralization, or RTL as applicable
- Is accessible — keyboard support, ARIA labels, focus states
- Uses Tailwind CSS (dark-mode compatible)
- Supports controlled and uncontrolled use (
value/defaultValue/onValueChange) - Forwards a ref and spreads unknown props onto its root element
- Has tests in
test/covering render, interaction, and controlled mode - Has a demo at
src/components/docs/<name>-demo.tsx— the docs Code tab renders this file verbatim, so write it as the snippet you'd want someone to copy: just the component and its props, no wrapper card or theme toggle (the preview shell provides those) - Has an MDX page embedding
<PreviewComponents registryName="<name>"> - Runs clean through
npm ci,npm run lint,npm run typecheck,npm run test, andnpm run build
Use the PR template — it walks you through the component checklist and asks for a usage snippet. Branch protection requires 1 approving review before merge.
- Keep changes focused on a single component.
- Reference the issue your PR closes (e.g.
Closes #42). - Run the local checks before opening the PR:
npm ci,npm run lint,npm run typecheck,npm run test, andnpm run build. - Always attach screenshots or a screen recording in the PR. UI, component, docs, and layout changes need before/after stills or a short clip of the interaction — including dark mode and a narrow viewport when those apply.
- In the PR description, include a brief usage snippet and any notes on design decisions.
- Label your PR with
componentand the relevant category.
Merging to main publishes nothing. A release is a deliberate act, and it takes
one step.
- Go to Releases → Draft a new release.
- Tag:
vX.Y.Z— thevprefix is expected, and the tag is the version that gets published. A tag that isn't semver fails the job rather than publishing. - Click Auto-generate release notes to list the merged PRs, then edit. If the release changes or removes a prop, say so at the top — that's what people read.
- Publish release.
Give the release a descriptive title (e.g. v1.3.0: LanguageSwitcherPill and keyboard navigation). Once npm publishing succeeds, the workflow opens an Announcements
discussion from the release, using that title and the release notes. If you already
ticked "Create a discussion", the workflow leaves it alone; pre-releases get none.
Publishing the release triggers .github/workflows/release.yml, which re-runs the
full check set against that commit and then publishes to npm with provenance. Watch
it in the Actions tab; if it fails, nothing is published and you can fix and re-run
without cutting a new tag:
gh workflow run release.yml -f tag=vX.Y.ZNote npm takes about five minutes to show a new version after the job succeeds —
npm view @babelize/elements version lagging is normal, not a failure.
Breaking a prop, removing an export, or changing runtime behaviour someone could be relying on is a major. New component or new prop is a minor. Fixes are patches. Keep deprecated prop aliases for at least one minor release before removing them.
- Hand-edit
versioninpackage.jsonoutside a release, orCHANGELOG.mdabove the1.0.16line — everything from1.1.0on lives in GitHub Releases. - Run
npm publishlocally. It skips every check and drops the provenance attestation. - Override a failing
test:pack. That check installs the packed tarball into a clean project and imports it; if it fails, the package is broken for everyone installing it. It exists because a broken build shipped to npm sixteen times without anyone noticing.
This project follows the Contributor Covenant Code of Conduct. By participating, you agree to uphold it.
If you discover a security issue, please report it privately via email or Discord. See SECURITY.md for details.
Open a discussion or join the Babelize community Discord.