no-frills-ui 0.0.14-alpha.8 → 0.0.14-rc.1
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/README.md +3 -3
- package/dist/index.js +847 -718
- package/dist/index.js.map +1 -1
- package/lib-esm/components/Accordion/Accordion.d.ts +9 -13
- package/lib-esm/components/Accordion/Accordion.js +13 -11
- package/lib-esm/components/Accordion/Accordion.js.map +1 -1
- package/lib-esm/components/Accordion/AccordionStep.d.ts +22 -22
- package/lib-esm/components/Accordion/AccordionStep.js +34 -29
- package/lib-esm/components/Accordion/AccordionStep.js.map +1 -1
- package/lib-esm/components/Badge/Badge.d.ts +13 -16
- package/lib-esm/components/Badge/Badge.js +10 -20
- package/lib-esm/components/Badge/Badge.js.map +1 -1
- package/lib-esm/components/Button/ActionButton.d.ts +9 -5
- package/lib-esm/components/Button/ActionButton.js +18 -3
- package/lib-esm/components/Button/ActionButton.js.map +1 -1
- package/lib-esm/components/Button/Button.d.ts +9 -5
- package/lib-esm/components/Button/Button.js +17 -5
- package/lib-esm/components/Button/Button.js.map +1 -1
- package/lib-esm/components/Button/IconButton.d.ts +9 -5
- package/lib-esm/components/Button/IconButton.js +18 -3
- package/lib-esm/components/Button/IconButton.js.map +1 -1
- package/lib-esm/components/Button/LinkButton.d.ts +9 -5
- package/lib-esm/components/Button/LinkButton.js +18 -3
- package/lib-esm/components/Button/LinkButton.js.map +1 -1
- package/lib-esm/components/Button/RaisedButton.d.ts +9 -5
- package/lib-esm/components/Button/RaisedButton.js +18 -3
- package/lib-esm/components/Button/RaisedButton.js.map +1 -1
- package/lib-esm/components/Card/Card.d.ts +4 -6
- package/lib-esm/components/Card/Card.js +16 -3
- package/lib-esm/components/Card/Card.js.map +1 -1
- package/lib-esm/components/Chip/Chip.d.ts +2 -2
- package/lib-esm/components/Chip/Chip.js +14 -8
- package/lib-esm/components/Chip/Chip.js.map +1 -1
- package/lib-esm/components/ChipInput/ChipInput.d.ts +28 -39
- package/lib-esm/components/ChipInput/ChipInput.js +37 -37
- package/lib-esm/components/ChipInput/ChipInput.js.map +1 -1
- package/lib-esm/components/Dialog/AlertDialog.d.ts +11 -12
- package/lib-esm/components/Dialog/AlertDialog.js +4 -11
- package/lib-esm/components/Dialog/AlertDialog.js.map +1 -1
- package/lib-esm/components/Dialog/ConfirmDialog.d.ts +13 -14
- package/lib-esm/components/Dialog/ConfirmDialog.js +4 -12
- package/lib-esm/components/Dialog/ConfirmDialog.js.map +1 -1
- package/lib-esm/components/Dialog/Dialog.d.ts +8 -14
- package/lib-esm/components/Dialog/Dialog.js +11 -9
- package/lib-esm/components/Dialog/Dialog.js.map +1 -1
- package/lib-esm/components/Dialog/PromptDialog.d.ts +18 -19
- package/lib-esm/components/Dialog/PromptDialog.js +10 -18
- package/lib-esm/components/Dialog/PromptDialog.js.map +1 -1
- package/lib-esm/components/DragAndDrop/DragAndDrop.d.ts +37 -59
- package/lib-esm/components/DragAndDrop/DragAndDrop.js +23 -26
- package/lib-esm/components/DragAndDrop/DragAndDrop.js.map +1 -1
- package/lib-esm/components/DragAndDrop/DragItem.d.ts +2 -2
- package/lib-esm/components/DragAndDrop/DragItem.js +40 -38
- package/lib-esm/components/DragAndDrop/DragItem.js.map +1 -1
- package/lib-esm/components/DragAndDrop/types.d.ts +3 -3
- package/lib-esm/components/DragAndDrop/types.js.map +1 -1
- package/lib-esm/components/Drawer/Drawer.d.ts +24 -31
- package/lib-esm/components/Drawer/Drawer.js +49 -45
- package/lib-esm/components/Drawer/Drawer.js.map +1 -1
- package/lib-esm/components/Groups/Group.d.ts +6 -8
- package/lib-esm/components/Groups/Group.js +12 -10
- package/lib-esm/components/Groups/Group.js.map +1 -1
- package/lib-esm/components/Input/Checkbox.d.ts +12 -15
- package/lib-esm/components/Input/Checkbox.js +30 -26
- package/lib-esm/components/Input/Checkbox.js.map +1 -1
- package/lib-esm/components/Input/Dropdown.d.ts +8 -18
- package/lib-esm/components/Input/Dropdown.js +42 -17
- package/lib-esm/components/Input/Dropdown.js.map +1 -1
- package/lib-esm/components/Input/Input.d.ts +8 -3
- package/lib-esm/components/Input/Input.js +20 -19
- package/lib-esm/components/Input/Input.js.map +1 -1
- package/lib-esm/components/Input/Radio.d.ts +4 -8
- package/lib-esm/components/Input/Radio.js +16 -13
- package/lib-esm/components/Input/Radio.js.map +1 -1
- package/lib-esm/components/Input/RadioButton.d.ts +4 -8
- package/lib-esm/components/Input/RadioButton.js +15 -12
- package/lib-esm/components/Input/RadioButton.js.map +1 -1
- package/lib-esm/components/Input/Select.d.ts +6 -13
- package/lib-esm/components/Input/Select.js +21 -18
- package/lib-esm/components/Input/Select.js.map +1 -1
- package/lib-esm/components/Input/TextArea.d.ts +6 -13
- package/lib-esm/components/Input/TextArea.js +29 -24
- package/lib-esm/components/Input/TextArea.js.map +1 -1
- package/lib-esm/components/Input/Toggle.d.ts +4 -9
- package/lib-esm/components/Input/Toggle.js +12 -10
- package/lib-esm/components/Input/Toggle.js.map +1 -1
- package/lib-esm/components/Menu/Menu.d.ts +4 -14
- package/lib-esm/components/Menu/Menu.js +24 -16
- package/lib-esm/components/Menu/Menu.js.map +1 -1
- package/lib-esm/components/Menu/MenuContext.d.ts +4 -4
- package/lib-esm/components/Menu/MenuContext.js +1 -0
- package/lib-esm/components/Menu/MenuContext.js.map +1 -1
- package/lib-esm/components/Menu/MenuItem.d.ts +10 -4
- package/lib-esm/components/Menu/MenuItem.js +19 -5
- package/lib-esm/components/Menu/MenuItem.js.map +1 -1
- package/lib-esm/components/Modal/Modal.d.ts +17 -23
- package/lib-esm/components/Modal/Modal.js +37 -34
- package/lib-esm/components/Modal/Modal.js.map +1 -1
- package/lib-esm/components/Notification/Notification.d.ts +39 -34
- package/lib-esm/components/Notification/Notification.js +16 -39
- package/lib-esm/components/Notification/Notification.js.map +1 -1
- package/lib-esm/components/Notification/NotificationManager.d.ts +4 -4
- package/lib-esm/components/Notification/NotificationManager.js +18 -14
- package/lib-esm/components/Notification/NotificationManager.js.map +1 -1
- package/lib-esm/components/Notification/index.d.ts +1 -0
- package/lib-esm/components/Notification/style.d.ts +2 -3
- package/lib-esm/components/Notification/style.js +11 -11
- package/lib-esm/components/Notification/style.js.map +1 -1
- package/lib-esm/components/Popover/Popover.d.ts +21 -20
- package/lib-esm/components/Popover/Popover.js +42 -44
- package/lib-esm/components/Popover/Popover.js.map +1 -1
- package/lib-esm/components/Spinner/Spinner.d.ts +14 -15
- package/lib-esm/components/Spinner/Spinner.js +12 -13
- package/lib-esm/components/Spinner/Spinner.js.map +1 -1
- package/lib-esm/components/Stepper/Step.d.ts +15 -12
- package/lib-esm/components/Stepper/Step.js +10 -8
- package/lib-esm/components/Stepper/Step.js.map +1 -1
- package/lib-esm/components/Stepper/Stepper.d.ts +11 -17
- package/lib-esm/components/Stepper/Stepper.js +25 -23
- package/lib-esm/components/Stepper/Stepper.js.map +1 -1
- package/lib-esm/components/Tabs/Tab.d.ts +10 -16
- package/lib-esm/components/Tabs/Tab.js +0 -8
- package/lib-esm/components/Tabs/Tab.js.map +1 -1
- package/lib-esm/components/Tabs/Tabs.d.ts +11 -22
- package/lib-esm/components/Tabs/Tabs.js +39 -31
- package/lib-esm/components/Tabs/Tabs.js.map +1 -1
- package/lib-esm/components/Toast/Toast.d.ts +7 -7
- package/lib-esm/components/Toast/Toast.js +13 -12
- package/lib-esm/components/Toast/Toast.js.map +1 -1
- package/lib-esm/components/Toast/ToastStory.d.ts +21 -24
- package/lib-esm/components/Tooltip/Tooltip.d.ts +11 -14
- package/lib-esm/components/Tooltip/Tooltip.js +11 -21
- package/lib-esm/components/Tooltip/Tooltip.js.map +1 -1
- package/lib-esm/icons/CheckCircle.js +2 -2
- package/lib-esm/icons/CheckCircle.js.map +1 -1
- package/lib-esm/icons/ErrorOutline.js +2 -2
- package/lib-esm/icons/ErrorOutline.js.map +1 -1
- package/lib-esm/icons/Info.js +2 -2
- package/lib-esm/icons/Info.js.map +1 -1
- package/lib-esm/icons/ReportProblem.js +2 -2
- package/lib-esm/icons/ReportProblem.js.map +1 -1
- package/lib-esm/index.js +43 -0
- package/lib-esm/shared/LayerManager.d.ts +5 -4
- package/lib-esm/shared/LayerManager.js +111 -111
- package/lib-esm/shared/LayerManager.js.map +1 -1
- package/lib-esm/shared/styles.d.ts +1 -1
- package/lib-esm/shared/styles.js +9 -9
- package/lib-esm/shared/styles.js.map +1 -1
- package/package.json +66 -31
- package/lib-esm/components/index.js +0 -43
- /package/lib-esm/{components/index.js.map → index.js.map} +0 -0
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from '@emotion/react/jsx-runtime';
|
|
2
2
|
import React, { useState, useRef, useId, useCallback, useEffect } from 'react';
|
|
3
|
-
import PropTypes from 'prop-types';
|
|
4
3
|
import styled from '@emotion/styled';
|
|
5
4
|
import Card from '../Card/Card.js';
|
|
6
5
|
|
|
@@ -11,7 +10,7 @@ var POPOVER_POSITION = /*#__PURE__*/ function(POPOVER_POSITION) {
|
|
|
11
10
|
POPOVER_POSITION["BOTTOM_RIGHT"] = "BOTTOM_RIGHT";
|
|
12
11
|
return POPOVER_POSITION;
|
|
13
12
|
}({});
|
|
14
|
-
const positionMap = {
|
|
13
|
+
const positionMap$2 = {
|
|
15
14
|
["TOP_LEFT"]: `
|
|
16
15
|
bottom: calc(100% - 10px);
|
|
17
16
|
left: 0;
|
|
@@ -30,25 +29,30 @@ const positionMap = {
|
|
|
30
29
|
`
|
|
31
30
|
};
|
|
32
31
|
const PopoverDiv = /*#__PURE__*/ styled("div", {
|
|
33
|
-
target: "
|
|
32
|
+
target: "ejcb1ps0",
|
|
34
33
|
label: "PopoverDiv"
|
|
35
34
|
})("position:relative;display:inline-flex;");
|
|
36
35
|
const Popper = /*#__PURE__*/ styled(Card, {
|
|
37
|
-
target: "
|
|
36
|
+
target: "ejcb1ps1",
|
|
38
37
|
label: "Popper"
|
|
39
|
-
})("position:absolute;width:100%;min-width:200px;overflow:auto;animation:enter 0.3s linear;border-radius:3px;z-index:1;transform:translate(", (props)=>props.translateX, "px,", (props)=>props.translateY, "px);", (props)=>positionMap[props.position], " &.closing{animation:exit 0.3s linear;}@keyframes enter{from{max-height:0px;opacity:1;overflow:hidden;}to{max-height:300px;opacity:1;overflow:hidden;}}@keyframes exit{to{max-height:0px;opacity:1;overflow:hidden;}from{max-height:300px;opacity:1;overflow:hidden;}}");
|
|
38
|
+
})("position:absolute;width:100%;min-width:200px;overflow:auto;animation:enter 0.3s linear;border-radius:3px;z-index:1;transform:translate(", (props)=>props.translateX, "px,", (props)=>props.translateY, "px);", (props)=>positionMap$2[props.position], " &.closing{animation:exit 0.3s linear;}@keyframes enter{from{max-height:0px;opacity:1;overflow:hidden;}to{max-height:300px;opacity:1;overflow:hidden;}}@keyframes exit{to{max-height:0px;opacity:1;overflow:hidden;}from{max-height:300px;opacity:1;overflow:hidden;}}");
|
|
40
39
|
const KEY_CODES = {
|
|
41
40
|
ESC: 27
|
|
42
41
|
};
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Popover Component
|
|
44
|
+
* @param props - Component props
|
|
45
|
+
* @param ref - Ref forwarded to the underlying HTMLDivElement
|
|
46
|
+
*/ function PopoverComponent(props, ref) {
|
|
47
|
+
const { open: propsOpen, element, position = "BOTTOM_LEFT", closeOnEsc = true, onClose, children, ...rest } = props;
|
|
48
|
+
const [open, setOpen] = useState(propsOpen);
|
|
45
49
|
const [closing, setClosing] = useState(false);
|
|
46
50
|
const [translate, setTranslate] = useState({
|
|
47
51
|
x: 0,
|
|
48
52
|
y: 0
|
|
49
53
|
});
|
|
50
|
-
const popperRef = useRef();
|
|
51
|
-
const containerRef = useRef();
|
|
54
|
+
const popperRef = useRef(null);
|
|
55
|
+
const containerRef = useRef(null);
|
|
52
56
|
const triggerRef = useRef(null);
|
|
53
57
|
const closeTimeoutRef = useRef(null);
|
|
54
58
|
const focusTimeoutRef = useRef(null);
|
|
@@ -69,8 +73,8 @@ function Popover(props) {
|
|
|
69
73
|
x: 0,
|
|
70
74
|
y: 0
|
|
71
75
|
});
|
|
72
|
-
if (
|
|
73
|
-
|
|
76
|
+
if (onClose) {
|
|
77
|
+
onClose();
|
|
74
78
|
}
|
|
75
79
|
setClosing(false);
|
|
76
80
|
// Restore focus to the trigger element after animation completes
|
|
@@ -83,15 +87,15 @@ function Popover(props) {
|
|
|
83
87
|
closeTimeoutRef.current = null;
|
|
84
88
|
}, 280);
|
|
85
89
|
}, [
|
|
86
|
-
|
|
90
|
+
onClose
|
|
87
91
|
]);
|
|
88
92
|
const keyupEventHandler = useCallback((e)=>{
|
|
89
|
-
if (
|
|
93
|
+
if (closeOnEsc && e.keyCode === KEY_CODES.ESC) {
|
|
90
94
|
close();
|
|
91
95
|
}
|
|
92
96
|
}, [
|
|
93
97
|
close,
|
|
94
|
-
|
|
98
|
+
closeOnEsc
|
|
95
99
|
]);
|
|
96
100
|
const clickOutsideHandler = useCallback((e)=>{
|
|
97
101
|
if (containerRef.current && !containerRef.current.contains(e.target)) {
|
|
@@ -111,7 +115,7 @@ function Popover(props) {
|
|
|
111
115
|
keyupEventHandler
|
|
112
116
|
]);
|
|
113
117
|
useEffect(()=>{
|
|
114
|
-
if (
|
|
118
|
+
if (propsOpen) {
|
|
115
119
|
setOpen(true);
|
|
116
120
|
// Use requestAnimationFrame to add listener after current event loop
|
|
117
121
|
const rafId = requestAnimationFrame(()=>{
|
|
@@ -127,22 +131,22 @@ function Popover(props) {
|
|
|
127
131
|
}
|
|
128
132
|
}
|
|
129
133
|
}, [
|
|
130
|
-
|
|
134
|
+
propsOpen,
|
|
131
135
|
open,
|
|
132
136
|
clickOutsideHandler,
|
|
133
137
|
close
|
|
134
138
|
]);
|
|
135
139
|
useEffect(()=>{
|
|
136
140
|
if (open) {
|
|
137
|
-
const { top, left, right } = popperRef.current
|
|
138
|
-
const height = popperRef.current
|
|
141
|
+
const { top = 0, left = 0, right = 0 } = popperRef.current?.getBoundingClientRect() ?? {};
|
|
142
|
+
const height = popperRef.current?.scrollHeight ?? 0;
|
|
139
143
|
const viewportWidth = document.documentElement.clientWidth;
|
|
140
144
|
const viewportHeight = document.documentElement.clientHeight;
|
|
141
145
|
const translation = {
|
|
142
146
|
x: 0,
|
|
143
147
|
y: 0
|
|
144
148
|
};
|
|
145
|
-
if (
|
|
149
|
+
if (position === "BOTTOM_LEFT") {
|
|
146
150
|
// overflow can happen at bottom and right
|
|
147
151
|
if (viewportHeight - top - height < 0) {
|
|
148
152
|
translation.y = -1 * (Math.abs(viewportHeight - top - height) + 5);
|
|
@@ -150,7 +154,7 @@ function Popover(props) {
|
|
|
150
154
|
if (viewportWidth - right < 0) {
|
|
151
155
|
translation.x = -1 * (Math.abs(viewportWidth - right) + 5);
|
|
152
156
|
}
|
|
153
|
-
} else if (
|
|
157
|
+
} else if (position == "BOTTOM_RIGHT") {
|
|
154
158
|
// overflow can happen at bottom and left
|
|
155
159
|
if (viewportHeight - top - height < 0) {
|
|
156
160
|
translation.y = -1 * (Math.abs(viewportHeight - top - height) + 5);
|
|
@@ -158,7 +162,7 @@ function Popover(props) {
|
|
|
158
162
|
if (left < 0) {
|
|
159
163
|
translation.x = Math.abs(left) + 5;
|
|
160
164
|
}
|
|
161
|
-
} else if (
|
|
165
|
+
} else if (position === "TOP_LEFT") {
|
|
162
166
|
// overflow can happen at top and right
|
|
163
167
|
if (top - height < 0) {
|
|
164
168
|
translation.y = Math.abs(top - height) + 5;
|
|
@@ -178,11 +182,11 @@ function Popover(props) {
|
|
|
178
182
|
// Note it can still overflow, but in that case fitting popper inside the
|
|
179
183
|
// window is not possible.
|
|
180
184
|
setTranslate(translation);
|
|
181
|
-
popperRef.current
|
|
185
|
+
popperRef.current?.focus();
|
|
182
186
|
}
|
|
183
187
|
}, [
|
|
184
188
|
open,
|
|
185
|
-
|
|
189
|
+
position
|
|
186
190
|
]);
|
|
187
191
|
/**
|
|
188
192
|
* Cleanup timeouts on unmount
|
|
@@ -196,10 +200,19 @@ function Popover(props) {
|
|
|
196
200
|
}
|
|
197
201
|
};
|
|
198
202
|
}, []);
|
|
203
|
+
const forwardRef = (node)=>{
|
|
204
|
+
containerRef.current = node;
|
|
205
|
+
if (typeof ref === 'function') {
|
|
206
|
+
ref(node);
|
|
207
|
+
} else if (ref) {
|
|
208
|
+
ref.current = node;
|
|
209
|
+
}
|
|
210
|
+
};
|
|
199
211
|
return /*#__PURE__*/ jsxs(PopoverDiv, {
|
|
200
|
-
ref:
|
|
212
|
+
ref: forwardRef,
|
|
213
|
+
...rest,
|
|
201
214
|
children: [
|
|
202
|
-
/*#__PURE__*/ React.createElement(
|
|
215
|
+
/*#__PURE__*/ React.createElement(element, {
|
|
203
216
|
ref: triggerRef,
|
|
204
217
|
id: triggerId,
|
|
205
218
|
'aria-expanded': open,
|
|
@@ -212,36 +225,21 @@ function Popover(props) {
|
|
|
212
225
|
role: "dialog",
|
|
213
226
|
"aria-labelledby": triggerId,
|
|
214
227
|
id: popperId,
|
|
215
|
-
position:
|
|
228
|
+
position: position,
|
|
216
229
|
translateX: translate.x,
|
|
217
230
|
translateY: translate.y,
|
|
218
|
-
className: closing
|
|
231
|
+
className: closing ? 'closing' : '',
|
|
219
232
|
ref: popperRef,
|
|
220
233
|
onClick: (e)=>{
|
|
221
234
|
e.stopPropagation();
|
|
222
235
|
e.nativeEvent.stopImmediatePropagation();
|
|
223
236
|
},
|
|
224
|
-
children:
|
|
237
|
+
children: children
|
|
225
238
|
})
|
|
226
239
|
]
|
|
227
240
|
});
|
|
228
241
|
}
|
|
229
|
-
Popover
|
|
230
|
-
/** Opens the popover */ open: PropTypes.bool.isRequired,
|
|
231
|
-
/** Anchor element for the popover */ element: PropTypes.func,
|
|
232
|
-
/** Position of the popover around anchor element */ position: PropTypes.oneOf([
|
|
233
|
-
"TOP_LEFT",
|
|
234
|
-
"TOP_RIGHT",
|
|
235
|
-
"BOTTOM_LEFT",
|
|
236
|
-
"BOTTOM_RIGHT"
|
|
237
|
-
]),
|
|
238
|
-
/** If the popover should close on `esc` key press */ closeOnEsc: PropTypes.bool,
|
|
239
|
-
/** Popover close callback */ onClose: PropTypes.func
|
|
240
|
-
};
|
|
241
|
-
Popover.defaultProps = {
|
|
242
|
-
closeOnEsc: true,
|
|
243
|
-
position: "BOTTOM_LEFT"
|
|
244
|
-
};
|
|
242
|
+
const Popover = /*#__PURE__*/ React.forwardRef(PopoverComponent);
|
|
245
243
|
|
|
246
244
|
export { POPOVER_POSITION, Popover as default };
|
|
247
245
|
//# sourceMappingURL=Popover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.js","sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from '@emotion/styled';\nimport { Card } from '../Card';\n\nexport enum POPOVER_POSITION {\n TOP_LEFT = 'TOP_LEFT',\n TOP_RIGHT = 'TOP_RIGHT',\n BOTTOM_LEFT = 'BOTTOM_LEFT',\n BOTTOM_RIGHT = 'BOTTOM_RIGHT',\n}\n\ninterface translate {\n x: number;\n y: number;\n}\n\nconst positionMap = {\n [POPOVER_POSITION.TOP_LEFT]: `\n bottom: calc(100% - 10px);\n left: 0;\n `,\n [POPOVER_POSITION.TOP_RIGHT]: `\n bottom: calc(100% - 10px);\n right: 0;\n `,\n [POPOVER_POSITION.BOTTOM_RIGHT]: `\n top: calc(100% - 10px);\n right: 0;\n `,\n [POPOVER_POSITION.BOTTOM_LEFT]: `\n top: calc(100% - 10px);\n left: 0;\n `,\n};\n\nconst PopoverDiv = styled.div`\n position: relative;\n display: inline-flex;\n`;\n\nconst Popper = styled(Card)<{ position: POPOVER_POSITION; translateX: number; translateY: number }>`\n position: absolute;\n width: 100%;\n min-width: 200px;\n overflow: auto;\n animation: enter 0.3s linear;\n border-radius: 3px;\n z-index: 1;\n transform: translate(${(props) => props.translateX}px, ${(props) => props.translateY}px);\n ${(props) => positionMap[props.position]}\n\n &.closing {\n /* max-height: 0px;\n opacity: 0;\n overflow: hidden; */\n animation: exit 0.3s linear;\n }\n\n @keyframes enter {\n from {\n max-height: 0px;\n opacity: 1;\n overflow: hidden;\n }\n to {\n max-height: 300px;\n opacity: 1;\n overflow: hidden;\n }\n }\n\n @keyframes exit {\n to {\n max-height: 0px;\n opacity: 1;\n overflow: hidden;\n }\n from {\n max-height: 300px;\n opacity: 1;\n overflow: hidden;\n }\n }\n`;\n\nconst KEY_CODES = {\n ESC: 27,\n};\n\nexport default function Popover(\n props: React.PropsWithChildren<PropTypes.InferProps<typeof Popover.propTypes>>,\n) {\n const [open, setOpen] = useState(props.open);\n const [closing, setClosing] = useState(false);\n const [translate, setTranslate] = useState<translate>({ x: 0, y: 0 });\n const popperRef = useRef<HTMLDivElement>();\n const containerRef = useRef<HTMLDivElement>();\n const triggerRef = useRef<HTMLElement | null>(null);\n const closeTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const focusTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const popperId = useId();\n const triggerId = useId();\n\n const close = useCallback(() => {\n // Clear any existing timeouts first\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n if (focusTimeoutRef.current) {\n clearTimeout(focusTimeoutRef.current);\n }\n\n setClosing(true);\n closeTimeoutRef.current = setTimeout(() => {\n setOpen(false);\n setTranslate({ x: 0, y: 0 });\n\n if (props.onClose) {\n props.onClose();\n }\n setClosing(false);\n\n // Restore focus to the trigger element after animation completes\n focusTimeoutRef.current = setTimeout(() => {\n if (triggerRef.current && document.body.contains(triggerRef.current)) {\n triggerRef.current.focus();\n }\n focusTimeoutRef.current = null;\n }, 50);\n closeTimeoutRef.current = null;\n }, 280);\n }, [props]);\n\n const keyupEventHandler = useCallback(\n (e: KeyboardEvent) => {\n if (props.closeOnEsc && e.keyCode === KEY_CODES.ESC) {\n close();\n }\n },\n [close, props.closeOnEsc],\n );\n\n const clickOutsideHandler = useCallback(\n (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n close();\n }\n },\n [close],\n );\n\n /**\n * Get called on popover mount.\n */\n useEffect(() => {\n document.addEventListener('keyup', keyupEventHandler);\n\n return () => {\n document.removeEventListener('keyup', keyupEventHandler);\n };\n }, [keyupEventHandler]);\n\n useEffect(() => {\n if (props.open) {\n setOpen(true);\n // Use requestAnimationFrame to add listener after current event loop\n const rafId = requestAnimationFrame(() => {\n document.addEventListener('click', clickOutsideHandler);\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n document.removeEventListener('click', clickOutsideHandler);\n };\n } else {\n if (open) {\n close();\n }\n }\n }, [props.open, open, clickOutsideHandler, close]);\n\n useEffect(() => {\n if (open) {\n const { top, left, right } = popperRef.current.getBoundingClientRect();\n const height = popperRef.current.scrollHeight;\n const viewportWidth = document.documentElement.clientWidth;\n const viewportHeight = document.documentElement.clientHeight;\n const translation = { x: 0, y: 0 };\n\n if (props.position === POPOVER_POSITION.BOTTOM_LEFT) {\n // overflow can happen at bottom and right\n if (viewportHeight - top - height < 0) {\n translation.y = -1 * (Math.abs(viewportHeight - top - height) + 5);\n }\n if (viewportWidth - right < 0) {\n translation.x = -1 * (Math.abs(viewportWidth - right) + 5);\n }\n } else if (props.position == POPOVER_POSITION.BOTTOM_RIGHT) {\n // overflow can happen at bottom and left\n if (viewportHeight - top - height < 0) {\n translation.y = -1 * (Math.abs(viewportHeight - top - height) + 5);\n }\n if (left < 0) {\n translation.x = Math.abs(left) + 5;\n }\n } else if (props.position === POPOVER_POSITION.TOP_LEFT) {\n // overflow can happen at top and right\n if (top - height < 0) {\n translation.y = Math.abs(top - height) + 5;\n }\n if (viewportWidth - right < 0) {\n translation.x = -1 * (Math.abs(viewportWidth - right) + 5);\n }\n } else {\n // overflow can happen at top and left\n if (top - height < 0) {\n translation.y = Math.abs(top - height) + 5;\n }\n if (left < 0) {\n translation.x = Math.abs(left) + 5;\n }\n }\n // Note it can still overflow, but in that case fitting popper inside the\n // window is not possible.\n setTranslate(translation);\n popperRef.current.focus();\n }\n }, [open, props.position]);\n\n /**\n * Cleanup timeouts on unmount\n */\n useEffect(() => {\n return () => {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n if (focusTimeoutRef.current) {\n clearTimeout(focusTimeoutRef.current);\n }\n };\n }, []);\n\n return (\n <PopoverDiv ref={containerRef}>\n {React.createElement(props.element, {\n ref: triggerRef,\n id: triggerId,\n 'aria-expanded': open,\n 'aria-haspopup': 'dialog',\n 'aria-controls': popperId,\n })}\n {open && (\n <Popper\n elevated\n tabIndex={0}\n role=\"dialog\"\n aria-labelledby={triggerId}\n id={popperId}\n position={props.position}\n translateX={translate.x}\n translateY={translate.y}\n className={closing && 'closing'}\n ref={popperRef}\n onClick={(e) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n }}\n >\n {props.children}\n </Popper>\n )}\n </PopoverDiv>\n );\n}\n\nPopover.propTypes = {\n /** Opens the popover */\n open: PropTypes.bool.isRequired,\n /** Anchor element for the popover */\n element: PropTypes.func,\n /** Position of the popover around anchor element */\n position: PropTypes.oneOf([\n POPOVER_POSITION.TOP_LEFT,\n POPOVER_POSITION.TOP_RIGHT,\n POPOVER_POSITION.BOTTOM_LEFT,\n POPOVER_POSITION.BOTTOM_RIGHT,\n ]),\n /** If the popover should close on `esc` key press */\n closeOnEsc: PropTypes.bool,\n /** Popover close callback */\n onClose: PropTypes.func,\n};\n\nPopover.defaultProps = {\n closeOnEsc: true,\n position: POPOVER_POSITION.BOTTOM_LEFT,\n};\n"],"names":["POPOVER_POSITION","positionMap","PopoverDiv","styled","Popper","Card","props","translateX","translateY","position","KEY_CODES","ESC","Popover","open","setOpen","useState","closing","setClosing","translate","setTranslate","x","y","popperRef","useRef","containerRef","triggerRef","closeTimeoutRef","focusTimeoutRef","popperId","useId","triggerId","close","useCallback","current","clearTimeout","setTimeout","onClose","document","body","contains","focus","keyupEventHandler","e","closeOnEsc","keyCode","clickOutsideHandler","target","useEffect","addEventListener","removeEventListener","rafId","requestAnimationFrame","cancelAnimationFrame","top","left","right","getBoundingClientRect","height","scrollHeight","viewportWidth","documentElement","clientWidth","viewportHeight","clientHeight","translation","Math","abs","_jsxs","ref","React","createElement","element","id","_jsx","elevated","tabIndex","role","aria-labelledby","className","onClick","stopPropagation","nativeEvent","stopImmediatePropagation","children","propTypes","PropTypes","bool","isRequired","func","oneOf","defaultProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Popover.js","sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport styled from '@emotion/styled';\nimport { Card } from '../Card';\n\nexport enum POPOVER_POSITION {\n TOP_LEFT = 'TOP_LEFT',\n TOP_RIGHT = 'TOP_RIGHT',\n BOTTOM_LEFT = 'BOTTOM_LEFT',\n BOTTOM_RIGHT = 'BOTTOM_RIGHT',\n}\n\ninterface Translate {\n x: number;\n y: number;\n}\n\nconst positionMap = {\n [POPOVER_POSITION.TOP_LEFT]: `\n bottom: calc(100% - 10px);\n left: 0;\n `,\n [POPOVER_POSITION.TOP_RIGHT]: `\n bottom: calc(100% - 10px);\n right: 0;\n `,\n [POPOVER_POSITION.BOTTOM_RIGHT]: `\n top: calc(100% - 10px);\n right: 0;\n `,\n [POPOVER_POSITION.BOTTOM_LEFT]: `\n top: calc(100% - 10px);\n left: 0;\n `,\n};\n\nconst PopoverDiv = styled.div`\n position: relative;\n display: inline-flex;\n`;\n\nconst Popper = styled(Card)<{ position: POPOVER_POSITION; translateX: number; translateY: number }>`\n position: absolute;\n width: 100%;\n min-width: 200px;\n overflow: auto;\n animation: enter 0.3s linear;\n border-radius: 3px;\n z-index: 1;\n transform: translate(${(props) => props.translateX}px, ${(props) => props.translateY}px);\n ${(props) => positionMap[props.position]}\n\n &.closing {\n /* max-height: 0px;\n opacity: 0;\n overflow: hidden; */\n animation: exit 0.3s linear;\n }\n\n @keyframes enter {\n from {\n max-height: 0px;\n opacity: 1;\n overflow: hidden;\n }\n to {\n max-height: 300px;\n opacity: 1;\n overflow: hidden;\n }\n }\n\n @keyframes exit {\n to {\n max-height: 0px;\n opacity: 1;\n overflow: hidden;\n }\n from {\n max-height: 300px;\n opacity: 1;\n overflow: hidden;\n }\n }\n`;\n\nconst KEY_CODES = {\n ESC: 27,\n};\n\ntype PopoverProps = {\n /** Opens the popover */\n open: boolean;\n /** Anchor element for the popover */\n element: React.ElementType;\n /**\n * Position of the popover around anchor element\n * @default POPOVER_POSITION.BOTTOM_LEFT\n */\n position?: POPOVER_POSITION;\n /**\n * If the popover should close on `esc` key press\n * @default true\n */\n closeOnEsc?: boolean;\n /** Popover close callback */\n onClose?: () => void;\n};\n\n/**\n * Popover Component\n * @param props - Component props\n * @param ref - Ref forwarded to the underlying HTMLDivElement\n */\nfunction PopoverComponent(\n props: React.PropsWithChildren<PopoverProps>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const {\n open: propsOpen,\n element,\n position = POPOVER_POSITION.BOTTOM_LEFT,\n closeOnEsc = true,\n onClose,\n children,\n ...rest\n } = props;\n\n const [open, setOpen] = useState<boolean>(propsOpen);\n const [closing, setClosing] = useState<boolean>(false);\n const [translate, setTranslate] = useState<Translate>({ x: 0, y: 0 });\n const popperRef = useRef<HTMLDivElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n const closeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const focusTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const popperId = useId();\n const triggerId = useId();\n\n const close = useCallback(() => {\n // Clear any existing timeouts first\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n if (focusTimeoutRef.current) {\n clearTimeout(focusTimeoutRef.current);\n }\n\n setClosing(true);\n closeTimeoutRef.current = setTimeout(() => {\n setOpen(false);\n setTranslate({ x: 0, y: 0 });\n\n if (onClose) {\n onClose();\n }\n setClosing(false);\n\n // Restore focus to the trigger element after animation completes\n focusTimeoutRef.current = setTimeout(() => {\n if (triggerRef.current && document.body.contains(triggerRef.current)) {\n triggerRef.current.focus();\n }\n focusTimeoutRef.current = null;\n }, 50);\n closeTimeoutRef.current = null;\n }, 280);\n }, [onClose]);\n\n const keyupEventHandler = useCallback(\n (e: KeyboardEvent) => {\n if (closeOnEsc && e.keyCode === KEY_CODES.ESC) {\n close();\n }\n },\n [close, closeOnEsc],\n );\n\n const clickOutsideHandler = useCallback(\n (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n close();\n }\n },\n [close],\n );\n\n /**\n * Get called on popover mount.\n */\n useEffect(() => {\n document.addEventListener('keyup', keyupEventHandler);\n\n return () => {\n document.removeEventListener('keyup', keyupEventHandler);\n };\n }, [keyupEventHandler]);\n\n useEffect(() => {\n if (propsOpen) {\n setOpen(true);\n // Use requestAnimationFrame to add listener after current event loop\n const rafId = requestAnimationFrame(() => {\n document.addEventListener('click', clickOutsideHandler);\n });\n\n return () => {\n cancelAnimationFrame(rafId);\n document.removeEventListener('click', clickOutsideHandler);\n };\n } else {\n if (open) {\n close();\n }\n }\n }, [propsOpen, open, clickOutsideHandler, close]);\n\n useEffect(() => {\n if (open) {\n const {\n top = 0,\n left = 0,\n right = 0,\n } = popperRef.current?.getBoundingClientRect() ?? {};\n const height = popperRef.current?.scrollHeight ?? 0;\n const viewportWidth = document.documentElement.clientWidth;\n const viewportHeight = document.documentElement.clientHeight;\n const translation = { x: 0, y: 0 };\n\n if (position === POPOVER_POSITION.BOTTOM_LEFT) {\n // overflow can happen at bottom and right\n if (viewportHeight - top - height < 0) {\n translation.y = -1 * (Math.abs(viewportHeight - top - height) + 5);\n }\n if (viewportWidth - right < 0) {\n translation.x = -1 * (Math.abs(viewportWidth - right) + 5);\n }\n } else if (position == POPOVER_POSITION.BOTTOM_RIGHT) {\n // overflow can happen at bottom and left\n if (viewportHeight - top - height < 0) {\n translation.y = -1 * (Math.abs(viewportHeight - top - height) + 5);\n }\n if (left < 0) {\n translation.x = Math.abs(left) + 5;\n }\n } else if (position === POPOVER_POSITION.TOP_LEFT) {\n // overflow can happen at top and right\n if (top - height < 0) {\n translation.y = Math.abs(top - height) + 5;\n }\n if (viewportWidth - right < 0) {\n translation.x = -1 * (Math.abs(viewportWidth - right) + 5);\n }\n } else {\n // overflow can happen at top and left\n if (top - height < 0) {\n translation.y = Math.abs(top - height) + 5;\n }\n if (left < 0) {\n translation.x = Math.abs(left) + 5;\n }\n }\n // Note it can still overflow, but in that case fitting popper inside the\n // window is not possible.\n setTranslate(translation);\n popperRef.current?.focus();\n }\n }, [open, position]);\n\n /**\n * Cleanup timeouts on unmount\n */\n useEffect(() => {\n return () => {\n if (closeTimeoutRef.current) {\n clearTimeout(closeTimeoutRef.current);\n }\n if (focusTimeoutRef.current) {\n clearTimeout(focusTimeoutRef.current);\n }\n };\n }, []);\n\n const forwardRef = (node: HTMLDivElement | null) => {\n containerRef.current = node;\n\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n };\n\n return (\n <PopoverDiv ref={forwardRef} {...rest}>\n {React.createElement(element, {\n ref: triggerRef,\n id: triggerId,\n 'aria-expanded': open,\n 'aria-haspopup': 'dialog',\n 'aria-controls': popperId,\n })}\n {open && (\n <Popper\n elevated\n tabIndex={0}\n role=\"dialog\"\n aria-labelledby={triggerId}\n id={popperId}\n position={position}\n translateX={translate.x}\n translateY={translate.y}\n className={closing ? 'closing' : ''}\n ref={popperRef}\n onClick={(e) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n }}\n >\n {children}\n </Popper>\n )}\n </PopoverDiv>\n );\n}\n\nconst Popover = React.forwardRef(PopoverComponent);\nexport default Popover;\n"],"names":["POPOVER_POSITION","positionMap","PopoverDiv","styled","Popper","Card","props","translateX","translateY","position","KEY_CODES","ESC","PopoverComponent","ref","open","propsOpen","element","closeOnEsc","onClose","children","rest","setOpen","useState","closing","setClosing","translate","setTranslate","x","y","popperRef","useRef","containerRef","triggerRef","closeTimeoutRef","focusTimeoutRef","popperId","useId","triggerId","close","useCallback","current","clearTimeout","setTimeout","document","body","contains","focus","keyupEventHandler","e","keyCode","clickOutsideHandler","target","useEffect","addEventListener","removeEventListener","rafId","requestAnimationFrame","cancelAnimationFrame","top","left","right","getBoundingClientRect","height","scrollHeight","viewportWidth","documentElement","clientWidth","viewportHeight","clientHeight","translation","Math","abs","forwardRef","node","_jsxs","React","createElement","id","_jsx","elevated","tabIndex","role","aria-labelledby","className","onClick","stopPropagation","nativeEvent","stopImmediatePropagation","Popover"],"mappings":"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"}
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
type SpinnerProp = PropTypes.InferProps<typeof Spinner.propTypes>;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
type SpinnerProp = {
|
|
3
|
+
/**
|
|
4
|
+
* Spinner's size
|
|
5
|
+
* @default 30
|
|
6
|
+
*/
|
|
7
|
+
size?: number;
|
|
8
|
+
/**
|
|
9
|
+
* Accessible label for screen readers
|
|
10
|
+
* @default 'Loading'
|
|
11
|
+
*/
|
|
12
|
+
label?: string;
|
|
13
|
+
};
|
|
14
|
+
declare const Spinner: React.ForwardRefExoticComponent<SpinnerProp & React.RefAttributes<HTMLDivElement>>;
|
|
16
15
|
export default Spinner;
|
|
@@ -1,30 +1,29 @@
|
|
|
1
1
|
import { jsx } from '@emotion/react/jsx-runtime';
|
|
2
|
-
import
|
|
2
|
+
import React from 'react';
|
|
3
3
|
import styled from '@emotion/styled';
|
|
4
4
|
import { getThemeValue, THEME_NAME } from '../../shared/constants.js';
|
|
5
5
|
|
|
6
6
|
const SpinnerDiv = /*#__PURE__*/ styled("div", {
|
|
7
|
-
target: "
|
|
7
|
+
target: "e14pfj3w0",
|
|
8
8
|
label: "SpinnerDiv"
|
|
9
9
|
})("border:4px solid ", getThemeValue(THEME_NAME.PRIMARY), ";border-top:4px solid ", getThemeValue(THEME_NAME.BORDER_LIGHT_COLOR), ";border-radius:50%;width:", (props)=>props.size, "px;height:", (props)=>props.size, "px;margin:0 auto;animation:spin 1s linear infinite;@keyframes spin{0%{transform:rotate(0deg);}100%{transform:rotate(360deg);}}");
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Spinner Component
|
|
12
|
+
* @param props - Component props
|
|
13
|
+
* @param ref - Ref forwarded to the underlying HTMLDivElement
|
|
14
|
+
*/ function SpinnerComponent(props, ref) {
|
|
15
|
+
const { label = 'Loading', size = 30, ...rest } = props;
|
|
12
16
|
return /*#__PURE__*/ jsx(SpinnerDiv, {
|
|
13
17
|
...rest,
|
|
18
|
+
ref: ref,
|
|
19
|
+
size: size,
|
|
14
20
|
role: "status",
|
|
15
|
-
"aria-label": label,
|
|
21
|
+
"aria-label": label || undefined,
|
|
16
22
|
"aria-live": "polite",
|
|
17
23
|
"aria-busy": "true"
|
|
18
24
|
});
|
|
19
25
|
}
|
|
20
|
-
Spinner
|
|
21
|
-
/** Spinner's size */ size: PropTypes.number,
|
|
22
|
-
/** Accessible label for screen readers */ label: PropTypes.string
|
|
23
|
-
};
|
|
24
|
-
Spinner.defaultProps = {
|
|
25
|
-
size: 30,
|
|
26
|
-
label: 'Loading'
|
|
27
|
-
};
|
|
26
|
+
const Spinner = /*#__PURE__*/ React.forwardRef(SpinnerComponent);
|
|
28
27
|
|
|
29
28
|
export { Spinner as default };
|
|
30
29
|
//# sourceMappingURL=Spinner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Spinner.js","sources":["../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"Spinner.js","sources":["../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import React from 'react';\nimport styled from '@emotion/styled';\nimport { getThemeValue, THEME_NAME } from '../../shared/constants';\n\nconst SpinnerDiv = styled.div<SpinnerProp>`\n border: 4px solid ${getThemeValue(THEME_NAME.PRIMARY)};\n border-top: 4px solid ${getThemeValue(THEME_NAME.BORDER_LIGHT_COLOR)};\n border-radius: 50%;\n width: ${(props) => props.size}px;\n height: ${(props) => props.size}px;\n margin: 0 auto;\n animation: spin 1s linear infinite;\n\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n`;\n\ntype SpinnerProp = {\n /**\n * Spinner's size\n * @default 30\n */\n size?: number;\n /**\n * Accessible label for screen readers\n * @default 'Loading'\n */\n label?: string;\n};\n\n/**\n * Spinner Component\n * @param props - Component props\n * @param ref - Ref forwarded to the underlying HTMLDivElement\n */\nfunction SpinnerComponent(props: SpinnerProp, ref: React.Ref<HTMLDivElement>) {\n const { label = 'Loading', size = 30, ...rest } = props;\n return (\n <SpinnerDiv\n {...rest}\n ref={ref}\n size={size}\n role=\"status\"\n aria-label={label || undefined}\n aria-live=\"polite\"\n aria-busy=\"true\"\n />\n );\n}\n\nconst Spinner = React.forwardRef<HTMLDivElement, SpinnerProp>(SpinnerComponent);\nexport default Spinner;\n"],"names":["SpinnerDiv","styled","getThemeValue","THEME_NAME","PRIMARY","BORDER_LIGHT_COLOR","props","size","SpinnerComponent","ref","label","rest","_jsx","role","aria-label","undefined","aria-live","aria-busy","Spinner","React","forwardRef"],"mappings":";;;;;AAIA,MAAMA,UAAAA,iBAAaC,MAAAA,CAAAA,KAAAA,EAAAA;;;AACKC,CAAAA,CAAAA,CAAAA,mBAAAA,EAAAA,aAAAA,CAAcC,UAAAA,CAAWC,OAAO,CAAA,EAAA,wBAAA,EAC5BF,aAAAA,CAAcC,WAAWE,kBAAkB,CAAA,EAAA,2BAAA,EAE1D,CAACC,KAAAA,GAAUA,MAAMC,IAAI,EAAA,YAAA,EACpB,CAACD,KAAAA,GAAUA,MAAMC,IAAI,EAAA,gIAAA,CAAA;AA2BnC;;;;AAIC,IACD,SAASC,gBAAAA,CAAiBF,KAAkB,EAAEG,GAA8B,EAAA;IACxE,MAAM,EAAEC,QAAQ,SAAS,EAAEH,OAAO,EAAE,EAAE,GAAGI,IAAAA,EAAM,GAAGL,KAAAA;AAClD,IAAA,qBACIM,GAAA,CAACZ,UAAAA,EAAAA;AACI,QAAA,GAAGW,IAAI;QACRF,GAAAA,EAAKA,GAAAA;QACLF,IAAAA,EAAMA,IAAAA;QACNM,IAAAA,EAAK,QAAA;AACLC,QAAAA,YAAAA,EAAYJ,KAAAA,IAASK,SAAAA;QACrBC,WAAAA,EAAU,QAAA;QACVC,WAAAA,EAAU;;AAGtB;AAEA,MAAMC,OAAAA,iBAAUC,KAAAA,CAAMC,UAAU,CAA8BZ,gBAAAA;;;;"}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
3
|
-
/**
|
|
2
|
+
declare const Step: React.ForwardRefExoticComponent<{
|
|
3
|
+
/**
|
|
4
|
+
* Name of the step to be displayed in the header
|
|
5
|
+
*/
|
|
4
6
|
name: string;
|
|
5
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* Disables the step
|
|
9
|
+
* @default false
|
|
10
|
+
*/
|
|
6
11
|
disabled?: boolean;
|
|
7
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* Marks the step as completed
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
8
16
|
completed?: boolean;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var defaultProps: {
|
|
13
|
-
disabled: boolean;
|
|
14
|
-
completed: boolean;
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
+
} & React.HTMLAttributes<HTMLDivElement> & {
|
|
18
|
+
children?: React.ReactNode | undefined;
|
|
19
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
17
20
|
export default Step;
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
import { jsx } from '@emotion/react/jsx-runtime';
|
|
2
|
-
import 'react';
|
|
2
|
+
import React from 'react';
|
|
3
3
|
import styled from '@emotion/styled';
|
|
4
4
|
|
|
5
5
|
const Container = /*#__PURE__*/ styled("div", {
|
|
6
|
-
target: "
|
|
6
|
+
target: "e1v23xop0",
|
|
7
7
|
label: "Container"
|
|
8
8
|
})("flex:1;display:flex;flex-direction:column;");
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Step Component
|
|
11
|
+
* @param props - Component props
|
|
12
|
+
* @param ref - Ref forwarded to the underlying HTMLDivElement
|
|
13
|
+
*/ function StepComponent(props, ref) {
|
|
10
14
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
11
15
|
const { name, disabled, completed, ...rest } = props;
|
|
12
16
|
return /*#__PURE__*/ jsx(Container, {
|
|
13
|
-
...rest
|
|
17
|
+
...rest,
|
|
18
|
+
ref: ref
|
|
14
19
|
});
|
|
15
20
|
}
|
|
16
|
-
Step
|
|
17
|
-
disabled: false,
|
|
18
|
-
completed: false
|
|
19
|
-
};
|
|
21
|
+
const Step = /*#__PURE__*/ React.forwardRef(StepComponent);
|
|
20
22
|
|
|
21
23
|
export { Step as default };
|
|
22
24
|
//# sourceMappingURL=Step.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Step.js","sources":["../../../src/components/Stepper/Step.tsx"],"sourcesContent":["import React from 'react';\nimport styled from '@emotion/styled';\n\
|
|
1
|
+
{"version":3,"file":"Step.js","sources":["../../../src/components/Stepper/Step.tsx"],"sourcesContent":["import React from 'react';\nimport styled from '@emotion/styled';\n\nconst Container = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n`;\n\ntype StepProps = {\n /**\n * Name of the step to be displayed in the header\n */\n name: string;\n /**\n * Disables the step\n * @default false\n */\n disabled?: boolean;\n /**\n * Marks the step as completed\n * @default false\n */\n completed?: boolean;\n} & React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Step Component\n * @param props - Component props\n * @param ref - Ref forwarded to the underlying HTMLDivElement\n */\nfunction StepComponent(props: React.PropsWithChildren<StepProps>, ref: React.Ref<HTMLDivElement>) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { name, disabled, completed, ...rest } = props;\n return <Container {...rest} ref={ref} />;\n}\n\nconst Step = React.forwardRef(StepComponent);\nexport default Step;\n"],"names":["Container","styled","StepComponent","props","ref","name","disabled","completed","rest","_jsx","Step","React","forwardRef"],"mappings":";;;;AAGA,MAAMA,SAAAA,iBAAYC,MAAAA,CAAAA,KAAAA,EAAAA;;;;AAuBlB;;;;AAIC,IACD,SAASC,aAAAA,CAAcC,KAAyC,EAAEC,GAA8B,EAAA;;IAE5F,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,SAAS,EAAE,GAAGC,IAAAA,EAAM,GAAGL,KAAAA;AAC/C,IAAA,qBAAOM,GAAA,CAACT,SAAAA,EAAAA;AAAW,QAAA,GAAGQ,IAAI;QAAEJ,GAAAA,EAAKA;;AACrC;AAEA,MAAMM,IAAAA,iBAAOC,KAAAA,CAAMC,UAAU,CAACV,aAAAA;;;;"}
|
|
@@ -1,19 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import React from 'react';
|
|
2
|
+
declare const Stepper: React.ForwardRefExoticComponent<{
|
|
3
|
+
/**
|
|
4
|
+
* Index of currently active step
|
|
5
|
+
* @default 0
|
|
6
|
+
*/
|
|
7
|
+
active?: number;
|
|
8
|
+
/** Callback function for click event on a step */
|
|
5
9
|
onStepClick?: (index: number) => void;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
var propTypes: {
|
|
10
|
-
/** Index of currently active step */
|
|
11
|
-
active: PropTypes.Requireable<number>;
|
|
12
|
-
/** Callback function for click event on a step */
|
|
13
|
-
onStepClick: PropTypes.Requireable<(...args: any[]) => any>;
|
|
14
|
-
};
|
|
15
|
-
var defaultProps: {
|
|
16
|
-
active: number;
|
|
17
|
-
};
|
|
18
|
-
}
|
|
10
|
+
} & {
|
|
11
|
+
children?: React.ReactNode | undefined;
|
|
12
|
+
} & React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
19
13
|
export default Stepper;
|
|
@@ -1,30 +1,33 @@
|
|
|
1
1
|
import { jsxs, jsx } from '@emotion/react/jsx-runtime';
|
|
2
|
-
import { useState, Children, isValidElement } from 'react';
|
|
3
|
-
import PropTypes from 'prop-types';
|
|
2
|
+
import React, { useState, Children, isValidElement } from 'react';
|
|
4
3
|
import styled from '@emotion/styled';
|
|
5
4
|
import { getThemeValue, THEME_NAME } from '../../shared/constants.js';
|
|
6
5
|
import { Ellipsis } from '../../shared/styles.js';
|
|
7
6
|
import Badge, { BADGE_TYPE } from '../Badge/Badge.js';
|
|
8
7
|
|
|
9
|
-
const Container = /*#__PURE__*/ styled("div", {
|
|
10
|
-
target: "
|
|
8
|
+
const Container$1 = /*#__PURE__*/ styled("div", {
|
|
9
|
+
target: "e14em2c80",
|
|
11
10
|
label: "Container"
|
|
12
11
|
})("flex:1;display:flex;flex-direction:column;min-height:400px;");
|
|
13
12
|
const Header = /*#__PURE__*/ styled("div", {
|
|
14
|
-
target: "
|
|
13
|
+
target: "e14em2c81",
|
|
15
14
|
label: "Header"
|
|
16
15
|
})("display:flex;flex-direction:row;justify-content:space-between;border-bottom:1px solid ", getThemeValue(THEME_NAME.BORDER_LIGHT_COLOR), ";@media (min-width:601px){&::before{position:absolute;top:25px;left:0;right:0;height:2px;background-color:", getThemeValue(THEME_NAME.LIGHT_GREY), ";content:' ';z-index:0;}}& > *{z-index:1;}");
|
|
17
16
|
const HeaderButton = /*#__PURE__*/ styled("button", {
|
|
18
|
-
target: "
|
|
17
|
+
target: "e14em2c82",
|
|
19
18
|
label: "HeaderButton"
|
|
20
19
|
})("border:none;padding:16px 24px 16px 16px;font-size:16px;cursor:pointer;background-color:", (props)=>props.active ? getThemeValue(THEME_NAME.BORDER_LIGHT_COLOR) : getThemeValue(THEME_NAME.BACKGROUND), ";font-weight:", (props)=>props.active ? 'bold' : 'normal', ";overflow:hidden;display:flex;align-items:center;color:", getThemeValue(THEME_NAME.TEXT_COLOR_DARK), ";&:disabled{cursor:not-allowed;background-color:", getThemeValue(THEME_NAME.DISABLED_BACKGROUND), ";}&:enabled:hover,&:focus{background-color:", getThemeValue(THEME_NAME.PRIMARY_LIGHTER), ";}@media (max-width:600px){&{display:none;}}");
|
|
21
20
|
const MobileHeader = /*#__PURE__*/ styled("div", {
|
|
22
|
-
target: "
|
|
21
|
+
target: "e14em2c83",
|
|
23
22
|
label: "MobileHeader"
|
|
24
23
|
})("padding:16px;font-size:16px;line-height:18px;align-items:center;font-weight:bold;flex:1;display:flex;flex-direction:row;justify-content:space-between;@media (min-width:601px){&{display:none;}}");
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Stepper Component
|
|
26
|
+
* @param props - Component props
|
|
27
|
+
* @param ref - Ref forwarded to the underlying HTMLDivElement
|
|
28
|
+
*/ function StepperComponent(props, ref) {
|
|
29
|
+
const { active: propsActive = 0, onStepClick, children, ...rest } = props;
|
|
30
|
+
const [active, setActive] = useState(propsActive);
|
|
28
31
|
const childrenArray = Children.toArray(children);
|
|
29
32
|
const stepRefs = [];
|
|
30
33
|
const stepClickHandler = (index)=>()=>{
|
|
@@ -55,7 +58,9 @@ function Stepper(props) {
|
|
|
55
58
|
stepRefs[prev]?.focus();
|
|
56
59
|
}
|
|
57
60
|
};
|
|
58
|
-
return /*#__PURE__*/ jsxs(Container, {
|
|
61
|
+
return /*#__PURE__*/ jsxs(Container$1, {
|
|
62
|
+
ref: ref,
|
|
63
|
+
...rest,
|
|
59
64
|
children: [
|
|
60
65
|
/*#__PURE__*/ jsxs(Header, {
|
|
61
66
|
role: "tablist",
|
|
@@ -63,24 +68,27 @@ function Stepper(props) {
|
|
|
63
68
|
children: [
|
|
64
69
|
Children.map(children, (child, index)=>{
|
|
65
70
|
if (!/*#__PURE__*/ isValidElement(child)) return null;
|
|
71
|
+
const reactElement = child;
|
|
66
72
|
return /*#__PURE__*/ jsxs(HeaderButton, {
|
|
67
|
-
ref: (el)=>
|
|
73
|
+
ref: (el)=>{
|
|
74
|
+
stepRefs[index] = el;
|
|
75
|
+
},
|
|
68
76
|
active: index === active,
|
|
69
77
|
type: "button",
|
|
70
78
|
role: "tab",
|
|
71
79
|
"aria-selected": index === active,
|
|
72
|
-
"aria-disabled": !!
|
|
80
|
+
"aria-disabled": !!reactElement.props.disabled,
|
|
73
81
|
tabIndex: index === active ? 0 : -1,
|
|
74
|
-
disabled:
|
|
82
|
+
disabled: reactElement.props.disabled,
|
|
75
83
|
onClick: stepClickHandler(index),
|
|
76
84
|
onKeyDown: onStepKeyDown(index),
|
|
77
85
|
children: [
|
|
78
86
|
/*#__PURE__*/ jsx(Badge, {
|
|
79
87
|
inline: true,
|
|
80
|
-
type: getBadgeType(index,
|
|
88
|
+
type: getBadgeType(index, reactElement.props.completed || false, reactElement.props.disabled || false)
|
|
81
89
|
}),
|
|
82
90
|
/*#__PURE__*/ jsx(Ellipsis, {
|
|
83
|
-
children:
|
|
91
|
+
children: reactElement.props.name
|
|
84
92
|
})
|
|
85
93
|
]
|
|
86
94
|
});
|
|
@@ -107,13 +115,7 @@ function Stepper(props) {
|
|
|
107
115
|
]
|
|
108
116
|
});
|
|
109
117
|
}
|
|
110
|
-
Stepper
|
|
111
|
-
/** Index of currently active step */ active: PropTypes.number,
|
|
112
|
-
/** Callback function for click event on a step */ onStepClick: PropTypes.func
|
|
113
|
-
};
|
|
114
|
-
Stepper.defaultProps = {
|
|
115
|
-
active: 0
|
|
116
|
-
};
|
|
118
|
+
const Stepper = /*#__PURE__*/ React.forwardRef(StepperComponent);
|
|
117
119
|
|
|
118
120
|
export { Stepper as default };
|
|
119
121
|
//# sourceMappingURL=Stepper.js.map
|