@fibery/ui-kit 1.36.2 → 1.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/package.json +8 -5
  3. package/src/action-badge.tsx +5 -4
  4. package/src/actions-menu/actions-menu-confirmation.tsx +1 -12
  5. package/src/actions-menu/actions-menu-item.tsx +19 -7
  6. package/src/actions-menu/actions-menu-props.tsx +4 -0
  7. package/src/actions-menu/actions-menu-sub-command-menu.tsx +7 -4
  8. package/src/actions-menu/actions-menu-sub-menu.tsx +9 -3
  9. package/src/actions-menu/actions-menu.tsx +24 -8
  10. package/src/actions-panel.tsx +12 -2
  11. package/src/antd/ant-modal.tsx +17 -2
  12. package/src/antd/input.tsx +4 -3
  13. package/src/app-icon-with-fallback.tsx +5 -8
  14. package/src/app-icon-wrapper.tsx +4 -4
  15. package/src/appIcons.json +20 -0
  16. package/src/axis-header.tsx +136 -76
  17. package/src/badge.tsx +14 -7
  18. package/src/beta-badge.tsx +12 -8
  19. package/src/box.tsx +1 -1
  20. package/src/breadcrumb.tsx +78 -0
  21. package/src/button/actions-button-compact.tsx +5 -2
  22. package/src/button/base-button.tsx +7 -4
  23. package/src/button/button-group.tsx +1 -1
  24. package/src/button/button.tsx +120 -2
  25. package/src/button/icon-button.tsx +13 -2
  26. package/src/button/select-button.tsx +27 -8
  27. package/src/card-container.tsx +36 -69
  28. package/src/card-hidden-link.tsx +52 -0
  29. package/src/collapsible-section.tsx +13 -3
  30. package/src/color-picker/index.js +65 -60
  31. package/src/color-picker/swatch.tsx +29 -14
  32. package/src/command-menu/index.tsx +5 -5
  33. package/src/context-menu/index.tsx +10 -1
  34. package/src/count-badge.tsx +57 -0
  35. package/src/date-picker/date-range-input.tsx +1 -1
  36. package/src/date-picker/date-range-picker.tsx +6 -3
  37. package/src/date-picker/fake-date-input.tsx +1 -1
  38. package/src/date-picker/relative-date-picker.tsx +7 -3
  39. package/src/date-picker/single-date-input.tsx +1 -1
  40. package/src/date-picker/single-date-picker.tsx +8 -5
  41. package/src/date-picker/styles.ts +32 -26
  42. package/src/date-picker/types.ts +3 -1
  43. package/src/date-picker/utils.ts +9 -2
  44. package/src/day-select/day-select.tsx +21 -75
  45. package/src/day-select/iso-week-day-select.tsx +1 -1
  46. package/src/day-select/mount-day-select.tsx +2 -2
  47. package/src/day-select/week-day-select.tsx +1 -5
  48. package/src/design-system.ts +91 -51
  49. package/src/dropdown-menu/index.tsx +8 -1
  50. package/src/emoji-picker/app-icon-picker.tsx +6 -4
  51. package/src/emoji-picker/emoji-picker-content-with-color.tsx +3 -9
  52. package/src/emoji-picker/emoji-picker-preview-footer.tsx +1 -1
  53. package/src/emoji-picker/emoji-picker.tsx +3 -0
  54. package/src/emoji-picker/emoji.tsx +2 -1
  55. package/src/emoji-picker/icon-emoji-picker.tsx +83 -68
  56. package/src/emoji-picker/primitives/footer.tsx +0 -1
  57. package/src/emoji-picker/primitives/header.tsx +1 -0
  58. package/src/emoji-picker/primitives/search.tsx +12 -13
  59. package/src/emoji-picker/primitives/skin-tone.tsx +1 -0
  60. package/src/emoji-picker/use-responsive-emoji-size.ts +11 -0
  61. package/src/emoji-picker/utils/emoji-set.ts +2 -1
  62. package/src/empty-state/empty-state.tsx +6 -0
  63. package/src/error-alert/error-alert.tsx +19 -7
  64. package/src/field-app-icon.tsx +29 -0
  65. package/src/field-container.tsx +4 -2
  66. package/src/field-icon.tsx +29 -0
  67. package/src/field-type-icon.tsx +82 -0
  68. package/src/file-item.tsx +164 -47
  69. package/src/guide-link.tsx +4 -3
  70. package/src/hint.tsx +10 -1
  71. package/src/html-styles.ts +23 -13
  72. package/src/icons/ast/ActivityFilled.ts +8 -0
  73. package/src/icons/ast/AiAssistantFilled.ts +8 -0
  74. package/src/icons/ast/AiFiberyBuild.ts +8 -0
  75. package/src/icons/ast/Anthropic.ts +1 -1
  76. package/src/icons/ast/Apple.ts +8 -0
  77. package/src/icons/ast/ArrowBottom.ts +1 -1
  78. package/src/icons/ast/ArrowForward.ts +1 -1
  79. package/src/icons/ast/ArrowLeft.ts +1 -1
  80. package/src/icons/ast/ArrowRight.ts +1 -1
  81. package/src/icons/ast/ArrowTop.ts +1 -1
  82. package/src/icons/ast/CollapseAllHorizontal.ts +8 -0
  83. package/src/icons/ast/Crosshair.ts +8 -0
  84. package/src/icons/ast/DateRange.ts +1 -1
  85. package/src/icons/ast/Document.ts +8 -0
  86. package/src/icons/ast/EntityCreate.ts +8 -0
  87. package/src/icons/ast/EntityCreateFilled.ts +8 -0
  88. package/src/icons/ast/ExpandAll.ts +8 -0
  89. package/src/icons/ast/ExpandAllHorizontal.ts +8 -0
  90. package/src/icons/ast/FiberyDesktopApp.ts +8 -0
  91. package/src/icons/ast/FileDownload.ts +8 -0
  92. package/src/icons/ast/GlobeUnpublish.ts +8 -0
  93. package/src/icons/ast/GraduationCapFilled.ts +8 -0
  94. package/src/icons/ast/Home.ts +1 -1
  95. package/src/icons/ast/HomeFilled.ts +8 -0
  96. package/src/icons/ast/ImportFilled.ts +8 -0
  97. package/src/icons/ast/IntegrationsFilled.ts +8 -0
  98. package/src/icons/ast/KeyboardHideDown.ts +8 -0
  99. package/src/icons/ast/LayoutMultiple.ts +8 -0
  100. package/src/icons/ast/LocationEdit.ts +8 -0
  101. package/src/icons/ast/MessagePlus.ts +8 -0
  102. package/src/icons/ast/OpenAi.ts +1 -1
  103. package/src/icons/ast/RicheditorHistoryRedo.ts +1 -1
  104. package/src/icons/ast/RicheditorHistoryUndo.ts +1 -1
  105. package/src/icons/ast/RicheditorMarkHighlight.ts +8 -0
  106. package/src/icons/ast/RicheditorMarkStrike.ts +1 -1
  107. package/src/icons/ast/RicheditorMarkUnderline.ts +1 -1
  108. package/src/icons/ast/SearchFilled.ts +8 -0
  109. package/src/icons/ast/SettingsFilled.ts +8 -0
  110. package/src/icons/ast/SlideMenuFilled.ts +8 -0
  111. package/src/icons/ast/SpaceApp.ts +8 -0
  112. package/src/icons/ast/SpaceGenerate.ts +8 -0
  113. package/src/icons/ast/SpaceScratch.ts +8 -0
  114. package/src/icons/ast/SpaceTemplate.ts +8 -0
  115. package/src/icons/ast/TableLayout.ts +8 -0
  116. package/src/icons/ast/TemplatesFilled.ts +8 -0
  117. package/src/icons/ast/ThumbsDown.ts +8 -0
  118. package/src/icons/ast/ThumbsUp.ts +8 -0
  119. package/src/icons/ast/TypeDate.ts +1 -1
  120. package/src/icons/ast/ViewDashboard.ts +8 -0
  121. package/src/icons/ast/WarningTriangleFilled.ts +8 -0
  122. package/src/icons/ast/Windows.ts +8 -0
  123. package/src/icons/ast/index.tsx +37 -0
  124. package/src/icons/react/ActivityFilled.tsx +13 -0
  125. package/src/icons/react/AiAssistantFilled.tsx +13 -0
  126. package/src/icons/react/AiFiberyBuild.tsx +13 -0
  127. package/src/icons/react/Apple.tsx +13 -0
  128. package/src/icons/react/CollapseAllHorizontal.tsx +13 -0
  129. package/src/icons/react/Crosshair.tsx +13 -0
  130. package/src/icons/react/Document.tsx +13 -0
  131. package/src/icons/react/EntityCreate.tsx +13 -0
  132. package/src/icons/react/EntityCreateFilled.tsx +13 -0
  133. package/src/icons/react/ExpandAll.tsx +13 -0
  134. package/src/icons/react/ExpandAllHorizontal.tsx +13 -0
  135. package/src/icons/react/FiberyDesktopApp.tsx +13 -0
  136. package/src/icons/react/FileDownload.tsx +13 -0
  137. package/src/icons/react/GlobeUnpublish.tsx +13 -0
  138. package/src/icons/react/GraduationCapFilled.tsx +13 -0
  139. package/src/icons/react/HomeFilled.tsx +13 -0
  140. package/src/icons/react/ImportFilled.tsx +13 -0
  141. package/src/icons/react/IntegrationsFilled.tsx +13 -0
  142. package/src/icons/react/KeyboardHideDown.tsx +13 -0
  143. package/src/icons/react/LayoutMultiple.tsx +13 -0
  144. package/src/icons/react/LocationEdit.tsx +13 -0
  145. package/src/icons/react/MessagePlus.tsx +13 -0
  146. package/src/icons/react/RicheditorMarkHighlight.tsx +13 -0
  147. package/src/icons/react/SearchFilled.tsx +13 -0
  148. package/src/icons/react/SettingsFilled.tsx +13 -0
  149. package/src/icons/react/SlideMenuFilled.tsx +13 -0
  150. package/src/icons/react/SpaceApp.tsx +13 -0
  151. package/src/icons/react/SpaceGenerate.tsx +13 -0
  152. package/src/icons/react/SpaceScratch.tsx +13 -0
  153. package/src/icons/react/SpaceTemplate.tsx +13 -0
  154. package/src/icons/react/TableLayout.tsx +13 -0
  155. package/src/icons/react/TemplatesFilled.tsx +13 -0
  156. package/src/icons/react/ThumbsDown.tsx +13 -0
  157. package/src/icons/react/ThumbsUp.tsx +13 -0
  158. package/src/icons/react/ViewDashboard.tsx +13 -0
  159. package/src/icons/react/WarningTriangleFilled.tsx +13 -0
  160. package/src/icons/react/Windows.tsx +13 -0
  161. package/src/icons/react/index.tsx +37 -0
  162. package/src/icons/svg/activity-filled.svg +4 -0
  163. package/src/icons/svg/ai-assistant-filled.svg +3 -0
  164. package/src/icons/svg/ai-fibery-build.svg +24 -0
  165. package/src/icons/svg/anthropic.svg +2 -14
  166. package/src/icons/svg/apple.svg +4 -0
  167. package/src/icons/svg/arrow-bottom.svg +1 -1
  168. package/src/icons/svg/arrow-forward.svg +1 -1
  169. package/src/icons/svg/arrow-left.svg +1 -1
  170. package/src/icons/svg/arrow-right.svg +1 -1
  171. package/src/icons/svg/arrow-top.svg +1 -1
  172. package/src/icons/svg/collapse-all-horizontal.svg +3 -0
  173. package/src/icons/svg/crosshair.svg +4 -0
  174. package/src/icons/svg/date-range.svg +3 -3
  175. package/src/icons/svg/document.svg +4 -0
  176. package/src/icons/svg/entity-create-filled.svg +4 -0
  177. package/src/icons/svg/entity-create.svg +3 -0
  178. package/src/icons/svg/expand-all-horizontal.svg +3 -0
  179. package/src/icons/svg/expand-all.svg +3 -0
  180. package/src/icons/svg/fibery-desktop-app.svg +101 -0
  181. package/src/icons/svg/file-download.svg +4 -0
  182. package/src/icons/svg/globe-unpublish.svg +4 -0
  183. package/src/icons/svg/go-to.svg +1 -3
  184. package/src/icons/svg/graduation-cap-filled.svg +4 -0
  185. package/src/icons/svg/home-filled.svg +3 -0
  186. package/src/icons/svg/home.svg +4 -2
  187. package/src/icons/svg/import-filled.svg +4 -0
  188. package/src/icons/svg/integrations-filled.svg +4 -0
  189. package/src/icons/svg/keyboard-hide-down.svg +1 -0
  190. package/src/icons/svg/layout-multiple.svg +3 -0
  191. package/src/icons/svg/location-edit.svg +13 -0
  192. package/src/icons/svg/message-plus.svg +4 -0
  193. package/src/icons/svg/open-ai.svg +2 -7
  194. package/src/icons/svg/open-as-page.svg +2 -3
  195. package/src/icons/svg/richeditor/history/redo.svg +3 -2
  196. package/src/icons/svg/richeditor/history/undo.svg +3 -2
  197. package/src/icons/svg/richeditor/mark/code.svg +4 -5
  198. package/src/icons/svg/richeditor/mark/em.svg +3 -2
  199. package/src/icons/svg/richeditor/mark/highlight.svg +3 -0
  200. package/src/icons/svg/richeditor/mark/strike.svg +3 -2
  201. package/src/icons/svg/richeditor/mark/strong.svg +3 -2
  202. package/src/icons/svg/richeditor/mark/underline.svg +4 -2
  203. package/src/icons/svg/search-filled.svg +3 -0
  204. package/src/icons/svg/settings-filled.svg +3 -0
  205. package/src/icons/svg/slide-menu-filled.svg +1 -0
  206. package/src/icons/svg/space-app.svg +3 -0
  207. package/src/icons/svg/space-generate.svg +3 -0
  208. package/src/icons/svg/space-scratch.svg +3 -0
  209. package/src/icons/svg/space-template.svg +3 -0
  210. package/src/icons/svg/table-layout.svg +3 -0
  211. package/src/icons/svg/templates-filled.svg +6 -0
  212. package/src/icons/svg/thumbs-down.svg +3 -0
  213. package/src/icons/svg/thumbs-up.svg +3 -0
  214. package/src/icons/svg/type/date.svg +3 -2
  215. package/src/icons/svg/view-dashboard.svg +5 -0
  216. package/src/icons/svg/warning-triangle-filled.svg +3 -0
  217. package/src/icons/svg/windows.svg +15 -0
  218. package/src/images-gallery/images-gallery.tsx +254 -0
  219. package/src/images-gallery/zoom.tsx +112 -0
  220. package/src/integration-compact-info-button.tsx +3 -1
  221. package/src/is-in-popup.ts +1 -1
  222. package/src/layout-styles.ts +43 -0
  223. package/src/lists/actions-menu-row-surface.tsx +3 -1
  224. package/src/lists/list-row-surface.tsx +9 -2
  225. package/src/loaders.tsx +6 -6
  226. package/src/logo.tsx +16 -9
  227. package/src/mobile-keyboard-aware-popup.tsx +87 -0
  228. package/src/mobile-styles.ts +10 -0
  229. package/src/modal-menu/contexts/modal-menu-context.tsx +22 -0
  230. package/src/modal-menu/contexts/modal-submenu-context.tsx +16 -0
  231. package/src/modal-menu/index.tsx +14 -0
  232. package/src/modal-menu/modal-menu-content.tsx +68 -0
  233. package/src/modal-menu/modal-menu-group.tsx +10 -0
  234. package/src/modal-menu/modal-menu-item.tsx +37 -0
  235. package/src/modal-menu/modal-menu-label.tsx +24 -0
  236. package/src/modal-menu/modal-menu-root.tsx +57 -0
  237. package/src/modal-menu/modal-menu-separator.tsx +14 -0
  238. package/src/modal-menu/modal-menu-trigger.tsx +37 -0
  239. package/src/modal-menu/modal-submenu-content.tsx +49 -0
  240. package/src/modal-menu/modal-submenu-trigger.tsx +34 -0
  241. package/src/modal-menu/modal-submenu.tsx +17 -0
  242. package/src/new-badge.tsx +4 -7
  243. package/src/number-input/text-area-auto-sized.tsx +47 -0
  244. package/src/number-input/text-input-auto-sized.tsx +49 -0
  245. package/src/online-users.tsx +3 -3
  246. package/src/palette.ts +50 -50
  247. package/src/popover/index.tsx +687 -0
  248. package/src/popover/mobile-popup-context.tsx +29 -0
  249. package/src/{popup → popover}/modifiers.tsx +0 -7
  250. package/src/{popup → popover}/popup-modifiers-context.ts +3 -3
  251. package/src/reactions/reaction-button.tsx +30 -45
  252. package/src/reactions/reaction-picker.tsx +39 -45
  253. package/src/rich-text-embed-error.tsx +2 -2
  254. package/src/select/{custom-select-partials → components}/menu.tsx +13 -7
  255. package/src/select/{custom-select-partials → components}/no-option-message.tsx +0 -1
  256. package/src/select/constants.ts +1 -0
  257. package/src/select/index.tsx +143 -148
  258. package/src/select/select-in-popover.tsx +119 -138
  259. package/src/select/styles.ts +60 -24
  260. package/src/shortcut-badge.tsx +1 -0
  261. package/src/tab-nav/tab-nav.tsx +47 -28
  262. package/src/theme-provider.tsx +9 -1
  263. package/src/toast/primitives.tsx +8 -1
  264. package/src/toggle-button/round-toggle-button.tsx +23 -0
  265. package/src/toggle-button/toggle-button-group.tsx +34 -0
  266. package/src/toggle-button/toggle-button.tsx +164 -0
  267. package/src/toggle.tsx +3 -3
  268. package/src/tooltip-if-overflown.tsx +9 -3
  269. package/src/tooltip.tsx +2 -2
  270. package/src/unit/index.tsx +9 -1
  271. package/src/unit/loading-unit-value.tsx +1 -0
  272. package/src/unit/maybe-unit-value.tsx +3 -3
  273. package/src/unit/primitive.tsx +58 -42
  274. package/src/unit/styles.ts +10 -14
  275. package/src/unit/types.ts +4 -2
  276. package/src/unit/unit-button-group.tsx +6 -11
  277. package/src/unit/unit-content.tsx +13 -5
  278. package/src/unit/unit-with-title.tsx +6 -1
  279. package/src/unit/unit-with-tooltip.tsx +24 -9
  280. package/src/use-is-phone.tsx +37 -0
  281. package/src/use-is-support-hover.ts +1 -1
  282. package/src/use-on-screen-keyboard-data.tsx +66 -0
  283. package/src/workflow-progress-icon.tsx +17 -23
  284. package/src/number-input/text-area-with-autosize.tsx +0 -91
  285. package/src/number-input/text-inline-input-with-autosize.tsx +0 -60
  286. package/src/popup/index.tsx +0 -382
  287. package/src/use-is-phone.ts +0 -5
  288. /package/src/{popup → popover}/popup-stack-context.tsx +0 -0
  289. /package/src/{popup → popover}/reference.ts +0 -0
  290. /package/src/{popup → popover}/styles.ts +0 -0
  291. /package/src/{popup → popover}/use-click-outside.ts +0 -0
  292. /package/src/select/{custom-select-partials → components}/clear-indicator.tsx +0 -0
  293. /package/src/select/{custom-select-partials → components}/drop-down-indicator.tsx +0 -0
  294. /package/src/select/{custom-select-partials → components}/group-heading.tsx +0 -0
  295. /package/src/select/{custom-select-partials → components}/menu-list-virtualized.tsx +0 -0
  296. /package/src/select/{custom-select-partials → components}/option.tsx +0 -0
@@ -1,48 +1,51 @@
1
+ /* eslint-disable no-use-before-define */
1
2
  import {useComposedRefs} from "@fibery/react/src/use-composed-refs";
2
- import {forwardRef, RefObject, useCallback, useMemo, useRef, useState} from "react";
3
+ import {ForwardedRef, forwardRef, RefObject, useCallback, useMemo, useRef, useState} from "react";
3
4
  import BaseSelect, {
4
5
  ActionMeta,
5
- Props as BaseSelectProps,
6
+ components as reactSelectComponents,
6
7
  createFilter,
7
8
  MenuListProps,
8
9
  MenuProps,
10
+ ControlProps,
9
11
  mergeStyles,
10
12
  MultiValue,
11
13
  MultiValueProps,
12
14
  OnChangeValue,
13
15
  OptionProps,
14
16
  OptionsOrGroups,
17
+ Props as BaseSelectProps,
15
18
  PropsValue,
16
- components as reactSelectComponents,
17
19
  SelectInstance,
18
20
  SingleValue,
19
21
  SingleValueProps,
20
22
  StylesConfig,
21
23
  } from "react-select";
22
24
  import BaseCreatableSelect, {CreatableProps} from "react-select/creatable";
23
- import {ClearIndicator, NoClearIndicator} from "./custom-select-partials/clear-indicator";
24
- import {DropdownIndicator} from "./custom-select-partials/drop-down-indicator";
25
- import {GroupHeading} from "./custom-select-partials/group-heading";
26
- import {Menu} from "./custom-select-partials/menu";
27
- import {MenuListVirtualized} from "./custom-select-partials/menu-list-virtualized";
28
- import {NoOptionsMessage} from "./custom-select-partials/no-option-message";
29
- import {Option, OptionSlow} from "./custom-select-partials/option";
25
+ import {ClearIndicator, NoClearIndicator} from "./components/clear-indicator";
26
+ import {DropdownIndicator} from "./components/drop-down-indicator";
27
+ import {GroupHeading} from "./components/group-heading";
28
+ import {Menu} from "./components/menu";
29
+ import {MenuListVirtualized} from "./components/menu-list-virtualized";
30
+ import {NoOptionsMessage} from "./components/no-option-message";
31
+ import {Option, OptionSlow} from "./components/option";
30
32
  import {useSelectControlSettings} from "./select-control-settings-context";
31
33
  import {
32
- componentsStyles,
33
- nonVirtualizedStyles,
34
- singleLineComponentsStyle,
35
- virtualizedStyles,
36
- zIndexStyles,
34
+ makeComponentsStyles,
35
+ makeNonVirtualizedStyles,
36
+ makeSingleLineStyles,
37
+ makeVirtualizedStyles,
38
+ makeZIndexStyles,
37
39
  } from "./styles";
38
40
  import {countOptions, GroupBase, ReactSelectRefContext} from "./util";
41
+ import _ from "lodash";
39
42
 
40
- export {reactSelectComponents as components, MenuListVirtualized};
41
43
  export type {
42
44
  ActionMeta,
43
45
  GroupBase,
44
46
  MenuListProps,
45
47
  MenuProps,
48
+ ControlProps,
46
49
  MultiValue,
47
50
  MultiValueProps,
48
51
  OnChangeValue,
@@ -52,89 +55,128 @@ export type {
52
55
  SingleValue,
53
56
  SingleValueProps,
54
57
  StylesConfig,
58
+ SelectInstance,
59
+ BaseSelectProps,
55
60
  };
56
61
 
57
- //Group dummy for virtualized option-lists. For performance.
62
+ export {reactSelectComponents as components, MenuListVirtualized, createFilter};
63
+
58
64
  function GroupVirtualized() {
59
65
  return null;
60
66
  }
61
- export function combineStyles<
62
- Option,
63
- IsMulti extends boolean = boolean,
64
- Group extends GroupBase<Option> = GroupBase<Option>
65
- >(stylesConfigs: StylesConfig<Option, IsMulti, Group>[]) {
66
- return stylesConfigs.reduce(mergeStyles, {});
67
- }
68
67
 
69
- export {createFilter};
68
+ export function combineStyles<T, U extends boolean, V extends GroupBase<T>>(styles: StylesConfig<T, U, V>[]) {
69
+ return styles.reduce(mergeStyles, {});
70
+ }
70
71
 
71
- export type SelectProps<
72
- Option = unknown,
73
- IsMulti extends boolean = boolean,
74
- Group extends GroupBase<Option> = GroupBase<Option>
75
- > = Omit<Omit<Omit<BaseSelectProps<Option, IsMulti, Group>, "isMulti">, "backspaceRemovesValue">, "isDisabled"> & {
72
+ export type SelectProps<T = unknown, U extends boolean = boolean, V extends GroupBase<T> = GroupBase<T>> = Omit<
73
+ Omit<Omit<BaseSelectProps<T, U, V>, "isMulti">, "backspaceRemovesValue">,
74
+ "isDisabled"
75
+ > & {
76
76
  virtualized?: boolean;
77
- isCollectionMode?: IsMulti;
77
+ isCollectionMode?: U;
78
78
  disabled?: boolean;
79
79
  forbidValuesClearInCollnMode?: boolean;
80
80
  };
81
81
 
82
- export function SingleRowSelect<
83
- Option = unknown,
84
- IsMulti extends boolean = boolean,
85
- Group extends GroupBase<Option> = GroupBase<Option>
86
- >({styles = {}, ...rest}: SelectProps<Option, IsMulti, Group>) {
87
- return (
88
- <Select<Option, IsMulti, Group>
89
- {...rest}
90
- styles={combineStyles<Option, IsMulti, Group>([
91
- singleLineComponentsStyle as unknown as StylesConfig<Option, IsMulti, Group>,
92
- styles,
93
- ])}
94
- />
95
- );
82
+ export function SingleRowSelect<T = unknown, U extends boolean = boolean, V extends GroupBase<T> = GroupBase<T>>({
83
+ styles = {},
84
+ ...rest
85
+ }: SelectProps<T, U, V>) {
86
+ return <Select<T, U, V> {...rest} styles={combineStyles([makeSingleLineStyles(), styles])} />;
96
87
  }
97
88
 
98
89
  const FAST_OPTION_USAGE_THRESHOLD = 200;
99
- /**
100
- * Draws a select input.
101
- * Please use formatOptionLabel instead of Option component override. Select has smart optimisations for large lists
102
- * those would be lost and your select slow if options are too numerous
103
- */
90
+
91
+ function useSelectComponents<T, U extends boolean, V extends GroupBase<T>>({
92
+ components,
93
+ optionsCount,
94
+ virtualized,
95
+ isCollectionMode,
96
+ forbidValuesClearInCollnMode,
97
+ }: {
98
+ components: SelectProps<T, U, V>["components"];
99
+ optionsCount: number;
100
+ virtualized: boolean;
101
+ isCollectionMode?: U;
102
+ forbidValuesClearInCollnMode?: boolean;
103
+ }) {
104
+ const shouldUseFastOption = optionsCount > FAST_OPTION_USAGE_THRESHOLD;
105
+ const shouldHideMultiValueRemove = isCollectionMode && forbidValuesClearInCollnMode;
106
+
107
+ return {
108
+ Menu,
109
+ DropdownIndicator,
110
+ ClearIndicator,
111
+ MultiValueRemove: shouldHideMultiValueRemove ? NoClearIndicator : ClearIndicator,
112
+ NoOptionsMessage,
113
+ GroupHeading,
114
+ Option: shouldUseFastOption ? Option : OptionSlow,
115
+ ...components,
116
+ Group: virtualized ? GroupVirtualized : components?.Group ? components.Group : reactSelectComponents.Group,
117
+ MenuList: virtualized
118
+ ? MenuListVirtualized
119
+ : components?.MenuList
120
+ ? components.MenuList
121
+ : reactSelectComponents.MenuList,
122
+ };
123
+ }
124
+
125
+ function useSelectStyles<T, U extends boolean, V extends GroupBase<T>>({
126
+ virtualized,
127
+ zIndex,
128
+ styles,
129
+ }: {
130
+ virtualized: boolean;
131
+ zIndex?: number;
132
+ styles?: SelectProps<T, U, V>["styles"];
133
+ }) {
134
+ return useMemo(() => {
135
+ return combineStyles<T, U, V>(
136
+ _.compact([
137
+ makeComponentsStyles<T, U, V>(),
138
+ virtualized ? makeVirtualizedStyles<T, U, V>() : makeNonVirtualizedStyles<T, U, V>(),
139
+ zIndex ? makeZIndexStyles<T, U, V>(zIndex) : null,
140
+ styles,
141
+ ])
142
+ );
143
+ }, [styles, virtualized, zIndex]);
144
+ }
145
+
104
146
  export const Select = forwardRef(function Select<
105
- Option = unknown,
106
- IsMulti extends boolean = boolean,
107
- Group extends GroupBase<Option> = GroupBase<Option>
147
+ T = unknown,
148
+ U extends boolean = boolean,
149
+ V extends GroupBase<T> = GroupBase<T>
108
150
  >(
109
151
  {
110
152
  components,
111
153
  isCollectionMode,
112
154
  menuPortalTarget,
113
155
  onKeyDown,
114
- styles = {},
156
+ styles,
115
157
  virtualized = true,
116
158
  onMenuOpen,
117
159
  onMenuClose,
118
160
  onChange,
119
161
  forbidValuesClearInCollnMode,
120
162
  ...rest
121
- }: SelectProps<Option, IsMulti, Group>,
122
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
123
- forwardedRef: any
163
+ }: SelectProps<T, U, V>,
164
+ forwardedRef: ForwardedRef<SelectInstance<T, U, V>>
124
165
  ) {
125
166
  const {getPopupContainerElement, zIndex} = useSelectControlSettings();
126
167
  const [menuOpenState, setMenuOpenState] = useState(rest.defaultMenuIsOpen);
127
- const optionsCount = useMemo(() => {
128
- return countOptions<Option, Group>(rest.options);
129
- }, [rest.options]);
168
+ const optionsCount = useMemo(() => countOptions(rest.options), [rest.options]);
169
+
130
170
  const onMenuOpenWrapped = useCallback(() => {
131
171
  setMenuOpenState(true);
132
172
  onMenuOpen && onMenuOpen();
133
173
  }, [onMenuOpen]);
174
+
134
175
  const onMenuCloseWrapped = useCallback(() => {
135
176
  setMenuOpenState(false);
136
177
  onMenuClose && onMenuClose();
137
178
  }, [onMenuClose]);
179
+
138
180
  const handleKeyDown: React.KeyboardEventHandler<HTMLInputElement> = useCallback(
139
181
  (e) => {
140
182
  switch (e.key) {
@@ -168,21 +210,24 @@ export const Select = forwardRef(function Select<
168
210
  },
169
211
  [onKeyDown, menuOpenState]
170
212
  );
171
- const combinedStyles = useMemo(() => {
172
- return combineStyles<Option, IsMulti, Group>([
173
- componentsStyles,
174
- virtualized ? virtualizedStyles : nonVirtualizedStyles,
175
- zIndex ? zIndexStyles(zIndex) : {},
176
- styles,
177
- ] as StylesConfig<Option, IsMulti, Group>[]);
178
- }, [styles, virtualized, zIndex]);
179
- const contextRef = useRef<SelectInstance<Option, IsMulti, Group> | null>(null);
180
- const combined = useComposedRefs(forwardedRef, contextRef);
213
+
214
+ const selectRef = useRef<SelectInstance<T, U, V> | null>(null);
215
+ const composedRef = useComposedRefs(forwardedRef, selectRef);
216
+
217
+ const selectComponents = useSelectComponents({
218
+ components,
219
+ optionsCount,
220
+ virtualized,
221
+ isCollectionMode,
222
+ forbidValuesClearInCollnMode,
223
+ });
224
+
225
+ const combinedStyles = useSelectStyles({virtualized, zIndex, styles});
181
226
 
182
227
  return (
183
- <ReactSelectRefContext.Provider value={contextRef as RefObject<SelectInstance>}>
184
- <BaseSelect<Option, IsMulti, Group>
185
- ref={combined}
228
+ <ReactSelectRefContext.Provider value={selectRef as RefObject<SelectInstance>}>
229
+ <BaseSelect<T, U, V>
230
+ ref={composedRef}
186
231
  // There are places, where it is useful to override menuPortalTarget globally for all selects.
187
232
  // When you are already in some popup. e.g. user input in buttons, relation filter popover.
188
233
  menuPortalTarget={getPopupContainerElement ? getPopupContainerElement() : menuPortalTarget}
@@ -191,29 +236,7 @@ export const Select = forwardRef(function Select<
191
236
  isMulti={isCollectionMode}
192
237
  backspaceRemovesValue={isCollectionMode && !forbidValuesClearInCollnMode}
193
238
  tabSelectsValue={false}
194
- components={{
195
- Menu: Menu,
196
- DropdownIndicator,
197
- ClearIndicator,
198
- /*
199
- Fast Options break option focus on hover behaviour but help with slow React Select performance with large options list.
200
- This isolates bug for big lists only
201
- Read Option definition for more info
202
- bug here: https://the.fibery.io/SoftDev/bug/Select-option-behaviour-is-incorrect-9413
203
- */
204
- MultiValueRemove: isCollectionMode && forbidValuesClearInCollnMode ? NoClearIndicator : ClearIndicator,
205
- NoOptionsMessage,
206
- GroupHeading,
207
- Option: optionsCount > FAST_OPTION_USAGE_THRESHOLD ? Option : OptionSlow,
208
- ...components,
209
- //Using dummy for virtualized lists. Virtualized lists render Groups differently (look MenuListVirtualized).
210
- Group: virtualized ? GroupVirtualized : components?.Group ? components.Group : reactSelectComponents.Group,
211
- MenuList: virtualized
212
- ? MenuListVirtualized
213
- : components?.MenuList
214
- ? components.MenuList
215
- : reactSelectComponents.MenuList,
216
- }}
239
+ components={selectComponents}
217
240
  {...rest}
218
241
  onKeyDown={handleKeyDown}
219
242
  onMenuOpen={onMenuOpenWrapped}
@@ -223,49 +246,34 @@ export const Select = forwardRef(function Select<
223
246
  />
224
247
  </ReactSelectRefContext.Provider>
225
248
  );
226
- // eslint-disable-next-line no-use-before-define
227
249
  }) as <Option = unknown, IsMulti extends boolean = boolean, Group extends GroupBase<Option> = GroupBase<Option>>(
228
- // eslint-disable-next-line no-use-before-define,@typescript-eslint/no-explicit-any
250
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
229
251
  props: SelectProps<Option, IsMulti, Group> & {ref?: any}
230
252
  ) => JSX.Element;
231
253
 
232
- export const CreatableSelect = forwardRef(CreatableSelectInner) as <
233
- Option = unknown,
234
- IsMulti extends boolean = boolean,
235
- // eslint-disable-next-line no-use-before-define
236
- Group extends GroupBase<Option> = GroupBase<Option>
237
- >(
238
- // eslint-disable-next-line no-use-before-define
239
- props: CreatableProps<Option, IsMulti, Group> & SelectProps<Option, IsMulti, Group>
240
- ) => ReturnType<typeof CreatableSelectInner>;
241
-
242
- export function CreatableSelectInner<
243
- Option = unknown,
244
- IsMulti extends boolean = boolean,
245
- Group extends GroupBase<Option> = GroupBase<Option>
246
- >(
254
+ function CreatableSelectInner<T = unknown, U extends boolean = boolean, V extends GroupBase<T> = GroupBase<T>>(
247
255
  {
248
256
  components,
249
257
  isCollectionMode,
250
258
  menuPortalTarget,
251
259
  styles = {},
252
260
  virtualized = true,
261
+ forbidValuesClearInCollnMode,
253
262
  ...rest
254
- }: CreatableProps<Option, IsMulti, Group> & SelectProps<Option, IsMulti, Group>,
255
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
256
- ref: any
263
+ }: CreatableProps<T, U, V> & SelectProps<T, U, V>,
264
+ ref: ForwardedRef<SelectInstance<T, U, V>>
257
265
  ) {
258
- const optionsCount = useMemo(() => {
259
- return countOptions<Option, Group>(rest.options);
260
- }, [rest.options]);
266
+ const optionsCount = useMemo(() => countOptions(rest.options), [rest.options]);
267
+
268
+ const selectComponents = useSelectComponents({
269
+ components,
270
+ optionsCount,
271
+ virtualized,
272
+ isCollectionMode,
273
+ forbidValuesClearInCollnMode,
274
+ });
261
275
 
262
- const combinedStyles = useMemo(() => {
263
- return combineStyles<Option, IsMulti, Group>([
264
- componentsStyles,
265
- virtualized ? virtualizedStyles : nonVirtualizedStyles,
266
- styles,
267
- ] as StylesConfig<Option, IsMulti, Group>[]);
268
- }, [styles, virtualized]);
276
+ const combinedStyles = useSelectStyles({virtualized, styles});
269
277
 
270
278
  return (
271
279
  <BaseCreatableSelect
@@ -276,30 +284,17 @@ export function CreatableSelectInner<
276
284
  isMulti={isCollectionMode}
277
285
  backspaceRemovesValue={isCollectionMode}
278
286
  tabSelectsValue={false}
279
- components={{
280
- Menu: Menu,
281
- DropdownIndicator,
282
- ClearIndicator,
283
- /*
284
- Fast Options break option focus on hover behaviour but help with slow React Select performance with large options list.
285
- This isolates bug for big lists only
286
- Read Option definition for more info
287
- bug here: https://the.fibery.io/SoftDev/bug/Select-option-behaviour-is-incorrect-9413
288
- */
289
- MultiValueRemove: ClearIndicator,
290
- NoOptionsMessage,
291
- GroupHeading,
292
- Option: optionsCount > FAST_OPTION_USAGE_THRESHOLD ? Option : OptionSlow,
293
- ...components,
294
- Group: virtualized ? GroupVirtualized : components?.Group ? components.Group : reactSelectComponents.Group,
295
- MenuList: virtualized
296
- ? MenuListVirtualized
297
- : components?.MenuList
298
- ? components.MenuList
299
- : reactSelectComponents.MenuList,
300
- }}
287
+ components={selectComponents}
301
288
  {...rest}
302
289
  isDisabled={rest.disabled}
303
290
  />
304
291
  );
305
292
  }
293
+
294
+ export const CreatableSelect = forwardRef(CreatableSelectInner) as <
295
+ T = unknown,
296
+ U extends boolean = boolean,
297
+ V extends GroupBase<T> = GroupBase<T>
298
+ >(
299
+ props: CreatableProps<T, U, V> & SelectProps<T, U, V>
300
+ ) => ReturnType<typeof CreatableSelectInner>;