LeafyGreen UI – LeafyGreen's React UI Kit
A library of React components, CSS patterns, and CLI tools for MongoDB’s LeafyGreen Design System.
npm install -g @lg-tools/cli
lg install
lg install button combobox
import Button from '@leafygreen-ui/button';
import { Combobox, ComboboxOptions } from '@leafygreen-ui/combobox';
npm
, pnpm
, or yarn
pnpm add @leafygreen-ui/button
import Button from '@leafygreen-ui/button';
Package | Latest | Downloads | Live Example |
---|---|---|---|
@leafygreen-ui/a11y | Live Example | ||
@leafygreen-ui/avatar | Live Example | ||
@leafygreen-ui/badge | Live Example | ||
@leafygreen-ui/banner | Live Example | ||
@leafygreen-ui/box | Live Example | ||
@leafygreen-ui/button | Live Example | ||
@leafygreen-ui/callout | Live Example | ||
@leafygreen-ui/card | Live Example | ||
@leafygreen-ui/checkbox | Live Example | ||
@leafygreen-ui/chip | Live Example | ||
@leafygreen-ui/code | Live Example | ||
@leafygreen-ui/combobox | Live Example | ||
@leafygreen-ui/confirmation-modal | Live Example | ||
@leafygreen-ui/copyable | Live Example | ||
@leafygreen-ui/date-picker | Live Example | ||
@leafygreen-ui/date-utils | Live Example | ||
@leafygreen-ui/descendants | Live Example | ||
@leafygreen-ui/drawer | Live Example | ||
@leafygreen-ui/emotion | Live Example | ||
@leafygreen-ui/empty-state | Live Example | ||
@leafygreen-ui/expandable-card | Live Example | ||
@leafygreen-ui/form-field | Live Example | ||
@leafygreen-ui/form-footer | Live Example | ||
@leafygreen-ui/gallery-indicator | Live Example | ||
@leafygreen-ui/guide-cue | Live Example | ||
@leafygreen-ui/hooks | Live Example | ||
@leafygreen-ui/icon | Live Example | ||
@leafygreen-ui/icon-button | Live Example | ||
@leafygreen-ui/info-sprinkle | Live Example | ||
@leafygreen-ui/inline-definition | Live Example | ||
@leafygreen-ui/input-option | Live Example | ||
@leafygreen-ui/leafygreen-provider | Live Example | ||
@leafygreen-ui/lib | Live Example | ||
@leafygreen-ui/loading-indicator | Live Example | ||
@leafygreen-ui/logo | Live Example | ||
@leafygreen-ui/marketing-modal | Live Example | ||
@leafygreen-ui/menu | Live Example | ||
@leafygreen-ui/modal | Live Example | ||
@leafygreen-ui/number-input | Live Example | ||
@leafygreen-ui/ordered-list | Live Example | ||
@leafygreen-ui/pagination | Live Example | ||
@leafygreen-ui/palette | Live Example | ||
@leafygreen-ui/password-input | Live Example | ||
@leafygreen-ui/pipeline | Live Example | ||
@leafygreen-ui/polymorphic | Live Example | ||
@leafygreen-ui/popover | Live Example | ||
@leafygreen-ui/portal | Live Example | ||
@leafygreen-ui/radio-box-group | Live Example | ||
@leafygreen-ui/radio-group | Live Example | ||
@leafygreen-ui/ripple | Live Example | ||
@leafygreen-ui/search-input | Live Example | ||
@leafygreen-ui/segmented-control | Live Example | ||
@leafygreen-ui/select | Live Example | ||
@leafygreen-ui/side-nav | Live Example | ||
@leafygreen-ui/skeleton-loader | Live Example | ||
@leafygreen-ui/split-button | Live Example | ||
@leafygreen-ui/stepper | Live Example | ||
@leafygreen-ui/table | Live Example | ||
@leafygreen-ui/tabs | Live Example | ||
@leafygreen-ui/testing-lib | Live Example | ||
@leafygreen-ui/text-area | Live Example | ||
@leafygreen-ui/text-input | Live Example | ||
@leafygreen-ui/toast | Live Example | ||
@leafygreen-ui/toggle | Live Example | ||
@leafygreen-ui/tokens | Live Example | ||
@leafygreen-ui/tooltip | Live Example | ||
@leafygreen-ui/typography | Live Example | ||
@lg-charts/chart-card | Live Example | ||
@lg-charts/colors | Live Example | ||
@lg-charts/core | Live Example | ||
@lg-charts/drag-provider | Live Example | ||
@lg-charts/legend | Live Example | ||
@lg-charts/series-provider | Live Example | ||
@lg-chat/avatar | Live Example | ||
@lg-chat/chat-disclaimer | Live Example | ||
@lg-chat/chat-window | Live Example | ||
@lg-chat/fixed-chat-window | Live Example | ||
@lg-chat/input-bar | Live Example | ||
@lg-chat/leafygreen-chat-provider | Live Example | ||
@lg-chat/lg-markdown | Live Example | ||
@lg-chat/message | Live Example | ||
@lg-chat/message-feed | Live Example | ||
@lg-chat/message-feedback | Live Example | ||
@lg-chat/message-prompts | Live Example | ||
@lg-chat/message-rating | Live Example | ||
@lg-chat/rich-links | Live Example | ||
@lg-chat/title-bar | Live Example | ||
@lg-tools/build | |||
@lg-tools/cli | |||
@lg-tools/codemods | |||
@lg-tools/create | |||
@lg-tools/install | |||
@lg-tools/link | |||
@lg-tools/lint | |||
@lg-tools/meta | |||
@lg-tools/slackbot | |||
@lg-tools/storybook-addon | |||
@lg-tools/storybook-decorators | |||
@lg-tools/storybook-utils | |||
@lg-tools/test | |||
@lg-tools/test-harnesses | |||
@lg-tools/update | |||
@lg-tools/validate |
Node >= 18.0.0 required.
via homebrew with brew install node
via nodejs installer
Install PNPM >= 9.15.0.
Clone the repository.
# Navigate to the directory you'd like to clone the repository into
$ cd ~/my/repositories
# Clone the repository.
# We recommend installing using the SSH address rather than the HTTPS one to make authentication easier for you. To set up SSH authentication with GitHub, see their guide: https://docs.github.com/en/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account
Install dependencies and link packages.
pnpm run init
Start up storybook to see all UI components that exist:
pnpm start
Note: Running storybook doesn’t trigger changes in dependencies, only the main component’s — e.g. If you’re looking at Button
, and make a change to Lib
, you need to rebuild Lib
for Storybook to see those changes in Button
.
To rebuild all packages:
pnpm build
To rebuild select packages, filter using --filter
:
pnpm build --filter="[package]"
// ex. --filter="@leafygreen-ui/hooks"
To actively develop leafygreen-ui
components within an application, the following script will link all leafygreen-ui
components within your application to the local leafygreen-ui
repository.
This will allow you to make changes to your local repository of leafygreen-ui
and see those changes immediately reflected within your running application. This allows you to develop both in isolation (within leafygreen-ui
) and in the context of your application.
To do this, clone this repository and navigate to the root directory (where package.json
is located), then run the following:
pnpm run link -- ${PATH_TO_APPLICATION}
The script does several things in order:
This builds every leafygreen-ui
component so they are ready to be linked
It scans your application for any installed leafygreen-ui
components in your node_modules/@leafygreen-ui
folder.
NOTE: If the package is new and unpublished/not installed, you will need to create a directory for the new component within your application inside node_modules/@leafygreen-ui
before running this command.
If any leafygreen-ui
components are found then the script uses pnpm link
to link every node_modules/@leafygreen-ui
module to your local leafygreen-ui
repository.
After the script completes, you can make changes directly to the component in your local leafygreen-ui
repository. Once you do this, run pnpm build
in the root of the leafygreen-ui
repository and the changes will be visible on your running application.
To get started quickly and easily run pnpm create-package my-new-package
. When you run this command, we create a directory containing all of the boilerplate code that you’ll need to start developing your new Component.
Note: it’s important to follow the kebab-casing convention described above.
build.tsconfig.json
leafygreen-ui
dependencies in your new component, add the dependency to the component directory’s tsconfig.json
.pnpm run init
to link all packages before starting developmentWhen you run pnpm fix
, we do the following:
pnpm prettier:fix
so that we have consistently formatted code.pnpm eslint:fix
to catch any syntax errors, unused variables, and any other easy-to-catch issues.To fix all files in the repository, run the following:
pnpm fix
To check if any files need formatting without automatically formatting them, run the following:
pnpm prettier:check
To run linting without automatically fixing issues, run the following:
pnpm eslint:check
To run typechecking without compiling the code, run the following:
pnpm ts
To run the unit tests for our components, run the following:
pnpm test
When making a PR that contains changes that should be included in a package’s changelog, be sure to do so by running:
pnpm changeset
This will generate a changes.json
file, keeping track of version upgrades and update descriptions. We follow semver conventions for versioning, so each change will either be major, minor, or patch.
Make sure that the PR includes the changes made by running this command.
Merge the automatically generated Version Packages
PR that will contain appropriate version bumps and changelog documentation.
Push the tags from the release up to Github.
git push --follow-tags
Read more in-depth pre-release guides here
Pre-releases let you publish an alpha/beta/next version of a component, allowing developers to test a component before fully releasing a component.
Let’s imagine we want to publish a beta
release of some component. Our work is being done on a branch called new-feature
git checkout -b pre-release
pnpm changeset pre enter beta
(name can be next
, beta
, alpha
, or any other name)pnpm changeset version
X.Y.Z-beta.0
(or whatever name you used)git commit -am "Prerelease version packages"
pnpm build <...components>
pnpm changeset publish
Any new work you do should be done in the original (new-feature
) branch.
To publish a new pre-release version, pull the changes from new-feature
into branch pre-release
, and follow steps 3-5.
When new-feature
is merged into main
, you can safely delete the pre-release
branch
You can deploy a static build of our Storybook site to gh-pages from the main
branch.
build-storybook
pnpm release:site
pnpm demo:site [your_github_username]
.The source files in this repository are made available under the terms of the Apache License, version 2.0.