@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.
- package/CHANGELOG.md +23 -0
- package/CHANGELOG.tmp +2 -3
- package/backlog/index.js +3 -3
- package/backlog/{Modal → v1/components/Modal}/Modal.js +2 -2
- package/backlog/v1/components/index.js +24 -1
- package/package.json +1 -1
- package/styles/_index.scss +1 -1
- package/styles/index.js +1 -1
- package/styles/{Modal → v1/components/Modal}/Modal.jsx +1 -1
- package/styles/v1/components/Modal/stories/Content.stories.js +314 -0
- package/styles/v1/components/Modal/stories/Display.stories.js +208 -0
- package/styles/v1/components/Modal/stories/Methods.stories.js +44 -0
- package/styles/v1/components/Modal/stories/Width.stories.js +82 -0
- package/styles/v1/components/Modal/stories/helpers/ReduxConsumer.jsx +21 -0
- package/styles/v1/components/index.js +1 -0
- package/styles/v2/components/Modal/Modal.jsx +69 -0
- package/styles/v2/components/Modal/Modal.stories.js +273 -0
- package/styles/v2/components/Modal/index.js +1 -0
- package/styles/v2/components/Modal/styles/body.js +23 -0
- package/styles/v2/components/Modal/styles/closeButton.js +17 -0
- package/styles/v2/components/Modal/styles/dialog.js +10 -0
- package/styles/v2/components/Modal/styles/dialogContainer.js +7 -0
- package/styles/v2/components/Modal/styles/footer.js +5 -0
- package/styles/v2/components/Modal/styles/header.js +7 -0
- package/styles/v2/components/Modal/styles/index.js +47 -0
- package/styles/v2/components/Modal/styles/overlay.js +4 -0
- package/styles/v2/components/index.js +1 -0
- package/styles/v2/components/styles.js +1 -0
- package/v1/index.js +1 -1
- package/v1/index.js.LICENSE.txt +18 -0
- package/v1/index.js.map +1 -1
- package/v2/index.js +1 -1
- package/v2/index.js.map +1 -1
- /package/backlog/{Modal → v1/components/Modal}/ModalContent.js +0 -0
- /package/backlog/{Modal → v1/components/Modal}/ModalFooter.js +0 -0
- /package/backlog/{Modal → v1/components/Modal}/index.js +0 -0
- /package/styles/{Modal → v1/components/Modal}/Modal.spec.js +0 -0
- /package/styles/{Modal → v1/components/Modal}/ModalContent.jsx +0 -0
- /package/styles/{Modal → v1/components/Modal}/ModalFooter.jsx +0 -0
- /package/styles/{Modal → v1/components/Modal}/_Modal.scss +0 -0
- /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);
|
|
@@ -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 "Transactional" 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 "Passive" 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'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,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});
|
|
@@ -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 {
|