UNPKG

notion-design-system

Version:

A comprehensive Notion-inspired design system built with React, TypeScript, and Tailwind CSS

416 lines (349 loc) 9.11 kB
# Notion Design System - Usage Documentation ## Table of Contents - [Installation](#installation) - [Setup](#setup) - [Components](#components) - [Theming](#theming) - [TypeScript Support](#typescript-support) - [Best Practices](#best-practices) - [Migration Guide](#migration-guide) - [FAQ](#faq) ## Installation ### npm ```bash npm install @sh20raj/notion-design-system ``` ### yarn ```bash yarn add @sh20raj/notion-design-system ``` ### pnpm ```bash pnpm add @sh20raj/notion-design-system ``` ## Setup ### 1. Import Styles Add the CSS file to your project. The method depends on your build system: #### Next.js ```jsx // pages/_app.js or app/layout.js import '@sh20raj/notion-design-system/dist/styles.css'; ``` #### Vite/React ```jsx // main.jsx or App.jsx import '@sh20raj/notion-design-system/dist/styles.css'; ``` #### Webpack/Create React App ```jsx // index.js or App.js import '@sh20raj/notion-design-system/dist/styles.css'; ``` ### 2. Configure Tailwind (Optional) If you're using Tailwind CSS in your project, you can extend the theme with Notion's design tokens: ```js // tailwind.config.js module.exports = { content: [ // ... your content paths './node_modules/@sh20raj/notion-design-system/dist/**/*.js', ], theme: { extend: { colors: { notion: { // Add Notion color tokens to your theme 'bg-primary': '#ffffff', 'bg-secondary': '#f7f6f3', 'text-primary': '#37352f', // ... other colors } } } } } ``` ### 3. Dark Mode Support The components support dark mode automatically. Enable it by adding the `dark` class to your root element: ```jsx // For Next.js with next-themes import { ThemeProvider } from 'next-themes'; function MyApp({ Component, pageProps }) { return ( <ThemeProvider attribute="class"> <Component {...pageProps} /> </ThemeProvider> ); } ``` ## Components ### Button ```jsx import { Button } from '@sh20raj/notion-design-system'; function MyComponent() { return ( <div> <Button variant="primary">Primary Button</Button> <Button variant="secondary">Secondary Button</Button> <Button variant="ghost">Ghost Button</Button> <Button size="sm">Small Button</Button> <Button size="lg">Large Button</Button> </div> ); } ``` #### Props - `variant`: 'primary' | 'secondary' | 'ghost' | 'danger' - `size`: 'sm' | 'md' | 'lg' - `disabled`: boolean - `loading`: boolean - `onClick`: function ### Card ```jsx import { Card } from '@sh20raj/notion-design-system'; function MyComponent() { return ( <Card> <Card.Header> <h3>Card Title</h3> </Card.Header> <Card.Content> <p>Card content goes here...</p> </Card.Content> <Card.Footer> <Button>Action</Button> </Card.Footer> </Card> ); } ``` ### Typography ```jsx import { Typography } from '@sh20raj/notion-design-system'; function MyComponent() { return ( <div> <Typography variant="h1">Heading 1</Typography> <Typography variant="h2">Heading 2</Typography> <Typography variant="body1">Body text</Typography> <Typography variant="body2">Secondary text</Typography> <Typography variant="caption">Caption text</Typography> </div> ); } ``` ### Input ```jsx import { Input } from '@sh20raj/notion-design-system'; function MyComponent() { return ( <div> <Input placeholder="Enter text..." label="Username" error="This field is required" /> <Input type="password" placeholder="Enter password..." label="Password" /> </div> ); } ``` ### Avatar ```jsx import { Avatar } from '@sh20raj/notion-design-system'; function MyComponent() { return ( <div> <Avatar src="/path/to/image.jpg" alt="User Name" /> <Avatar initials="JD" /> <Avatar size="sm" initials="SM" /> <Avatar size="lg" src="/path/to/image.jpg" /> </div> ); } ``` ### Badge ```jsx import { Badge } from '@sh20raj/notion-design-system'; function MyComponent() { return ( <div> <Badge variant="default">Default</Badge> <Badge variant="success">Success</Badge> <Badge variant="warning">Warning</Badge> <Badge variant="danger">Danger</Badge> </div> ); } ``` ### Tooltip ```jsx import { Tooltip } from '@sh20raj/notion-design-system'; function MyComponent() { return ( <Tooltip content="This is a tooltip"> <Button>Hover me</Button> </Tooltip> ); } ``` ### Sidebar ```jsx import { Sidebar } from '@sh20raj/notion-design-system'; function MyComponent() { return ( <Sidebar> <Sidebar.Item icon="home" active>Home</Sidebar.Item> <Sidebar.Item icon="settings">Settings</Sidebar.Item> <Sidebar.Item icon="user">Profile</Sidebar.Item> </Sidebar> ); } ``` ### Block ```jsx import { Block } from '@sh20raj/notion-design-system'; function MyComponent() { return ( <div> <Block type="text"> This is a text block similar to Notion's blocks. </Block> <Block type="heading" level={2}> This is a heading block </Block> <Block type="code" language="javascript"> console.log('Hello, World!'); </Block> </div> ); } ``` ## Theming ### CSS Custom Properties You can override the default theme by defining CSS custom properties: ```css :root { --notion-bg-primary: #ffffff; --notion-bg-secondary: #f7f6f3; --notion-text-primary: #37352f; --notion-text-secondary: #6f6e69; --notion-border: #e9e9e7; --notion-blue: #2383e2; /* ... other properties */ } .dark { --notion-bg-primary: #191919; --notion-bg-secondary: #2f3437; --notion-text-primary: #ffffff; --notion-text-secondary: #9b9998; --notion-border: #373c41; /* ... other properties */ } ``` ### Extending with Tailwind ```js // tailwind.config.js module.exports = { theme: { extend: { colors: { 'custom-primary': '#your-color', 'custom-secondary': '#your-color', } } } } ``` ## TypeScript Support The package includes full TypeScript support with type definitions: ```tsx import { Button, ButtonProps } from '@sh20raj/notion-design-system'; interface MyComponentProps { onSubmit: () => void; } function MyComponent({ onSubmit }: MyComponentProps) { const handleClick: ButtonProps['onClick'] = (event) => { // TypeScript knows the event type console.log('Button clicked', event); onSubmit(); }; return ( <Button onClick={handleClick} variant="primary"> Submit </Button> ); } ``` ## Best Practices ### 1. Consistent Spacing Use the provided spacing tokens: ```jsx <div className="space-y-notion-md"> <Button>Button 1</Button> <Button>Button 2</Button> </div> ``` ### 2. Color Usage Stick to the semantic color tokens: ```jsx // Good <Button variant="primary">Primary Action</Button> <Button variant="danger">Delete</Button> // Avoid custom colors that don't follow the system <Button style={{ backgroundColor: 'purple' }}>Custom</Button> ``` ### 3. Accessibility All components include proper ARIA attributes: ```jsx <Button disabled={loading} aria-label="Submit form" aria-describedby="submit-help" > {loading ? 'Submitting...' : 'Submit'} </Button> ``` ### 4. Responsive Design Use the responsive utilities: ```jsx <Typography variant="h1" className="text-notion-xl md:text-notion-2xl"> Responsive Heading </Typography> ``` ## Migration Guide ### From Custom Components If you're migrating from custom components: 1. **Audit your current components**: List all components you want to replace 2. **Map to design system**: Find equivalent components in the design system 3. **Update imports**: Replace your imports with the design system imports 4. **Test thoroughly**: Ensure all functionality works as expected ### Example Migration ```jsx // Before import { MyButton } from '../components/MyButton'; import './MyButton.css'; // After import { Button } from '@sh20raj/notion-design-system'; ``` ## FAQ ### Q: How do I customize the theme? A: You can override CSS custom properties or extend the Tailwind theme. See the [Theming](#theming) section. ### Q: Are the components accessible? A: Yes, all components follow WCAG 2.1 AA guidelines and include proper ARIA attributes. ### Q: Can I use this with Next.js? A: Yes, the components are compatible with Next.js, including SSR and SSG. ### Q: How do I report bugs? A: Please create an issue on the [GitHub repository](https://github.com/shade-solutions/notion-design-system/issues). ### Q: Can I contribute? A: Yes! Check out the contributing guidelines in the repository. ### Q: Is this production-ready? A: The components are built with production use in mind, but please test thoroughly in your specific use case. ## Support - **GitHub Issues**: https://github.com/shade-solutions/notion-design-system/issues - **Documentation**: https://github.com/shade-solutions/notion-design-system#readme - **NPM Package**: https://www.npmjs.com/package/@sh20raj/notion-design-system