@via-profit/ui-kit 0.1.0-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.
Files changed (171) hide show
  1. package/CHANGELOG.md +0 -0
  2. package/CONTRIBUTING.md +0 -0
  3. package/LICENSE +21 -0
  4. package/README.md +17 -0
  5. package/dist/Autocomplete/index.d.ts +46 -0
  6. package/dist/Autocomplete/index.js +187 -0
  7. package/dist/Autocomplete/popper-options.d.ts +4 -0
  8. package/dist/Autocomplete/popper-options.js +33 -0
  9. package/dist/Button/ButtonAccent.d.ts +10 -0
  10. package/dist/Button/ButtonAccent.js +48 -0
  11. package/dist/Button/ButtonBase.d.ts +4 -0
  12. package/dist/Button/ButtonBase.js +38 -0
  13. package/dist/Button/ButtonStandard.d.ts +19 -0
  14. package/dist/Button/ButtonStandard.js +50 -0
  15. package/dist/Button/index.d.ts +9 -0
  16. package/dist/Button/index.js +27 -0
  17. package/dist/Calendar/CalendarBottomBar.d.ts +4 -0
  18. package/dist/Calendar/CalendarBottomBar.js +28 -0
  19. package/dist/Calendar/CalendarCell.d.ts +8 -0
  20. package/dist/Calendar/CalendarCell.js +61 -0
  21. package/dist/Calendar/CalendarDateContainer.d.ts +6 -0
  22. package/dist/Calendar/CalendarDateContainer.js +13 -0
  23. package/dist/Calendar/CalendarEmptyCell.d.ts +4 -0
  24. package/dist/Calendar/CalendarEmptyCell.js +29 -0
  25. package/dist/Calendar/CalendarMonthControl.d.ts +6 -0
  26. package/dist/Calendar/CalendarMonthControl.js +49 -0
  27. package/dist/Calendar/CalendarPaper.d.ts +6 -0
  28. package/dist/Calendar/CalendarPaper.js +20 -0
  29. package/dist/Calendar/CalendarTopBar.d.ts +4 -0
  30. package/dist/Calendar/CalendarTopBar.js +30 -0
  31. package/dist/Calendar/CalendarWeekDayLabel.d.ts +6 -0
  32. package/dist/Calendar/CalendarWeekDayLabel.js +17 -0
  33. package/dist/Calendar/CalendarWeekDaysBar.d.ts +10 -0
  34. package/dist/Calendar/CalendarWeekDaysBar.js +32 -0
  35. package/dist/Calendar/CalendarWeekRow.d.ts +6 -0
  36. package/dist/Calendar/CalendarWeekRow.js +14 -0
  37. package/dist/Calendar/IconChevronLeft.d.ts +3 -0
  38. package/dist/Calendar/IconChevronLeft.js +9 -0
  39. package/dist/Calendar/IconChevronRight.d.ts +3 -0
  40. package/dist/Calendar/IconChevronRight.js +9 -0
  41. package/dist/Calendar/index.d.ts +18 -0
  42. package/dist/Calendar/index.js +166 -0
  43. package/dist/Calendar/use-calendar.d.ts +50 -0
  44. package/dist/Calendar/use-calendar.js +197 -0
  45. package/dist/DatePicker/index.d.ts +3 -0
  46. package/dist/DatePicker/index.js +8 -0
  47. package/dist/ErrorBoundary/index.d.ts +19 -0
  48. package/dist/ErrorBoundary/index.js +78 -0
  49. package/dist/Image/index.d.ts +7 -0
  50. package/dist/Image/index.js +45 -0
  51. package/dist/MaskedField/index.d.ts +33 -0
  52. package/dist/MaskedField/index.js +63 -0
  53. package/dist/MaskedField/templates.d.ts +11 -0
  54. package/dist/MaskedField/templates.js +81 -0
  55. package/dist/MaskedField/useMasked.d.ts +18 -0
  56. package/dist/MaskedField/useMasked.js +96 -0
  57. package/dist/Menu/MenuItem.d.ts +10 -0
  58. package/dist/Menu/MenuItem.js +47 -0
  59. package/dist/Menu/MenuItemInner.d.ts +7 -0
  60. package/dist/Menu/MenuItemInner.js +48 -0
  61. package/dist/Menu/MenuWrapper.d.ts +10 -0
  62. package/dist/Menu/MenuWrapper.js +77 -0
  63. package/dist/Menu/index.d.ts +196 -0
  64. package/dist/Menu/index.js +452 -0
  65. package/dist/Menu/popper-options.d.ts +4 -0
  66. package/dist/Menu/popper-options.js +33 -0
  67. package/dist/Menu/reducer.d.ts +14 -0
  68. package/dist/Menu/reducer.js +19 -0
  69. package/dist/Modal/CloseIcon.d.ts +3 -0
  70. package/dist/Modal/CloseIcon.js +37 -0
  71. package/dist/Modal/ModalConfirmBox.d.ts +9 -0
  72. package/dist/Modal/ModalConfirmBox.js +148 -0
  73. package/dist/Modal/ModalDialog.d.ts +7 -0
  74. package/dist/Modal/ModalDialog.js +99 -0
  75. package/dist/Modal/ModalDrawer.d.ts +11 -0
  76. package/dist/Modal/ModalDrawer.js +150 -0
  77. package/dist/Modal/ModalMessageBox.d.ts +8 -0
  78. package/dist/Modal/ModalMessageBox.js +147 -0
  79. package/dist/Modal/index.d.ts +12 -0
  80. package/dist/Modal/index.js +54 -0
  81. package/dist/NoSSR/index.d.ts +7 -0
  82. package/dist/NoSSR/index.js +15 -0
  83. package/dist/PhoneField/CountryFlag.d.ts +6 -0
  84. package/dist/PhoneField/CountryFlag.js +52 -0
  85. package/dist/PhoneField/flags/BYFlag.d.ts +3 -0
  86. package/dist/PhoneField/flags/BYFlag.js +44 -0
  87. package/dist/PhoneField/flags/JPFlag.d.ts +3 -0
  88. package/dist/PhoneField/flags/JPFlag.js +34 -0
  89. package/dist/PhoneField/flags/KZFlag.d.ts +3 -0
  90. package/dist/PhoneField/flags/KZFlag.js +45 -0
  91. package/dist/PhoneField/flags/RUFlag.d.ts +3 -0
  92. package/dist/PhoneField/flags/RUFlag.js +32 -0
  93. package/dist/PhoneField/flags/UAFlag.d.ts +3 -0
  94. package/dist/PhoneField/flags/UAFlag.js +31 -0
  95. package/dist/PhoneField/flags/USFlag.d.ts +3 -0
  96. package/dist/PhoneField/flags/USFlag.js +34 -0
  97. package/dist/PhoneField/flags/UnknownFlag.d.ts +3 -0
  98. package/dist/PhoneField/flags/UnknownFlag.js +34 -0
  99. package/dist/PhoneField/index.d.ts +49 -0
  100. package/dist/PhoneField/index.js +82 -0
  101. package/dist/PhoneField/templates.d.ts +3 -0
  102. package/dist/PhoneField/templates.js +18 -0
  103. package/dist/PhoneField/usePhoneUtils.d.ts +65 -0
  104. package/dist/PhoneField/usePhoneUtils.js +157 -0
  105. package/dist/SelectBox/IconChevronDown.d.ts +3 -0
  106. package/dist/SelectBox/IconChevronDown.js +9 -0
  107. package/dist/SelectBox/SelectButton.d.ts +10 -0
  108. package/dist/SelectBox/SelectButton.js +80 -0
  109. package/dist/SelectBox/index.d.ts +40 -0
  110. package/dist/SelectBox/index.js +188 -0
  111. package/dist/SelectBox/popper-options.d.ts +4 -0
  112. package/dist/SelectBox/popper-options.js +33 -0
  113. package/dist/TextField/TextFieldContainer.d.ts +7 -0
  114. package/dist/TextField/TextFieldContainer.js +52 -0
  115. package/dist/TextField/TextFieldErrorText.d.ts +8 -0
  116. package/dist/TextField/TextFieldErrorText.js +75 -0
  117. package/dist/TextField/TextFieldIconWrapper.d.ts +8 -0
  118. package/dist/TextField/TextFieldIconWrapper.js +73 -0
  119. package/dist/TextField/TextFieldInput.d.ts +7 -0
  120. package/dist/TextField/TextFieldInput.js +60 -0
  121. package/dist/TextField/TextFieldLabel.d.ts +7 -0
  122. package/dist/TextField/TextFieldLabel.js +50 -0
  123. package/dist/TextField/TextFieldLabelAsterisk.d.ts +7 -0
  124. package/dist/TextField/TextFieldLabelAsterisk.js +51 -0
  125. package/dist/TextField/TextFieldWrapper.d.ts +14 -0
  126. package/dist/TextField/TextFieldWrapper.js +76 -0
  127. package/dist/TextField/index.d.ts +14 -0
  128. package/dist/TextField/index.js +93 -0
  129. package/dist/ThemeProvider/createTheme.d.ts +36 -0
  130. package/dist/ThemeProvider/createTheme.js +34 -0
  131. package/dist/ThemeProvider/index.d.ts +8 -0
  132. package/dist/ThemeProvider/index.js +12 -0
  133. package/dist/Typography/Base.d.ts +6 -0
  134. package/dist/Typography/Base.js +11 -0
  135. package/dist/Typography/Blockquote.d.ts +6 -0
  136. package/dist/Typography/Blockquote.js +23 -0
  137. package/dist/Typography/Del.d.ts +6 -0
  138. package/dist/Typography/Del.js +10 -0
  139. package/dist/Typography/Em.d.ts +6 -0
  140. package/dist/Typography/Em.js +10 -0
  141. package/dist/Typography/H1.d.ts +6 -0
  142. package/dist/Typography/H1.js +11 -0
  143. package/dist/Typography/H2.d.ts +6 -0
  144. package/dist/Typography/H2.js +11 -0
  145. package/dist/Typography/H3.d.ts +6 -0
  146. package/dist/Typography/H3.js +11 -0
  147. package/dist/Typography/H4.d.ts +6 -0
  148. package/dist/Typography/H4.js +11 -0
  149. package/dist/Typography/H5.d.ts +6 -0
  150. package/dist/Typography/H5.js +11 -0
  151. package/dist/Typography/List.d.ts +14 -0
  152. package/dist/Typography/List.js +17 -0
  153. package/dist/Typography/Paragraph.d.ts +6 -0
  154. package/dist/Typography/Paragraph.js +11 -0
  155. package/dist/Typography/SectionDescription.d.ts +8 -0
  156. package/dist/Typography/SectionDescription.js +17 -0
  157. package/dist/Typography/SectionTitle.d.ts +8 -0
  158. package/dist/Typography/SectionTitle.js +31 -0
  159. package/dist/Typography/Span.d.ts +6 -0
  160. package/dist/Typography/Span.js +10 -0
  161. package/dist/Typography/Strong.d.ts +6 -0
  162. package/dist/Typography/Strong.js +10 -0
  163. package/dist/Typography/U.d.ts +6 -0
  164. package/dist/Typography/U.js +10 -0
  165. package/dist/color/Color.d.ts +44 -0
  166. package/dist/color/Color.js +346 -0
  167. package/dist/color/index.d.ts +3 -0
  168. package/dist/color/index.js +22 -0
  169. package/dist/index.d.ts +4 -0
  170. package/dist/index.js +23 -0
  171. package/package.json +113 -0
@@ -0,0 +1,452 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const react_1 = __importDefault(require("react"));
30
+ const react_dom_1 = __importDefault(require("react-dom"));
31
+ const react_window_1 = require("react-window");
32
+ const react_popper_1 = require("react-popper");
33
+ const popper_options_1 = __importDefault(require("./popper-options"));
34
+ const MenuItem_1 = __importDefault(require("./MenuItem"));
35
+ const MenuWrapper_1 = __importDefault(require("./MenuWrapper"));
36
+ const reducer_1 = __importStar(require("./reducer"));
37
+ const Menu = react_1.default.forwardRef((props, ref) => {
38
+ const { items, value, isOpen, estimatedItemSize = 30, endThreshold = 10, thresholdPercent = 30, autofocusDelay = 250, autofocus = true, closeOutsideClick = true, overscanCount = 1, zIndex = 1, tabIndex = -1, portalNode = typeof window !== 'undefined' ? window.document.body : undefined, outerRef, listRef, anchorElement, multiple, popperOptions, onSelectItem, onEndReached, getOptionSelected, renderItem, onRequestClose, } = props;
39
+ const getSelectedIndexes = react_1.default.useCallback(() => {
40
+ const idx = new Set();
41
+ if (typeof value === 'object' && value !== null) {
42
+ if (typeof getOptionSelected === 'function') {
43
+ if (Array.isArray(value)) {
44
+ value.forEach(v => {
45
+ idx.add(items.findIndex(item => getOptionSelected({ item, value: v })));
46
+ });
47
+ }
48
+ if (!Array.isArray(value)) {
49
+ idx.add(items.findIndex(item => getOptionSelected({ item, value: value })));
50
+ }
51
+ }
52
+ if (Array.isArray(value)) {
53
+ value.forEach(v => {
54
+ idx.add(items.findIndex(item => JSON.stringify(item) === JSON.stringify(v)));
55
+ });
56
+ }
57
+ else {
58
+ idx.add(items.findIndex(item => JSON.stringify(item) === JSON.stringify(value)));
59
+ }
60
+ }
61
+ return [...idx];
62
+ }, [getOptionSelected, items, value]);
63
+ const [domLoaded, setDomLoaded] = react_1.default.useState(false);
64
+ const [menuIsOpen, setMenuOpen] = react_1.default.useState(Boolean(isOpen));
65
+ const [currentAnchorElement, setAnchorElement] = react_1.default.useState(anchorElement);
66
+ const isOpenRef = react_1.default.useRef(menuIsOpen);
67
+ const dimensionsRef = react_1.default.useRef({ width: 0, height: 0 });
68
+ const sizeMapRef = react_1.default.useRef(new Map());
69
+ const listVirtRef = react_1.default.useRef(null);
70
+ const listOuterRef = react_1.default.useRef(null);
71
+ const menuWrapperRef = react_1.default.useRef(null);
72
+ const [{ selectedIndexes, markedIndex, hoveredIndex }, dispatch] = react_1.default.useReducer(reducer_1.default, Object.assign(Object.assign({}, reducer_1.defaultState), { selectedIndexes: getSelectedIndexes(), markedIndex: -1 }));
73
+ const selectedIndexesRef = react_1.default.useRef(selectedIndexes);
74
+ const [popperElement, setPopperElement] = react_1.default.useState(null);
75
+ const timeoutRef = react_1.default.useRef(null);
76
+ const { styles, attributes, forceUpdate } = (0, react_popper_1.usePopper)(currentAnchorElement, popperElement, popperOptions || popper_options_1.default);
77
+ /**
78
+ * Client render detection
79
+ */
80
+ react_1.default.useEffect(() => {
81
+ setDomLoaded(true);
82
+ }, []);
83
+ /**
84
+ * Scroll to first of selected item
85
+ */
86
+ const scrollToFirstSelected = react_1.default.useCallback(() => {
87
+ var _a;
88
+ const indexes = getSelectedIndexes();
89
+ // Sort array of indexes by DESC and get the index
90
+ const index = indexes.length ? [...indexes.sort()][0] : -1;
91
+ dispatch({
92
+ type: 'setMenuState',
93
+ payload: {
94
+ markedIndex: index,
95
+ },
96
+ });
97
+ (_a = listVirtRef.current) === null || _a === void 0 ? void 0 : _a.scrollToItem(index);
98
+ }, [getSelectedIndexes]);
99
+ /**
100
+ * Select specified item by index
101
+ */
102
+ const selectItem = react_1.default.useCallback((index) => {
103
+ const item = items[index];
104
+ if (!item) {
105
+ return;
106
+ }
107
+ if (typeof onSelectItem === 'function') {
108
+ // For multiple
109
+ if (multiple && Array.isArray(value)) {
110
+ const selItems = new Set(value);
111
+ if (selectedIndexes.includes(index)) {
112
+ selItems.delete(item);
113
+ }
114
+ else {
115
+ selItems.add(item);
116
+ }
117
+ onSelectItem([...selItems]);
118
+ }
119
+ else {
120
+ // For single
121
+ onSelectItem(item);
122
+ }
123
+ }
124
+ }, [items, onSelectItem, selectedIndexes, value, multiple]);
125
+ /**
126
+ * Highlight specified item by index
127
+ */
128
+ const highlightIndex = react_1.default.useCallback((index) => {
129
+ dispatch({
130
+ type: 'setMenuState',
131
+ payload: {
132
+ markedIndex: items[index] ? index : -1,
133
+ },
134
+ });
135
+ }, [items]);
136
+ const hightlightPrevItem = react_1.default.useCallback(() => {
137
+ var _a;
138
+ const index = Math.max(markedIndex - 1, 0);
139
+ highlightIndex(index);
140
+ (_a = listVirtRef.current) === null || _a === void 0 ? void 0 : _a.scrollToItem(index);
141
+ }, [markedIndex, highlightIndex]);
142
+ const hightlightNextItem = react_1.default.useCallback(() => {
143
+ var _a;
144
+ const index = Math.min(markedIndex + 1, items.length);
145
+ highlightIndex(index);
146
+ (_a = listVirtRef.current) === null || _a === void 0 ? void 0 : _a.scrollToItem(index);
147
+ }, [markedIndex, items.length, highlightIndex]);
148
+ const hightlightFirstItem = react_1.default.useCallback(() => {
149
+ var _a;
150
+ const index = 0;
151
+ highlightIndex(index);
152
+ (_a = listVirtRef.current) === null || _a === void 0 ? void 0 : _a.scrollToItem(index);
153
+ }, [highlightIndex]);
154
+ const hightlightLastItem = react_1.default.useCallback(() => {
155
+ var _a;
156
+ const index = items.length - 1;
157
+ highlightIndex(index);
158
+ (_a = listVirtRef.current) === null || _a === void 0 ? void 0 : _a.scrollToItem(index);
159
+ }, [highlightIndex, items.length]);
160
+ const selectHightlightedItem = react_1.default.useCallback(() => {
161
+ if (markedIndex > -1) {
162
+ selectItem(markedIndex);
163
+ }
164
+ }, [markedIndex, selectItem]);
165
+ /**
166
+ * API
167
+ */
168
+ react_1.default.useImperativeHandle(ref, () => ({
169
+ focus: () => { var _a; return (_a = menuWrapperRef.current) === null || _a === void 0 ? void 0 : _a.focus(); },
170
+ scrollToItem: (index, align) => { var _a; return (_a = listVirtRef.current) === null || _a === void 0 ? void 0 : _a.scrollToItem(index, align); },
171
+ scrollTo: (scrollOffset) => { var _a; return (_a = listVirtRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo(scrollOffset); },
172
+ scrollToFirstSelected,
173
+ selectItem: selectItem,
174
+ updatePopper: () => typeof forceUpdate === 'function' && forceUpdate(),
175
+ highlightIndex,
176
+ hightlightPrevItem,
177
+ hightlightNextItem,
178
+ hightlightFirstItem,
179
+ hightlightLastItem,
180
+ selectHightlightedItem,
181
+ }), [
182
+ scrollToFirstSelected,
183
+ selectItem,
184
+ highlightIndex,
185
+ hightlightPrevItem,
186
+ hightlightNextItem,
187
+ hightlightFirstItem,
188
+ hightlightLastItem,
189
+ selectHightlightedItem,
190
+ forceUpdate,
191
+ ]);
192
+ /**
193
+ * To write row height (size in px) into the cached map
194
+ * and fire re-render action of virtualized list
195
+ */
196
+ const setRowHeight = react_1.default.useCallback((index, height) => {
197
+ var _a;
198
+ sizeMapRef.current.set(index, height);
199
+ (_a = listVirtRef.current) === null || _a === void 0 ? void 0 : _a.resetAfterIndex(index);
200
+ }, []);
201
+ /**
202
+ * Update achnor
203
+ */
204
+ react_1.default.useEffect(() => {
205
+ if (anchorElement !== currentAnchorElement) {
206
+ setAnchorElement(anchorElement);
207
+ }
208
+ }, [anchorElement, currentAnchorElement]);
209
+ const dimensions = react_1.default.useMemo(() => {
210
+ const dimensions = Object.assign({}, dimensionsRef.current);
211
+ menuIsOpen;
212
+ const MAX_HEIGHT = 360;
213
+ const MIN_WIDTH = 200;
214
+ let size = 0;
215
+ for (let index = 0; index < items.length; index++) {
216
+ if (index > 60) {
217
+ break;
218
+ }
219
+ size += sizeMapRef.current.get(index) || estimatedItemSize;
220
+ }
221
+ if (size > 0) {
222
+ dimensions.height = Math.min(size, MAX_HEIGHT);
223
+ }
224
+ if (currentAnchorElement) {
225
+ dimensions.width = Math.max(currentAnchorElement.getBoundingClientRect().width, MIN_WIDTH);
226
+ }
227
+ dimensionsRef.current = dimensions;
228
+ return dimensions;
229
+ }, [currentAnchorElement, items, estimatedItemSize, menuIsOpen]);
230
+ const onScroll = react_1.default.useCallback(({ scrollOffset, scrollDirection }) => {
231
+ if (typeof onEndReached !== 'function') {
232
+ return;
233
+ }
234
+ // Detect the end of the reached
235
+ if (listOuterRef.current && scrollDirection === 'forward') {
236
+ // The threshold is the number of items from the end of the list,
237
+ // upon reaching which the additional loading of new items will begin
238
+ const threshold = (endThreshold / 100) * thresholdPercent;
239
+ // const threshold = 10;
240
+ const offset = listOuterRef.current.scrollHeight - listOuterRef.current.clientHeight;
241
+ const lastItemsHeight = Array.from(items)
242
+ .slice(-threshold)
243
+ .reduce((totalHeight, _edge, index) => totalHeight + (sizeMapRef.current.get(index) || estimatedItemSize), 0);
244
+ if (scrollOffset >= offset - lastItemsHeight) {
245
+ onEndReached();
246
+ }
247
+ }
248
+ }, [onEndReached, endThreshold, thresholdPercent, items, estimatedItemSize]);
249
+ /**
250
+ * Keyboard events of menu list container.
251
+ * Note: Moved selection up and down while keys pressed
252
+ */
253
+ const listKeydownEvent = react_1.default.useCallback((event) => {
254
+ if (!menuIsOpen) {
255
+ return;
256
+ }
257
+ switch (event.code) {
258
+ case 'Enter':
259
+ case 'NumpadEnter':
260
+ case 'Tab':
261
+ event.preventDefault();
262
+ if (markedIndex > -1) {
263
+ selectItem(markedIndex);
264
+ }
265
+ break;
266
+ case 'ArrowUp':
267
+ {
268
+ event.preventDefault();
269
+ hightlightPrevItem();
270
+ }
271
+ break;
272
+ case 'ArrowDown':
273
+ {
274
+ event.preventDefault();
275
+ hightlightNextItem();
276
+ }
277
+ break;
278
+ case 'Home':
279
+ {
280
+ event.preventDefault();
281
+ hightlightFirstItem();
282
+ }
283
+ break;
284
+ case 'End':
285
+ {
286
+ event.preventDefault();
287
+ hightlightLastItem();
288
+ }
289
+ break;
290
+ case 'PageUp':
291
+ case 'PageDown':
292
+ case 'Space':
293
+ event.preventDefault();
294
+ break;
295
+ case 'Escape':
296
+ event.preventDefault();
297
+ onRequestClose(event);
298
+ break;
299
+ default:
300
+ // do nothing
301
+ break;
302
+ }
303
+ }, [
304
+ markedIndex,
305
+ menuIsOpen,
306
+ onRequestClose,
307
+ selectItem,
308
+ hightlightPrevItem,
309
+ hightlightNextItem,
310
+ hightlightFirstItem,
311
+ hightlightLastItem,
312
+ ]);
313
+ /**
314
+ * Invoked `renderItem` function if that passed,
315
+ * otherwise used another render method
316
+ */
317
+ const renderItemFn = react_1.default.useCallback(item => (typeof renderItem === 'function' ? renderItem(item) : JSON.stringify(item)), [renderItem]);
318
+ // eslint-disable-next-line arrow-body-style
319
+ react_1.default.useEffect(() => {
320
+ return () => {
321
+ if (timeoutRef.current) {
322
+ clearTimeout(timeoutRef.current);
323
+ }
324
+ };
325
+ }, []);
326
+ react_1.default.useEffect(() => {
327
+ const windowResizeEvent = (_event) => {
328
+ if (timeoutRef.current) {
329
+ clearTimeout(timeoutRef.current);
330
+ }
331
+ timeoutRef.current = setTimeout(() => {
332
+ if (forceUpdate) {
333
+ forceUpdate();
334
+ }
335
+ }, 100);
336
+ };
337
+ const mouseDownEvent = (event) => {
338
+ if (!menuIsOpen) {
339
+ return;
340
+ }
341
+ let parentElem = event.target;
342
+ let needToClose = true;
343
+ while (parentElem && 'parentNode' in parentElem) {
344
+ if (parentElem === popperElement) {
345
+ needToClose = false;
346
+ break;
347
+ }
348
+ parentElem = parentElem.parentNode;
349
+ }
350
+ if (needToClose) {
351
+ onRequestClose(event);
352
+ }
353
+ };
354
+ if (closeOutsideClick) {
355
+ window.document.addEventListener('mousedown', mouseDownEvent);
356
+ }
357
+ window.document.addEventListener('resize', windowResizeEvent);
358
+ return () => {
359
+ if (closeOutsideClick) {
360
+ window.document.removeEventListener('mousedown', mouseDownEvent);
361
+ }
362
+ window.document.removeEventListener('resize', windowResizeEvent);
363
+ };
364
+ }, [forceUpdate, menuIsOpen, popperElement, onRequestClose, closeOutsideClick]);
365
+ /**
366
+ * Toggle menu open
367
+ */
368
+ react_1.default.useEffect(() => {
369
+ var _a;
370
+ if (isOpenRef.current !== isOpen) {
371
+ isOpenRef.current = Boolean(isOpen);
372
+ setMenuOpen(Boolean(isOpen));
373
+ if (isOpen) {
374
+ scrollToFirstSelected();
375
+ if (autofocus) {
376
+ setTimeout(() => {
377
+ var _a;
378
+ (_a = menuWrapperRef.current) === null || _a === void 0 ? void 0 : _a.focus();
379
+ }, autofocusDelay);
380
+ }
381
+ }
382
+ // Reset indexes
383
+ if (!isOpen) {
384
+ (_a = listVirtRef.current) === null || _a === void 0 ? void 0 : _a.scrollToItem(0);
385
+ dispatch({
386
+ type: 'setMenuState',
387
+ payload: {
388
+ markedIndex: -1,
389
+ hoveredIndex: -1,
390
+ },
391
+ });
392
+ }
393
+ }
394
+ }, [
395
+ getSelectedIndexes,
396
+ scrollToFirstSelected,
397
+ isOpen,
398
+ autofocus,
399
+ popperElement,
400
+ autofocusDelay,
401
+ ]);
402
+ /**
403
+ * Mark selected items by values
404
+ */
405
+ react_1.default.useEffect(() => {
406
+ const indexes = getSelectedIndexes();
407
+ // If elements in selectedIndexesRef and indexes are not equale
408
+ if ((selectedIndexesRef.current.length === indexes.length &&
409
+ selectedIndexesRef.current.every(value => indexes.includes(value))) === false) {
410
+ selectedIndexesRef.current = indexes;
411
+ dispatch({
412
+ type: 'setMenuState',
413
+ payload: {
414
+ selectedIndexes: indexes,
415
+ },
416
+ });
417
+ }
418
+ }, [value, getSelectedIndexes]);
419
+ return !domLoaded
420
+ ? null
421
+ : react_dom_1.default.createPortal(react_1.default.createElement("div", Object.assign({}, attributes.popper, { ref: setPopperElement, style: Object.assign(Object.assign({}, styles.popper), { zIndex }) }), menuIsOpen && (react_1.default.createElement(MenuWrapper_1.default, { isOpen: menuIsOpen, ref: menuWrapperRef, tabIndex: tabIndex, dimensions: dimensions, onKeyDown: listKeydownEvent },
422
+ react_1.default.createElement(react_window_1.VariableSizeList, { onScroll: onScroll, width: 300, height: 350, itemCount: items.length, overscanCount: overscanCount, itemSize: index => sizeMapRef.current.get(index) || estimatedItemSize, estimatedItemSize: estimatedItemSize, ref: elem => {
423
+ listVirtRef.current = elem;
424
+ if (listRef) {
425
+ listRef.current = elem;
426
+ }
427
+ }, outerRef: elem => {
428
+ listOuterRef.current = elem;
429
+ if (outerRef) {
430
+ outerRef.current = elem;
431
+ }
432
+ } }, ({ index, style }) => {
433
+ const item = items[index];
434
+ return (react_1.default.createElement(MenuItem_1.default, { index: index, style: style, setRowHeight: setRowHeight, selected: selectedIndexes.includes(index), hovered: hoveredIndex === index || markedIndex === index, onMouseEnter: () => {
435
+ if (index !== hoveredIndex) {
436
+ dispatch({
437
+ type: 'setMenuState',
438
+ payload: { hoveredIndex: index, markedIndex: -1 },
439
+ });
440
+ }
441
+ }, onMouseLeave: () => {
442
+ if (index === hoveredIndex) {
443
+ dispatch({
444
+ type: 'setMenuState',
445
+ payload: { hoveredIndex: -1, markedIndex: -1 },
446
+ });
447
+ }
448
+ }, onClick: () => selectItem(index) }, renderItemFn({ item, index })));
449
+ })))), typeof portalNode === 'function' ? portalNode() : portalNode || window.document.body);
450
+ });
451
+ Menu.displayName = 'Menu';
452
+ exports.default = Menu;
@@ -0,0 +1,4 @@
1
+ import type { usePopper } from 'react-popper';
2
+ export type PopperOptions = Parameters<typeof usePopper>[2];
3
+ export declare const popperOptions: PopperOptions;
4
+ export default popperOptions;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.popperOptions = void 0;
4
+ exports.popperOptions = {
5
+ placement: 'bottom',
6
+ modifiers: [
7
+ {
8
+ name: 'offset',
9
+ options: {
10
+ offset: [0, 8],
11
+ },
12
+ },
13
+ {
14
+ name: 'flip',
15
+ enabled: true,
16
+ options: {
17
+ altBoundary: true,
18
+ padding: 8,
19
+ },
20
+ },
21
+ {
22
+ name: 'preventOverflow',
23
+ enabled: true,
24
+ options: {
25
+ altAxis: true,
26
+ altBoundary: true,
27
+ tether: true,
28
+ padding: 8,
29
+ },
30
+ },
31
+ ],
32
+ };
33
+ exports.default = exports.popperOptions;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ export interface MenuState {
3
+ readonly selectedIndexes: readonly number[];
4
+ readonly markedIndex: number;
5
+ readonly hoveredIndex: number;
6
+ }
7
+ export type Actions = ActionSetMenuState;
8
+ interface ActionSetMenuState {
9
+ readonly type: 'setMenuState';
10
+ readonly payload: Partial<MenuState>;
11
+ }
12
+ export declare const defaultState: MenuState;
13
+ export declare const reducer: React.Reducer<MenuState, Actions>;
14
+ export default reducer;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reducer = exports.defaultState = void 0;
4
+ exports.defaultState = {
5
+ selectedIndexes: [],
6
+ markedIndex: -1,
7
+ hoveredIndex: -1,
8
+ };
9
+ const reducer = (state, action) => {
10
+ switch (action.type) {
11
+ case 'setMenuState': {
12
+ return Object.assign(Object.assign({}, state), action.payload);
13
+ }
14
+ default:
15
+ return state;
16
+ }
17
+ };
18
+ exports.reducer = reducer;
19
+ exports.default = exports.reducer;
@@ -0,0 +1,3 @@
1
+ import * as React from 'react';
2
+ declare const ForwardRef: React.ForwardRefExoticComponent<Omit<React.SVGProps<SVGSVGElement>, "ref"> & React.RefAttributes<SVGSVGElement>>;
3
+ export default ForwardRef;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const React = __importStar(require("react"));
27
+ const react_1 = require("react");
28
+ const CloseIcon = (props, ref) => (React.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 512 512", ref: ref }, props),
29
+ React.createElement("path", { style: {
30
+ fill: 'none',
31
+ stroke: 'currentColor',
32
+ strokeLinecap: 'round',
33
+ strokeLinejoin: 'round',
34
+ strokeWidth: 32,
35
+ }, d: "M368 368 144 144M368 144 144 368" })));
36
+ const ForwardRef = (0, react_1.forwardRef)(CloseIcon);
37
+ exports.default = ForwardRef;
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ import ReactModal from 'react-modal';
3
+ export interface ModalConfirmBoxProps extends ReactModal.Props {
4
+ readonly title: string;
5
+ readonly message: React.ReactNode;
6
+ readonly onRequestYes: React.MouseEventHandler<HTMLButtonElement>;
7
+ }
8
+ declare const _default: React.ForwardRefExoticComponent<ModalConfirmBoxProps & React.RefAttributes<ReactModal>>;
9
+ export default _default;