@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,60 +0,0 @@
1
- import {CSSProperties, useRef} from "react";
2
- import {stopPropagation} from "@fibery/react/src/stop-propagation";
3
- import {Stack} from "./stack";
4
- import {cx} from "@linaria/core";
5
- import {hiddenCss, inputCss, textInlineCss} from "./styles";
6
- import {invalidInputClass} from "./edit-unit-styles";
7
-
8
- export const TextInlineInputWithAutosize = ({
9
- value,
10
- onFocus,
11
- onBlur,
12
- onChange,
13
- onKeyDown,
14
- autoFocus,
15
- placeholder,
16
- invalid,
17
- ...rest
18
- }: {
19
- value: string | null;
20
- onFocus?: React.FocusEventHandler<HTMLInputElement>;
21
- onBlur?: React.FocusEventHandler<HTMLInputElement>;
22
- onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
23
- onChange: (value: string | number) => void;
24
- placeholder: string;
25
- autoFocus: boolean;
26
- style?: CSSProperties;
27
- width?: number;
28
- invalid?: boolean;
29
- }) => {
30
- const inputRef = useRef<HTMLInputElement>(null);
31
-
32
- let hiddenValue = placeholder || "";
33
- if (value && value.length > hiddenValue.length - 1) {
34
- hiddenValue = value;
35
- }
36
-
37
- return (
38
- <Stack
39
- bottom={<div className={cx(inputCss, textInlineCss, hiddenCss)}>{hiddenValue}</div>}
40
- top={
41
- <input
42
- // Allow input to shrink (otherwise it has size 20 by default)
43
- size={1}
44
- autoFocus={autoFocus}
45
- ref={inputRef}
46
- value={value || ""}
47
- onFocus={onFocus}
48
- onBlur={onBlur}
49
- onChange={(e) => onChange?.(e.target.value)}
50
- onKeyDown={onKeyDown}
51
- type="text"
52
- placeholder={placeholder}
53
- onClick={stopPropagation}
54
- {...rest}
55
- className={cx(inputCss, invalid && invalidInputClass)}
56
- />
57
- }
58
- />
59
- );
60
- };
@@ -1,382 +0,0 @@
1
- import {stopPropagation} from "@fibery/react/src/stop-propagation";
2
- import {useControllableState} from "@fibery/react/src/use-controllable-state";
3
- import {usePointerDownOutside} from "@fibery/react/src/use-pointer-down-outside";
4
- import {css} from "@linaria/core";
5
- import {createPopper, Modifier, Placement, State} from "@popperjs/core";
6
- import {Options as FlipOptions} from "@popperjs/core/lib/modifiers/flip";
7
- import {Options as PreventOverflowOptions} from "@popperjs/core/lib/modifiers/preventOverflow";
8
- import cx from "classnames";
9
- import _ from "lodash";
10
- import {
11
- CSSProperties,
12
- forwardRef,
13
- MouseEvent,
14
- ReactNode,
15
- useEffect,
16
- useId,
17
- useImperativeHandle,
18
- useMemo,
19
- useRef,
20
- useState,
21
- } from "react";
22
- import {createPortal} from "react-dom";
23
- import {usePopper} from "react-popper";
24
- import {createInlineTheme, fontWeight, space, themeVars} from "../design-system";
25
- import {IconButton} from "../button/icon-button";
26
- import CloseIcon from "../icons/react/Close";
27
- import {useTheme} from "../theme-provider";
28
- import {$TSFixMe} from "../tsfixme";
29
- import {useIsPhone} from "../use-is-phone";
30
- import {usePopupModifiers} from "./popup-modifiers-context";
31
- import {getMaxSize, observeWidth} from "./modifiers";
32
- import {isElementReference, Reference} from "./reference";
33
- import {basicPopupClassName, basicPopupContainerClassName, hidePopupWhenTriggerIsHiddenClassName} from "./styles";
34
- import {usePopupStackContext} from "./popup-stack-context";
35
-
36
- export type Props = {
37
- trigger?: ReactNode;
38
- children: ReactNode;
39
- placement: Placement;
40
- open: boolean;
41
- popupStyle?: $TSFixMe;
42
- mobilePopupStyle?: CSSProperties;
43
- mobilePopupContentClassName?: string;
44
- popupClassName?: string;
45
- popupContainerClassName?: string;
46
- renderInPortal?: boolean;
47
- offset?: [number, number];
48
- disabled?: boolean;
49
- triggerDomElement?: Reference;
50
- onMouseLeave?: (e: MouseEvent<HTMLDivElement>) => void;
51
- renderBackdrop?: boolean;
52
- backdropClassName?: string;
53
- closeOnEscape?: boolean;
54
- preventOverflowOptions?: Partial<PreventOverflowOptions>;
55
- flipOptions?: Partial<FlipOptions>;
56
- additionalModifiers?: Array<Partial<Modifier<$TSFixMe, $TSFixMe>>>;
57
- hidePopupWhenTriggerIsHidden?: boolean;
58
- shrinkable?: boolean;
59
- onOpen?: () => unknown;
60
- onClose?: (event: Event) => unknown;
61
- supportMobile?: boolean;
62
- title?: string;
63
- getPopupContainer?: () => HTMLElement;
64
-
65
- /**
66
- * @deprecated
67
- * Because of openning animation popup creates new stacking context https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_positioned_layout/Understanding_z-index/Stacking_context
68
- * this might break any components that use position: fixed inside the popup (i.e. formula editor -> monaco editor)
69
- * Pass true to restore stacking context after animation is finished.
70
- *
71
- * Marked as deprecated because it's better to avoid this prop
72
- */
73
- fixStackingContextAfterOpen?: boolean;
74
- /**
75
- * ran after Popup positioned the element the first time
76
- */
77
- onFirstUpdate?: () => void;
78
- };
79
-
80
- export type {State};
81
-
82
- export type PopupApi = {popupElement: HTMLDivElement | null; update: (() => Promise<unknown>) | null};
83
-
84
- function MobilePopup({
85
- content,
86
- mobilePopupStyle,
87
- mobilePopupContentClassName,
88
- title,
89
- onClose,
90
- }: {
91
- content: ReactNode;
92
- mobilePopupStyle?: CSSProperties;
93
- mobilePopupContentClassName?: string;
94
- title: string;
95
- onClose: () => void;
96
- }) {
97
- const theme = useTheme();
98
-
99
- return createPortal(
100
- <div
101
- className={css`
102
- position: absolute;
103
- top: 0;
104
- bottom: 0;
105
- left: 0;
106
- right: 0;
107
- background: ${themeVars.actionMenuBg};
108
- z-index: 1002;
109
- display: grid;
110
- grid-template-rows: 45px 1fr;
111
- `}
112
- style={{...createInlineTheme(theme), ...mobilePopupStyle}}
113
- >
114
- <div
115
- className={css`
116
- display: flex;
117
- align-items: center;
118
- justify-content: space-between;
119
- gap: ${space.s8}px;
120
- padding: 0 ${space.s8}px 0 ${space.s12}px;
121
- `}
122
- >
123
- <div
124
- className={css`
125
- font-weight: ${fontWeight.medium};
126
- font-size: 16px;
127
- min-width: 0;
128
- overflow: hidden;
129
- text-overflow: ellipsis;
130
- `}
131
- >
132
- {title}
133
- </div>
134
- <IconButton onClick={onClose} size={"large"}>
135
- <CloseIcon />
136
- </IconButton>
137
- </div>
138
- <div
139
- className={cx(
140
- css`
141
- border-top: ${themeVars.separators.opacity5};
142
- `,
143
- mobilePopupContentClassName
144
- )}
145
- >
146
- {content}
147
- </div>
148
- </div>,
149
- document.body
150
- );
151
- }
152
-
153
- export const Popup = forwardRef<PopupApi, Props>(
154
- (
155
- {
156
- trigger,
157
- children,
158
- placement,
159
- open,
160
- popupStyle,
161
- popupContainerClassName,
162
- popupClassName,
163
- renderInPortal,
164
- offset = [0, 0],
165
- disabled = false,
166
- triggerDomElement,
167
- onMouseLeave,
168
- renderBackdrop,
169
- backdropClassName,
170
- closeOnEscape = true,
171
- preventOverflowOptions = {},
172
- flipOptions = {},
173
- additionalModifiers = [],
174
- hidePopupWhenTriggerIsHidden = true,
175
- shrinkable,
176
- onOpen = _.noop,
177
- onClose = _.noop,
178
- supportMobile = false,
179
- title = "",
180
- mobilePopupStyle,
181
- mobilePopupContentClassName,
182
- getPopupContainer: popupContainerOverride,
183
- fixStackingContextAfterOpen = false,
184
- onFirstUpdate,
185
- },
186
- ref
187
- ) => {
188
- const popupModifiers = usePopupModifiers();
189
- const getPopupContainer = popupContainerOverride ?? popupModifiers.getPopupContainer;
190
- const id = useId();
191
- const theme = useTheme();
192
- const {registerEscapeCallback, registerPopup} = usePopupStackContext();
193
- const isPhone = useIsPhone();
194
- const updateRef = useRef<(() => Promise<unknown>) | null>(null);
195
- const [triggerElement, setTriggerElement] = useControllableState<Reference>({value: triggerDomElement});
196
- const [popupElement, setPopupElement] = useState<HTMLDivElement | null>(null);
197
-
198
- const shrinkableModifiers = useMemo(() => {
199
- return shrinkable ? getMaxSize(preventOverflowOptions) : [];
200
- }, [preventOverflowOptions, shrinkable]);
201
- // migrate to floating-ui https://floating-ui.com/docs/migration
202
- const {styles, attributes, update} = usePopper(triggerElement, popupElement, {
203
- placement,
204
- onFirstUpdate,
205
- modifiers: [
206
- {
207
- name: "flip",
208
- options: {
209
- ...popupModifiers.flipOptions,
210
- ...flipOptions,
211
- },
212
- },
213
- {
214
- name: "preventOverflow",
215
- options: {
216
- tether: false,
217
- padding: space.s6,
218
- ...popupModifiers.preventOverflowOptions,
219
- ...preventOverflowOptions,
220
- },
221
- },
222
- {
223
- name: "offset",
224
- options: {
225
- offset: offset,
226
- },
227
- },
228
- observeWidth,
229
- ...shrinkableModifiers,
230
- ...additionalModifiers,
231
- ...(popupModifiers.additionalModifiers ?? []),
232
- ],
233
- });
234
- updateRef.current = update;
235
- useImperativeHandle(
236
- ref,
237
- () => {
238
- return {popupElement, update};
239
- },
240
- [popupElement, update]
241
- );
242
- useEffect(() => {
243
- let unregister: () => void;
244
- if (registerPopup && open) {
245
- unregister = registerPopup(id);
246
- }
247
- return () => {
248
- unregister?.();
249
- };
250
- }, [registerPopup, id, open]);
251
- useEffect(() => {
252
- if (triggerElement && closeOnEscape && open) {
253
- const onKeyDown = (evt: KeyboardEvent) => {
254
- if (evt.defaultPrevented) {
255
- return;
256
- }
257
- if (evt.key === "Escape") {
258
- onClose(evt);
259
- evt.preventDefault();
260
- evt.stopPropagation();
261
- }
262
- };
263
-
264
- if (registerEscapeCallback) {
265
- registerEscapeCallback(id, onKeyDown);
266
- } else {
267
- document.addEventListener("keydown", onKeyDown);
268
- }
269
-
270
- // if popup was opened but nothing was focused inside it we should catch 'Escape' key from trigger as well
271
- // otherwise it can be caught by navigation panel
272
- "addEventListener" in triggerElement && triggerElement.addEventListener("keydown", onKeyDown);
273
-
274
- return () => {
275
- if (!registerEscapeCallback) {
276
- document.removeEventListener("keydown", onKeyDown);
277
- }
278
-
279
- "removeEventListener" in triggerElement && triggerElement.removeEventListener("keydown", onKeyDown);
280
- };
281
- }
282
- // eslint-disable-next-line @typescript-eslint/no-empty-function
283
- return () => {};
284
- }, [closeOnEscape, onClose, open, triggerElement, registerEscapeCallback, id]);
285
-
286
- const {onPointerDownCapture} = usePointerDownOutside((event) => {
287
- if (!open || (isPhone && supportMobile)) {
288
- return;
289
- }
290
- const target = event.target;
291
- if (target instanceof Node) {
292
- const ignoreElements = _.compact([isElementReference(triggerElement) && triggerElement]);
293
- if (ignoreElements.some((element) => element.contains(target))) {
294
- return;
295
- }
296
- }
297
- onClose(event);
298
- });
299
-
300
- if (isPhone && supportMobile) {
301
- return open ? (
302
- <MobilePopup
303
- onClose={onClose}
304
- title={title}
305
- mobilePopupContentClassName={mobilePopupContentClassName}
306
- mobilePopupStyle={mobilePopupStyle}
307
- content={children}
308
- />
309
- ) : null;
310
- }
311
-
312
- const renderPopup = () => {
313
- return (
314
- <>
315
- {renderBackdrop && (
316
- <div
317
- id={"popup-backdrop"}
318
- data-testid={"popup-backdrop"}
319
- className={cx(
320
- backdropClassName,
321
- css`
322
- position: absolute;
323
- inset: 0;
324
- z-index: 1000;
325
- `
326
- )}
327
- />
328
- )}
329
- <div
330
- className={cx(
331
- basicPopupContainerClassName,
332
- hidePopupWhenTriggerIsHidden && hidePopupWhenTriggerIsHiddenClassName,
333
- popupContainerClassName
334
- )}
335
- onMouseLeave={onMouseLeave}
336
- ref={setPopupElement}
337
- onClick={stopPropagation}
338
- {...attributes.popper}
339
- onPointerDownCapture={onPointerDownCapture}
340
- style={{...styles.popper, ...createInlineTheme(theme), ...popupStyle}}
341
- >
342
- <div
343
- className={cx(basicPopupClassName, popupClassName)}
344
- onAnimationEnd={
345
- fixStackingContextAfterOpen
346
- ? (e) => (e.target as HTMLElement).setAttribute("data-fix-stacking-context", "")
347
- : undefined
348
- }
349
- style={popupStyle}
350
- >
351
- {children}
352
- </div>
353
- </div>
354
- </>
355
- );
356
- };
357
-
358
- // TODO: ui-kit should not know about portal container in main ui
359
- if (triggerDomElement) {
360
- return open ? (renderInPortal ? createPortal(renderPopup(), getPopupContainer()) : renderPopup()) : null;
361
- }
362
-
363
- const onMouseDown: React.MouseEventHandler<HTMLDivElement> = (e) => {
364
- if (e.button === 0) {
365
- open ? onClose(e as unknown as Event) : onOpen();
366
- }
367
- };
368
-
369
- return (
370
- <div>
371
- <div ref={setTriggerElement} onMouseDown={disabled ? undefined : onMouseDown}>
372
- {trigger}
373
- </div>
374
- {open ? (renderInPortal ? createPortal(renderPopup(), getPopupContainer()) : renderPopup()) : null}
375
- </div>
376
- );
377
- }
378
- );
379
-
380
- export {createPopper};
381
-
382
- export type {Placement};
@@ -1,5 +0,0 @@
1
- import {useIsMediaQueryMatched} from "./use-is-media-query-matched";
2
-
3
- export function useIsPhone() {
4
- return useIsMediaQueryMatched("(max-width: 420px), (max-height: 420px)");
5
- }
File without changes
File without changes
File without changes
File without changes