Observed since 20 Oct, 18:58 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
21st-kit
A modern React UI component library
A modern React UI component library designed for building beautiful, accessible, and responsive web applications.
# npm
npm install 21st-kit
# yarn
yarn add 21st-kit
# pnpm
pnpm add 21st-kit
import React from 'react';
import { ThemeProvider, Button, Card, CardContent } from '21st-kit';
import '21st-kit/dist/index.css';
function App() {
return (
<ThemeProvider>
<Card>
<CardContent>
<h2>Hello, 21st-Kit!</h2>
<p>A modern React UI component library</p>
<Button>Get Started</Button>
</CardContent>
</Card>
</ThemeProvider>
);
}
export default App;
21st-Kit comes with a powerful theming system that allows you to customize the look and feel of your application.
import { ThemeProvider } from '21st-kit';
function App() {
const customTheme = {
colors: {
primary: '#0070f3',
secondary: '#7928ca',
// Override other colors as needed
},
borderRadius: {
md: '0.5rem',
// Override other border radiuses as needed
},
// Override other theme values as needed
};
return (
<ThemeProvider theme={customTheme}>
{/* Your app content */}
</ThemeProvider>
);
}
21st-Kit works seamlessly with popular form libraries like React Hook Form and Formik.
import { useForm, Controller } from 'react-hook-form';
import { Form, FormItem, FormLabel, FormControl, FormMessage, Input, Button } from '21st-kit';
function LoginForm() {
const { control, handleSubmit, formState: { errors } } = useForm({
defaultValues: {
email: '',
password: '',
}
});
const onSubmit = (data) => {
console.log(data);
};
return (
<Form onSubmit={handleSubmit(onSubmit)}>
<FormItem validationState={errors.email ? 'invalid' : 'default'}>
<FormLabel required>Email</FormLabel>
<FormControl>
<Controller
name="email"
control={control}
rules={{
required: 'Email is required',
pattern: {
value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
message: 'Invalid email address'
}
}}
render={({ field }) => (
<Input
type="email"
placeholder="Enter your email"
{...field}
/>
)}
/>
</FormControl>
<FormMessage error={errors.email?.message} />
</FormItem>
{/* Password field and submit button */}
</Form>
);
}
Many components in 21st-Kit support both controlled and uncontrolled usage patterns.
import { useState } from 'react';
import { Tabs, TabsList, TabsTrigger, TabsContent } from '21st-kit';
function ControlledTabs() {
const [activeTab, setActiveTab] = useState('tab1');
return (
<Tabs value={activeTab} onValueChange={setActiveTab}>
<TabsList>
<TabsTrigger value="tab1">Tab 1</TabsTrigger>
<TabsTrigger value="tab2">Tab 2</TabsTrigger>
</TabsList>
<TabsContent value="tab1">Content for Tab 1</TabsContent>
<TabsContent value="tab2">Content for Tab 2</TabsContent>
</Tabs>
);
}
import { Tabs, TabsList, TabsTrigger, TabsContent } from '21st-kit';
function UncontrolledTabs() {
return (
<Tabs defaultValue="tab1">
<TabsList>
<TabsTrigger value="tab1">Tab 1</TabsTrigger>
<TabsTrigger value="tab2">Tab 2</TabsTrigger>
</TabsList>
<TabsContent value="tab1">Content for Tab 1</TabsContent>
<TabsContent value="tab2">Content for Tab 2</TabsContent>
</Tabs>
);
}
21st-Kit provides multiple button variants to suit different UI needs:
import { Button } from '21st-kit';
function ButtonExamples() {
return (
<div>
<Button variant="primary">Primary</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="outline">Outline</Button>
<Button variant="text">Text</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="link">Link</Button>
<Button variant="danger">Danger</Button>
<Button variant="success">Success</Button>
<Button variant="warning">Warning</Button>
<Button variant="info">Info</Button>
{/* Icon buttons */}
<Button size="icon" aria-label="Settings">
<SettingsIcon />
</Button>
{/* Loading state */}
<Button loading>Loading</Button>
{/* With icons */}
<Button leftIcon={<DownloadIcon />}>Download</Button>
<Button rightIcon={<ArrowRightIcon />}>Next</Button>
</div>
);
}
We welcome contributions! Please see our Contributing Guide for more details.
MIT © Bharadwaj Apittu
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
clsxEnvironment{
"local_name": "clsx",
"alias": false,
"peer_metadata": null
} | ^2.1.1 | runtime |
reactEnvironment{
"local_name": "react",
"alias": false,
"peer_metadata": null
} | ^18.0.0 | runtime |
react-domEnvironment{
"local_name": "react-dom",
"alias": false,
"peer_metadata": null
} | ^18.0.0 | runtime |
class-variance-authorityEnvironment{
"local_name": "class-variance-authority",
"alias": false,
"peer_metadata": null
} | ^0.7.0 | runtime |
sassEnvironment{
"local_name": "sass",
"alias": false,
"peer_metadata": null
} | ^1.85.1 | development |
viteEnvironment{
"local_name": "vite",
"alias": false,
"peer_metadata": null
} | ^4.4.5 | development |
eslintEnvironment{
"local_name": "eslint",
"alias": false,
"peer_metadata": null
} | ^8.45.0 | development |
postcssEnvironment{
"local_name": "postcss",
"alias": false,
"peer_metadata": null
} | ^8.4.31 | development |
storybookEnvironment{
"local_name": "storybook",
"alias": false,
"peer_metadata": null
} | ^7.5.3 | development |
typescriptEnvironment{
"local_name": "typescript",
"alias": false,
"peer_metadata": null
} | ^5.0.2 | development |
@types/nodeEnvironment{
"local_name": "@types/node",
"alias": false,
"peer_metadata": null
} | ^20.9.0 | development |
@types/reactEnvironment{
"local_name": "@types/react",
"alias": false,
"peer_metadata": null
} | ^18.2.15 | development |
autoprefixerEnvironment{
"local_name": "autoprefixer",
"alias": false,
"peer_metadata": null
} | ^10.4.16 | development |
@storybook/testEnvironment{
"local_name": "@storybook/test",
"alias": false,
"peer_metadata": null
} | ^7.6.20 | development |
vite-plugin-dtsEnvironment{
"local_name": "vite-plugin-dts",
"alias": false,
"peer_metadata": null
} | ^3.6.3 | development |
@storybook/reactEnvironment{
"local_name": "@storybook/react",
"alias": false,
"peer_metadata": null
} | ^7.6.20 | development |
@types/react-domEnvironment{
"local_name": "@types/react-dom",
"alias": false,
"peer_metadata": null
} | ^18.2.7 | development |
@storybook/blocksEnvironment{
"local_name": "@storybook/blocks",
"alias": false,
"peer_metadata": null
} | ^7.5.3 | development |
@rollup/plugin-jsonEnvironment{
"local_name": "@rollup/plugin-json",
"alias": false,
"peer_metadata": null
} | ^6.1.0 | development |
@vitejs/plugin-reactEnvironment{
"local_name": "@vitejs/plugin-react",
"alias": false,
"peer_metadata": null
} | ^4.0.3 | development |
rollup-plugin-terserEnvironment{
"local_name": "rollup-plugin-terser",
"alias": false,
"peer_metadata": null
} | ^7.0.2 | development |
@storybook/react-viteEnvironment{
"local_name": "@storybook/react-vite",
"alias": false,
"peer_metadata": null
} | ^7.5.3 | development |
rollup-plugin-postcssEnvironment{
"local_name": "rollup-plugin-postcss",
"alias": false,
"peer_metadata": null
} | ^4.0.2 | development |
@storybook/addon-linksEnvironment{
"local_name": "@storybook/addon-links",
"alias": false,
"peer_metadata": null
} | ^7.5.3 | development |
@rollup/plugin-commonjsEnvironment{
"local_name": "@rollup/plugin-commonjs",
"alias": false,
"peer_metadata": null
} | ^28.0.2 | development |
eslint-plugin-storybookEnvironment{
"local_name": "eslint-plugin-storybook",
"alias": false,
"peer_metadata": null
} | ^0.6.15 | development |
@rollup/plugin-typescriptEnvironment{
"local_name": "@rollup/plugin-typescript",
"alias": false,
"peer_metadata": null
} | ^12.1.2 | development |
@typescript-eslint/parserEnvironment{
"local_name": "@typescript-eslint/parser",
"alias": false,
"peer_metadata": null
} | ^6.0.0 | development |
eslint-plugin-react-hooksEnvironment{
"local_name": "eslint-plugin-react-hooks",
"alias": false,
"peer_metadata": null
} | ^4.6.0 | development |
@storybook/testing-libraryEnvironment{
"local_name": "@storybook/testing-library",
"alias": false,
"peer_metadata": null
} | ^0.2.2 | development |
@rollup/plugin-node-resolveEnvironment{
"local_name": "@rollup/plugin-node-resolve",
"alias": false,
"peer_metadata": null
} | ^16.0.0 | development |
@storybook/addon-essentialsEnvironment{
"local_name": "@storybook/addon-essentials",
"alias": false,
"peer_metadata": null
} | ^7.6.20 | development |
@storybook/addon-onboardingEnvironment{
"local_name": "@storybook/addon-onboarding",
"alias": false,
"peer_metadata": null
} | ^1.0.11 | development |
eslint-plugin-react-refreshEnvironment{
"local_name": "eslint-plugin-react-refresh",
"alias": false,
"peer_metadata": null
} | ^0.4.3 | development |
@storybook/addon-interactionsEnvironment{
"local_name": "@storybook/addon-interactions",
"alias": false,
"peer_metadata": null
} | ^7.5.3 | development |
@typescript-eslint/eslint-pluginEnvironment{
"local_name": "@typescript-eslint/eslint-plugin",
"alias": false,
"peer_metadata": null
} | ^6.0.0 | development |
rollup-plugin-peer-deps-externalEnvironment{
"local_name": "rollup-plugin-peer-deps-external",
"alias": false,
"peer_metadata": null
} | ^2.2.4 | development |
reactEnvironment{
"local_name": "react",
"alias": false,
"peer_metadata": null
} | ^18.0.0 | peer |
react-domEnvironment{
"local_name": "react-dom",
"alias": false,
"peer_metadata": null
} | ^18.0.0 | peer |
Source distribution
{
"shasum": "09ccb276b2a9234e0e3629d8d70af6fafd17ba1a",
"tarball": "https://registry.npmjs.org/21st-kit/-/21st-kit-0.1.3.tgz",
"fileCount": 29,
"integrity": "sha512-WyppgNXqa0IX8cCFNJWOxIVOF3AJ8x3jzFTBiCF+SBpZNwGxLbDndpTwGsEaZOdYwfXicjL1KUh75DeIGCsftQ==",
"signatures": [
{
"sig": "MEQCIC8Unf/03QUXMdo6A3cPWWOxOSWWbXJYO0/zvFP+lZlEAiAnu8jCHlvhQargGmSPghB8eEfga0bI7oLBPwp2wPeVqA==",
"keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"
}
],
"unpackedSize": 89582
}Observed since 20 Oct, 18:58 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:33e4cd7e49c98c0620746308a658a9d16fd8a59fbc6b6fb50d78039b96324704