diff --git a/.vscode/story-template.code-snippets b/.vscode/story-template.code-snippets
index 19736c0479..3be39e8179 100644
--- a/.vscode/story-template.code-snippets
+++ b/.vscode/story-template.code-snippets
@@ -7,71 +7,70 @@
"// import { StoryTemplateName } from './OtherStoryFile.stories' // import stories for component compositions",
"",
"export default {",
- " title: 'Components/ComponentName',",
- " excludeStories: ['ComponentTemplateName'],",
- " argTypes: {",
- " booleanExample: {",
- " control: { type: 'boolean' },",
- " description: 'true/false toggle to controls',",
- " table: {",
- " category: 'Pick one: CSS, HTML, Interactive'",
- " }",
- " },",
- " selectExample: {",
- " options: [0, 1, 2, 3], // iterator",
- " mapping: ['string1', 'string2', 'string3', 'string4'], // values",
- " control: {",
- " type: 'select',",
- " labels: ['string1-label', 'string2-label', 'string3-label', 'string4-label'] // public labels",
- " },",
- " description: 'select menu mapping to strings (example: use for variant class names)',",
- " table: {",
- " category: 'Pick one: CSS, HTML, Interactive'",
- " }",
- " },",
- " stringExample: {",
- " name: 'stringExample',",
- " type: 'string',",
- " description: 'text box control',",
- " table: {",
- " category: 'Pick one: CSS, HTML, Interactive'",
- " }",
- " },",
- " children: {",
- " description: 'creates a slot for children',",
- " table: {",
- " category: 'HTML'",
- " }",
- " },",
+ " title: 'Components/ComponentName',",
+ " excludeStories: ['ComponentTemplateName'],",
+ " layout: 'padded',",
+ " argTypes: {",
+ " booleanExample: {",
+ " control: {type: 'boolean'},",
+ " description: 'true/false toggle to controls',",
+ " table: {",
+ " category: 'Pick one: CSS, HTML, Interactive'",
+ " }",
+ " },",
+ " radioExample: {",
+ " options: ['string1', 'string2', 'string3', 'string4'],",
+ " control: {",
+ " type: 'inline-radio',",
+ " },",
+ " description: 'radio buttons mapping to strings (example: use for variant class names)',",
+ " table: {",
+ " category: 'Pick one: CSS, HTML, Interactive'",
+ " }",
+ " },",
+ " stringExample: {",
+ " name: 'stringExample',",
+ " type: 'string',",
+ " description: 'text box control',",
+ " table: {",
+ " category: 'Pick one: CSS, HTML, Interactive'",
+ " }",
+ " },",
+ " children: {",
+ " description: 'creates a slot for children',",
+ " table: {",
+ " category: 'HTML'",
+ " }",
" }",
+ " }",
"}",
"",
"// build every component case here in the template (private api)",
- "export const ComponentTemplateName = ({ booleanExample, selectExample, stringExample, children }) => (",
- "
",
- " {/* use {children} for wrapper component templates */}",
- " <>",
- " {stringExample}",
- " {children}",
- " >",
- "
",
+ "export const ComponentTemplateName = ({booleanExample, radioExample, stringExample, children}) => (",
+ " ",
+ " {/* use {children} for wrapper component templates */}",
+ " <>",
+ " {stringExample}",
+ " {children}",
+ " >",
+ "
",
")",
"",
"// create a \"playground\" demo page that may set some defaults and allow story to access component controls",
"export const Playground = ComponentTemplateName.bind({})",
"Playground.args = {",
- " stringExample: 'Default text',",
- " booleanExample: false,",
- " children: (",
- " <>",
- " ",
- " >",
- " )",
+ " stringExample: 'Default text',",
+ " booleanExample: false",
+ " // children: (",
+ " // <>",
+ " // ",
+ " // >",
+ " // )",
"}",
""
],
diff --git a/docs/.storybook/main.js b/docs/.storybook/main.js
index f5f15878ed..06417d4184 100644
--- a/docs/.storybook/main.js
+++ b/docs/.storybook/main.js
@@ -6,6 +6,7 @@ module.exports = {
'@storybook/addon-essentials',
'@storybook/preset-scss',
'@whitespace/storybook-addon-html',
- 'storybook-addon-designs'
+ 'storybook-addon-designs',
+ 'storybook-color-picker'
]
}
diff --git a/docs/.storybook/manager-head.html b/docs/.storybook/manager-head.html
new file mode 100644
index 0000000000..37254b8687
--- /dev/null
+++ b/docs/.storybook/manager-head.html
@@ -0,0 +1,10 @@
+
diff --git a/docs/.storybook/preview-head.html b/docs/.storybook/preview-head.html
index 16b173065b..fe487fd774 100644
--- a/docs/.storybook/preview-head.html
+++ b/docs/.storybook/preview-head.html
@@ -4,7 +4,7 @@
Helvetica Neue, sans-serif;
color: var(--color-fg-default);
background-color: var(--color-canvas-default);
- padding: 0;
+ height: 100vh;
}
.theme-wrap {
@@ -12,4 +12,18 @@
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
height: 100vh;
}
+
+ .theme-wrap .story-wrap {
+ padding: 1rem;
+ height: unset;
+ }
+
+ .sb-main-padded .theme-wrap {
+ margin: -1rem;
+ }
+
+ .sb-main-padded div:not(.theme-wrap) > [data-dark-theme] {
+ margin: -1rem;
+ padding: 1rem;
+ }
diff --git a/docs/.storybook/preview.js b/docs/.storybook/preview.js
index 171eca3175..20b0dbc5f7 100644
--- a/docs/.storybook/preview.js
+++ b/docs/.storybook/preview.js
@@ -1,6 +1,7 @@
import '../../src/docs.scss'
import '../../src/index.scss'
import '../../src/base/index.scss'
+import '../src/stories/helpers/storybook-styles.scss'
import renderToHTML from '../src/stories/helpers/code-snippet-html-helper'
const customViewports = {
diff --git a/docs/package.json b/docs/package.json
index b701660f77..6c2f74664d 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -7,7 +7,7 @@
"develop": "ln -sf ../dist . && gatsby develop -H 0.0.0.0",
"build-content": "gatsby build --prefix-paths",
"build": "./script/now-build.sh && ./script/build-storybook.sh",
- "storybook": "start-storybook -p 6006",
+ "storybook": "NODE_ENV=test start-storybook -p 6006",
"build-storybook": "./script/build-storybook.sh"
},
"dependencies": {
@@ -58,6 +58,7 @@
"@storybook/react": "6.3.12",
"@whitespace/storybook-addon-html": "^5.0.0",
"babel-loader": "^8.2.3",
- "storybook-addon-designs": "6.2.0"
+ "storybook-addon-designs": "6.2.0",
+ "storybook-color-picker": "2.1.4"
}
}
diff --git a/docs/src/stories/components/ActionList/ActionListItem.stories.jsx b/docs/src/stories/components/ActionList/ActionListItem.stories.jsx
index 01cb8eb0cb..d49cfa71b5 100644
--- a/docs/src/stories/components/ActionList/ActionListItem.stories.jsx
+++ b/docs/src/stories/components/ActionList/ActionListItem.stories.jsx
@@ -16,7 +16,7 @@ export default {
options: [0, 1, 2], // iterator
mapping: ['', 'ActionList-content--sizeMedium', 'ActionList-content--sizeLarge'], // values
control: {
- type: 'select',
+ type: 'inline-radio',
labels: ['default', 'medium', 'large']
},
description: 'small (default), medium, large',
diff --git a/docs/src/stories/components/Button/Button.stories.jsx b/docs/src/stories/components/Button/Button.stories.jsx
index 5b763f0254..365a477df9 100644
--- a/docs/src/stories/components/Button/Button.stories.jsx
+++ b/docs/src/stories/components/Button/Button.stories.jsx
@@ -7,31 +7,173 @@ export default {
design: {
type: 'figma',
url: 'https://www.figma.com/file/GCvY3Qv8czRgZgvl1dG6lp/Primer-Web?node-id=4371%3A7128'
- }
+ },
+ layout: 'padded'
},
+
+ excludeStories: ['ButtonTemplate'],
argTypes: {
variant: {
- options: [0, 1, 2, 3], // iterator
- mapping: [null, 'btn-primary', 'btn-outline', 'btn-danger'], // values
+ options: [0, 1, 2, 3, 4, 5, 6, 7], // iterator
+ mapping: [
+ null,
+ 'btn-primary',
+ 'btn-outline',
+ 'btn-danger',
+ 'btn-link',
+ 'btn-invisible',
+ 'btn-with-count',
+ 'btn-octicon'
+ ], // values
control: {
type: 'select',
- labels: ['default', 'primary', 'outline', 'danger']
+ labels: ['default', 'primary', 'outline', 'danger', 'link', 'invisible', 'close', 'with-count', 'icon-only']
},
- defaultValue: ''
+ table: {
+ category: 'CSS'
+ }
+ },
+ size: {
+ options: [0, 1, 2], // iterator
+ mapping: [null, 'btn-sm', 'btn-large'], // values
+ control: {
+ type: 'select',
+ labels: ['default', 'small', 'large']
+ },
+ table: {
+ category: 'CSS'
+ }
},
label: {
defaultValue: 'Button',
type: 'string',
name: 'label',
- description: 'string'
+ description: 'string',
+ table: {
+ category: 'HTML'
+ }
+ },
+ disabled: {
+ defaultValue: false,
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ fullWidth: {
+ defaultValue: false,
+ control: {type: 'boolean'},
+ table: {
+ category: 'CSS'
+ }
+ },
+ closeBtn: {
+ control: {type: 'boolean'},
+ table: {
+ category: 'CSS'
+ }
+ },
+ leadingVisual: {
+ name: 'leadingVisual',
+ type: 'string',
+ description: 'Paste [Octicon](https://primer.style/octicons/) in control field',
+ table: {
+ category: 'HTML'
+ }
+ },
+ trailingVisual: {
+ name: 'trailingVisual',
+ type: 'string',
+ description: 'Paste [Octicon](https://primer.style/octicons/) in control field',
+ table: {
+ category: 'HTML'
+ }
+ },
+ trailingAction: {
+ defaultValue: false,
+ control: {type: 'boolean'},
+ table: {
+ category: 'CSS'
+ }
+ },
+ selected: {
+ defaultValue: false,
+ control: {type: 'boolean'},
+ table: {
+ category: 'CSS'
+ }
+ },
+ focusElement: {
+ control: {type: 'boolean'},
+ description: 'set focus on one element',
+ table: {
+ category: 'Interactive'
+ }
+ },
+ focusAllElements: {
+ control: {type: 'boolean'},
+ description: 'set focus on all elements for viewing in all themes',
+ table: {
+ category: 'Interactive'
+ }
}
}
}
-const Template = ({label, variant}) => (
+const focusMethod = function getFocus() {
+ // find the focusable element
+ var button = document.getElementsByTagName('button')[0]
+ // set focus on element
+ button.focus()
+}
+
+export const ButtonTemplate = ({
+ label,
+ variant,
+ disabled,
+ size,
+ fullWidth,
+ leadingVisual,
+ trailingVisual,
+ trailingAction,
+ selected,
+ closeBtn,
+ focusElement,
+ focusAllElements
+}) => (
<>
- {label}
+
+ {leadingVisual && }
+ {label}
+ {trailingVisual && }
+ {trailingAction && }
+ {closeBtn && (
+
+
+
+ )}
+
+ {focusElement && focusMethod()}
>
)
-export const Button = Template.bind({})
+export const Playground = ButtonTemplate.bind({})
+Playground.args = {
+ closeBtn: false,
+ focusElement: false,
+ focusAllElements: false
+}
diff --git a/docs/src/stories/components/Button/ButtonFeatures.stories.jsx b/docs/src/stories/components/Button/ButtonFeatures.stories.jsx
new file mode 100644
index 0000000000..853ee49e81
--- /dev/null
+++ b/docs/src/stories/components/Button/ButtonFeatures.stories.jsx
@@ -0,0 +1,55 @@
+import React from 'react'
+import clsx from 'clsx'
+import {ButtonTemplate} from './Button.stories'
+
+export default {
+ title: 'Components/Button/Features'
+}
+
+export const LeadingVisual = ButtonTemplate.bind({})
+LeadingVisual.storyName = 'Leading icon'
+LeadingVisual.args = {
+ label: 'Open in Desktop',
+ leadingVisual:
+ ' '
+}
+
+export const TrailingVisual = ButtonTemplate.bind({})
+TrailingVisual.storyName = 'Trailing icon'
+TrailingVisual.args = {
+ label: 'Open in Desktop',
+ trailingVisual:
+ ' '
+}
+
+export const Disabled = ButtonTemplate.bind({})
+Disabled.storyName = 'Disabled'
+Disabled.args = {
+ label: 'Disabled',
+ disabled: true
+}
+
+export const DisabledWithLeadingVisual = ButtonTemplate.bind({})
+DisabledWithLeadingVisual.storyName = 'Disabled with leading visual'
+DisabledWithLeadingVisual.args = {
+ label: 'Disabled',
+ disabled: true,
+ leadingVisual:
+ ' '
+}
+
+export const Selected = ButtonTemplate.bind({})
+Selected.storyName = 'Selected'
+Selected.args = {
+ label: 'Selected',
+ selected: true
+}
+
+export const SelectedWithLeadingVisual = ButtonTemplate.bind({})
+SelectedWithLeadingVisual.storyName = 'Selected with leading visual'
+SelectedWithLeadingVisual.args = {
+ label: 'Selected',
+ selected: true,
+ leadingVisual:
+ ' '
+}
diff --git a/docs/src/stories/components/Forms/Checkbox.stories.jsx b/docs/src/stories/components/Forms/Checkbox.stories.jsx
new file mode 100644
index 0000000000..f4a28347b9
--- /dev/null
+++ b/docs/src/stories/components/Forms/Checkbox.stories.jsx
@@ -0,0 +1,121 @@
+import React from 'react'
+import clsx from 'clsx'
+
+export default {
+ title: 'Components/Forms/Checkbox',
+ parameters: {
+ layout: 'padded'
+ },
+ decorators: [
+ Story => (
+
+ )
+ ],
+ excludeStories: ['CheckboxTemplate'],
+ argTypes: {
+ disabled: {
+ description: 'disabled field',
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ note: {
+ type: 'string',
+ name: 'note',
+ description: 'string',
+ table: {
+ category: 'HTML'
+ }
+ },
+ label: {
+ type: 'string',
+ name: 'label',
+ description: 'string',
+ table: {
+ category: 'HTML'
+ }
+ },
+ highlight: {
+ control: {type: 'boolean'},
+ description: 'highlight label',
+ table: {
+ category: 'CSS'
+ }
+ },
+ checked: {
+ control: {type: 'boolean'},
+ description: 'checkbox state',
+ table: {
+ category: 'CSS'
+ }
+ },
+ focusElement: {
+ control: {type: 'boolean'},
+ description: 'set focus on element',
+ table: {
+ category: 'Interactive'
+ }
+ },
+ focusAllElements: {
+ control: {type: 'boolean'},
+ description: 'set focus on all elements for viewing in all themes',
+ table: {
+ category: 'Interactive'
+ }
+ },
+ type: {
+ options: [0, 1], // iterator
+ mapping: ['checkbox', 'radio'], // values
+ control: {
+ type: 'inline-radio',
+ labels: ['checkbox', 'radio'] // public labels
+ },
+ description: 'input type'
+ }
+ }
+}
+
+const focusMethod = function getFocus() {
+ // find the focusable element
+ var checkbox = document.getElementsByTagName('input')[0]
+ // set focus on element
+ checkbox.focus()
+}
+
+export const CheckboxTemplate = ({label, note, highlight, disabled, checked, focusElement, focusAllElements, type}) => (
+ <>
+
+ {focusElement && focusMethod()}
+ >
+)
+
+export const Playground = CheckboxTemplate.bind({})
+Playground.args = {
+ label: 'Label',
+ focusElement: false,
+ disabled: false,
+ checked: false,
+ highlight: false,
+ note: '',
+ type: 'checkbox',
+ focusAllElements: false
+}
diff --git a/docs/src/stories/components/Forms/Input.stories.jsx b/docs/src/stories/components/Forms/Input.stories.jsx
new file mode 100644
index 0000000000..c2aac751f5
--- /dev/null
+++ b/docs/src/stories/components/Forms/Input.stories.jsx
@@ -0,0 +1,168 @@
+import React from 'react'
+import clsx from 'clsx'
+
+export default {
+ title: 'Components/Forms/Input',
+ parameters: {
+ layout: 'padded'
+ },
+ decorators: [
+ Story => (
+
+ )
+ ],
+ excludeStories: ['InputTemplate'],
+ argTypes: {
+ size: {
+ options: [0, 1, 2], // iterator
+ mapping: [null, 'input-sm', 'input-lg'], // values
+ control: {
+ type: 'select',
+ labels: ['default', 'small', 'large']
+ },
+ table: {
+ category: 'CSS'
+ }
+ },
+ block: {
+ description: 'full width',
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ monospace: {
+ description: 'monospace text',
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ contrast: {
+ description: 'change input background to light gray',
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ disabled: {
+ description: 'disabled field',
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ hideWebKit: {
+ description: 'hide WebKit autofill icon',
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ placeholder: {
+ type: 'string',
+ name: 'placeholder',
+ description: 'string',
+ table: {
+ category: 'HTML'
+ }
+ },
+ label: {
+ type: 'string',
+ name: 'label',
+ description: 'string',
+ table: {
+ category: 'HTML'
+ }
+ },
+ type: {
+ name: 'type',
+ type: 'string',
+ description: 'type',
+ table: {
+ category: 'HTML'
+ }
+ },
+ id: {
+ name: 'id',
+ type: 'string',
+ description: 'id',
+ table: {
+ category: 'HTML'
+ }
+ },
+ focusElement: {
+ control: {type: 'boolean'},
+ description: 'set focus on element',
+ table: {
+ category: 'Interactive'
+ }
+ },
+ focusAllElements: {
+ control: {type: 'boolean'},
+ description: 'set focus on all elements for viewing in all themes',
+ table: {
+ category: 'Interactive'
+ }
+ }
+ }
+}
+
+const focusMethod = function getFocus() {
+ // find the focusable element
+ var input = document.getElementsByTagName('input')[0]
+ // set focus on element
+ input.focus()
+}
+
+export const InputTemplate = ({
+ label,
+ type,
+ id,
+ size,
+ block,
+ placeholder,
+ contrast,
+ disabled,
+ hideWebKit,
+ monospace,
+ focusElement,
+ focusAllElements
+}) => (
+ <>
+ {label}
+
+ {focusElement && focusMethod()}
+ >
+)
+
+export const Playground = InputTemplate.bind({})
+Playground.args = {
+ type: 'email',
+ id: 'some-id',
+ placeholder: 'Email address',
+ label: 'Enter email address',
+ block: false,
+ hideWebKit: false,
+ monospace: false,
+ contrast: false,
+ disabled: false,
+ focusElement: false,
+ focusAllElements: false
+}
diff --git a/docs/src/stories/components/Forms/Radio.stories.jsx b/docs/src/stories/components/Forms/Radio.stories.jsx
new file mode 100644
index 0000000000..33835a50cb
--- /dev/null
+++ b/docs/src/stories/components/Forms/Radio.stories.jsx
@@ -0,0 +1,29 @@
+import React from 'react'
+import clsx from 'clsx'
+import {CheckboxTemplate} from './Checkbox.stories'
+
+export default {
+ title: 'Components/Forms/Radio',
+ parameters: {
+ layout: 'padded'
+ },
+ decorators: [
+ Story => (
+
+ )
+ ]
+}
+
+export const Playground = CheckboxTemplate.bind({})
+Playground.args = {
+ label: 'Label',
+ focusElement: false,
+ disabled: false,
+ checked: false,
+ highlight: false,
+ note: '',
+ type: 'radio',
+ focusAllElements: false
+}
diff --git a/docs/src/stories/components/Forms/Select.stories.jsx b/docs/src/stories/components/Forms/Select.stories.jsx
new file mode 100644
index 0000000000..f8303e7efc
--- /dev/null
+++ b/docs/src/stories/components/Forms/Select.stories.jsx
@@ -0,0 +1,112 @@
+import React from 'react'
+import clsx from 'clsx'
+
+export default {
+ title: 'Components/Forms/Select',
+ parameters: {
+ layout: 'padded'
+ },
+ decorators: [
+ Story => (
+
+ )
+ ],
+ excludeStories: ['SelectTemplate'],
+ argTypes: {
+ size: {
+ options: [0, 1], // iterator
+ mapping: [null, 'select-sm'], // values
+ control: {
+ type: 'select',
+ labels: ['default', 'small']
+ },
+ table: {
+ category: 'CSS'
+ }
+ },
+ disabled: {
+ description: 'disabled field',
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ placeholder: {
+ type: 'string',
+ name: 'placeholder',
+ description: 'string',
+ table: {
+ category: 'HTML'
+ }
+ },
+ label: {
+ type: 'string',
+ name: 'label',
+ description: 'string',
+ table: {
+ category: 'HTML'
+ }
+ },
+ id: {
+ name: 'id',
+ type: 'string',
+ description: 'id',
+ table: {
+ category: 'HTML'
+ }
+ },
+ focusElement: {
+ control: {type: 'boolean'},
+ description: 'set focus on element',
+ table: {
+ category: 'Interactive'
+ }
+ },
+ focusAllElements: {
+ control: {type: 'boolean'},
+ description: 'set focus on all elements for viewing in all themes',
+ table: {
+ category: 'Interactive'
+ }
+ }
+ }
+}
+
+const focusMethod = function getFocus() {
+ // find the focusable element
+ var select = document.getElementsByTagName('select')[0]
+ // set focus on element
+ select.focus()
+}
+
+export const SelectTemplate = ({label, id, size, placeholder, disabled, focusElement, focusAllElements}) => (
+ <>
+ {label}
+
+ Choose an option
+ Git
+ Subversion
+ Social Coding
+ Beets
+ Bears
+ Battlestar Galactica
+
+ {focusElement && focusMethod()}
+ >
+)
+
+export const Playground = SelectTemplate.bind({})
+Playground.args = {
+ id: 'some-id',
+ placeholder: 'Select',
+ label: 'Select one',
+ focusElement: false,
+ focusAllElements: false
+}
diff --git a/docs/src/stories/components/Forms/Textarea.stories.jsx b/docs/src/stories/components/Forms/Textarea.stories.jsx
new file mode 100644
index 0000000000..4bc81d4ac7
--- /dev/null
+++ b/docs/src/stories/components/Forms/Textarea.stories.jsx
@@ -0,0 +1,154 @@
+import React from 'react'
+import clsx from 'clsx'
+
+export default {
+ title: 'Components/Forms/Textarea',
+ parameters: {
+ layout: 'padded'
+ },
+ decorators: [
+ Story => (
+
+ )
+ ],
+ excludeStories: ['TextareaTemplate'],
+ argTypes: {
+ size: {
+ options: [0, 1, 2], // iterator
+ mapping: [null, 'input-sm', 'input-lg'], // values
+ control: {
+ type: 'select',
+ labels: ['default', 'small', 'large']
+ },
+ table: {
+ category: 'CSS'
+ }
+ },
+ block: {
+ description: 'full width',
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ contrast: {
+ description: 'change input background to light gray',
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ disabled: {
+ description: 'disabled field',
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ hideWebKit: {
+ description: 'hude WebKit autofill icon',
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ placeholder: {
+ type: 'string',
+ name: 'placeholder',
+ description: 'string',
+ table: {
+ category: 'HTML'
+ }
+ },
+ label: {
+ type: 'string',
+ name: 'label',
+ description: 'string',
+ table: {
+ category: 'HTML'
+ }
+ },
+ type: {
+ name: 'type',
+ type: 'string',
+ description: 'type',
+ table: {
+ category: 'HTML'
+ }
+ },
+ id: {
+ name: 'id',
+ type: 'string',
+ description: 'id',
+ table: {
+ category: 'HTML'
+ }
+ },
+ focusElement: {
+ control: {type: 'boolean'},
+ description: 'set focus on element',
+ table: {
+ category: 'Interactive'
+ }
+ },
+ focusAllElements: {
+ control: {type: 'boolean'},
+ description: 'set focus on all elements for viewing in all themes',
+ table: {
+ category: 'Interactive'
+ }
+ }
+ }
+}
+
+const focusMethod = function getFocus() {
+ // find the focusable element
+ var textarea = document.getElementsByTagName('textarea')[0]
+ // set focus on element
+ textarea.focus()
+}
+
+export const TextareaTemplate = ({
+ label,
+ type,
+ id,
+ size,
+ block,
+ placeholder,
+ contrast,
+ disabled,
+ hideWebKit,
+ focusElement,
+ focusAllElements
+}) => (
+ <>
+ {label}
+
+ {focusElement && focusMethod()}
+ >
+)
+
+export const Playground = TextareaTemplate.bind({})
+Playground.args = {
+ type: 'email',
+ id: 'some-id',
+ placeholder: 'Email address',
+ label: 'Enter email address',
+ focusElement: false,
+ focusAllElements: false
+}
diff --git a/docs/src/stories/components/Link/Link.stories.jsx b/docs/src/stories/components/Link/Link.stories.jsx
new file mode 100644
index 0000000000..b8dc10f432
--- /dev/null
+++ b/docs/src/stories/components/Link/Link.stories.jsx
@@ -0,0 +1,88 @@
+import React from 'react'
+import clsx from 'clsx'
+
+export default {
+ title: 'Components/Link',
+ parameters: {
+ layout: 'padded'
+ },
+
+ excludeStories: ['LinkTemplate'],
+ argTypes: {
+ variant: {
+ options: [0, 1, 2, 3, 4], // iterator
+ mapping: [null, 'Link--primary', 'Link--secondary', 'Link--muted', 'Link--onHover'], // values
+ control: {
+ type: 'select',
+ labels: ['default', 'primary', 'secondar', 'muted', 'onHover', 'invisible', 'close', 'with-count']
+ },
+ table: {
+ category: 'CSS'
+ }
+ },
+ noUnderline: {
+ defaultValue: false,
+ control: {type: 'boolean'},
+ table: {
+ category: 'Interactive'
+ }
+ },
+ label: {
+ type: 'string',
+ name: 'label',
+ description: 'string',
+ table: {
+ category: 'HTML'
+ }
+ },
+ href: {
+ name: 'href',
+ type: 'string',
+ description: 'url',
+ table: {
+ category: 'HTML'
+ }
+ },
+ focusElement: {
+ control: {type: 'boolean'},
+ description: 'set focus on element',
+ table: {
+ category: 'Interactive'
+ }
+ },
+ focusAllElements: {
+ control: {type: 'boolean'},
+ description: 'set focus on all elements for viewing in all themes',
+ table: {
+ category: 'Interactive'
+ }
+ }
+ }
+}
+
+const focusMethod = function getFocus() {
+ // find the focusable element
+ var link = document.getElementsByTagName('a')[0]
+ // set focus on element
+ link.focus()
+}
+
+export const LinkTemplate = ({label, variant, href, noUnderline, focusElement, focusAllElements}) => (
+ <>
+
+ {label}
+
+ {focusElement && focusMethod()}
+ >
+)
+
+export const Playground = LinkTemplate.bind({})
+Playground.args = {
+ label: 'Link label',
+ href: '/',
+ focusElement: false,
+ focusAllElements: false
+}
diff --git a/docs/src/stories/helpers/ColorBlock.jsx b/docs/src/stories/helpers/ColorBlock.jsx
new file mode 100644
index 0000000000..ab45cc53da
--- /dev/null
+++ b/docs/src/stories/helpers/ColorBlock.jsx
@@ -0,0 +1,23 @@
+import React from 'react'
+import PropTypes from 'prop-types'
+
+const ColorBlock = ({backgroundColor, showValueLabel}) => {
+ return (
+
+
+ {showValueLabel &&
{backgroundColor}
}
+
+ )
+}
+
+ColorBlock.propTypes = {
+ backgroundColor: PropTypes.string,
+ showValueLabel: PropTypes.bool
+}
+
+ColorBlock.defaultProps = {
+ backgroundColor: null,
+ showValueLabel: false
+}
+
+export default ColorBlock
diff --git a/docs/src/stories/helpers/storybook-styles.scss b/docs/src/stories/helpers/storybook-styles.scss
new file mode 100644
index 0000000000..70f9f926e0
--- /dev/null
+++ b/docs/src/stories/helpers/storybook-styles.scss
@@ -0,0 +1,21 @@
+// color blocks
+
+.colorBlockWrap {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ gap: 1rem;
+}
+
+.colorBlockItem {
+ aspect-ratio: 1/1;
+ width: 100px;
+}
+
+.toc {
+ list-style: none !important;
+ padding: 0 !important;
+ li {
+ margin-left: 0 !important;
+ }
+}
diff --git a/docs/src/stories/playground/ColorPlayground.stories.jsx b/docs/src/stories/playground/ColorPlayground.stories.jsx
new file mode 100644
index 0000000000..c7dc18eab9
--- /dev/null
+++ b/docs/src/stories/playground/ColorPlayground.stories.jsx
@@ -0,0 +1,78 @@
+import React from 'react'
+import clsx from 'clsx'
+import ColorBlock from '../helpers/ColorBlock'
+import DarkColorblind from '@primer/primitives/dist/json/colors/dark_colorblind.json'
+import DarkDimmed from '@primer/primitives/dist/json/colors/dark_dimmed.json'
+import DarkHighContrast from '@primer/primitives/dist/json/colors/dark_high_contrast.json'
+import Dark from '@primer/primitives/dist/json/colors/dark.json'
+import Light from '@primer/primitives/dist/json/colors/light.json'
+import LightColorblind from '@primer/primitives/dist/json/colors/light_colorblind.json'
+
+/*
+* Welcome to the Primer CSS Playground!
+
+* Use the code snippets from [prototyping guide](./Prototyping.stories.mdx) for setting up controls and conditional logic
+
+* Uncomment any code that you need, and feel free to delete whatever gets in your way
+
+* argTypes are optional for prototyping
+*/
+
+export default {
+ title: 'Prototypes/Color',
+ // layout: 'padded', // add padding around frame
+ layout: 'fullwidth',
+ excludeStories: ['ColorPlaygroundTemplate'],
+ // optional argTypes
+ argTypes: {
+ backgroundColor: {
+ name: 'color',
+ control: 'color',
+ description: 'use with an inline style tag to access a colorpicker control'
+ }
+ }
+}
+
+const ColorPlaygroundTemplate = ({backgroundColor}) => {
+ return (
+
+
+
+
+ )
+}
+
+export const Color = ColorPlaygroundTemplate.bind({})
+Color.args = {
+ backgroundColor: '#000000'
+}
+Color.parameters = {
+ colorPalettes: {
+ palettes: [
+ {
+ name: 'dark_colorblind',
+ palette: DarkColorblind
+ },
+ {
+ name: 'dark_dimmed',
+ palette: DarkDimmed
+ },
+ {
+ name: 'dark_high_contrast',
+ palette: DarkHighContrast
+ },
+ {
+ name: 'dark',
+ palette: Dark
+ },
+ {
+ name: 'light',
+ palette: Light
+ },
+ {
+ name: 'light_colorblind',
+ palette: LightColorblind
+ }
+ ]
+ }
+}
diff --git a/docs/src/stories/playground/Playground.stories.jsx b/docs/src/stories/playground/Playground.stories.jsx
new file mode 100644
index 0000000000..c56befce89
--- /dev/null
+++ b/docs/src/stories/playground/Playground.stories.jsx
@@ -0,0 +1,111 @@
+import React from 'react'
+import clsx from 'clsx'
+import DarkColorblind from '@primer/primitives/dist/json/colors/dark_colorblind.json'
+import DarkDimmed from '@primer/primitives/dist/json/colors/dark_dimmed.json'
+import DarkHighContrast from '@primer/primitives/dist/json/colors/dark_high_contrast.json'
+import Dark from '@primer/primitives/dist/json/colors/dark.json'
+import Light from '@primer/primitives/dist/json/colors/light.json'
+import LightColorblind from '@primer/primitives/dist/json/colors/light_colorblind.json'
+// import useToggle from '../helpers/useToggle.jsx'
+// import ColorBlock from '../helpers/ColorBlock'
+// import { StoryTemplateName } from './OtherStoryFile.stories' // import stories for component compositions
+
+/*
+* Welcome to the Primer CSS Playground!
+
+* Use the code snippets from [prototyping guide](./Prototyping.stories.mdx) for setting up controls and conditional logic
+
+* Uncomment any code that you need, and feel free to delete whatever gets in your way
+
+* argTypes are optional for prototyping
+*/
+
+export default {
+ title: 'Prototypes/Playground',
+ // layout: 'padded', // add padding around frame
+ layout: 'fullwidth',
+ excludeStories: ['PlaygroundTemplate'],
+
+ // optional argType examples below
+ argTypes: {
+ booleanExample: {
+ control: {type: 'boolean'},
+ description: 'true/false toggle to controls'
+ },
+ radioExample: {
+ options: ['string1', 'string2', 'string3', 'string4'],
+ control: {
+ type: 'inline-radio'
+ },
+ description: 'radio buttons mapping to strings (example: use for variant class names)'
+ },
+ stringExample: {
+ name: 'stringExample',
+ type: 'string',
+ description: 'text box control'
+ },
+ slot: {
+ description: 'creates a slot for children'
+ },
+ backgroundColor: {
+ name: 'color',
+ control: 'color',
+ description: 'use with an inline style tag to access a colorpicker control'
+ }
+ }
+}
+
+// Prototype within PlaygroundTemplate
+// delete argTypes between ({ here }) if not using
+export const PlaygroundTemplate = ({booleanExample, radioExample, stringExample, slot, backgroundColor}) => {
+ return (
+ <>
+ Your prototype here!
+ >
+ )
+}
+
+export const Playground = PlaygroundTemplate.bind({})
+// Set default values for Playground story here
+Playground.args = {
+ // backgroundColor: ''
+ // stringExample: 'Default text',
+ // booleanExample: false
+ // example: how to use args to set slot content
+ // slot: (
+ // <>
+ //
+ // >
+ // )
+}
+// access color primitives from the paintbrush icon in the toolbar
+Playground.parameters = {
+ colorPalettes: {
+ palettes: [
+ {
+ name: 'dark_colorblind',
+ palette: DarkColorblind
+ },
+ {
+ name: 'dark_dimmed',
+ palette: DarkDimmed
+ },
+ {
+ name: 'dark_high_contrast',
+ palette: DarkHighContrast
+ },
+ {
+ name: 'dark',
+ palette: Dark
+ },
+ {
+ name: 'light',
+ palette: Light
+ },
+ {
+ name: 'light_colorblind',
+ palette: LightColorblind
+ }
+ ]
+ }
+}
diff --git a/docs/src/stories/playground/Prototyping.stories.mdx b/docs/src/stories/playground/Prototyping.stories.mdx
new file mode 100644
index 0000000000..42e258ca70
--- /dev/null
+++ b/docs/src/stories/playground/Prototyping.stories.mdx
@@ -0,0 +1,392 @@
+import {Meta} from '@storybook/addon-docs'
+
+
+
+# Primer CSS Playground
+
+The Playground file contains an empty story configured to promote quick design prototyping with Primer CSS. It can be used with or without controls/args, and there are no rules! Work directly in the Playground file for temporary drafting and collaborating. If what you're building is more permanant, create a folder under Components or Patterns and move your work there.
+
+Use this guide as a reference for code snippets, Storybook controls, and configuring conditional logic for interactive prototypes
+
+### On this page
+
+
+
+### CSS class syntax
+
+```jsx
+// Ways to combine multiple CSS classes
+// simple Primer classes
+
+
+// React/jsx syntax
+
+
+// conditionally add arg string as css class
+
+
+// conditionally set css class if arg is true/false (use !booleanExample for false)
+
+```
+
+### Importing other stories
+
+```jsx
+import {StoryTemplateName} from './OtherStoryFile.stories'
+
+// import existing args from story
+
+
+// optional: set new args
+
+```
+
+### Conditional logic using Storybook controls
+
+Storybook controls can be used to mock interaction, state, and variants in a prototype. These are optional for prototyping, but can come in handy if you need a way to toggle state without writing custom javascript.
+
+The following examples show each Storybook argType available and a few ways to use them.
+
+#### Boolean (true/false)
+
+```jsx
+// YourStory.stories.jsx
+export default {
+ title: 'Prototypes/Playground',
+ argTypes: {
+ booleanExample: {
+ control: {type: 'boolean'},
+ description: 'true/false toggle to controls'
+ }
+ }
+}
+
+export const PlaygroundTemplate = ({booleanExample}) => {
+ return (
+ // render markup if true or !false
+ {booleanExample &&
}
+ {!booleanExample &&
}
+
+ // render css class 'true-class' if true else 'false-class'
+ // can also be undefined if false
+
+
+
+ // set html attribute
+
+
+ )
+}
+```
+
+### Execute function if boolean is true
+
+```jsx
+// YourStory.stories.jsx
+export default {
+ title: 'Prototypes/Playground',
+ argTypes: {
+ focusElement: {
+ control: {type: 'boolean'},
+ description: 'set focus on element',
+ table: {
+ category: 'Interactive'
+ }
+ }
+ }
+}
+
+// only one element can be focused at a time
+const focusMethod = function getFocus() {
+ // find the focusable element
+ var button = document.getElementsByTagName('button')[0]
+ // set focus on element
+ button.focus()
+}
+
+export const PlaygroundTemplate = ({focusElement}) => {
+ return (
+ <>
+ Button
+ {focusElement && focusMethod()}
+ >
+ )
+}
+```
+
+#### Radio options
+
+`inline-radio` type control is great for setting CSS class variants on a component when multiple class options exist.
+
+```jsx
+// YourStory.stories.jsx
+export default {
+ title: 'Prototypes/Playground',
+ argTypes: {
+ radioExample: {
+ options: ['string1', 'string2', 'string3', 'string4'],
+ control: {
+ type: 'inline-radio'
+ },
+ description: 'radio buttons mapping to strings (example: use for variant class names)'
+ }
+ }
+}
+
+export const PlaygroundTemplate = ({radioExample}) => {
+ return (
+ // render css class from options
+
+ )
+}
+```
+
+#### String
+
+```jsx
+// YourStory.stories.jsx
+export default {
+ title: 'Prototypes/Playground',
+ argTypes: {
+ stringExample: {
+ name: 'stringExample',
+ type: 'string',
+ description: 'text box control'
+ },
+ }
+}
+
+export const PlaygroundTemplate = ({stringExample}) => {
+ return (
+ // text
+ {stringExample}
+
+ // id
+
+
+ // octicon container
+
+ )
+}
+```
+
+#### Slots
+
+```jsx
+// YourStory.stories.jsx
+export default {
+ title: 'Prototypes/Playground',
+ argTypes: {
+ slot: {
+ description: 'creates a slot for children'
+ }
+ }
+}
+
+export const PlaygroundTemplate = ({slot}) => {
+ return (
+ // creates a slot for markup or other components
+ {slot}
+ )
+}
+```
+
+### Interactive prototyping
+
+Sometimes you may want to prototype interations without relying on Storybook controls. One example of this is rendering a `button` that toggles an overlay to open. You can achieve this with a `boolean` control, but in this case you want to be able to click the button in the prototype (just like an interactive prototype in Figma)
+
+#### Collapse/expand
+
+```jsx
+// import the useToggle React hook
+import useToggle from '../helpers/useToggle.jsx'
+
+export const PlaygroundTemplate = ({}) => {
+ const [isCollapsed, itemIsCollapsed] = useToggle()
+ return (
+ <>
+
+ Toggle collapse
+
+
+ >
+ )
+}
+```
+
+#### Open/close
+
+```jsx
+// import the useToggle React hook
+import useToggle from '../helpers/useToggle.jsx'
+
+export const PlaygroundTemplate = ({}) => {
+ const [isOpen, itemisOpen] = useToggle()
+ return (
+ <>
+
+ More
+ Hidden text
+
+ >
+ )
+}
+```
+
+#### HTML attribute
+
+Toggle any HTML attribute, like `aria-etc`, `checked`, `hidden`, etc.
+
+```jsx
+// import the useToggle React hook
+import useToggle from '../helpers/useToggle.jsx'
+
+export const PlaygroundTemplate = ({}) => {
+ const [isDisabled, itemisDisabled] = useToggle()
+ return (
+ <>
+
+ Toggle
+
+ {isDisabled ? 'disabled' : 'button'}
+ >
+ )
+}
+```
+
+#### CSS class
+
+Toggle any CSS class to show interaction and/or animation
+
+```jsx
+// import the useToggle React hook
+import useToggle from '../helpers/useToggle.jsx'
+
+export const PlaygroundTemplate = ({}) => {
+ const [isRotating, itemisRotating] = useToggle()
+ return (
+ <>
+
+ Toggle
+
+
+
+
+ >
+ )
+}
+```
+
+### Working with color
+
+Stories have access to all distributed colors from Primer Primitives. Here are some ways you might like to utilize Storybook for testing and prototyping.
+
+#### View all themes
+
+In the Theme toolbar menu, selecting "all" will render the story in every theme. This gives you a quick overview of how color primitives interact in each theme, and is especially helpful for checking contrast ratios.
+
+#### Access the Storybook colorpicker
+
+Storybook includes a colorpicker control that may be useful for tweaking existing colors or prototyping something totally new.
+
+By setting the `backgroundColor`, the component also has access to the Primer Primitives color picker. Open the toolbar menu by clicking the paintbrush, and an option to replace `backgroundColor` should show up. From there, select a primitive from a given theme.
+
+```jsx
+// YourStory.stories.jsx
+export default {
+ title: 'Prototypes/Playground',
+ argTypes: {
+ backgroundColor: {
+ name: 'color',
+ control: 'color',
+ description: 'use with an inline style tag to access a colorpicker control'
+ }
+ }
+}
+
+export const PlaygroundTemplate = ({backgroundColor}) => {
+ return
+}
+```
+
+#### ColorBlock component
+
+`ColorBlock` is a simple helper component that renders a square, intended to be used for quickly showing a block of color.
+
+```jsx
+// YourStory.stories.jsx
+import ColorBlock from '../helpers/ColorBlock'
+
+export default {
+ title: 'Prototypes/Playground',
+ argTypes: {
+ // optional arg
+ backgroundColor: {
+ name: 'color',
+ control: 'color',
+ description: 'use with an inline style tag to access a colorpicker control'
+ }
+ }
+}
+
+export const PlaygroundTemplate = ({backgroundColor}) => {
+ return (
+
+ // access the color picker + display the hex value as a label
+
+ // pass in a primitive, hex value, etc.
+
+
+ )
+}
+```
+
+#### Color Playground
+
+If you'e just working with color, Color Playground is a quick start template for manipulating `ColorBlock`. Repeat ` ` as many times as you need to test combinations.
diff --git a/docs/yarn.lock b/docs/yarn.lock
index d0bf1b4e28..be16f63503 100644
--- a/docs/yarn.lock
+++ b/docs/yarn.lock
@@ -9,6 +9,22 @@
dependencies:
tslib "~2.0.1"
+"@babel/cli@^7.14.5":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.16.0.tgz#a729b7a48eb80b49f48a339529fc4129fd7bcef3"
+ integrity sha512-WLrM42vKX/4atIoQB+eb0ovUof53UUvecb4qGjU2PDDWRiZr50ZpiV8NpcLo7iSxeGYrRG0Mqembsa+UrTAV6Q==
+ dependencies:
+ commander "^4.0.1"
+ convert-source-map "^1.1.0"
+ fs-readdir-recursive "^1.1.0"
+ glob "^7.0.0"
+ make-dir "^2.1.0"
+ slash "^2.0.0"
+ source-map "^0.5.0"
+ optionalDependencies:
+ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3"
+ chokidar "^3.4.0"
+
"@babel/code-frame@7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
@@ -1139,6 +1155,13 @@
dependencies:
regenerator-runtime "^0.13.4"
+"@babel/runtime@^7.13.10":
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5"
+ integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
"@babel/standalone@^7.12.6":
version "7.15.8"
resolved "https://registry.yarnpkg.com/@babel/standalone/-/standalone-7.15.8.tgz#3cb40b81892a702968a3e0bba2bdd1115f034876"
@@ -1214,6 +1237,17 @@
"@emotion/utils" "0.11.3"
"@emotion/weak-memoize" "0.2.5"
+"@emotion/cache@^11.5.0":
+ version "11.5.0"
+ resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.5.0.tgz#a5eb78cbef8163939ee345e3ddf0af217b845e62"
+ integrity sha512-mAZ5QRpLriBtaj/k2qyrXwck6yeoz1V5lMt/jfj6igWU35yYlNKs2LziXVgvH81gnJZ+9QQNGelSsnuoAy6uIw==
+ dependencies:
+ "@emotion/memoize" "^0.7.4"
+ "@emotion/sheet" "^1.0.3"
+ "@emotion/utils" "^1.0.0"
+ "@emotion/weak-memoize" "^0.2.5"
+ stylis "^4.0.10"
+
"@emotion/core@^10.1.1":
version "10.1.1"
resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.1.1.tgz#c956c1365f2f2481960064bcb8c4732e5fb612c3"
@@ -1235,7 +1269,7 @@
"@emotion/utils" "0.11.3"
babel-plugin-emotion "^10.0.27"
-"@emotion/hash@0.8.0":
+"@emotion/hash@0.8.0", "@emotion/hash@^0.8.0":
version "0.8.0"
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
@@ -1252,6 +1286,24 @@
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
+"@emotion/memoize@^0.7.4":
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50"
+ integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==
+
+"@emotion/react@^11.4.0":
+ version "11.5.0"
+ resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.5.0.tgz#19b5771bbfbda5e8517e948a2d9064810f0022bd"
+ integrity sha512-MYq/bzp3rYbee4EMBORCn4duPQfgpiEB5XzrZEBnUZAL80Qdfr7CEv/T80jwaTl/dnZmt9SnTa8NkTrwFNpLlw==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@emotion/cache" "^11.5.0"
+ "@emotion/serialize" "^1.0.2"
+ "@emotion/sheet" "^1.0.3"
+ "@emotion/utils" "^1.0.0"
+ "@emotion/weak-memoize" "^0.2.5"
+ hoist-non-react-statics "^3.3.1"
+
"@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16":
version "0.11.16"
resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad"
@@ -1263,11 +1315,27 @@
"@emotion/utils" "0.11.3"
csstype "^2.5.7"
+"@emotion/serialize@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965"
+ integrity sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==
+ dependencies:
+ "@emotion/hash" "^0.8.0"
+ "@emotion/memoize" "^0.7.4"
+ "@emotion/unitless" "^0.7.5"
+ "@emotion/utils" "^1.0.0"
+ csstype "^3.0.2"
+
"@emotion/sheet@0.9.4":
version "0.9.4"
resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5"
integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==
+"@emotion/sheet@^1.0.3":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.3.tgz#00c326cd7985c5ccb8fe2c1b592886579dcfab8f"
+ integrity sha512-YoX5GyQ4db7LpbmXHMuc8kebtBGP6nZfRC5Z13OKJMixBEwdZrJ914D6yJv/P+ZH/YY3F5s89NYX2hlZAf3SRQ==
+
"@emotion/styled-base@^10.0.27":
version "10.0.31"
resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.0.31.tgz#940957ee0aa15c6974adc7d494ff19765a2f742a"
@@ -1291,7 +1359,7 @@
resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04"
integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==
-"@emotion/unitless@0.7.5", "@emotion/unitless@^0.7.0":
+"@emotion/unitless@0.7.5", "@emotion/unitless@^0.7.0", "@emotion/unitless@^0.7.5":
version "0.7.5"
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
@@ -1301,7 +1369,12 @@
resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924"
integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==
-"@emotion/weak-memoize@0.2.5":
+"@emotion/utils@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af"
+ integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==
+
+"@emotion/weak-memoize@0.2.5", "@emotion/weak-memoize@^0.2.5":
version "0.2.5"
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
@@ -1332,6 +1405,32 @@
dependencies:
"@figspec/components" "^1.0.0"
+"@fortawesome/fontawesome-common-types@^0.2.36":
+ version "0.2.36"
+ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz#b44e52db3b6b20523e0c57ef8c42d315532cb903"
+ integrity sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==
+
+"@fortawesome/fontawesome-svg-core@^1.2.35":
+ version "1.2.36"
+ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz#4f2ea6f778298e0c47c6524ce2e7fd58eb6930e3"
+ integrity sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==
+ dependencies:
+ "@fortawesome/fontawesome-common-types" "^0.2.36"
+
+"@fortawesome/free-solid-svg-icons@^5.15.3":
+ version "5.15.4"
+ resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz#2a68f3fc3ddda12e52645654142b9e4e8fbb6cc5"
+ integrity sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==
+ dependencies:
+ "@fortawesome/fontawesome-common-types" "^0.2.36"
+
+"@fortawesome/react-fontawesome@^0.1.14":
+ version "0.1.16"
+ resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.16.tgz#ce7665490214e20f929368d6b65f68884a99276a"
+ integrity sha512-aLmzDwC9rEOAJv2UJdMns89VZR5Ry4IHu5dQQh24Z/lWKEm44lfQr1UNalZlkUaQN8d155tNh+CS7ntntj1VMA==
+ dependencies:
+ prop-types "^15.7.2"
+
"@gar/promisify@^1.0.1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210"
@@ -1852,6 +1951,11 @@
call-me-maybe "^1.0.1"
glob-to-regexp "^0.3.0"
+"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3":
+ version "2.1.8-no-fsevents.3"
+ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b"
+ integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==
+
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -1932,7 +2036,7 @@
style-value-types "^3.1.7"
tslib "^1.10.0"
-"@popperjs/core@^2.5.4", "@popperjs/core@^2.6.0":
+"@popperjs/core@^2.10.2", "@popperjs/core@^2.5.4", "@popperjs/core@^2.6.0":
version "2.10.2"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.10.2.tgz#0798c03351f0dea1a5a4cabddf26a55a7cbee590"
integrity sha512-IXf3XA7+XyN7CP9gGh/XB0UxVMlvARGEgGXLubFICsUMGz6Q+DU+i4gGlpOxTjKvXjkJDJC8YdqdKkDj9qZHEQ==
@@ -3571,6 +3675,11 @@
resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109"
integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==
+"@types/pluralize@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/pluralize/-/pluralize-0.0.29.tgz#6ffa33ed1fc8813c469b859681d09707eb40d03c"
+ integrity sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==
+
"@types/pretty-hrtime@^1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz#72a26101dc567b0d68fd956cf42314556e42d601"
@@ -5655,7 +5764,7 @@ cheerio@^0.22.0:
lodash.reject "^4.4.0"
lodash.some "^4.4.0"
-"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.4.3, chokidar@^3.5.1:
+"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.4.3, chokidar@^3.5.1:
version "3.5.2"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75"
integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==
@@ -5734,7 +5843,7 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
-classnames@2.3.1:
+classnames@2.3.1, classnames@^2.2.5:
version "2.3.1"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e"
integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==
@@ -5951,7 +6060,7 @@ commander@^2.19.0, commander@^2.20.0, commander@^2.20.3:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-commander@^4.1.1:
+commander@^4.0.1, commander@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
@@ -6026,6 +6135,20 @@ concat-stream@^1.5.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
+concurrently@^6.2.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.3.0.tgz#63128cb4a6ed54d3c0ed8528728590a5fe54582a"
+ integrity sha512-k4k1jQGHHKsfbqzkUszVf29qECBrkvBKkcPJEUDTyVR7tZd1G/JOfnst4g1sYbFvJ4UjHZisj1aWQR8yLKpGPw==
+ dependencies:
+ chalk "^4.1.0"
+ date-fns "^2.16.1"
+ lodash "^4.17.21"
+ rxjs "^6.6.3"
+ spawn-command "^0.0.2-1"
+ supports-color "^8.1.0"
+ tree-kill "^1.2.2"
+ yargs "^16.2.0"
+
configstore@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
@@ -6111,7 +6234,7 @@ convert-hrtime@^3.0.0:
resolved "https://registry.yarnpkg.com/convert-hrtime/-/convert-hrtime-3.0.0.tgz#62c7593f5809ca10be8da858a6d2f702bcda00aa"
integrity sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==
-convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
+convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
@@ -6713,7 +6836,7 @@ dataloader@^1.4.0:
resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8"
integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==
-date-fns@^2.0.1, date-fns@^2.14.0:
+date-fns@^2.0.1, date-fns@^2.14.0, date-fns@^2.16.1:
version "2.25.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.25.0.tgz#8c5c8f1d958be3809a9a03f4b742eba894fc5680"
integrity sha512-ovYRFnTrbGPD4nqaEqescPEv1mNwvt+UTqI3Ay9SzNtey9NZnYu6E2qCcBBgJ6/2VF1zGGygpyTDITqpQQ5e+w==
@@ -8693,6 +8816,11 @@ fs-monkey@1.0.3:
resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3"
integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==
+fs-readdir-recursive@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
+ integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==
+
fs-write-stream-atomic@^1.0.8:
version "1.0.10"
resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
@@ -9452,7 +9580,7 @@ glob-to-regexp@^0.3.0:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
-glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
@@ -10036,7 +10164,7 @@ hmac-drbg@^1.0.1:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.1"
-hoist-non-react-statics@^3.3.0:
+hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@@ -15378,6 +15506,14 @@ react-addons-text-content@^0.0.4:
resolved "https://registry.yarnpkg.com/react-addons-text-content/-/react-addons-text-content-0.0.4.tgz#d2e259fdc951d1d8906c08902002108dce8792e5"
integrity sha1-0uJZ/clR0diQbAiQIAIQjc6HkuU=
+react-animate-height@^2.0.23:
+ version "2.0.23"
+ resolved "https://registry.yarnpkg.com/react-animate-height/-/react-animate-height-2.0.23.tgz#2e14ac707b20ae67b87766ccfd581e693e0e7ec7"
+ integrity sha512-DucSC/1QuxWEFzR9IsHMzrf2nrcZ6qAmLIFoENa2kLK7h72XybcMA9o073z7aHccFzdMEW0/fhAdnQG7a4rDow==
+ dependencies:
+ classnames "^2.2.5"
+ prop-types "^15.6.1"
+
react-clientside-effect@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.5.tgz#e2c4dc3c9ee109f642fac4f5b6e9bf5bcd2219a3"
@@ -15638,7 +15774,16 @@ react-popper-tooltip@^3.1.1:
"@popperjs/core" "^2.5.4"
react-popper "^2.2.4"
-react-popper@^2.2.4:
+react-popper-tooltip@^4.3.0:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-4.3.1.tgz#0bfdd40453395865d7a5678a160640243070528e"
+ integrity sha512-/Lj1vjAEFEFxKKWnxupeS9pRrXYQlJd++OAAj/Ht3uOSqjWLtYWDXKV99e+YO6b5hV3SgXbtkHFzHH4eqlMWJA==
+ dependencies:
+ "@babel/runtime" "^7.15.4"
+ "@popperjs/core" "^2.10.2"
+ react-popper "^2.2.5"
+
+react-popper@^2.2.4, react-popper@^2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96"
integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==
@@ -16471,7 +16616,7 @@ rx-lite@*, rx-lite@^4.0.8:
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=
-rxjs@^6.6.0:
+rxjs@^6.6.0, rxjs@^6.6.3:
version "6.6.7"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
@@ -17127,6 +17272,11 @@ space-separated-tokens@^1.0.0:
resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899"
integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==
+spawn-command@^0.0.2-1:
+ version "0.0.2-1"
+ resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0"
+ integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=
+
spdx-correct@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
@@ -17327,6 +17477,23 @@ storybook-addon-outline@^1.4.1:
"@storybook/core-events" "^6.3.0"
ts-dedent "^2.1.1"
+storybook-color-picker@2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/storybook-color-picker/-/storybook-color-picker-2.1.4.tgz#32290cc2cecb4edd3062f0b125d4ccfeed60516e"
+ integrity sha512-YaIQv4XG27r3/WPm7+lrjxUhFNnUlfnLZ+MbE57Wg6cUycR5yYPQZX2swkCNgJLF0m36YmlNclL4CcQ3ZHeitA==
+ dependencies:
+ "@babel/cli" "^7.14.5"
+ "@emotion/react" "^11.4.0"
+ "@fortawesome/fontawesome-svg-core" "^1.2.35"
+ "@fortawesome/free-solid-svg-icons" "^5.15.3"
+ "@fortawesome/react-fontawesome" "^0.1.14"
+ "@types/pluralize" "^0.0.29"
+ concurrently "^6.2.0"
+ pluralize "^8.0.0"
+ react-animate-height "^2.0.23"
+ react-popper-tooltip "^4.3.0"
+ typescript "^4.3.4"
+
stream-browserify@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
@@ -17708,6 +17875,11 @@ stylis@^3.5.0:
resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe"
integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==
+stylis@^4.0.10:
+ version "4.0.10"
+ resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.10.tgz#446512d1097197ab3f02fb3c258358c3f7a14240"
+ integrity sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg==
+
subscriptions-transport-ws@^0.9.18:
version "0.9.19"
resolved "https://registry.yarnpkg.com/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz#10ca32f7e291d5ee8eb728b9c02e43c52606cdcf"
@@ -17750,6 +17922,13 @@ supports-color@^7.0.0, supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
+supports-color@^8.1.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
svg-parser@^2.0.2:
version "2.0.4"
resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5"
@@ -18141,6 +18320,11 @@ tr46@~0.0.3:
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+tree-kill@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
+ integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
+
trim-trailing-lines@^1.0.0:
version "1.1.4"
resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0"
@@ -18314,6 +18498,11 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
+typescript@^4.3.4:
+ version "4.4.4"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c"
+ integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==
+
unbox-primitive@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"