@zendeskgarden/react-modals 9.0.0-next.2 → 9.0.0-next.21

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 (61) hide show
  1. package/README.md +10 -10
  2. package/dist/esm/elements/Body.js +42 -0
  3. package/dist/esm/elements/Close.js +53 -0
  4. package/dist/esm/elements/Drawer/Body.js +43 -0
  5. package/dist/esm/elements/Drawer/Close.js +54 -0
  6. package/dist/esm/elements/Drawer/Drawer.js +182 -0
  7. package/dist/esm/elements/Drawer/Footer.js +37 -0
  8. package/dist/esm/elements/Drawer/FooterItem.js +37 -0
  9. package/dist/esm/elements/Drawer/Header.js +69 -0
  10. package/dist/esm/elements/Footer.js +43 -0
  11. package/dist/esm/elements/FooterItem.js +36 -0
  12. package/dist/esm/elements/Header.js +70 -0
  13. package/dist/esm/elements/Modal.js +191 -0
  14. package/dist/esm/elements/TooltipModal/Body.js +43 -0
  15. package/dist/esm/elements/TooltipModal/Close.js +50 -0
  16. package/dist/esm/elements/TooltipModal/Footer.js +37 -0
  17. package/dist/esm/elements/TooltipModal/FooterItem.js +37 -0
  18. package/dist/esm/elements/TooltipModal/Title.js +68 -0
  19. package/dist/esm/elements/TooltipModal/TooltipModal.js +192 -0
  20. package/dist/esm/index.js +15 -0
  21. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/alert-error-stroke.svg.js +37 -0
  22. package/dist/esm/node_modules/@zendeskgarden/svg-icons/src/16/x-stroke.svg.js +26 -0
  23. package/dist/esm/styled/StyledBackdrop.js +49 -0
  24. package/dist/esm/styled/StyledBody.js +30 -0
  25. package/dist/esm/styled/StyledClose.js +28 -0
  26. package/dist/esm/styled/StyledDangerIcon.js +19 -0
  27. package/dist/esm/styled/StyledDrawer.js +44 -0
  28. package/dist/esm/styled/StyledDrawerBody.js +23 -0
  29. package/dist/esm/styled/StyledDrawerClose.js +28 -0
  30. package/dist/esm/styled/StyledDrawerFooter.js +30 -0
  31. package/dist/esm/styled/StyledDrawerFooterItem.js +23 -0
  32. package/dist/esm/styled/StyledDrawerHeader.js +24 -0
  33. package/dist/esm/styled/StyledFooter.js +22 -0
  34. package/dist/esm/styled/StyledFooterItem.js +22 -0
  35. package/dist/esm/styled/StyledHeader.js +38 -0
  36. package/dist/esm/styled/StyledModal.js +58 -0
  37. package/dist/esm/styled/StyledTooltipModal.js +33 -0
  38. package/dist/esm/styled/StyledTooltipModalBackdrop.js +22 -0
  39. package/dist/esm/styled/StyledTooltipModalBody.js +30 -0
  40. package/dist/esm/styled/StyledTooltipModalClose.js +23 -0
  41. package/dist/esm/styled/StyledTooltipModalFooter.js +22 -0
  42. package/dist/esm/styled/StyledTooltipModalFooterItem.js +23 -0
  43. package/dist/esm/styled/StyledTooltipModalTitle.js +36 -0
  44. package/dist/esm/styled/StyledTooltipWrapper.js +25 -0
  45. package/dist/esm/types/index.js +11 -0
  46. package/dist/esm/utils/useModalContext.js +18 -0
  47. package/dist/esm/utils/useTooltipModalContext.js +18 -0
  48. package/dist/index.cjs.js +272 -215
  49. package/dist/typings/elements/Body.d.ts +2 -0
  50. package/dist/typings/elements/Close.d.ts +2 -0
  51. package/dist/typings/elements/Footer.d.ts +2 -0
  52. package/dist/typings/elements/FooterItem.d.ts +2 -0
  53. package/dist/typings/elements/Header.d.ts +2 -0
  54. package/dist/typings/elements/Modal.d.ts +13 -1
  55. package/dist/typings/index.d.ts +1 -1
  56. package/dist/typings/styled/StyledClose.d.ts +2 -5
  57. package/dist/typings/styled/StyledDrawerClose.d.ts +2 -1
  58. package/dist/typings/styled/StyledHeader.d.ts +2 -1
  59. package/dist/typings/styled/StyledTooltipModalClose.d.ts +2 -1
  60. package/package.json +9 -9
  61. package/dist/index.esm.js +0 -1115
package/dist/index.esm.js DELETED
@@ -1,1115 +0,0 @@
1
- /**
2
- * Copyright Zendesk, Inc.
3
- *
4
- * Use of this source code is governed under the Apache License, Version 2.0
5
- * found at http://www.apache.org/licenses/LICENSE-2.0.
6
- */
7
-
8
- import * as React from 'react';
9
- import React__default, { createContext, useContext, forwardRef, useRef, useState, useEffect, useMemo } from 'react';
10
- import ReactDOM, { createPortal } from 'react-dom';
11
- import styled, { keyframes, css, ThemeContext } from 'styled-components';
12
- import PropTypes from 'prop-types';
13
- import { getColor, retrieveComponentStyles, DEFAULT_THEME, getLineHeight, focusStyles, mediaQuery, menuStyles, getMenuPosition, arrowStyles, getArrowPosition, useDocument, useText, getFloatingPlacements, PLACEMENT as PLACEMENT$1 } from '@zendeskgarden/react-theming';
14
- import { useModal } from '@zendeskgarden/container-modal';
15
- import { useFocusVisible } from '@zendeskgarden/container-focusvisible';
16
- import { mergeRefs } from 'react-merge-refs';
17
- import isWindow from 'dom-helpers/isWindow';
18
- import ownerDocument from 'dom-helpers/ownerDocument';
19
- import ownerWindow from 'dom-helpers/ownerWindow';
20
- import css$1 from 'dom-helpers/css';
21
- import getScrollbarSize from 'dom-helpers/scrollbarSize';
22
- import { CSSTransition } from 'react-transition-group';
23
- import { useFloating, offset, autoPlacement, autoUpdate } from '@floating-ui/react-dom';
24
- import activeElement from 'dom-helpers/activeElement';
25
-
26
- function _extends$2() {
27
- _extends$2 = Object.assign ? Object.assign.bind() : function (target) {
28
- for (var i = 1; i < arguments.length; i++) {
29
- var source = arguments[i];
30
- for (var key in source) {
31
- if (Object.prototype.hasOwnProperty.call(source, key)) {
32
- target[key] = source[key];
33
- }
34
- }
35
- }
36
- return target;
37
- };
38
- return _extends$2.apply(this, arguments);
39
- }
40
-
41
- const COMPONENT_ID$j = 'modals.backdrop';
42
- const animationName$1 = keyframes(["0%{opacity:0;}100%{opacity:1;}"]);
43
- const animationStyles$1 = props => {
44
- if (props.isAnimated) {
45
- return css(["animation:", " 0.15s ease-in;"], animationName$1);
46
- }
47
- return '';
48
- };
49
- const StyledBackdrop = styled.div.attrs({
50
- 'data-garden-id': COMPONENT_ID$j,
51
- 'data-garden-version': '9.0.0-next.2'
52
- }).withConfig({
53
- displayName: "StyledBackdrop",
54
- componentId: "sc-mzdjpo-0"
55
- })(["display:flex;position:fixed;inset:0;align-items:", ";justify-content:", ";z-index:400;background-color:", ";overflow:auto;-webkit-overflow-scrolling:touch;font-family:", ";direction:", ";", ";", ";"], props => props.isCentered && 'center', props => props.isCentered && 'center', props => getColor('neutralHue', 800, props.theme, 0.85), props => props.theme.fonts.system, props => props.theme.rtl && 'rtl', animationStyles$1, props => retrieveComponentStyles(COMPONENT_ID$j, props));
56
- StyledBackdrop.defaultProps = {
57
- theme: DEFAULT_THEME
58
- };
59
- StyledBackdrop.propTypes = {
60
- isCentered: PropTypes.bool,
61
- isAnimated: PropTypes.bool
62
- };
63
-
64
- const COMPONENT_ID$i = 'modals.body';
65
- const StyledBody = styled.div.attrs({
66
- 'data-garden-id': COMPONENT_ID$i,
67
- 'data-garden-version': '9.0.0-next.2'
68
- }).withConfig({
69
- displayName: "StyledBody",
70
- componentId: "sc-14rzecg-0"
71
- })(["display:block;margin:0;padding:", ";height:100%;overflow:auto;line-height:", ";color:", ";font-size:", ";", ";"], props => `${props.theme.space.base * 5}px ${props.theme.space.base * 10}px`, props => getLineHeight(props.theme.lineHeights.md, props.theme.fontSizes.md), props => props.theme.colors.foreground, props => props.theme.fontSizes.md, props => retrieveComponentStyles(COMPONENT_ID$i, props));
72
- StyledBody.defaultProps = {
73
- theme: DEFAULT_THEME
74
- };
75
-
76
- const COMPONENT_ID$h = 'modals.close';
77
- const colorStyles = props => {
78
- const backgroundColor = 'primaryHue';
79
- const foregroundColor = 'neutralHue';
80
- return css(["background-color:transparent;color:", ";&:hover{background-color:", ";color:", ";}", " &:active{transition:background-color 0.1s ease-in-out,color 0.1s ease-in-out;background-color:", ";color:", ";}"], getColor(foregroundColor, 600, props.theme), getColor(backgroundColor, 600, props.theme, 0.08), getColor(foregroundColor, 700, props.theme), focusStyles({
81
- theme: props.theme,
82
- hue: backgroundColor
83
- }), getColor(backgroundColor, 600, props.theme, 0.2), getColor(foregroundColor, 800, props.theme));
84
- };
85
- const BASE_MULTIPLIERS$1 = {
86
- top: 2.5,
87
- side: 6.5,
88
- size: 10
89
- };
90
- const StyledClose = styled.button.attrs({
91
- 'data-garden-id': COMPONENT_ID$h,
92
- 'data-garden-version': '9.0.0-next.2'
93
- }).withConfig({
94
- displayName: "StyledClose",
95
- componentId: "sc-iseudj-0"
96
- })(["display:block;position:absolute;top:", "px;", ":", ";transition:box-shadow 0.1s ease-in-out,background-color 0.25s ease-in-out,color 0.25s ease-in-out;border:none;border-radius:50%;background-color:transparent;cursor:pointer;padding:0;width:", "px;height:", "px;overflow:hidden;text-decoration:none;font-size:0;user-select:none;&::-moz-focus-inner{border:0;}", " & > svg{vertical-align:middle;}", ";"], props => props.theme.space.base * BASE_MULTIPLIERS$1.top, props => props.theme.rtl ? 'left' : 'right', props => `${props.theme.space.base * BASE_MULTIPLIERS$1.side}px`, props => props.theme.space.base * BASE_MULTIPLIERS$1.size, props => props.theme.space.base * BASE_MULTIPLIERS$1.size, props => colorStyles(props), props => retrieveComponentStyles(COMPONENT_ID$h, props));
97
- StyledClose.defaultProps = {
98
- theme: DEFAULT_THEME
99
- };
100
-
101
- const COMPONENT_ID$g = 'modals.footer';
102
- const StyledFooter = styled.div.attrs({
103
- 'data-garden-id': COMPONENT_ID$g,
104
- 'data-garden-version': '9.0.0-next.2'
105
- }).withConfig({
106
- displayName: "StyledFooter",
107
- componentId: "sc-d8pfdu-0"
108
- })(["display:flex;flex-shrink:0;align-items:center;justify-content:flex-end;border-top:", ";padding:", ";", ";"], props => props.isLarge && `${props.theme.borders.sm} ${getColor('neutralHue', 200, props.theme)}`, props => props.isLarge ? `${props.theme.space.base * 8}px ${props.theme.space.base * 10}px` : `${props.theme.space.base * 5}px ${props.theme.space.base * 10}px ${props.theme.space.base * 8}px`, props => retrieveComponentStyles(COMPONENT_ID$g, props));
109
- StyledFooter.defaultProps = {
110
- theme: DEFAULT_THEME
111
- };
112
-
113
- const COMPONENT_ID$f = 'modals.footer_item';
114
- const StyledFooterItem = styled.span.attrs({
115
- 'data-garden-id': COMPONENT_ID$f,
116
- 'data-garden-version': '9.0.0-next.2'
117
- }).withConfig({
118
- displayName: "StyledFooterItem",
119
- componentId: "sc-1mb76hl-0"
120
- })(["display:flex;margin-", ":", "px;min-width:0;&:first-child{margin-", ":0;}", ";"], props => props.theme.rtl ? 'right' : 'left', props => props.theme.space.base * 5, props => props.theme.rtl ? 'right' : 'left', props => retrieveComponentStyles(COMPONENT_ID$f, props));
121
- StyledFooterItem.defaultProps = {
122
- theme: DEFAULT_THEME
123
- };
124
-
125
- const COMPONENT_ID$e = 'modals.header';
126
- const StyledHeader = styled.div.attrs({
127
- 'data-garden-id': COMPONENT_ID$e,
128
- 'data-garden-version': '9.0.0-next.2'
129
- }).withConfig({
130
- displayName: "StyledHeader",
131
- componentId: "sc-1787r9v-0"
132
- })(["display:block;position:", ";margin:0;border-bottom:", " ", ";padding:", ";", " line-height:", ";color:", ";font-size:", ";font-weight:", ";", ";"], props => props.isDanger && 'relative', props => props.theme.borders.sm, getColor('neutralHue', 200), props => `${props.theme.space.base * 5}px ${props.theme.space.base * 10}px`, props => props.isCloseButtonPresent && `padding-${props.theme.rtl ? 'left' : 'right'}: ${props.theme.space.base * (BASE_MULTIPLIERS$1.size + BASE_MULTIPLIERS$1.side + 2)}px;`, props => getLineHeight(props.theme.lineHeights.md, props.theme.fontSizes.md), props => props.isDanger ? getColor('dangerHue', 600, props.theme) : props.theme.colors.foreground, props => props.theme.fontSizes.md, props => props.theme.fontWeights.semibold, props => retrieveComponentStyles(COMPONENT_ID$e, props));
133
- StyledHeader.defaultProps = {
134
- theme: DEFAULT_THEME
135
- };
136
-
137
- var _g, _circle;
138
- function _extends$1() { _extends$1 = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$1.apply(this, arguments); }
139
- var SvgAlertErrorStroke = function SvgAlertErrorStroke(props) {
140
- return /*#__PURE__*/React.createElement("svg", _extends$1({
141
- xmlns: "http://www.w3.org/2000/svg",
142
- width: 16,
143
- height: 16,
144
- focusable: "false",
145
- viewBox: "0 0 16 16",
146
- "aria-hidden": "true"
147
- }, props), _g || (_g = /*#__PURE__*/React.createElement("g", {
148
- fill: "none",
149
- stroke: "currentColor"
150
- }, /*#__PURE__*/React.createElement("circle", {
151
- cx: 7.5,
152
- cy: 8.5,
153
- r: 7
154
- }), /*#__PURE__*/React.createElement("path", {
155
- strokeLinecap: "round",
156
- d: "M7.5 4.5V9"
157
- }))), _circle || (_circle = /*#__PURE__*/React.createElement("circle", {
158
- cx: 7.5,
159
- cy: 12,
160
- r: 1,
161
- fill: "currentColor"
162
- })));
163
- };
164
-
165
- const StyledDangerIcon = styled(SvgAlertErrorStroke).withConfig({
166
- displayName: "StyledDangerIcon",
167
- componentId: "sc-1kwbb39-0"
168
- })(["position:absolute;top:", "px;", ":", ";"], props => props.theme.space.base * 5.5, props => props.theme.rtl ? 'right' : 'left', props => `${props.theme.space.base * 4}px`);
169
- StyledDangerIcon.defaultProps = {
170
- theme: DEFAULT_THEME
171
- };
172
-
173
- const COMPONENT_ID$d = 'modals.modal';
174
- const animationName = keyframes(["0%{transform:scale(0);opacity:0;}50%{transform:scale(1.05);}100%{opacity:1;}"]);
175
- const animationStyles = props => {
176
- if (props.isAnimated) {
177
- return css(["animation:", " 0.3s ease-in;"], animationName);
178
- }
179
- return '';
180
- };
181
- const boxShadow$1 = props => {
182
- const {
183
- theme
184
- } = props;
185
- const {
186
- space,
187
- shadows
188
- } = theme;
189
- const offsetY = `${space.base * 5}px`;
190
- const blurRadius = `${space.base * 7}px`;
191
- const color = getColor('neutralHue', 800, theme, 0.35);
192
- return shadows.lg(offsetY, blurRadius, color);
193
- };
194
- const sizeStyles$1 = props => {
195
- return css(["", "{width:", ";}"], mediaQuery('up', props.isLarge ? 'md' : 'sm', props.theme), props.isLarge ? props.theme.breakpoints.md : props.theme.breakpoints.sm);
196
- };
197
- const StyledModal = styled.div.attrs({
198
- 'data-garden-id': COMPONENT_ID$d,
199
- 'data-garden-version': '9.0.0-next.2'
200
- }).withConfig({
201
- displayName: "StyledModal",
202
- componentId: "sc-1pe1axu-0"
203
- })(["display:flex;position:fixed;flex-direction:column;animation-delay:0.01s;margin:", ";border-radius:", ";box-shadow:", ";background-color:", ";min-height:60px;max-height:calc(100vh - ", "px);overflow:auto;direction:", ";", ";", ";&:focus{outline:none;}@media (max-height:399px){top:", "px;bottom:auto;margin-bottom:", "px;max-height:none;}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){right:", ";bottom:", ";transform:", ";}", ";"], props => props.isCentered ? '0' : `${props.theme.space.base * 12}px`, props => props.theme.borderRadii.md, boxShadow$1, props => props.theme.colors.background, props => props.theme.space.base * 24, props => props.theme.rtl && 'rtl', animationStyles, sizeStyles$1, props => props.theme.space.base * 6, props => props.theme.space.base * 6, props => props.isCentered && '50%', props => props.isCentered && '50%', props => props.isCentered && 'translate(50%, 50%)', props => retrieveComponentStyles(COMPONENT_ID$d, props));
204
- StyledModal.propTypes = {
205
- isLarge: PropTypes.bool,
206
- isAnimated: PropTypes.bool
207
- };
208
- StyledModal.defaultProps = {
209
- theme: DEFAULT_THEME
210
- };
211
-
212
- const COMPONENT_ID$c = 'modals.tooltip_modal.backdrop';
213
- const StyledTooltipModalBackdrop = styled.div.attrs({
214
- 'data-garden-id': COMPONENT_ID$c,
215
- 'data-garden-version': '9.0.0-next.2'
216
- }).withConfig({
217
- displayName: "StyledTooltipModalBackdrop",
218
- componentId: "sc-1yaomgq-0"
219
- })(["position:fixed;inset:0;z-index:400;overflow:hidden;-webkit-overflow-scrolling:touch;font-family:", ";direction:", ";&.garden-tooltip-modal-transition-exit-active{pointer-events:none;}&.garden-tooltip-modal-transition-exit-active div{transition:opacity 200ms;opacity:0;}", ";"], props => props.theme.fonts.system, props => props.theme.rtl && 'rtl', props => retrieveComponentStyles(COMPONENT_ID$c, props));
220
- StyledTooltipModalBackdrop.defaultProps = {
221
- theme: DEFAULT_THEME
222
- };
223
-
224
- const StyledTooltipWrapper = styled.div.attrs(props => ({
225
- className: props.isAnimated && 'is-animated'
226
- })).withConfig({
227
- displayName: "StyledTooltipWrapper",
228
- componentId: "sc-1xk05kf-0"
229
- })(["top:0;left:0;", ";"], props => menuStyles(getMenuPosition(props.placement), {
230
- theme: props.theme,
231
- hidden: false,
232
- zIndex: props.zIndex,
233
- animationModifier: '.is-animated'
234
- }));
235
- StyledTooltipWrapper.defaultProps = {
236
- theme: DEFAULT_THEME
237
- };
238
-
239
- const COMPONENT_ID$b = 'modals.tooltip_modal';
240
- const StyledTooltipModal = styled.div.attrs(props => ({
241
- 'data-garden-id': COMPONENT_ID$b,
242
- 'data-garden-version': '9.0.0-next.2',
243
- className: props.isAnimated && 'is-animated'
244
- })).withConfig({
245
- displayName: "StyledTooltipModal",
246
- componentId: "sc-42ubfr-0"
247
- })(["padding:", "px;width:400px;", ";", ";"], props => props.theme.space.base * 5, props => {
248
- const computedArrowStyles = arrowStyles(getArrowPosition(props.theme, props.placement), {
249
- size: `${props.theme.space.base * 2}px`,
250
- inset: '1px',
251
- animationModifier: '.is-animated'
252
- });
253
- if (props.isAnimated) {
254
- return props.hasArrow && props.transitionState === 'entered' && computedArrowStyles;
255
- }
256
- return props.hasArrow && computedArrowStyles;
257
- }, props => retrieveComponentStyles(COMPONENT_ID$b, props));
258
- StyledTooltipModal.defaultProps = {
259
- theme: DEFAULT_THEME
260
- };
261
-
262
- const COMPONENT_ID$a = 'modals.tooltip_modal.title';
263
- const sizeStyles = props => `
264
- /* stylelint-disable-next-line property-no-unknown */
265
- padding-${props.theme.rtl ? 'left' : 'right'}: ${props.theme.space.base * 8}px;
266
- line-height: ${getLineHeight(props.theme.lineHeights.md, props.theme.fontSizes.md)};
267
- font-size: ${props.theme.fontSizes.md};
268
- `;
269
- const StyledTooltipModalTitle = styled.div.attrs({
270
- 'data-garden-id': COMPONENT_ID$a,
271
- 'data-garden-version': '9.0.0-next.2'
272
- }).withConfig({
273
- displayName: "StyledTooltipModalTitle",
274
- componentId: "sc-11xjgjs-0"
275
- })(["margin:0;color:", ";font-weight:", ";", ";", ";"], props => props.theme.colors.foreground, props => props.theme.fontWeights.semibold, props => sizeStyles(props), props => retrieveComponentStyles(COMPONENT_ID$a, props));
276
- StyledTooltipModalTitle.defaultProps = {
277
- theme: DEFAULT_THEME
278
- };
279
-
280
- const COMPONENT_ID$9 = 'modals.tooltip_modal.body';
281
- const StyledTooltipModalBody = styled.div.attrs({
282
- 'data-garden-id': COMPONENT_ID$9,
283
- 'data-garden-version': '9.0.0-next.2'
284
- }).withConfig({
285
- displayName: "StyledTooltipModalBody",
286
- componentId: "sc-195dkzj-0"
287
- })(["display:block;margin:0;padding-top:", "px;line-height:", ";color:", ";font-size:", ";", ";"], props => props.theme.space.base * 1.5, props => getLineHeight(props.theme.lineHeights.md, props.theme.fontSizes.md), props => props.theme.colors.foreground, props => props.theme.fontSizes.md, props => retrieveComponentStyles(COMPONENT_ID$9, props));
288
- StyledTooltipModalBody.defaultProps = {
289
- theme: DEFAULT_THEME
290
- };
291
-
292
- const COMPONENT_ID$8 = 'modals.tooltip_modal.footer';
293
- const StyledTooltipModalFooter = styled.div.attrs({
294
- 'data-garden-id': COMPONENT_ID$8,
295
- 'data-garden-version': '9.0.0-next.2'
296
- }).withConfig({
297
- displayName: "StyledTooltipModalFooter",
298
- componentId: "sc-fm36a9-0"
299
- })(["display:flex;flex-shrink:0;align-items:center;justify-content:flex-end;padding-top:", "px;", ";"], p => p.theme.space.base * 5, props => retrieveComponentStyles(COMPONENT_ID$8, props));
300
- StyledTooltipModalFooter.defaultProps = {
301
- theme: DEFAULT_THEME
302
- };
303
-
304
- const COMPONENT_ID$7 = 'modals.tooltip_modal.footer_item';
305
- const StyledTooltipModalFooterItem = styled(StyledFooterItem).attrs({
306
- 'data-garden-id': COMPONENT_ID$7,
307
- 'data-garden-version': '9.0.0-next.2'
308
- }).withConfig({
309
- displayName: "StyledTooltipModalFooterItem",
310
- componentId: "sc-1nahj6p-0"
311
- })(["", ";"], props => retrieveComponentStyles(COMPONENT_ID$7, props));
312
- StyledTooltipModalFooterItem.defaultProps = {
313
- theme: DEFAULT_THEME
314
- };
315
-
316
- const COMPONENT_ID$6 = 'modals.tooltip_modal.close';
317
- const StyledTooltipModalClose = styled(StyledClose).attrs({
318
- 'data-garden-id': COMPONENT_ID$6,
319
- 'data-garden-version': '9.0.0-next.2'
320
- }).withConfig({
321
- displayName: "StyledTooltipModalClose",
322
- componentId: "sc-1h2ke3q-0"
323
- })(["top:", "px;", ":", ";width:", "px;height:", "px;", ";"], props => props.theme.space.base * 3.5, props => props.theme.rtl ? 'left' : 'right', props => `${props.theme.space.base * 3}px`, props => props.theme.space.base * 8, props => props.theme.space.base * 8, props => retrieveComponentStyles(COMPONENT_ID$6, props));
324
- StyledTooltipModalClose.defaultProps = {
325
- theme: DEFAULT_THEME
326
- };
327
-
328
- const COMPONENT_ID$5 = 'modals.drawer_modal';
329
- const DRAWER_WIDTH = 380;
330
- const boxShadow = props => {
331
- const {
332
- theme
333
- } = props;
334
- const {
335
- space,
336
- shadows
337
- } = theme;
338
- const offsetY = `${space.base * 5}px`;
339
- const blurRadius = `${space.base * 7}px`;
340
- const color = getColor('neutralHue', 800, theme, 0.35);
341
- return shadows.lg(offsetY, blurRadius, color);
342
- };
343
- const StyledDrawer = styled.div.attrs({
344
- 'data-garden-id': COMPONENT_ID$5,
345
- 'data-garden-version': '9.0.0-next.2'
346
- }).withConfig({
347
- displayName: "StyledDrawer",
348
- componentId: "sc-zp66t3-0"
349
- })(["display:flex;position:fixed;top:0;", ":0;flex-direction:column;z-index:500;box-shadow:", ";background:", ";width:", "px;height:100%;overflow:auto;-webkit-overflow-scrolling:touch;font-family:", ";direction:", ";&.garden-drawer-transition-enter{transform:translateX(", "px);}&.garden-drawer-transition-enter-active{transform:translateX(0);transition:transform 0.25s ease-in-out;}&.garden-drawer-transition-exit-active{transform:translateX(", "px);transition:transform 0.25s ease-in-out;}&:focus{outline:none;}", ";"], props => props.theme.rtl ? 'left' : 'right', boxShadow, props => props.theme.colors.background, DRAWER_WIDTH, props => props.theme.fonts.system, props => props.theme.rtl && 'rtl', props => props.theme.rtl ? -DRAWER_WIDTH : DRAWER_WIDTH, props => props.theme.rtl ? -DRAWER_WIDTH : DRAWER_WIDTH, props => retrieveComponentStyles(COMPONENT_ID$5, props));
350
- StyledDrawer.defaultProps = {
351
- theme: DEFAULT_THEME
352
- };
353
-
354
- const COMPONENT_ID$4 = 'modals.drawer_modal.close';
355
- const BASE_MULTIPLIERS = {
356
- top: BASE_MULTIPLIERS$1.top,
357
- side: 2,
358
- size: BASE_MULTIPLIERS$1.size
359
- };
360
- const StyledDrawerClose = styled(StyledClose).attrs({
361
- 'data-garden-id': COMPONENT_ID$4,
362
- 'data-garden-version': '9.0.0-next.2'
363
- }).withConfig({
364
- displayName: "StyledDrawerClose",
365
- componentId: "sc-1a0xt3x-0"
366
- })(["", ":", ";", ";"], props => props.theme.rtl ? 'left' : 'right', props => `${props.theme.space.base * BASE_MULTIPLIERS.side}px`, props => retrieveComponentStyles(COMPONENT_ID$4, props));
367
- StyledDrawerClose.defaultProps = {
368
- theme: DEFAULT_THEME
369
- };
370
-
371
- const COMPONENT_ID$3 = 'modals.drawer_modal.header';
372
- const StyledDrawerHeader = styled(StyledHeader).attrs({
373
- 'data-garden-id': COMPONENT_ID$3,
374
- 'data-garden-version': '9.0.0-next.2'
375
- }).withConfig({
376
- displayName: "StyledDrawerHeader",
377
- componentId: "sc-y4mgkj-0"
378
- })(["padding:", "px;", " ", ";"], props => props.theme.space.base * 5, props => props.isCloseButtonPresent && `padding-${props.theme.rtl ? 'left' : 'right'}: ${props.theme.space.base * (BASE_MULTIPLIERS.size + BASE_MULTIPLIERS.side + 2)}px;`, props => retrieveComponentStyles(COMPONENT_ID$3, props));
379
- StyledDrawerHeader.defaultProps = {
380
- theme: DEFAULT_THEME
381
- };
382
-
383
- const COMPONENT_ID$2 = 'modals.drawer_modal.body';
384
- const StyledDrawerBody = styled(StyledBody).attrs({
385
- 'data-garden-id': COMPONENT_ID$2,
386
- 'data-garden-version': '9.0.0-next.2'
387
- }).withConfig({
388
- displayName: "StyledDrawerBody",
389
- componentId: "sc-13qufyn-0"
390
- })(["padding:", "px;", ";"], props => props.theme.space.base * 5, props => retrieveComponentStyles(COMPONENT_ID$2, props));
391
- StyledDrawerBody.defaultProps = {
392
- theme: DEFAULT_THEME
393
- };
394
-
395
- const COMPONENT_ID$1 = 'modals.drawer_modal.footer';
396
- const StyledDrawerFooter = styled.div.attrs({
397
- 'data-garden-id': COMPONENT_ID$1,
398
- 'data-garden-version': '9.0.0-next.2'
399
- }).withConfig({
400
- displayName: "StyledDrawerFooter",
401
- componentId: "sc-kc7e6p-0"
402
- })(["display:flex;flex-shrink:0;justify-content:flex-end;border-top:", ";padding:", "px;", ";"], props => `${props.theme.borders.sm} ${getColor('neutralHue', 200, props.theme)}`, props => props.theme.space.base * 5, props => retrieveComponentStyles(COMPONENT_ID$1, props));
403
- StyledDrawerFooter.defaultProps = {
404
- theme: DEFAULT_THEME
405
- };
406
-
407
- const COMPONENT_ID = 'modals.drawer_modal.footer_item';
408
- const StyledDrawerFooterItem = styled(StyledFooterItem).attrs({
409
- 'data-garden-id': COMPONENT_ID,
410
- 'data-garden-version': '9.0.0-next.2'
411
- }).withConfig({
412
- displayName: "StyledDrawerFooterItem",
413
- componentId: "sc-m2yul4-0"
414
- })(["", ";"], props => retrieveComponentStyles(COMPONENT_ID, props));
415
- StyledDrawerFooterItem.defaultProps = {
416
- theme: DEFAULT_THEME
417
- };
418
-
419
- const ModalsContext = createContext(undefined);
420
- const useModalContext = () => {
421
- const context = useContext(ModalsContext);
422
- if (context === undefined) {
423
- throw new Error('useModalContext must be used within a ModalsContext.Provider');
424
- }
425
- return context;
426
- };
427
-
428
- const isOverflowing = element => {
429
- const doc = ownerDocument(element);
430
- const win = ownerWindow(doc);
431
- const isBody = element && element.tagName.toLowerCase() === 'body';
432
- if (!isWindow(doc) && !isBody) {
433
- return element.scrollHeight > element.clientHeight;
434
- }
435
- const style = win.getComputedStyle(doc.body);
436
- const marginLeft = parseInt(style.getPropertyValue('margin-left'), 10);
437
- const marginRight = parseInt(style.getPropertyValue('margin-right'), 10);
438
- return marginLeft + doc.body.clientWidth + marginRight < win.innerWidth;
439
- };
440
- const Modal = forwardRef((_ref, ref) => {
441
- let {
442
- backdropProps,
443
- children,
444
- onClose,
445
- isLarge,
446
- isCentered,
447
- isAnimated,
448
- id,
449
- appendToNode,
450
- focusOnMount,
451
- restoreFocus,
452
- ...modalProps
453
- } = _ref;
454
- const theme = useContext(ThemeContext);
455
- const modalRef = useRef(null);
456
- const environment = useDocument(theme);
457
- const [isCloseButtonPresent, setIsCloseButtonPresent] = useState(false);
458
- const [hasHeader, setHasHeader] = useState(false);
459
- const {
460
- getBackdropProps,
461
- getModalProps,
462
- getTitleProps,
463
- getContentProps,
464
- getCloseProps
465
- } = useModal({
466
- idPrefix: id,
467
- onClose,
468
- modalRef,
469
- focusOnMount,
470
- restoreFocus
471
- });
472
- useFocusVisible({
473
- scope: modalRef,
474
- relativeDocument: environment
475
- });
476
- useEffect(() => {
477
- if (!environment) {
478
- return undefined;
479
- }
480
- const htmlElement = environment.querySelector('html');
481
- const bodyElement = environment.querySelector('body');
482
- let previousHtmlOverflow;
483
- let previousBodyPaddingRight;
484
- if (bodyElement) {
485
- if (isOverflowing(bodyElement)) {
486
- const scrollbarSize = getScrollbarSize();
487
- const bodyPaddingRight = parseInt(css$1(bodyElement, 'paddingRight') || '0', 10);
488
- previousBodyPaddingRight = bodyElement.style.paddingRight;
489
- bodyElement.style.paddingRight = `${bodyPaddingRight + scrollbarSize}px`;
490
- }
491
- if (htmlElement) {
492
- previousHtmlOverflow = htmlElement.style.overflow;
493
- htmlElement.style.overflow = 'hidden';
494
- }
495
- return () => {
496
- if (htmlElement) {
497
- htmlElement.style.overflow = previousHtmlOverflow;
498
- }
499
- bodyElement.style.paddingRight = previousBodyPaddingRight;
500
- };
501
- }
502
- return undefined;
503
- }, [environment]);
504
- const rootNode = useMemo(() => {
505
- if (appendToNode) {
506
- return appendToNode;
507
- }
508
- if (environment) {
509
- return environment.body;
510
- }
511
- return undefined;
512
- }, [appendToNode, environment]);
513
- const value = useMemo(() => ({
514
- isLarge,
515
- isCloseButtonPresent,
516
- hasHeader,
517
- setHasHeader,
518
- getTitleProps,
519
- getContentProps,
520
- getCloseProps,
521
- setIsCloseButtonPresent
522
- }), [isLarge, hasHeader, isCloseButtonPresent, getTitleProps, getContentProps, getCloseProps]);
523
- const modalContainerProps = getModalProps({
524
- 'aria-describedby': undefined,
525
- ...(hasHeader ? {} : {
526
- 'aria-labelledby': undefined
527
- })
528
- });
529
- const attribute = hasHeader ? 'aria-labelledby' : 'aria-label';
530
- const defaultValue = hasHeader ? modalContainerProps['aria-labelledby'] : 'Modal dialog';
531
- const labelValue = hasHeader ? modalContainerProps['aria-labelledby'] : modalProps['aria-label'];
532
- const ariaProps = {
533
- [attribute]: useText(Modal, {
534
- [attribute]: labelValue
535
- }, attribute, defaultValue)
536
- };
537
- if (!rootNode) {
538
- return null;
539
- }
540
- return createPortal( React__default.createElement(ModalsContext.Provider, {
541
- value: value
542
- }, React__default.createElement(StyledBackdrop, _extends$2({
543
- isCentered: isCentered,
544
- isAnimated: isAnimated
545
- }, getBackdropProps(backdropProps)), React__default.createElement(StyledModal, _extends$2({
546
- isCentered: isCentered,
547
- isAnimated: isAnimated,
548
- isLarge: isLarge
549
- }, modalContainerProps, ariaProps, modalProps, {
550
- ref: mergeRefs([ref, modalRef])
551
- }), children))), rootNode);
552
- });
553
- Modal.displayName = 'Modal';
554
- Modal.propTypes = {
555
- backdropProps: PropTypes.object,
556
- isLarge: PropTypes.bool,
557
- isAnimated: PropTypes.bool,
558
- isCentered: PropTypes.bool,
559
- focusOnMount: PropTypes.bool,
560
- restoreFocus: PropTypes.bool,
561
- onClose: PropTypes.func,
562
- appendToNode: PropTypes.any
563
- };
564
- Modal.defaultProps = {
565
- isAnimated: true,
566
- isCentered: true
567
- };
568
-
569
- const Body$2 = forwardRef((props, ref) => {
570
- const {
571
- getContentProps
572
- } = useModalContext();
573
- return React__default.createElement(StyledBody, _extends$2({}, getContentProps(props), {
574
- ref: ref
575
- }));
576
- });
577
- Body$2.displayName = 'Body';
578
-
579
- var _path;
580
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
581
- var SvgXStroke = function SvgXStroke(props) {
582
- return /*#__PURE__*/React.createElement("svg", _extends({
583
- xmlns: "http://www.w3.org/2000/svg",
584
- width: 16,
585
- height: 16,
586
- focusable: "false",
587
- viewBox: "0 0 16 16",
588
- "aria-hidden": "true"
589
- }, props), _path || (_path = /*#__PURE__*/React.createElement("path", {
590
- stroke: "currentColor",
591
- strokeLinecap: "round",
592
- d: "M3 13L13 3m0 10L3 3"
593
- })));
594
- };
595
-
596
- const Close$2 = forwardRef((props, ref) => {
597
- const {
598
- getCloseProps,
599
- setIsCloseButtonPresent
600
- } = useModalContext();
601
- useEffect(() => {
602
- setIsCloseButtonPresent(true);
603
- return () => setIsCloseButtonPresent(false);
604
- });
605
- const ariaLabel = useText(Close$2, props, 'aria-label', 'Close modal');
606
- return React__default.createElement(StyledClose, _extends$2({}, getCloseProps({
607
- ...props,
608
- 'aria-label': ariaLabel
609
- }), {
610
- ref: ref
611
- }), React__default.createElement(SvgXStroke, null));
612
- });
613
- Close$2.displayName = 'Close';
614
-
615
- const Footer$2 = React__default.forwardRef((props, ref) => {
616
- const {
617
- isLarge
618
- } = useModalContext();
619
- return React__default.createElement(StyledFooter, _extends$2({
620
- ref: ref,
621
- isLarge: isLarge
622
- }, props));
623
- });
624
- Footer$2.displayName = 'Footer';
625
-
626
- const FooterItem$2 = React__default.forwardRef((props, ref) => React__default.createElement(StyledFooterItem, _extends$2({
627
- ref: ref
628
- }, props)));
629
- FooterItem$2.displayName = 'FooterItem';
630
-
631
- const Header$1 = forwardRef((_ref, ref) => {
632
- let {
633
- children,
634
- tag,
635
- ...other
636
- } = _ref;
637
- const {
638
- isCloseButtonPresent,
639
- hasHeader,
640
- setHasHeader,
641
- getTitleProps
642
- } = useModalContext();
643
- useEffect(() => {
644
- if (!hasHeader && setHasHeader) {
645
- setHasHeader(true);
646
- }
647
- return () => {
648
- if (hasHeader && setHasHeader) {
649
- setHasHeader(false);
650
- }
651
- };
652
- }, [hasHeader, setHasHeader]);
653
- return React__default.createElement(StyledHeader, _extends$2({}, getTitleProps(other), {
654
- as: tag,
655
- isCloseButtonPresent: isCloseButtonPresent,
656
- ref: ref
657
- }), other.isDanger && React__default.createElement(StyledDangerIcon, null), children);
658
- });
659
- Header$1.displayName = 'Header';
660
- Header$1.propTypes = {
661
- isDanger: PropTypes.bool,
662
- tag: PropTypes.any
663
- };
664
- Header$1.defaultProps = {
665
- tag: 'div'
666
- };
667
-
668
- const TooltipModalContext = createContext(undefined);
669
- const useTooltipModalContext = () => {
670
- const context = useContext(TooltipModalContext);
671
- if (context === undefined) {
672
- throw new Error('Element must be used within a TooltipModal component.');
673
- }
674
- return context;
675
- };
676
-
677
- const TitleComponent = forwardRef((_ref, ref) => {
678
- let {
679
- children,
680
- tag,
681
- ...other
682
- } = _ref;
683
- const {
684
- getTitleProps,
685
- hasTitle,
686
- setHasTitle
687
- } = useTooltipModalContext();
688
- useEffect(() => {
689
- if (!hasTitle && setHasTitle) {
690
- setHasTitle(true);
691
- }
692
- return () => {
693
- if (hasTitle && setHasTitle) {
694
- setHasTitle(false);
695
- }
696
- };
697
- }, [hasTitle, setHasTitle]);
698
- return React__default.createElement(StyledTooltipModalTitle, _extends$2({}, getTitleProps(other), {
699
- as: tag,
700
- ref: ref
701
- }), children);
702
- });
703
- TitleComponent.displayName = 'TooltipModal.Title';
704
- TitleComponent.propTypes = {
705
- tag: PropTypes.any
706
- };
707
- TitleComponent.defaultProps = {
708
- tag: 'div'
709
- };
710
- const Title = TitleComponent;
711
-
712
- const BodyComponent$1 = forwardRef((props, ref) => {
713
- const {
714
- getContentProps
715
- } = useTooltipModalContext();
716
- return React__default.createElement(StyledTooltipModalBody, _extends$2({}, getContentProps(props), {
717
- ref: ref
718
- }));
719
- });
720
- BodyComponent$1.displayName = 'TooltipModal.Body';
721
- const Body$1 = BodyComponent$1;
722
-
723
- const CloseComponent$1 = forwardRef((props, ref) => {
724
- const {
725
- getCloseProps
726
- } = useTooltipModalContext();
727
- const ariaLabel = useText(CloseComponent$1, props, 'aria-label', 'Close tooltip');
728
- return React__default.createElement(StyledTooltipModalClose, _extends$2({}, getCloseProps({
729
- ...props,
730
- 'aria-label': ariaLabel
731
- }), {
732
- ref: ref
733
- }), React__default.createElement(SvgXStroke, null));
734
- });
735
- CloseComponent$1.displayName = 'TooltipModal.Close';
736
- const Close$1 = CloseComponent$1;
737
-
738
- const FooterComponent$1 = forwardRef((props, ref) => React__default.createElement(StyledTooltipModalFooter, _extends$2({
739
- ref: ref
740
- }, props)));
741
- FooterComponent$1.displayName = 'TooltipModal.Footer';
742
- const Footer$1 = FooterComponent$1;
743
-
744
- const FooterItemComponent$1 = forwardRef((props, ref) => React__default.createElement(StyledTooltipModalFooterItem, _extends$2({
745
- ref: ref
746
- }, props)));
747
- FooterItemComponent$1.displayName = 'TooltipModal.FooterItem';
748
- const FooterItem$1 = FooterItemComponent$1;
749
-
750
- const PLACEMENT_DEFAULT = 'top';
751
- const TooltipModalComponent = React__default.forwardRef((_ref, ref) => {
752
- let {
753
- appendToNode,
754
- referenceElement,
755
- placement: _placement,
756
- onClose,
757
- hasArrow,
758
- isAnimated,
759
- zIndex,
760
- backdropProps,
761
- focusOnMount,
762
- restoreFocus,
763
- id,
764
- ...props
765
- } = _ref;
766
- const theme = useContext(ThemeContext) || DEFAULT_THEME;
767
- const previousReferenceElementRef = useRef();
768
- const modalRef = useRef(null);
769
- const transitionRef = useRef(null);
770
- const [floatingElement, setFloatingElement] = useState();
771
- const [hasTitle, setHasTitle] = useState(false);
772
- const {
773
- getTitleProps,
774
- getCloseProps,
775
- getContentProps,
776
- getBackdropProps,
777
- getModalProps
778
- } = useModal({
779
- idPrefix: id,
780
- onClose,
781
- modalRef,
782
- focusOnMount,
783
- restoreFocus: false
784
- });
785
- const [floatingPlacement] = getFloatingPlacements(theme, _placement === 'auto' ? PLACEMENT_DEFAULT : _placement);
786
- const {
787
- refs,
788
- placement,
789
- update,
790
- floatingStyles: {
791
- transform
792
- }
793
- } = useFloating({
794
- elements: {
795
- reference: referenceElement,
796
- floating: floatingElement
797
- },
798
- placement: floatingPlacement,
799
- middleware: [offset(theme.space.base * 3), _placement === 'auto' ? autoPlacement() : undefined]
800
- });
801
- useEffect(() => {
802
- let cleanup;
803
- if (referenceElement && floatingElement && refs.reference.current && refs.floating.current) {
804
- cleanup = autoUpdate(refs.reference.current, refs.floating.current, update, {
805
- elementResize: typeof ResizeObserver === 'function'
806
- });
807
- }
808
- return () => cleanup && cleanup();
809
- }, [referenceElement, floatingElement, refs.reference, refs.floating, update]);
810
- useEffect(() => {
811
- if (!referenceElement && previousReferenceElementRef.current && restoreFocus) {
812
- previousReferenceElementRef.current.focus();
813
- }
814
- previousReferenceElementRef.current = referenceElement;
815
- }, [referenceElement, restoreFocus]);
816
- const modalProps = getModalProps({
817
- 'aria-describedby': undefined,
818
- ...(hasTitle ? {} : {
819
- 'aria-labelledby': undefined
820
- })
821
- });
822
- const attribute = hasTitle ? 'aria-labelledby' : 'aria-label';
823
- const defaultValue = hasTitle ? modalProps['aria-labelledby'] : 'Modal dialog';
824
- const labelValue = hasTitle ? modalProps['aria-labelledby'] : props['aria-label'];
825
- const ariaProps = {
826
- [attribute]: useText(TooltipModalComponent, {
827
- [attribute]: labelValue
828
- }, attribute, defaultValue)
829
- };
830
- const value = {
831
- hasTitle,
832
- setHasTitle,
833
- getTitleProps,
834
- getContentProps,
835
- getCloseProps
836
- };
837
- const Node = React__default.createElement(CSSTransition, {
838
- unmountOnExit: true,
839
- timeout: isAnimated ? 200 : 0,
840
- in: Boolean(referenceElement),
841
- classNames: isAnimated ? 'garden-tooltip-modal-transition' : '',
842
- nodeRef: transitionRef
843
- }, transitionState => {
844
- return React__default.createElement(TooltipModalContext.Provider, {
845
- value: value
846
- }, React__default.createElement(StyledTooltipModalBackdrop, _extends$2({}, getBackdropProps(), backdropProps, {
847
- ref: transitionRef
848
- }), React__default.createElement(StyledTooltipWrapper, {
849
- ref: setFloatingElement,
850
- style: {
851
- transform
852
- },
853
- placement: placement,
854
- zIndex: zIndex,
855
- isAnimated: isAnimated
856
- }, React__default.createElement(StyledTooltipModal, _extends$2({
857
- transitionState: transitionState,
858
- placement: placement,
859
- hasArrow: hasArrow,
860
- isAnimated: isAnimated
861
- }, modalProps, ariaProps, props, {
862
- ref: mergeRefs([modalRef, ref])
863
- })))));
864
- });
865
- return appendToNode ? createPortal(Node, appendToNode) : Node;
866
- });
867
- TooltipModalComponent.displayName = 'TooltipModal';
868
- TooltipModalComponent.defaultProps = {
869
- placement: 'auto',
870
- hasArrow: true,
871
- focusOnMount: true,
872
- restoreFocus: true
873
- };
874
- TooltipModalComponent.propTypes = {
875
- appendToNode: PropTypes.any,
876
- referenceElement: PropTypes.any,
877
- placement: PropTypes.any,
878
- isAnimated: PropTypes.bool,
879
- hasArrow: PropTypes.bool,
880
- zIndex: PropTypes.number,
881
- onClose: PropTypes.func,
882
- backdropProps: PropTypes.any,
883
- focusOnMount: PropTypes.bool,
884
- restoreFocus: PropTypes.bool
885
- };
886
- const TooltipModal = TooltipModalComponent;
887
- TooltipModal.Body = Body$1;
888
- TooltipModal.Close = Close$1;
889
- TooltipModal.Footer = Footer$1;
890
- TooltipModal.FooterItem = FooterItem$1;
891
- TooltipModal.Title = Title;
892
-
893
- const HeaderComponent = forwardRef((_ref, ref) => {
894
- let {
895
- tag,
896
- ...other
897
- } = _ref;
898
- const {
899
- isCloseButtonPresent,
900
- hasHeader,
901
- setHasHeader,
902
- getTitleProps
903
- } = useModalContext();
904
- useEffect(() => {
905
- if (!hasHeader && setHasHeader) {
906
- setHasHeader(true);
907
- }
908
- return () => {
909
- if (hasHeader && setHasHeader) {
910
- setHasHeader(false);
911
- }
912
- };
913
- }, [hasHeader, setHasHeader]);
914
- return React__default.createElement(StyledDrawerHeader, _extends$2({}, getTitleProps(other), {
915
- as: tag,
916
- isCloseButtonPresent: isCloseButtonPresent,
917
- ref: ref
918
- }));
919
- });
920
- HeaderComponent.displayName = 'Drawer.Header';
921
- HeaderComponent.propTypes = {
922
- tag: PropTypes.any
923
- };
924
- HeaderComponent.defaultProps = {
925
- tag: 'div'
926
- };
927
- const Header = HeaderComponent;
928
-
929
- const BodyComponent = forwardRef((props, ref) => {
930
- const {
931
- getContentProps
932
- } = useModalContext();
933
- return React__default.createElement(StyledDrawerBody, _extends$2({}, getContentProps(props), {
934
- ref: ref
935
- }), props.children);
936
- });
937
- BodyComponent.displayName = 'Drawer.Body';
938
- const Body = BodyComponent;
939
-
940
- const CloseComponent = forwardRef((props, ref) => {
941
- const {
942
- getCloseProps,
943
- setIsCloseButtonPresent
944
- } = useModalContext();
945
- useEffect(() => {
946
- setIsCloseButtonPresent(true);
947
- return () => setIsCloseButtonPresent(false);
948
- });
949
- const ariaLabel = useText(CloseComponent, props, 'aria-label', 'Close drawer');
950
- return React__default.createElement(StyledDrawerClose, _extends$2({}, getCloseProps({
951
- ...props,
952
- 'aria-label': ariaLabel
953
- }), {
954
- ref: ref
955
- }), React__default.createElement(SvgXStroke, null));
956
- });
957
- CloseComponent.displayName = 'Drawer.Close';
958
- const Close = CloseComponent;
959
-
960
- const FooterComponent = forwardRef((props, ref) => React__default.createElement(StyledDrawerFooter, _extends$2({
961
- ref: ref
962
- }, props)));
963
- FooterComponent.displayName = 'Drawer.Footer';
964
- const Footer = FooterComponent;
965
-
966
- const FooterItemComponent = forwardRef((props, ref) => React__default.createElement(StyledDrawerFooterItem, _extends$2({
967
- ref: ref
968
- }, props)));
969
- FooterItemComponent.displayName = 'Drawer.FooterItem';
970
- const FooterItem = FooterItemComponent;
971
-
972
- const DrawerComponent = forwardRef((_ref, ref) => {
973
- let {
974
- id,
975
- isOpen,
976
- onClose,
977
- backdropProps,
978
- appendToNode,
979
- focusOnMount,
980
- restoreFocus,
981
- ...props
982
- } = _ref;
983
- const modalRef = useRef(null);
984
- const transitionRef = useRef(null);
985
- const triggerRef = useRef(null);
986
- const theme = useContext(ThemeContext);
987
- const environment = useDocument(theme);
988
- const [isCloseButtonPresent, setIsCloseButtonPresent] = useState(false);
989
- const [hasHeader, setHasHeader] = useState(false);
990
- useFocusVisible({
991
- scope: modalRef,
992
- relativeDocument: modalRef.current
993
- });
994
- const {
995
- getTitleProps,
996
- getCloseProps,
997
- getContentProps,
998
- getBackdropProps,
999
- getModalProps
1000
- } = useModal({
1001
- idPrefix: id,
1002
- modalRef,
1003
- focusOnMount: false ,
1004
- restoreFocus: false ,
1005
- environment,
1006
- onClose
1007
- });
1008
- useEffect(() => {
1009
- if (environment) {
1010
- if (isOpen && modalRef.current) {
1011
- if (restoreFocus) {
1012
- triggerRef.current = activeElement(environment);
1013
- }
1014
- if (focusOnMount) {
1015
- modalRef.current.focus();
1016
- }
1017
- }
1018
- if (!isOpen && triggerRef.current) {
1019
- triggerRef.current.focus();
1020
- }
1021
- }
1022
- return () => {
1023
- if (!(restoreFocus && isOpen)) {
1024
- triggerRef.current = null;
1025
- }
1026
- };
1027
- }, [environment, restoreFocus, focusOnMount, isOpen]);
1028
- useEffect(() => {
1029
- if (!environment) {
1030
- return undefined;
1031
- }
1032
- const htmlElement = environment.querySelector('html');
1033
- let previousHtmlOverflow;
1034
- if (htmlElement && isOpen) {
1035
- previousHtmlOverflow = htmlElement.style.overflow;
1036
- htmlElement.style.overflow = 'hidden';
1037
- }
1038
- return () => {
1039
- if (htmlElement && isOpen) {
1040
- htmlElement.style.overflow = previousHtmlOverflow;
1041
- }
1042
- };
1043
- }, [environment, isOpen]);
1044
- const rootNode = useMemo(() => {
1045
- if (appendToNode) {
1046
- return appendToNode;
1047
- }
1048
- if (environment) {
1049
- return environment.body;
1050
- }
1051
- return undefined;
1052
- }, [appendToNode, environment]);
1053
- const value = useMemo(() => ({
1054
- isCloseButtonPresent,
1055
- hasHeader,
1056
- setHasHeader,
1057
- getTitleProps,
1058
- getContentProps,
1059
- getCloseProps,
1060
- setIsCloseButtonPresent
1061
- }), [isCloseButtonPresent, hasHeader, getTitleProps, getContentProps, getCloseProps]);
1062
- const modalProps = getModalProps({
1063
- 'aria-describedby': undefined,
1064
- ...(hasHeader ? {} : {
1065
- 'aria-labelledby': undefined
1066
- })
1067
- });
1068
- const attribute = hasHeader ? 'aria-labelledby' : 'aria-label';
1069
- const defaultValue = hasHeader ? modalProps['aria-labelledby'] : 'Modal dialog';
1070
- const labelValue = hasHeader ? modalProps['aria-labelledby'] : props['aria-label'];
1071
- const ariaProps = {
1072
- [attribute]: useText(DrawerComponent, {
1073
- [attribute]: labelValue
1074
- }, attribute, defaultValue)
1075
- };
1076
- if (!rootNode) {
1077
- return null;
1078
- }
1079
- return ReactDOM.createPortal( React__default.createElement(ModalsContext.Provider, {
1080
- value: value
1081
- }, React__default.createElement(CSSTransition, {
1082
- in: isOpen,
1083
- timeout: 250,
1084
- unmountOnExit: true,
1085
- classNames: "garden-drawer-transition",
1086
- nodeRef: transitionRef
1087
- }, React__default.createElement(StyledBackdrop, _extends$2({
1088
- isAnimated: true
1089
- }, getBackdropProps(backdropProps)), React__default.createElement(StyledDrawer, _extends$2({}, modalProps, ariaProps, props, {
1090
- ref: mergeRefs([ref, modalRef, transitionRef])
1091
- }))))), rootNode);
1092
- });
1093
- DrawerComponent.displayName = 'Drawer';
1094
- DrawerComponent.propTypes = {
1095
- backdropProps: PropTypes.object,
1096
- focusOnMount: PropTypes.bool,
1097
- restoreFocus: PropTypes.bool,
1098
- onClose: PropTypes.func,
1099
- appendToNode: PropTypes.any,
1100
- isOpen: PropTypes.bool
1101
- };
1102
- DrawerComponent.defaultProps = {
1103
- focusOnMount: true ,
1104
- restoreFocus: true
1105
- };
1106
- const Drawer = DrawerComponent;
1107
- Drawer.Body = Body;
1108
- Drawer.Close = Close;
1109
- Drawer.Footer = Footer;
1110
- Drawer.FooterItem = FooterItem;
1111
- Drawer.Header = Header;
1112
-
1113
- const PLACEMENT = ['auto', ...PLACEMENT$1];
1114
-
1115
- export { Body$2 as Body, Close$2 as Close, Drawer, Footer$2 as Footer, FooterItem$2 as FooterItem, Header$1 as Header, Modal, PLACEMENT, TooltipModal };