@spothero/ui 14.8.3 → 14.8.5-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/CHANGELOG.tmp +2 -3
  3. package/backlog/index.js +3 -3
  4. package/backlog/{Modal → v1/components/Modal}/Modal.js +2 -2
  5. package/backlog/v1/components/index.js +24 -1
  6. package/package.json +1 -1
  7. package/styles/_index.scss +1 -1
  8. package/styles/index.js +1 -1
  9. package/styles/{Modal → v1/components/Modal}/Modal.jsx +1 -1
  10. package/styles/v1/components/Modal/stories/Content.stories.js +314 -0
  11. package/styles/v1/components/Modal/stories/Display.stories.js +208 -0
  12. package/styles/v1/components/Modal/stories/Methods.stories.js +44 -0
  13. package/styles/v1/components/Modal/stories/Width.stories.js +82 -0
  14. package/styles/v1/components/Modal/stories/helpers/ReduxConsumer.jsx +21 -0
  15. package/styles/v1/components/index.js +1 -0
  16. package/styles/v2/components/Modal/Modal.jsx +69 -0
  17. package/styles/v2/components/Modal/Modal.stories.js +273 -0
  18. package/styles/v2/components/Modal/index.js +1 -0
  19. package/styles/v2/components/Modal/styles/body.js +23 -0
  20. package/styles/v2/components/Modal/styles/closeButton.js +17 -0
  21. package/styles/v2/components/Modal/styles/dialog.js +10 -0
  22. package/styles/v2/components/Modal/styles/dialogContainer.js +7 -0
  23. package/styles/v2/components/Modal/styles/footer.js +5 -0
  24. package/styles/v2/components/Modal/styles/header.js +7 -0
  25. package/styles/v2/components/Modal/styles/index.js +47 -0
  26. package/styles/v2/components/Modal/styles/overlay.js +4 -0
  27. package/styles/v2/components/index.js +1 -0
  28. package/styles/v2/components/styles.js +1 -0
  29. package/v1/index.js +1 -1
  30. package/v1/index.js.LICENSE.txt +18 -0
  31. package/v1/index.js.map +1 -1
  32. package/v2/index.js +1 -1
  33. package/v2/index.js.map +1 -1
  34. /package/backlog/{Modal → v1/components/Modal}/ModalContent.js +0 -0
  35. /package/backlog/{Modal → v1/components/Modal}/ModalFooter.js +0 -0
  36. /package/backlog/{Modal → v1/components/Modal}/index.js +0 -0
  37. /package/styles/{Modal → v1/components/Modal}/Modal.spec.js +0 -0
  38. /package/styles/{Modal → v1/components/Modal}/ModalContent.jsx +0 -0
  39. /package/styles/{Modal → v1/components/Modal}/ModalFooter.jsx +0 -0
  40. /package/styles/{Modal → v1/components/Modal}/_Modal.scss +0 -0
  41. /package/styles/{Modal → v1/components/Modal}/index.js +0 -0
@@ -0,0 +1,44 @@
1
+ import React, {useState, useRef} from 'react';
2
+ import Button from 'v1/components/Button/Button';
3
+ import Modal from '../Modal';
4
+ import ModalContent from '../ModalContent';
5
+
6
+ export default {
7
+ component: Modal,
8
+ title: 'v1/Modal/Methods',
9
+ };
10
+
11
+ export const OnHide = () => {
12
+ const [isOpen, setOpen] = useState(false);
13
+ const modal = useRef();
14
+
15
+ const onToggle = () => {
16
+ setOpen(prevIsOpen => !prevIsOpen);
17
+ };
18
+
19
+ const onHideClick = () => {
20
+ modal.current.hide();
21
+ };
22
+
23
+ return (
24
+ <div className="ModalHide">
25
+ <Button color="primary" onClick={onToggle}>
26
+ Open Modal
27
+ </Button>
28
+ {isOpen && (
29
+ <Modal ref={modal} title="Modal Title" onHidden={onToggle}>
30
+ <ModalContent>
31
+ <p>This is the modal content.</p>
32
+ <Button
33
+ className="ModalContent-hide"
34
+ color="primary"
35
+ onClick={onHideClick}
36
+ >
37
+ Hide Modal
38
+ </Button>
39
+ </ModalContent>
40
+ </Modal>
41
+ )}
42
+ </div>
43
+ );
44
+ };
@@ -0,0 +1,82 @@
1
+ import React, {useState} from 'react';
2
+ import Button from 'v1/components/Button/Button';
3
+ import Modal from '../Modal';
4
+ import ModalContent from '../ModalContent';
5
+
6
+ export default {
7
+ component: Modal,
8
+ title: 'v1/Modal/Width',
9
+ };
10
+
11
+ export const PercentageWidth = () => {
12
+ const [isOpen, setOpen] = useState(false);
13
+
14
+ const onToggle = () => {
15
+ setOpen(prevIsOpen => !prevIsOpen);
16
+ };
17
+
18
+ return (
19
+ <div className="ModalPercentage">
20
+ <Button color="primary" onClick={onToggle}>
21
+ Open Modal with Percentage Width
22
+ </Button>
23
+ {isOpen && (
24
+ <Modal title="Modal Title" width="75%" onHidden={onToggle}>
25
+ <ModalContent>
26
+ <p>This is has 75% width.</p>
27
+ </ModalContent>
28
+ </Modal>
29
+ )}
30
+ </div>
31
+ );
32
+ };
33
+
34
+ export const PixelWidth = () => {
35
+ const [isOpen, setOpen] = useState(false);
36
+
37
+ const onToggle = () => {
38
+ setOpen(prevIsOpen => !prevIsOpen);
39
+ };
40
+
41
+ return (
42
+ <div className="ModalPixels">
43
+ <Button color="primary" onClick={onToggle}>
44
+ Open Modal with Pixel Width
45
+ </Button>
46
+ {isOpen && (
47
+ <Modal title="Modal Title" width={300} onHidden={onToggle}>
48
+ <ModalContent>
49
+ <p>This is has 300px width.</p>
50
+ </ModalContent>
51
+ </Modal>
52
+ )}
53
+ </div>
54
+ );
55
+ };
56
+
57
+ export const SizeWidth = () => {
58
+ const [isOpen, setOpen] = useState(false);
59
+
60
+ const onToggle = () => {
61
+ setOpen(prevIsOpen => !prevIsOpen);
62
+ };
63
+
64
+ return (
65
+ <div className="ModalSize">
66
+ <Button color="primary" onClick={onToggle}>
67
+ Open Modal with Size Width
68
+ </Button>
69
+ {isOpen && (
70
+ <Modal
71
+ title="Modal Title"
72
+ width="extra-wide"
73
+ onHidden={onToggle}
74
+ >
75
+ <ModalContent>
76
+ <p>This is has width set to extra-wide.</p>
77
+ </ModalContent>
78
+ </Modal>
79
+ )}
80
+ </div>
81
+ );
82
+ };
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import {connect} from 'react-redux';
4
+
5
+ const ReduxConsumer = ({items}) => {
6
+ return <div className="ModalReduxConsumer">{items}</div>;
7
+ };
8
+
9
+ ReduxConsumer.propTypes = {
10
+ items: PropTypes.string.isRequired,
11
+ };
12
+
13
+ const mapStateToProps = state => {
14
+ const {items} = state;
15
+
16
+ return {
17
+ items,
18
+ };
19
+ };
20
+
21
+ export default connect(mapStateToProps)(ReduxConsumer);
@@ -4,3 +4,4 @@ export {default as Table} from './Table/Table';
4
4
  export {default as TextButton} from './TextButton/TextButton';
5
5
  export {default as Image} from './Image/Image';
6
6
  export {default as Loader} from './Loader/Loader';
7
+ export {Modal, ModalContent, ModalFooter} from './Modal';
@@ -0,0 +1,69 @@
1
+ import React, {forwardRef} from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import {
4
+ Modal as ChakraModal,
5
+ ModalOverlay,
6
+ ModalContent,
7
+ ModalHeader,
8
+ ModalFooter,
9
+ ModalBody,
10
+ ModalCloseButton,
11
+ useBreakpointValue,
12
+ Box,
13
+ } from '@chakra-ui/react';
14
+ import headerStyles from './styles/header';
15
+
16
+ /**
17
+ * @param {boolean} isOpen - Whether or not the Modal is open
18
+ * @param {React.ReactNode} children - The header text of the modal
19
+ * @param {()=>void} [onClose] - Callback invoked to close the Modal. Not required, but strongly suggested.
20
+ * @param {('sm'|'md'|'lg')} [size] - The size of the modal. If unspecified, uses "md" styles.
21
+ * @param {React.ReactNode} [header] - The node for the header. Likely just a string.
22
+ * @param {React.ReactNode} [footer] - The node for the footer. Likely some control buttons.
23
+ * @param {React.ReactNode} [hideCloseButton] - Whether or not to show the close button
24
+ * @returns {React.ReactElement} - The Modal component
25
+ */
26
+ const Modal = forwardRef((props, ref) => {
27
+ const {header, footer, children, hideCloseButton} = props;
28
+ const isMobile = useBreakpointValue({base: true, tablet: false});
29
+
30
+ return (
31
+ <ChakraModal
32
+ motionPreset={isMobile ? 'slideInBottom' : 'scale'}
33
+ {...props}
34
+ ref={ref}
35
+ >
36
+ <ModalOverlay />
37
+ <ModalContent>
38
+ {header ? (
39
+ <ModalHeader>{header}</ModalHeader>
40
+ ) : (
41
+ <Box {...headerStyles(props)} />
42
+ )}
43
+ {hideCloseButton ? null : <ModalCloseButton />}
44
+ <ModalBody>{children}</ModalBody>
45
+
46
+ {footer ? <ModalFooter>{footer}</ModalFooter> : null}
47
+ </ModalContent>
48
+ </ChakraModal>
49
+ );
50
+ });
51
+
52
+ export default Modal;
53
+
54
+ Modal.propTypes = {
55
+ /** Whether or not the Modal is open */
56
+ isOpen: PropTypes.bool.isRequired,
57
+ /** React children. Body of the Modal. */
58
+ children: PropTypes.node.isRequired,
59
+ /** Callback invoked to close the Modal. Not required, but strongly suggested. */
60
+ onClose: PropTypes.func,
61
+ /** The size of the modal. If unspecified, uses md styles. */
62
+ size: PropTypes.oneOf(['sm', 'md', 'lg']),
63
+ /** The node for the header. Likely just a string (optional) */
64
+ header: PropTypes.node,
65
+ /** The node for the footer. Likely some control buttons (optional) */
66
+ footer: PropTypes.node,
67
+ /** Whether or not to show the close button (optional) */
68
+ hideCloseButton: PropTypes.bool,
69
+ };
@@ -0,0 +1,273 @@
1
+ import React, {useState} from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import {Box} from '@chakra-ui/react';
4
+ import disableArgs from 'storybook/utils/disable-args';
5
+ import {createSelectControl} from 'storybook/utils/create-control';
6
+
7
+ import {Modal} from './index';
8
+ import Button from 'v2/components/Button/Button';
9
+ import Text from 'v2/components/Text/Text';
10
+ import Heading from 'v2/components/Heading/Heading';
11
+ import Accordion, {
12
+ AccordionIcon,
13
+ AccordionItem,
14
+ AccordionPanel,
15
+ AccordionButton,
16
+ } from 'v2/components/Accordion';
17
+
18
+ export default {
19
+ title: 'v2/Modal',
20
+ component: Modal,
21
+ parameters: {
22
+ importBy: 'Modal',
23
+ removeBaseHtmlClass: true,
24
+ chakraLink: 'https://chakra-ui.com/docs/overlay/Modal',
25
+ },
26
+ argTypes: {
27
+ ...createSelectControl('size', ['sm', 'md', 'lg']),
28
+ ...disableArgs(['isOpen', 'onClose', 'footer']),
29
+ hideCloseButton: {
30
+ control: {
31
+ type: 'boolean',
32
+ },
33
+ },
34
+ header: {
35
+ control: {type: 'text'},
36
+ },
37
+ children: {
38
+ control: {type: 'text'},
39
+ },
40
+ },
41
+ args: {
42
+ size: 'md',
43
+ },
44
+ };
45
+
46
+ export const Transactional = props => {
47
+ const [open, setOpen] = useState(false);
48
+
49
+ return (
50
+ <Box>
51
+ <Text marginBottom={2}>
52
+ A &quot;Transactional&quot; modal just refers to one with a{' '}
53
+ <code>footer</code> prop.
54
+ </Text>
55
+ <Button onClick={() => setOpen(true)}>Open Modal</Button>
56
+
57
+ <Modal
58
+ {...props}
59
+ footer={
60
+ <>
61
+ <Button
62
+ onClick={() => setOpen(false)}
63
+ variant="secondary"
64
+ marginRight={4}
65
+ >
66
+ Cancel
67
+ </Button>
68
+ <Button
69
+ onClick={() => setOpen(false)}
70
+ variant="primary"
71
+ >
72
+ Submit
73
+ </Button>
74
+ </>
75
+ }
76
+ isOpen={open}
77
+ onClose={() => setOpen(false)}
78
+ >
79
+ {props.children}
80
+ </Modal>
81
+ </Box>
82
+ );
83
+ };
84
+
85
+ Transactional.propTypes = {
86
+ children: PropTypes.string,
87
+ };
88
+
89
+ Transactional.args = {
90
+ header: 'Transactional',
91
+ children:
92
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent tincidunt lectus et mauris viverra, nec tincidunt arcu rhoncus. Duis pellentesque vestibulum orci ut mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis vel malesuada ligula. Cras dapibus enim sem. Suspendisse potenti. Mauris tempus non tortor eu placerat. Pellentesque faucibus dui vitae purus iaculis, ac convallis turpis gravida. Ut ac massa pretium, finibus quam vitae, aliquet libero. orci ut mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis vel malesuada ligula. Cras dapibus enim sem. Suspendisse potenti. Mauris tempus non tortor eu placerat. Pellentesque faucibus dui vitae purus iaculis, ac convallis turpis gravida. Ut ac massa pretium, finibus quam vitae, aliquet libero.',
93
+ };
94
+
95
+ export const Passive = props => {
96
+ const [open, setOpen] = useState(false);
97
+
98
+ return (
99
+ <Box>
100
+ <Text marginBottom={2}>
101
+ A &quot;Passive&quot; modal just refers to one with no{' '}
102
+ <code>footer</code> prop.
103
+ </Text>
104
+ <Button onClick={() => setOpen(true)}>Open Modal</Button>
105
+
106
+ <Modal {...props} isOpen={open} onClose={() => setOpen(false)}>
107
+ {props.children}
108
+ </Modal>
109
+ </Box>
110
+ );
111
+ };
112
+
113
+ Passive.propTypes = {
114
+ children: PropTypes.string,
115
+ };
116
+
117
+ Passive.args = {
118
+ header: 'Passive',
119
+ children:
120
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent tincidunt lectus et mauris viverra, nec tincidunt arcu rhoncus. Duis pellentesque vestibulum orci ut mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis vel malesuada ligula. Cras dapibus enim sem. Suspendisse potenti. Mauris tempus non tortor eu placerat. Pellentesque faucibus dui vitae purus iaculis, ac convallis turpis gravida. Ut ac massa pretium, finibus quam vitae, aliquet libero. orci ut mattis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis vel malesuada ligula. Cras dapibus enim sem. Suspendisse potenti. Mauris tempus non tortor eu placerat. Pellentesque faucibus dui vitae purus iaculis, ac convallis turpis gravida. Ut ac massa pretium, finibus quam vitae, aliquet libero.',
121
+ };
122
+
123
+ export const TransactionalWithExpandingContent = props => {
124
+ const [open, setOpen] = useState(false);
125
+ const accordionRefs = [React.createRef(), React.createRef()];
126
+
127
+ const handleAccordionChange = index => {
128
+ if (accordionRefs[index]) {
129
+ // Timeout so that scroll doesn't happen until accordion animation complete
130
+ setTimeout(() => {
131
+ accordionRefs[index].current.scrollIntoView({
132
+ behavior: 'smooth',
133
+ block: 'start',
134
+ });
135
+ }, 150);
136
+ }
137
+ };
138
+
139
+ return (
140
+ <Box>
141
+ <Text marginBottom={2}>
142
+ When content inside a modal dynamically expands, the modal
143
+ should scroll to that new content.
144
+ </Text>
145
+ <Text marginBottom={2}>
146
+ However, this is something we&apos;ll need to implement on a
147
+ case by case basis when it applies.
148
+ </Text>
149
+ <Text marginBottom={2}>
150
+ Feel free to check the code of this demo to see an example of
151
+ how we might do that.
152
+ </Text>
153
+ <Button onClick={() => setOpen(true)}>Open Modal</Button>
154
+
155
+ <Modal
156
+ {...props}
157
+ header="Transactional with Expanding Content"
158
+ footer={
159
+ <>
160
+ <Button
161
+ onClick={() => setOpen(false)}
162
+ variant="secondary"
163
+ marginRight={4}
164
+ >
165
+ Cancel
166
+ </Button>
167
+ <Button variant="primary">Submit</Button>
168
+ </>
169
+ }
170
+ isOpen={open}
171
+ onClose={() => setOpen(false)}
172
+ >
173
+ <Box>
174
+ <Text marginBottom={2}>
175
+ Try opening an Accordion when it is at the very bottom
176
+ of the modal.
177
+ </Text>
178
+ <Text marginBottom={2}>
179
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
180
+ Praesent tincidunt lectus et mauris viverra, nec
181
+ tincidunt arcu rhoncus. Duis pellentesque vestibulum
182
+ orci ut mattis. Class aptent taciti sociosqu ad litora
183
+ torquent per conubia nostra, per inceptos himenaeos.
184
+ Duis vel malesuada ligula. Cras dapibus enim sem.
185
+ Suspendisse potenti. Mauris tempus non tortor eu
186
+ placerat. Pellentesque faucibus dui vitae purus iaculis,
187
+ ac convallis turpis gravida. Ut ac massa pretium,
188
+ finibus quam vitae, aliquet libero. orci ut mattis.
189
+ Class aptent taciti sociosqu ad litora torquent per
190
+ conubia nostra, per inceptos himenaeos. Duis vel
191
+ malesuada ligula. Cras dapibus enim sem. Suspendisse
192
+ potenti. Mauris tempus non tortor eu placerat.
193
+ Pellentesque faucibus dui vitae purus iaculis, ac
194
+ convallis turpis gravida. Ut ac massa pretium, finibus
195
+ quam vitae, aliquet libero.
196
+ </Text>
197
+ <Accordion onChange={handleAccordionChange} allowToggle>
198
+ <AccordionItem ref={accordionRefs[0]}>
199
+ <Heading as="h3">
200
+ <AccordionButton>
201
+ <Box flex="1" textAlign="left">
202
+ Accordion 1
203
+ </Box>
204
+ <AccordionIcon />
205
+ </AccordionButton>
206
+ </Heading>
207
+ <AccordionPanel>
208
+ <Text>
209
+ Lorem ipsum dolor sit amet, consectetur
210
+ adipiscing elit. Praesent tincidunt lectus
211
+ et mauris viverra, nec tincidunt arcu
212
+ rhoncus. Duis pellentesque vestibulum orci
213
+ ut mattis. Class aptent taciti sociosqu ad
214
+ litora torquent per conubia nostra, per
215
+ inceptos himenaeos. Duis vel malesuada
216
+ ligula. Cras dapibus enim sem. Suspendisse
217
+ potenti. Mauris tempus non tortor eu
218
+ placerat. Pellentesque faucibus dui vitae
219
+ purus iaculis, ac convallis turpis gravida.
220
+ Ut ac massa pretium, finibus quam vitae,
221
+ aliquet libero. Aliquam et urna condimentum,
222
+ sagittis nisl hendrerit, elementum velit.
223
+ Nullam quis nisl dictum, suscipit ligula
224
+ nec, elementum libero. Nullam eu lorem
225
+ convallis, dictum nisl in, condimentum dui.
226
+ Lorem ipsum dolor sit amet, consectetur
227
+ adipiscing elit. Viva
228
+ </Text>
229
+ </AccordionPanel>
230
+ </AccordionItem>
231
+ <AccordionItem ref={accordionRefs[1]}>
232
+ <Heading as="h3">
233
+ <AccordionButton>
234
+ <Box flex="1" textAlign="left">
235
+ Accordion 2
236
+ </Box>
237
+ <AccordionIcon />
238
+ </AccordionButton>
239
+ </Heading>
240
+ <AccordionPanel>
241
+ <Text>
242
+ Lorem ipsum dolor sit amet, consectetur
243
+ adipiscing elit. Praesent tincidunt lectus
244
+ et mauris viverra, nec tincidunt arcu
245
+ rhoncus. Duis pellentesque vestibulum orci
246
+ ut mattis. Class aptent taciti sociosqu ad
247
+ litora torquent per conubia nostra, per
248
+ inceptos himenaeos. Duis vel malesuada
249
+ ligula. Cras dapibus enim sem. Suspendisse
250
+ potenti. Mauris tempus non tortor eu
251
+ placerat. Pellentesque faucibus dui vitae
252
+ purus iaculis, ac convallis turpis gravida.
253
+ Ut ac massa pretium, finibus quam vitae,
254
+ aliquet libero. Aliquam et urna condimentum,
255
+ sagittis nisl hendrerit, elementum velit.
256
+ Nullam quis nisl dictum, suscipit ligula
257
+ nec, elementum libero. Nullam eu lorem
258
+ convallis, dictum nisl in, condimentum dui.
259
+ Lorem ipsum dolor sit amet, consectetur
260
+ adipiscing elit. Viva
261
+ </Text>
262
+ </AccordionPanel>
263
+ </AccordionItem>
264
+ </Accordion>
265
+ </Box>
266
+ </Modal>
267
+ </Box>
268
+ );
269
+ };
270
+
271
+ TransactionalWithExpandingContent.argTypes = {
272
+ ...disableArgs(['children', 'header']),
273
+ };
@@ -0,0 +1 @@
1
+ export {default as Modal} from './Modal';
@@ -0,0 +1,23 @@
1
+ export default ({footer, header, hideCloseButton}) => {
2
+ const scrollingHeaderStyles =
3
+ header || !hideCloseButton
4
+ ? {
5
+ // The following adapted from https://lea.verou.me/2012/04/background-attachment-local/
6
+ background:
7
+ 'linear-gradient(white 30%, white), linear-gradient(rgb(0 0 0 / 10%) 0%, white)',
8
+ backgroundRepeat: 'no-repeat',
9
+ backgroundColor: 'white',
10
+ backgroundSize: '100% 30px, 100% 10px',
11
+ backgroundAttachment: 'local, scroll',
12
+ }
13
+ : {};
14
+
15
+ return {
16
+ borderBottomRadius: footer ? null : 'md',
17
+ paddingX: 4,
18
+ paddingBottom: 4,
19
+ flex: 1,
20
+ overflow: 'auto',
21
+ ...scrollingHeaderStyles,
22
+ };
23
+ };
@@ -0,0 +1,17 @@
1
+ export default ({header}) => ({
2
+ position: 'absolute',
3
+ top: header ? 4 : 2,
4
+ insetEnd: header ? 4 : 2,
5
+ color: 'gray.dark',
6
+ borderRadius: 'sm',
7
+ width: 8,
8
+ height: 8,
9
+
10
+ _focus: {
11
+ boxShadow: 'outline',
12
+ },
13
+
14
+ _hover: {
15
+ bg: 'gray.50',
16
+ },
17
+ });
@@ -0,0 +1,10 @@
1
+ export default ({footer}) => ({
2
+ borderRadius: 'md',
3
+ borderBottomRadius: {base: '0', tablet: 'md'},
4
+ background: 'white',
5
+ color: 'inherit',
6
+ marginY: 0,
7
+ zIndex: 'layer8',
8
+ boxShadow: 'lg',
9
+ paddingBottom: footer ? 0 : 4,
10
+ });
@@ -0,0 +1,7 @@
1
+ export default {
2
+ display: 'flex',
3
+ zIndex: 'layer8',
4
+ justifyContent: 'center',
5
+ alignItems: {base: 'flex-end', tablet: 'center'},
6
+ overflow: 'hidden',
7
+ };
@@ -0,0 +1,5 @@
1
+ export default {
2
+ borderTop: '1px',
3
+ borderColor: 'gray.100',
4
+ padding: 4,
5
+ };
@@ -0,0 +1,7 @@
1
+ export default ({hideCloseButton, header}) => ({
2
+ padding: !hideCloseButton || header ? 4 : 2,
3
+ fontSize: 'xl',
4
+ fontWeight: 'semibold',
5
+ // If just close button, still have 'header' section at top
6
+ minHeight: header || hideCloseButton ? null : 12,
7
+ });
@@ -0,0 +1,47 @@
1
+ import merge from 'lodash/merge';
2
+ import chakraDefaultTheme from '@chakra-ui/theme';
3
+
4
+ import overlay from './overlay';
5
+ import dialogContainer from './dialogContainer';
6
+ import dialog from './dialog';
7
+ import header from './header';
8
+ import closeButton from './closeButton';
9
+ import body from './body';
10
+ import footer from './footer';
11
+
12
+ const baseStyle = props => ({
13
+ overlay,
14
+ dialogContainer,
15
+ dialog: dialog(props),
16
+ header: header(props),
17
+ closeButton: closeButton(props),
18
+ body: body(props),
19
+ footer,
20
+ });
21
+
22
+ const sizes = {
23
+ sm: {
24
+ dialog: {
25
+ // Would have preferred object syntax here and below, but wasn't working for whatever reason
26
+ maxWidth: ['100%', '100%', '48%', '32%', '24%'],
27
+ maxHeight: ['100%', '100%', '60%', '48%', '32%'],
28
+ minHeight: ['auto', 'auto', '48%', '32%', '24%'],
29
+ },
30
+ },
31
+ md: {
32
+ dialog: {
33
+ maxWidth: ['100%', '100%', '84%', '60%', '48%'],
34
+ maxHeight: ['100%', '100%', '96%', '84%', '60%'],
35
+ minHeight: ['auto', 'auto', '84%', '60%', '48%'],
36
+ },
37
+ },
38
+ lg: {
39
+ dialog: {
40
+ maxWidth: ['100%', '100%', '96%', '84%', '72%'],
41
+ maxHeight: ['100%', '100%', '96%', '96%', '84%'],
42
+ minHeight: ['auto', 'auto', '96%', '84%', '72%'],
43
+ },
44
+ },
45
+ };
46
+
47
+ export default merge(chakraDefaultTheme.components.Modal, {baseStyle, sizes});
@@ -0,0 +1,4 @@
1
+ export default {
2
+ background: 'rgba(0, 45, 91, 0.3)', // secondary.default at 30%
3
+ zIndex: 'layer8',
4
+ };
@@ -24,6 +24,7 @@ export {default as Loader} from './Loader/Loader';
24
24
  export {default as Checkbox} from './Checkbox';
25
25
  export {default as Input} from './Input';
26
26
  export {Popover, PopoverTrigger, PopoverContent} from './Popover';
27
+ export {Modal} from './Modal';
27
28
 
28
29
  // generic chakra reexports
29
30
  export {
@@ -12,3 +12,4 @@ export {default as Select} from './Select/styles';
12
12
  export {default as Checkbox} from './Checkbox/styles';
13
13
  export {default as Popover} from './Popover/styles';
14
14
  export {default as Input} from './Input/styles';
15
+ export {default as Modal} from './Modal/styles';