Merge pull request #1 from Uniswap/add-storybook
feature(storybook): first pass at storybook integration
This commit is contained in:
commit
4d612dc2a2
1
.nvmrc
Normal file
1
.nvmrc
Normal file
@ -0,0 +1 @@
|
|||||||
|
lts/*
|
16
.storybook/main.ts
Normal file
16
.storybook/main.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
const { dirname, join, parse, resolve } = require('path')
|
||||||
|
const { existsSync } = require('fs')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
stories: ['../src/**/*.stories.@(ts|tsx)'],
|
||||||
|
addons: ['@storybook/addon-links', '@storybook/addon-essentials', '@storybook/preset-create-react-app'],
|
||||||
|
typescript: {
|
||||||
|
check: true,
|
||||||
|
checkOptions: {},
|
||||||
|
reactDocgen: 'react-docgen-typescript',
|
||||||
|
reactDocgenTypescriptOptions: {
|
||||||
|
shouldExtractLiteralValuesFromEnum: true,
|
||||||
|
propFilter: prop => (prop.parent ? !/node_modules/.test(prop.parent.fileName) : true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
4
.storybook/manager.ts
Normal file
4
.storybook/manager.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import { addons } from '@storybook/addons'
|
||||||
|
import { light } from './theme'
|
||||||
|
|
||||||
|
addons.setConfig({ theme: light })
|
77
.storybook/preview.tsx
Normal file
77
.storybook/preview.tsx
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
import { ThemeProvider as SCThemeProvider } from 'styled-components'
|
||||||
|
import { Story } from '@storybook/react/types-6-0'
|
||||||
|
import React from 'react'
|
||||||
|
import { FixedGlobalStyle, theme, ThemedGlobalStyle } from '../src/theme'
|
||||||
|
import * as storybookThemes from './theme'
|
||||||
|
|
||||||
|
export const parameters = {
|
||||||
|
actions: { argTypesRegex: '^on[A-Z].*' },
|
||||||
|
dependencies: {
|
||||||
|
withStoriesOnly: true,
|
||||||
|
hideEmpty: true
|
||||||
|
},
|
||||||
|
docs: {
|
||||||
|
theme: storybookThemes.light
|
||||||
|
},
|
||||||
|
viewport: {
|
||||||
|
viewports: {
|
||||||
|
mobile: {
|
||||||
|
name: 'iPhone X',
|
||||||
|
styles: {
|
||||||
|
width: '375px',
|
||||||
|
height: '812px'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
tablet: {
|
||||||
|
name: 'iPad',
|
||||||
|
styles: {
|
||||||
|
width: '768px',
|
||||||
|
height: '1024px'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
laptop: {
|
||||||
|
name: 'Laptop',
|
||||||
|
styles: {
|
||||||
|
width: '1024px',
|
||||||
|
height: '768px'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
desktop: {
|
||||||
|
name: 'Desktop',
|
||||||
|
styles: {
|
||||||
|
width: '1440px',
|
||||||
|
height: '1024px'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const globalTypes = {
|
||||||
|
theme: {
|
||||||
|
name: 'Theme',
|
||||||
|
description: 'Global theme for components',
|
||||||
|
defaultValue: 'light',
|
||||||
|
toolbar: {
|
||||||
|
icon: 'circlehollow',
|
||||||
|
items: ['light', 'dark']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const withProviders = (Component: Story, context: Record<string, any>) => {
|
||||||
|
const THEME = theme(context.globals.theme === 'dark')
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<FixedGlobalStyle />
|
||||||
|
<SCThemeProvider theme={THEME}>
|
||||||
|
<ThemedGlobalStyle />
|
||||||
|
<main>
|
||||||
|
<Component />
|
||||||
|
</main>
|
||||||
|
</SCThemeProvider>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const decorators = [withProviders]
|
17
.storybook/theme.ts
Normal file
17
.storybook/theme.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { create } from '@storybook/theming'
|
||||||
|
|
||||||
|
// this themes the storybook UI
|
||||||
|
const uniswapBaseTheme = {
|
||||||
|
brandTitle: 'Uniswap Design',
|
||||||
|
brandUrl: 'https://uniswap.org',
|
||||||
|
brandImage: 'https://ipfs.io/ipfs/QmNa8mQkrNKp1WEEeGjFezDmDeodkWRevGFN8JCV7b4Xir'
|
||||||
|
}
|
||||||
|
export const light = create({
|
||||||
|
base: 'light',
|
||||||
|
...uniswapBaseTheme
|
||||||
|
})
|
||||||
|
|
||||||
|
// export const dark = create({
|
||||||
|
// base: 'dark',
|
||||||
|
// ...uniswapBaseTheme,
|
||||||
|
// })
|
14
package.json
14
package.json
@ -9,6 +9,15 @@
|
|||||||
"@reach/dialog": "^0.10.3",
|
"@reach/dialog": "^0.10.3",
|
||||||
"@reach/portal": "^0.10.3",
|
"@reach/portal": "^0.10.3",
|
||||||
"@reduxjs/toolkit": "^1.3.5",
|
"@reduxjs/toolkit": "^1.3.5",
|
||||||
|
"@storybook/addon-actions": "^6.1.17",
|
||||||
|
"@storybook/addon-essentials": "^6.1.17",
|
||||||
|
"@storybook/addon-links": "^6.1.17",
|
||||||
|
"@storybook/addons": "^6.1.17",
|
||||||
|
"@storybook/components": "^6.1.17",
|
||||||
|
"@storybook/preset-create-react-app": "^3.1.5",
|
||||||
|
"@storybook/preset-typescript": "^3.0.0",
|
||||||
|
"@storybook/react": "^6.1.17",
|
||||||
|
"@storybook/theming": "^6.1.17",
|
||||||
"@types/jest": "^25.2.1",
|
"@types/jest": "^25.2.1",
|
||||||
"@types/lodash.flatmap": "^4.5.6",
|
"@types/lodash.flatmap": "^4.5.6",
|
||||||
"@types/luxon": "^1.24.4",
|
"@types/luxon": "^1.24.4",
|
||||||
@ -95,9 +104,10 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "react-scripts start",
|
"start": "react-scripts start",
|
||||||
"build": "react-scripts build",
|
"build": "react-scripts build",
|
||||||
"test": "react-scripts test --env=jsdom",
|
|
||||||
"eject": "react-scripts eject",
|
"eject": "react-scripts eject",
|
||||||
"integration-test": "start-server-and-test 'serve build -l 3000' http://localhost:3000 'cypress run'"
|
"integration-test": "start-server-and-test 'serve build -l 3000' http://localhost:3000 'cypress run'",
|
||||||
|
"storybook": "start-storybook -p 6006",
|
||||||
|
"test": "react-scripts test --env=jsdom"
|
||||||
},
|
},
|
||||||
"eslintConfig": {
|
"eslintConfig": {
|
||||||
"extends": "react-app",
|
"extends": "react-app",
|
||||||
|
153
src/components/Button/Button.stories.tsx
Normal file
153
src/components/Button/Button.stories.tsx
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
import { Story } from '@storybook/react/types-6-0'
|
||||||
|
import styled from 'styled-components'
|
||||||
|
import React from 'react'
|
||||||
|
import {
|
||||||
|
ButtonConfirmed,
|
||||||
|
ButtonDropdown,
|
||||||
|
ButtonDropdownGrey,
|
||||||
|
ButtonDropdownLight,
|
||||||
|
ButtonEmpty,
|
||||||
|
ButtonError,
|
||||||
|
ButtonGray,
|
||||||
|
ButtonLight,
|
||||||
|
ButtonOutlined,
|
||||||
|
ButtonPink,
|
||||||
|
ButtonPrimary,
|
||||||
|
ButtonRadio,
|
||||||
|
ButtonSecondary,
|
||||||
|
ButtonUNIGradient,
|
||||||
|
ButtonWhite
|
||||||
|
} from './index'
|
||||||
|
|
||||||
|
const wrapperCss = styled.main`
|
||||||
|
font-size: 2em;
|
||||||
|
margin: 3em;
|
||||||
|
max-width: 300px;
|
||||||
|
`
|
||||||
|
|
||||||
|
export default {
|
||||||
|
title: 'Buttons',
|
||||||
|
argTypes: {
|
||||||
|
disabled: { control: { type: 'boolean' } },
|
||||||
|
onClick: { action: 'clicked' }
|
||||||
|
},
|
||||||
|
decorators: [
|
||||||
|
(Component: Story) => (
|
||||||
|
<div css={wrapperCss}>
|
||||||
|
<Component />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const Unicorn = () => (
|
||||||
|
<span role="img" aria-label="unicorn">
|
||||||
|
🦄
|
||||||
|
</span>
|
||||||
|
)
|
||||||
|
|
||||||
|
export const Radio = () => (
|
||||||
|
<ButtonRadio>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonRadio>
|
||||||
|
)
|
||||||
|
export const DropdownLight = () => (
|
||||||
|
<ButtonDropdownLight>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonDropdownLight>
|
||||||
|
)
|
||||||
|
export const DropdownGrey = () => (
|
||||||
|
<ButtonDropdownGrey>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonDropdownGrey>
|
||||||
|
)
|
||||||
|
export const Dropdown = () => (
|
||||||
|
<ButtonDropdown>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonDropdown>
|
||||||
|
)
|
||||||
|
export const Error = () => (
|
||||||
|
<ButtonError>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonError>
|
||||||
|
)
|
||||||
|
export const Confirmed = () => (
|
||||||
|
<ButtonConfirmed>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonConfirmed>
|
||||||
|
)
|
||||||
|
export const White = () => (
|
||||||
|
<ButtonWhite>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonWhite>
|
||||||
|
)
|
||||||
|
export const Empty = () => (
|
||||||
|
<ButtonEmpty>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonEmpty>
|
||||||
|
)
|
||||||
|
export const Outlined = () => (
|
||||||
|
<ButtonOutlined>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonOutlined>
|
||||||
|
)
|
||||||
|
export const UNIGradient = () => (
|
||||||
|
<ButtonUNIGradient>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonUNIGradient>
|
||||||
|
)
|
||||||
|
export const Pink = () => (
|
||||||
|
<ButtonPink>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonPink>
|
||||||
|
)
|
||||||
|
export const Secondary = () => (
|
||||||
|
<ButtonSecondary>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonSecondary>
|
||||||
|
)
|
||||||
|
export const Gray = () => (
|
||||||
|
<ButtonGray>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonGray>
|
||||||
|
)
|
||||||
|
export const Light = () => (
|
||||||
|
<ButtonLight>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonLight>
|
||||||
|
)
|
||||||
|
export const Primary = () => (
|
||||||
|
<ButtonPrimary>
|
||||||
|
<Unicorn />
|
||||||
|
UNISWAP
|
||||||
|
<Unicorn />
|
||||||
|
</ButtonPrimary>
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user