@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,157 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.usePhoneUtils = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const templates_1 = __importDefault(require("./templates"));
9
+ const usePhoneUtils = () => {
10
+ /**
11
+ * Get template info by parset value
12
+ */
13
+ const getTemplateInfo = react_1.default.useCallback(parsedValue => {
14
+ const [countryCode, callingCode, template, placeholder, regexp] = templates_1.default.find(template => new RegExp(template[4]).test(parsedValue.trim())) || templates_1.default[0];
15
+ return {
16
+ countryCode,
17
+ callingCode,
18
+ template,
19
+ placeholder,
20
+ regexp,
21
+ };
22
+ }, []);
23
+ /**
24
+ * Get phone validation status
25
+ */
26
+ const validateParsedInput = react_1.default.useCallback((inputValue, template) => {
27
+ const xLength = template.replace(/[^x\d]/g, '').split('').length;
28
+ const digitLength = inputValue.replace(/[^\d]/g, '').split('').length;
29
+ return xLength === digitLength;
30
+ }, []);
31
+ /**
32
+ * Format phone string
33
+ */
34
+ const formatParsedInput = react_1.default.useCallback((inputValue, caret, defaultCountry) => {
35
+ const defaultTemplateRecord = templates_1.default.find(t => t[0] === (defaultCountry || null));
36
+ const [defaultCountryCode, defaultCountryCalling, defaultTemplate, defaultPlaceholder] = defaultTemplateRecord || templates_1.default[templates_1.default.length - 1];
37
+ const data = {
38
+ text: '',
39
+ caret,
40
+ countryCode: defaultCountryCode,
41
+ callingCode: defaultCountryCalling,
42
+ template: defaultTemplate,
43
+ placeholder: defaultPlaceholder,
44
+ number: '',
45
+ isValid: false,
46
+ };
47
+ if (inputValue === '') {
48
+ return data;
49
+ }
50
+ const { countryCode, callingCode, template, placeholder } = getTemplateInfo(inputValue);
51
+ const mask = template.split('').map(c => (c === 'x' ? /\d/ : c));
52
+ let charIndex = 0;
53
+ for (let patternIndex = 0; patternIndex < mask.length; patternIndex++) {
54
+ if (charIndex >= inputValue.length) {
55
+ break;
56
+ }
57
+ const char = inputValue[charIndex];
58
+ const template = mask[patternIndex];
59
+ // If put +, but not first
60
+ if (charIndex !== 0 && char === '+') {
61
+ break;
62
+ }
63
+ if (template instanceof RegExp && new RegExp(template).test(char)) {
64
+ data.text = `${data.text}${char}`;
65
+ charIndex += 1;
66
+ }
67
+ if (typeof template === 'string' && template === char) {
68
+ data.text = `${data.text}${char}`;
69
+ charIndex += 1;
70
+ }
71
+ if (typeof template === 'string' && template !== char) {
72
+ data.text = `${data.text}${template}`;
73
+ if (charIndex < caret) {
74
+ data.caret += 1;
75
+ }
76
+ }
77
+ }
78
+ // const templateLength = template.replace(/[^x\d]/g, '').split('').length;
79
+ // const valueLength = inputValue.replace(/[^\d]/g, '').split('').length;
80
+ const number = data.text.replace(/[^0-9]/g, '').substring((callingCode === null || callingCode === void 0 ? void 0 : callingCode.length) || 0);
81
+ return Object.assign(Object.assign({}, data), { countryCode,
82
+ callingCode,
83
+ template,
84
+ placeholder,
85
+ number, isValid: validateParsedInput(data.text, template) });
86
+ }, [getTemplateInfo, validateParsedInput]);
87
+ /**
88
+ * Parse phone string
89
+ */
90
+ const parseInput = react_1.default.useCallback((value, caret) => {
91
+ const data = {
92
+ text: '',
93
+ caret: 0,
94
+ };
95
+ value
96
+ .trim()
97
+ .split('')
98
+ .forEach((character, charIndex) => {
99
+ const isMatch = new RegExp(/[+0-9]/).test(character);
100
+ if (isMatch) {
101
+ data.text = `${data.text}${character}`;
102
+ if (charIndex < (caret || 0)) {
103
+ data.caret += 1;
104
+ }
105
+ }
106
+ });
107
+ return Object.assign({}, data);
108
+ }, []);
109
+ const parseAndValidate = react_1.default.useCallback(inputValue => {
110
+ const { text } = parseInput(inputValue);
111
+ const { template } = getTemplateInfo(text);
112
+ return validateParsedInput(text, template);
113
+ }, [getTemplateInfo, parseInput, validateParsedInput]);
114
+ const parseAndFormat = react_1.default.useCallback((inputValue, caret) => {
115
+ const parsed = parseInput(inputValue, caret);
116
+ return formatParsedInput(parsed.text, parsed.caret);
117
+ }, [formatParsedInput, parseInput]);
118
+ return {
119
+ /**
120
+ * Validate parsed phone string by template\
121
+ * ```js
122
+ * // Example:
123
+ * validateParsedInput('79129876543', '7 (xxx) xxx-xx-xx'); // true
124
+ * validateParsedInput('79129876', '7 (xxx) xxx-xx-xx'); // false
125
+ * ```
126
+ */
127
+ validateParsedInput,
128
+ getTemplateInfo,
129
+ /**
130
+ * Parse plain phone string and validate result\
131
+ * ```js
132
+ * // Example:
133
+ * parseAndValidate('+7 912 659-99-88'); // true
134
+ * parseAndValidate('+7 912 659-99-'); // false
135
+ * ```
136
+ */
137
+ parseAndValidate,
138
+ parseAndFormat,
139
+ /**
140
+ * Format phone string by template\
141
+ * ```js
142
+ * // Example:
143
+ * format('')
144
+ * ```
145
+ */
146
+ formatParsedInput,
147
+ /**
148
+ * Parse input phone string\
149
+ * ```js
150
+ * // Example:
151
+ * const { text, caret } = parseInput('+7 (912', 7); // { '7912', 4 }
152
+ * ```
153
+ */
154
+ parseInput,
155
+ };
156
+ };
157
+ exports.usePhoneUtils = usePhoneUtils;
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const _default: React.ForwardRefExoticComponent<Omit<React.SVGProps<SVGSVGElement>, "ref"> & React.RefAttributes<SVGSVGElement>>;
3
+ export default _default;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const IconChevronDown = (props, ref) => (react_1.default.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", width: "1em", height: "1em", ref: ref }, props),
8
+ react_1.default.createElement("path", { fill: "none", stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 48, d: "m112 184 144 144 144-144" })));
9
+ exports.default = react_1.default.forwardRef(IconChevronDown);
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ export type SelectButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {
3
+ readonly isOpen?: boolean;
4
+ readonly fullWidth?: boolean;
5
+ };
6
+ declare const _default: React.ForwardRefExoticComponent<React.ButtonHTMLAttributes<HTMLButtonElement> & {
7
+ readonly isOpen?: boolean | undefined;
8
+ readonly fullWidth?: boolean | undefined;
9
+ } & React.RefAttributes<HTMLButtonElement>>;
10
+ export default _default;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const react_1 = __importDefault(require("react"));
18
+ const styled_1 = __importDefault(require("@emotion/styled"));
19
+ const react_2 = require("@emotion/react");
20
+ const IconChevronDown_1 = __importDefault(require("./IconChevronDown"));
21
+ const StyledButton = styled_1.default.button `
22
+ display: flex;
23
+ font-size: 1em;
24
+ align-items: center;
25
+ justify-content: space-between;
26
+ outline: 1px solid transparent;
27
+ box-shadow: none;
28
+ text-align: left;
29
+ padding: 0.8em 1em;
30
+ cursor: pointer;
31
+ outline: transparent;
32
+ transition: all 180ms ease-out 0s;
33
+ background: none;
34
+ color: currentColor;
35
+ max-width: ${({ $fullWidth }) => ($fullWidth ? '100%' : '16em')};
36
+ border: 1px solid;
37
+ border-radius: ${({ theme }) => theme.shape.radiusFactor * 2}em;
38
+ border-color: ${({ theme }) => theme.isDark
39
+ ? theme.colors.backgroundPrimary().lighten(1.4).toString()
40
+ : theme.colors.backgroundPrimary().darken(0.4).toString()};
41
+ &:hover {
42
+ background-color: ${({ theme }) => theme.colors.backgroundPrimary().darken(0.05).toString()};
43
+ }
44
+ &:active {
45
+ background-color: ${({ theme }) => theme.colors.backgroundPrimary().darken(0.1).toString()};
46
+ }
47
+ &:focus-visible {
48
+ outline: 2px solid ${({ theme }) => theme.colors.accentPrimary().toString()};
49
+ }
50
+ `;
51
+ const ValueWrapper = styled_1.default.span `
52
+ white-space: nowrap;
53
+ overflow: hidden;
54
+ text-overflow: ellipsis;
55
+ width: 100%;
56
+ font-size: 0.86em;
57
+ display: block;
58
+ pointer-events: none;
59
+ `;
60
+ const ChevronWrapper = styled_1.default.span `
61
+ margin-left: 1em;
62
+ display: flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ transition: 120ms ease-out;
66
+ pointer-events: none;
67
+ transform: rotateZ(0);
68
+ ${({ $isOpen }) => $isOpen &&
69
+ (0, react_2.css) `
70
+ transform: rotateZ(180deg);
71
+ `}
72
+ `;
73
+ const SelectButton = (props, ref) => {
74
+ const { children, isOpen, fullWidth } = props, nativeProps = __rest(props, ["children", "isOpen", "fullWidth"]);
75
+ return (react_1.default.createElement(StyledButton, Object.assign({ type: "button", "$fullWidth": fullWidth }, nativeProps, { ref: ref }),
76
+ react_1.default.createElement(ValueWrapper, null, children),
77
+ react_1.default.createElement(ChevronWrapper, { "$isOpen": isOpen },
78
+ react_1.default.createElement(IconChevronDown_1.default, null))));
79
+ };
80
+ exports.default = react_1.default.forwardRef(SelectButton);
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ import { MenuRef, MenuProps, Value } from '../Menu';
3
+ type SelectBoxMenuProps<T, Multiple extends boolean | undefined = false> = Pick<MenuProps<T, Multiple>, 'items' | 'value' | 'estimatedItemSize' | 'endThreshold' | 'overscanCount' | 'getOptionSelected' | 'onEndReached' | 'onSelectItem' | 'renderItem' | 'multiple' | 'zIndex' | 'onRequestClose' | 'isOpen'> & {
4
+ readonly fullWidth?: boolean;
5
+ readonly itemToString: ItemToString<T, Multiple>;
6
+ readonly renderInput?: (params: RenderInputProps<T, Multiple>) => React.ReactNode;
7
+ readonly onRequestOpen: (event?: FocusEvent | KeyboardEvent | MouseEvent | React.FocusEvent | React.KeyboardEvent | React.MouseEvent) => void;
8
+ };
9
+ export type ItemToString<T, Multiple> = Multiple extends undefined | false ? (item: T) => string : undefined;
10
+ export type SelectoBoxContainerRef = HTMLButtonElement;
11
+ export type RenderInputProps<T, Multiple extends boolean | undefined = undefined> = {
12
+ readonly fullWidth?: boolean;
13
+ readonly selected: Value<T, Multiple> | null;
14
+ readonly inputRef: React.Ref<HTMLButtonElement>;
15
+ readonly onClick: React.MouseEventHandler<HTMLButtonElement>;
16
+ readonly onFocus: React.FocusEventHandler<HTMLButtonElement>;
17
+ readonly onBlur: React.FocusEventHandler<HTMLButtonElement>;
18
+ readonly onKeyDown: React.KeyboardEventHandler<HTMLButtonElement>;
19
+ };
20
+ export type SelectBoxRef<T> = Pick<MenuRef<T>, 'scrollToItem' | 'scrollTo' | 'scrollToFirstSelected' | 'selectItem' | 'highlightIndex' | 'hightlightPrevItem' | 'hightlightNextItem' | 'hightlightFirstItem' | 'hightlightLastItem' | 'selectHightlightedItem' | 'updatePopper'> & {
21
+ readonly clear: () => void;
22
+ readonly focus: () => void;
23
+ readonly blur: () => void;
24
+ };
25
+ export type SelectBoxProps<T, Multiple extends boolean | undefined = undefined> = SelectBoxMenuProps<T, Multiple> & {
26
+ readonly containerRef?: React.Ref<SelectoBoxContainerRef>;
27
+ readonly notSelectedLabel?: React.ReactNode;
28
+ };
29
+ declare const _default: <T, Multiple extends boolean | undefined = false>(props: Pick<MenuProps<T, Multiple>, "zIndex" | "value" | "isOpen" | "estimatedItemSize" | "overscanCount" | "items" | "endThreshold" | "multiple" | "getOptionSelected" | "onEndReached" | "onSelectItem" | "renderItem" | "onRequestClose"> & {
30
+ readonly fullWidth?: boolean | undefined;
31
+ readonly itemToString: ItemToString<T, Multiple>;
32
+ readonly renderInput?: ((params: RenderInputProps<T, Multiple>) => React.ReactNode) | undefined;
33
+ readonly onRequestOpen: (event?: MouseEvent | KeyboardEvent | FocusEvent | React.FocusEvent<Element, Element> | React.KeyboardEvent<Element> | React.MouseEvent<Element, MouseEvent> | undefined) => void;
34
+ } & {
35
+ readonly containerRef?: React.Ref<HTMLButtonElement> | undefined;
36
+ readonly notSelectedLabel?: React.ReactNode;
37
+ } & {
38
+ ref?: React.Ref<SelectBoxRef<T>> | undefined;
39
+ }) => JSX.Element;
40
+ export default _default;
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const Menu_1 = __importDefault(require("../Menu"));
8
+ const SelectButton_1 = __importDefault(require("./SelectButton"));
9
+ const popper_options_1 = __importDefault(require("./popper-options"));
10
+ const SelectBox = react_1.default.forwardRef((props, ref) => {
11
+ const { containerRef, itemToString, value, items, isOpen, notSelectedLabel = 'Not selected', estimatedItemSize, endThreshold, overscanCount, multiple, zIndex, fullWidth, renderInput, onRequestOpen, onRequestClose, getOptionSelected, onEndReached, onSelectItem, renderItem, } = props;
12
+ const menuRef = react_1.default.useRef(null);
13
+ const [currentOpen, setCurrentOpen] = react_1.default.useState(isOpen);
14
+ const [currentValue, setCurrentValue] = react_1.default.useState(value);
15
+ const [anchorElement, setAnchorElement] = react_1.default.useState(null);
16
+ const isFocusedRef = react_1.default.useRef(false);
17
+ /**
18
+ * API
19
+ */
20
+ react_1.default.useImperativeHandle(ref, () => ({
21
+ highlightIndex: (index) => { var _a; return (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.highlightIndex(index); },
22
+ hightlightPrevItem: () => { var _a; return (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.hightlightPrevItem(); },
23
+ hightlightNextItem: () => { var _a; return (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.hightlightNextItem(); },
24
+ hightlightFirstItem: () => { var _a; return (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.hightlightFirstItem(); },
25
+ hightlightLastItem: () => { var _a; return (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.hightlightLastItem(); },
26
+ selectHightlightedItem: () => { var _a; return (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.selectHightlightedItem(); },
27
+ updatePopper: () => { var _a; return (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.updatePopper(); },
28
+ scrollToFirstSelected: () => { var _a; return (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.scrollToFirstSelected(); },
29
+ selectItem: (index) => { var _a; return (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.selectItem(index); },
30
+ scrollTo: (scrollOffset) => { var _a; return (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.scrollTo(scrollOffset); },
31
+ scrollToItem: (index, align) => { var _a; return (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.scrollToItem(index, align); },
32
+ clear: () => {
33
+ setCurrentValue(null);
34
+ anchorElement === null || anchorElement === void 0 ? void 0 : anchorElement.focus();
35
+ },
36
+ focus: () => anchorElement === null || anchorElement === void 0 ? void 0 : anchorElement.focus(),
37
+ blur: () => anchorElement === null || anchorElement === void 0 ? void 0 : anchorElement.blur(),
38
+ }), [anchorElement]);
39
+ const onClickEvent = react_1.default.useCallback((event) => {
40
+ if (!currentOpen) {
41
+ onRequestOpen(event);
42
+ }
43
+ else {
44
+ onRequestClose(event);
45
+ }
46
+ }, [currentOpen, onRequestClose, onRequestOpen]);
47
+ const inputKeydownEvent = react_1.default.useCallback((event) => {
48
+ var _a, _b, _c, _d, _e;
49
+ if (!isFocusedRef.current) {
50
+ return;
51
+ }
52
+ switch (event.code) {
53
+ case 'Enter':
54
+ case 'NumpadEnter':
55
+ event.preventDefault();
56
+ (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.selectHightlightedItem();
57
+ break;
58
+ case 'ArrowUp':
59
+ {
60
+ event.preventDefault();
61
+ (_b = menuRef.current) === null || _b === void 0 ? void 0 : _b.hightlightPrevItem();
62
+ }
63
+ break;
64
+ case 'ArrowDown':
65
+ {
66
+ event.preventDefault();
67
+ (_c = menuRef.current) === null || _c === void 0 ? void 0 : _c.hightlightNextItem();
68
+ if (!currentOpen) {
69
+ onRequestOpen(event);
70
+ }
71
+ }
72
+ break;
73
+ case 'Home':
74
+ {
75
+ event.preventDefault();
76
+ (_d = menuRef.current) === null || _d === void 0 ? void 0 : _d.hightlightFirstItem();
77
+ }
78
+ break;
79
+ case 'End':
80
+ {
81
+ event.preventDefault();
82
+ (_e = menuRef.current) === null || _e === void 0 ? void 0 : _e.hightlightLastItem();
83
+ }
84
+ break;
85
+ case 'PageUp':
86
+ case 'PageDown':
87
+ event.preventDefault();
88
+ break;
89
+ case 'Escape':
90
+ case 'Tab':
91
+ onRequestClose(event);
92
+ break;
93
+ case 'Space':
94
+ if (!currentOpen) {
95
+ onRequestOpen(event);
96
+ }
97
+ break;
98
+ default:
99
+ // do nothing
100
+ break;
101
+ }
102
+ }, [currentOpen, onRequestClose, onRequestOpen]);
103
+ react_1.default.useEffect(() => {
104
+ if (value === null) {
105
+ setCurrentValue(null);
106
+ return;
107
+ }
108
+ if (multiple) {
109
+ if (Array.isArray(value)) {
110
+ setCurrentValue(value);
111
+ }
112
+ if (!Array.isArray(value)) {
113
+ setCurrentValue([value]);
114
+ }
115
+ }
116
+ if (!multiple) {
117
+ if (Array.isArray(value)) {
118
+ setCurrentValue(value[0]);
119
+ }
120
+ if (!Array.isArray(value)) {
121
+ setCurrentValue(value);
122
+ }
123
+ }
124
+ }, [value, multiple]);
125
+ react_1.default.useEffect(() => {
126
+ setCurrentOpen(isOpen);
127
+ }, [isOpen]);
128
+ const onSelectItemF = react_1.default.useCallback(selected => {
129
+ setCurrentValue(selected);
130
+ if (typeof onSelectItem === 'function') {
131
+ onSelectItem(selected);
132
+ }
133
+ anchorElement === null || anchorElement === void 0 ? void 0 : anchorElement.focus();
134
+ }, [onSelectItem, anchorElement]);
135
+ const inputElement = react_1.default.useMemo(() => {
136
+ const hasValue = currentValue && currentValue !== null;
137
+ const valueIsNotArray = !Array.isArray(currentValue);
138
+ const hasCustomFunc = typeof itemToString === 'function';
139
+ const elem = typeof renderInput === 'function' ? (renderInput({
140
+ fullWidth,
141
+ inputRef: setAnchorElement,
142
+ selected: currentValue,
143
+ onBlur: () => {
144
+ isFocusedRef.current = false;
145
+ },
146
+ onFocus: event => {
147
+ isFocusedRef.current = true;
148
+ onRequestOpen(event);
149
+ },
150
+ onKeyDown: inputKeydownEvent,
151
+ onClick: onClickEvent,
152
+ })) : (react_1.default.createElement(SelectButton_1.default, { fullWidth: fullWidth, isOpen: currentOpen, onKeyDown: inputKeydownEvent, onClick: onClickEvent, ref: el => {
153
+ if (typeof containerRef === 'object' && containerRef !== null) {
154
+ containerRef.current = el;
155
+ }
156
+ if (typeof containerRef === 'function') {
157
+ containerRef(el);
158
+ }
159
+ setAnchorElement(el);
160
+ } }, hasValue && valueIsNotArray && hasCustomFunc
161
+ ? itemToString(currentValue)
162
+ : notSelectedLabel));
163
+ return elem;
164
+ }, [
165
+ renderInput,
166
+ inputKeydownEvent,
167
+ onClickEvent,
168
+ itemToString,
169
+ onRequestOpen,
170
+ currentValue,
171
+ notSelectedLabel,
172
+ containerRef,
173
+ currentOpen,
174
+ fullWidth,
175
+ ]);
176
+ return (react_1.default.createElement(react_1.default.Fragment, null,
177
+ inputElement,
178
+ react_1.default.createElement(Menu_1.default, { ref: menuRef, items: items, value: currentValue, isOpen: currentOpen && items.length > 0, autofocus: true, anchorElement: anchorElement, estimatedItemSize: estimatedItemSize, endThreshold: endThreshold, overscanCount: overscanCount, getOptionSelected: getOptionSelected, onEndReached: onEndReached, onSelectItem: onSelectItemF, renderItem: renderItem, multiple: multiple, zIndex: zIndex, closeOutsideClick: true, popperOptions: popper_options_1.default, onRequestClose: evt => {
179
+ if ((evt === null || evt === void 0 ? void 0 : evt.target) !== anchorElement) {
180
+ onRequestClose(evt);
181
+ setTimeout(() => {
182
+ anchorElement === null || anchorElement === void 0 ? void 0 : anchorElement.focus();
183
+ }, 100);
184
+ }
185
+ } })));
186
+ });
187
+ SelectBox.displayName = 'SelectBox';
188
+ exports.default = SelectBox;
@@ -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-start',
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,7 @@
1
+ import * as React from 'react';
2
+ export interface TextFieldContainerProps extends React.InputHTMLAttributes<HTMLDivElement> {
3
+ readonly fullWidth?: boolean;
4
+ readonly focused: boolean;
5
+ }
6
+ declare const _default: React.ForwardRefExoticComponent<TextFieldContainerProps & React.RefAttributes<HTMLDivElement>>;
7
+ export default _default;
@@ -0,0 +1,52 @@
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 __rest = (this && this.__rest) || function (s, e) {
26
+ var t = {};
27
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
28
+ t[p] = s[p];
29
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
30
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
31
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
32
+ t[p[i]] = s[p[i]];
33
+ }
34
+ return t;
35
+ };
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const React = __importStar(require("react"));
41
+ const styled_1 = __importDefault(require("@emotion/styled"));
42
+ const StyledTextFieldContainer = styled_1.default.div `
43
+ display: inline-flex;
44
+ flex-flow: column;
45
+ width: 100%;
46
+ max-width: ${({ $fullWidth }) => ($fullWidth ? '100%' : '16em')};
47
+ `;
48
+ const TextFieldContainer = (props, ref) => {
49
+ const { children, fullWidth, focused } = props, otherProps = __rest(props, ["children", "fullWidth", "focused"]);
50
+ return (React.createElement(StyledTextFieldContainer, Object.assign({}, otherProps, { ref: ref, "$fullWidth": fullWidth, "$focused": focused }), children));
51
+ };
52
+ exports.default = React.forwardRef(TextFieldContainer);
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ export interface TextFieldErrorTextProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ readonly showEmptyIfNoError?: boolean;
4
+ readonly error?: boolean;
5
+ readonly focused?: boolean;
6
+ }
7
+ declare const _default: React.ForwardRefExoticComponent<TextFieldErrorTextProps & React.RefAttributes<HTMLDivElement>>;
8
+ export default _default;