-
-
Notifications
You must be signed in to change notification settings - Fork 9.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add addon-a11y to monorepo #2292
Changes from 14 commits
2a434dd
12d989e
eb76e63
0d67ae2
fae8834
0266c97
17acba5
980468b
c2aacec
7bd40cf
8d4f74b
ea9ac1a
f3a8e48
6fdc4e3
986e552
607f37d
1561f54
90f1711
88a8f00
56d13ef
90e8857
5792e09
c3cfd7b
3bf698c
862d4cf
56c14a2
5ec50a8
966c605
857d84d
0f30fc9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"presets": ["react-app"] | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
node_modules | ||
coverage | ||
dist | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
node_modules | ||
.babelrc | ||
src | ||
docs | ||
.scripts | ||
.storybook | ||
*.md |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
import '../register'; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
import React from 'react'; | ||
import PropTypes from 'prop-types'; | ||
|
||
const styles = { | ||
button: { | ||
padding: '12px 6px', | ||
fontSize: '12px', | ||
lineHeight: '16px', | ||
borderRadius: '5px', | ||
}, | ||
ok: { | ||
backgroundColor: '#028402', | ||
color: '#ffffff', | ||
}, | ||
wrong: { | ||
color: '#ffffff', | ||
backgroundColor: '#4caf50', | ||
} | ||
} | ||
|
||
function Button({ label, content, disabled, contrast }) { | ||
return ( | ||
<button | ||
style={{ | ||
...styles.button, | ||
...styles[contrast], | ||
}} | ||
disabled={disabled} | ||
> | ||
{ content } | ||
</button> | ||
) | ||
} | ||
|
||
Button.propTypes = { | ||
label: PropTypes.string, | ||
content: PropTypes.string, | ||
disabled: PropTypes.bool, | ||
contrast: PropTypes.oneOf(['ok', 'wrong']) | ||
}; | ||
|
||
Button.defaultProps = { | ||
disabled: false, | ||
contrast: 'ok', | ||
}; | ||
|
||
export default Button; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
import React from 'react'; | ||
import { storiesOf } from '@storybook/react'; | ||
|
||
import { checkA11y } from './../../../src'; | ||
|
||
import Button from './component'; | ||
|
||
import Faker from 'faker'; | ||
|
||
const text = Faker.lorem.words(); | ||
|
||
storiesOf('<Button />', module) | ||
.addDecorator(checkA11y) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think these a11y stories should be moved over to CRA so we can test them together. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. agree There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added, will leave the old storybook, because might copy over some more stories later. |
||
.add('Default', () => ( | ||
<Button /> | ||
)) | ||
.add('Content', () => ( | ||
<Button content={text} /> | ||
)) | ||
.add('Label', () => ( | ||
<Button label={text} /> | ||
)) | ||
.add('Disabled', () => ( | ||
<Button | ||
disabled | ||
content={text} | ||
/> | ||
)) | ||
.add('Invalid contrast', () => ( | ||
<Button | ||
contrast="wrong" | ||
content={Faker.lorem.words()} | ||
/> | ||
)); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
import React from 'react'; | ||
import PropTypes from 'prop-types'; | ||
|
||
function Input({ id, value, type, placeholder }) { | ||
return ( | ||
<input | ||
id={id} | ||
value={value} | ||
placeholder={placeholder} | ||
type={type} | ||
/> | ||
); | ||
} | ||
|
||
Input.propTypes = { | ||
type: PropTypes.oneOf(['text', 'password']), | ||
id: PropTypes.string, | ||
value: PropTypes.string, | ||
placeholder: PropTypes.string, | ||
} | ||
|
||
export default Input; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
import React from 'react'; | ||
import PropTypes from 'prop-types'; | ||
|
||
const styles = { | ||
label: { | ||
padding: '0 6px', | ||
}, | ||
} | ||
|
||
function Label({ id, content }) { | ||
return ( | ||
<label | ||
style={styles.label} | ||
htmlFor={id} | ||
> | ||
{ content } | ||
</label> | ||
) | ||
} | ||
|
||
Label.propTypes = { | ||
content: PropTypes.string, | ||
id: PropTypes.string, | ||
}; | ||
|
||
export default Label; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import React from 'react'; | ||
import PropTypes from 'prop-types'; | ||
|
||
import Label from './Label'; | ||
import Input from './Input'; | ||
|
||
function Row({ label, input }) { | ||
return ( | ||
<div> | ||
{label} | ||
{input} | ||
</div> | ||
); | ||
} | ||
|
||
Row.propTypes = { | ||
label: PropTypes.instanceOf(Label), | ||
input: PropTypes.instanceOf(Input), | ||
} | ||
|
||
export default Row; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
import Input from './Input'; | ||
import Label from './Label'; | ||
import Row from './Row'; | ||
|
||
export { | ||
Input, | ||
Label, | ||
Row, | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
import React from 'react'; | ||
|
||
import * as Form from './components'; | ||
|
||
import { storiesOf } from '@storybook/react'; | ||
import { checkA11y } from './../../../src'; | ||
|
||
import Faker from 'faker'; | ||
|
||
const label = Faker.lorem.word(); | ||
const placeholder = Faker.lorem.word(); | ||
|
||
storiesOf('<Form />', module) | ||
.addDecorator(checkA11y) | ||
.add('Without Label', () => ( | ||
<Form.Row | ||
input={<Form.Input />} | ||
/> | ||
)) | ||
.add ('With label', () => ( | ||
<Form.Row | ||
label={<Form.Label | ||
content={label} | ||
id="1" | ||
/>} | ||
input={<Form.Input id="1" />} | ||
/> | ||
)) | ||
.add ('With placeholder', () => ( | ||
<Form.Row | ||
input={<Form.Input | ||
id="1" | ||
placeholder={placeholder} | ||
/>} | ||
/> | ||
)) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import React from 'react'; | ||
import PropTypes from 'prop-types'; | ||
|
||
function Image({ src, alt, presentation }) { | ||
return ( | ||
<img | ||
src={src} | ||
alt={alt} | ||
role={presentation && 'presentation'} | ||
/> | ||
); | ||
} | ||
|
||
Image.propTypes = { | ||
src: PropTypes.string.isRequired, | ||
alt: PropTypes.string, | ||
presentation: PropTypes.bool, | ||
}; | ||
|
||
export default Image; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
import React from 'react'; | ||
import { storiesOf } from '@storybook/react'; | ||
|
||
import { checkA11y } from './../../../src'; | ||
|
||
import Image from './component'; | ||
|
||
import Faker from 'faker'; | ||
|
||
const image = Faker.image.animals(); | ||
const alt = Faker.lorem.words(); | ||
|
||
storiesOf('<Image />', module) | ||
.addDecorator(checkA11y) | ||
.add('Without alt', () => ( | ||
<Image src={image} /> | ||
)) | ||
.add('With alt', () => ( | ||
<Image | ||
src={image} | ||
alt={alt} | ||
/> | ||
)) | ||
.add('Presentation', () => ( | ||
<Image | ||
presentation | ||
src={image} | ||
/> | ||
)); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
import React, { cloneElement } from 'react'; | ||
import PropTypes from 'prop-types'; | ||
|
||
const headings = { | ||
1: (<h1 />), | ||
2: (<h2 />), | ||
3: (<h3 />), | ||
4: (<h4 />), | ||
}; | ||
|
||
function Heading({ level, children }) { | ||
return cloneElement(headings[level], {}, children) | ||
} | ||
|
||
Heading.propTypes = { | ||
level: PropTypes.oneOf([1, 2, 3, 4]), | ||
children: PropTypes.any, | ||
}; | ||
|
||
Heading.defaultProps = { | ||
level: 1, | ||
}; | ||
|
||
export default Heading; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
import React from 'react'; | ||
import PropTypes from 'prop-types'; | ||
|
||
function Link({ href, content }) { | ||
return ( | ||
<a href={href}> | ||
{ content } | ||
</a> | ||
); | ||
} | ||
|
||
Link.propTypes = { | ||
href: PropTypes.string, | ||
content: PropTypes.string, | ||
}; | ||
|
||
export default Link; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import React from 'react'; | ||
import PropTypes from 'prop-types'; | ||
|
||
function Text({ children }) { | ||
return ( | ||
<p> | ||
{children} | ||
</p> | ||
); | ||
} | ||
|
||
Text.propTypes = { | ||
children: PropTypes.any, | ||
}; | ||
|
||
export default Text; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
import Heading from './Heading'; | ||
import Link from './Link'; | ||
import Text from './Text'; | ||
|
||
export { | ||
Heading, | ||
Link, | ||
Text, | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
import React from 'react'; | ||
import { storiesOf } from '@storybook/react'; | ||
|
||
import { checkA11y } from './../../../src'; | ||
|
||
import * as Typography from './components'; | ||
|
||
import Faker from 'faker'; | ||
|
||
const href = "javascript:void 0"; | ||
|
||
storiesOf('<Typography />', module) | ||
.addDecorator(checkA11y) | ||
.add('Correct', () => ( | ||
<div> | ||
<Typography.Heading level={1}> | ||
{Faker.lorem.sentence()} | ||
</Typography.Heading> | ||
|
||
<Typography.Text> | ||
{Faker.lorem.paragraph()} | ||
</Typography.Text> | ||
|
||
<Typography.Link | ||
content={`${Faker.lorem.words(4)}...`} | ||
href={href} | ||
/> | ||
</div> | ||
)) | ||
.add('Empty Heading', () => ( | ||
<Typography.Heading level={2} /> | ||
)) | ||
.add('Empty Paragraph', () => ( | ||
<Typography.Text /> | ||
)) | ||
.add('Empty Link', () => ( | ||
<Typography.Link href={href} /> | ||
)) | ||
.add('Link without href', () => ( | ||
<Typography.Link content={`${Faker.lorem.words(4)}...`} /> | ||
)); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
import * as storybook from '@storybook/react'; | ||
|
||
const req = require.context('./components/', true, /stories\.js$/) | ||
|
||
const loadStories = () => | ||
req.keys().forEach(req); | ||
|
||
|
||
storybook.configure(loadStories, module) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like it's all covered by root .gitignore