@fibery/ui-kit 1.29.0 → 1.29.2

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 (42) hide show
  1. package/package.json +2 -2
  2. package/src/actions-menu/actions-menu-confirmation.tsx +70 -0
  3. package/src/actions-menu/actions-menu-props.tsx +1 -0
  4. package/src/actions-menu/actions-menu-sub-command-menu.tsx +97 -142
  5. package/src/actions-menu/actions-menu-sub-menu.tsx +3 -1
  6. package/src/actions-menu/actions-menu.tsx +8 -1
  7. package/src/actions-menu/context-actions-menu.tsx +5 -1
  8. package/src/actions-menu/contexts/actions-menu-context.tsx +6 -2
  9. package/src/actions-menu/utils/insert-separators.tsx +1 -3
  10. package/src/design-system.ts +14 -11
  11. package/src/dropdown-menu/index.tsx +10 -4
  12. package/src/icons/ast/FieldUnit.ts +8 -0
  13. package/src/icons/ast/IntegrationsIntegrationDiscourseColor.ts +8 -0
  14. package/src/icons/ast/IntegrationsIntegrationIntercomColor.ts +8 -0
  15. package/src/icons/ast/IntegrationsIntegrationSlackColor.ts +8 -0
  16. package/src/icons/ast/IntegrationsIntegrationZendeskColor.ts +8 -0
  17. package/src/icons/ast/LayoutDouble.ts +8 -0
  18. package/src/icons/ast/LayoutSingle.ts +8 -0
  19. package/src/icons/ast/MoveBottom.ts +8 -0
  20. package/src/icons/ast/MoveLeft.ts +8 -0
  21. package/src/icons/ast/MoveRight.ts +8 -0
  22. package/src/icons/ast/MoveTop.ts +8 -0
  23. package/src/icons/ast/Pin.ts +8 -0
  24. package/src/icons/ast/UserRole.ts +8 -0
  25. package/src/icons/ast/index.tsx +13 -0
  26. package/src/icons/react/FieldUnit.tsx +12 -0
  27. package/src/icons/react/IntegrationsIntegrationDiscourseColor.tsx +12 -0
  28. package/src/icons/react/IntegrationsIntegrationIntercomColor.tsx +12 -0
  29. package/src/icons/react/IntegrationsIntegrationSlackColor.tsx +12 -0
  30. package/src/icons/react/IntegrationsIntegrationZendeskColor.tsx +12 -0
  31. package/src/icons/react/LayoutDouble.tsx +12 -0
  32. package/src/icons/react/LayoutSingle.tsx +12 -0
  33. package/src/icons/react/MoveBottom.tsx +12 -0
  34. package/src/icons/react/MoveLeft.tsx +12 -0
  35. package/src/icons/react/MoveRight.tsx +12 -0
  36. package/src/icons/react/MoveTop.tsx +12 -0
  37. package/src/icons/react/Pin.tsx +12 -0
  38. package/src/icons/react/UserRole.tsx +12 -0
  39. package/src/icons/react/index.tsx +13 -0
  40. package/src/item.tsx +1 -1
  41. package/src/select/select-in-popover.tsx +3 -2
  42. package/src/tooltip.tsx +3 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fibery/ui-kit",
3
- "version": "1.29.0",
3
+ "version": "1.29.2",
4
4
  "private": false,
5
5
  "files": [
6
6
  "src/antd/styles.ts",
@@ -54,7 +54,7 @@
54
54
  "chroma-js": "2.1.2",
55
55
  "chrono-node": "^2.7.5",
56
56
  "classnames": "2.3.1",
57
- "cmdk": "0.2.0",
57
+ "cmdk": "1.0.0",
58
58
  "color-hash": "1.0.3",
59
59
  "d3-shape": "1.3.7",
60
60
  "date-fns": "2.29.2",
@@ -0,0 +1,70 @@
1
+ import {css} from "@linaria/core";
2
+ import {AntModal} from "../antd/ant-modal";
3
+ import {border, space, themeVars} from "../design-system";
4
+ import {ActionsPanel} from "../actions-panel";
5
+ import {Button} from "../button";
6
+ import {useActionsMenuContext} from "./contexts/actions-menu-context";
7
+
8
+ const modalClass = css`
9
+ & .ant-modal-content {
10
+ box-shadow: ${themeVars.shadowModal};
11
+ margin-left: ${space.s6}px;
12
+ margin-right: ${space.s6}px;
13
+ background-color: ${themeVars.modalContentBg};
14
+ border-radius: ${border.radius6}px;
15
+ }
16
+ `;
17
+
18
+ export type ActionsMenuConfirmationProps = {
19
+ message: string;
20
+ onCancel?: () => void;
21
+ onConfirm: () => void;
22
+ };
23
+
24
+ export const ActionsMenuConfirmation: React.FC<ActionsMenuConfirmationProps> = ({message, onCancel, onConfirm}) => {
25
+ const {showConfirmation} = useActionsMenuContext();
26
+
27
+ // TODO: use radix dialog
28
+ return (
29
+ <AntModal
30
+ zIndex={1001} // ant vs radix -- round 1
31
+ open={true}
32
+ closable={false}
33
+ footer={null}
34
+ maskStyle={{backgroundColor: themeVars.modalBg}}
35
+ className={modalClass}
36
+ maskClosable
37
+ onCancel={() => showConfirmation(null)}
38
+ >
39
+ {message}
40
+
41
+ <div
42
+ className={css`
43
+ margin-top: ${space.s24}px;
44
+ display: flex;
45
+ gap: ${space.s6}px;
46
+ `}
47
+ >
48
+ <ActionsPanel inline>
49
+ <Button
50
+ primary
51
+ onClick={() => {
52
+ onConfirm();
53
+ showConfirmation(null);
54
+ }}
55
+ >
56
+ Proceed
57
+ </Button>
58
+ <Button
59
+ onClick={() => {
60
+ showConfirmation(null);
61
+ onCancel?.();
62
+ }}
63
+ >
64
+ Cancel
65
+ </Button>
66
+ </ActionsPanel>
67
+ </div>
68
+ </AntModal>
69
+ );
70
+ };
@@ -10,6 +10,7 @@ export type ActionsMenuProps = {
10
10
  align?: ContentProps["align"];
11
11
  disabled?: boolean;
12
12
  portalled?: boolean;
13
+ container?: HTMLElement | null | undefined;
13
14
  wide?: boolean;
14
15
  /** The controlled open state of the ActionsMenu. Must be used in conjunction with onOpenChange. */
15
16
  open?: boolean;
@@ -1,59 +1,41 @@
1
+ import {stopPropagation} from "@fibery/react/src/stop-propagation";
1
2
  import {css, cx} from "@linaria/core";
2
- import {CommandInput, CommandItem, CommandList, CommandRoot, CommandEmpty} from "cmdk";
3
- import {border, layout, space, textStyles, themeVars} from "../design-system";
4
- import Search from "../icons/react/Search";
5
- import {useActionsMenuContext} from "./contexts/actions-menu-context";
3
+ import React, {RefObject, useMemo, useRef, useState} from "react";
4
+ import {
5
+ CommandMenuEmpty,
6
+ CommandMenuGroup,
7
+ CommandMenuInput,
8
+ CommandMenuItem,
9
+ CommandMenuList,
10
+ CommandMenuRoot,
11
+ } from "../command-menu";
6
12
  import {ActionsMenuSubMenu} from "./actions-menu-sub-menu";
7
- import {styled} from "@linaria/react";
8
- import {useRef, useState} from "react";
9
- import {stopPropagation} from "@fibery/react/src/stop-propagation";
10
- /**
11
- *
12
- * Probably commands menu deserves to be extracted to a separate primitive component not connected to ActionsMenu
13
- * but for now we don't have other use cases for it so no idea how a primitive should look like
14
- *
15
- * Feel free to extract it to a separate one
16
- *
17
- */
18
-
19
- const inputContainerCss = css`
20
- display: flex;
21
- padding: ${space.s8}px ${space.s12}px;
22
- align-items: center;
23
- border-bottom: 1px solid ${themeVars.separatorColor};
24
-
25
- & input {
26
- min-width: 120px;
27
- width: 100%;
28
- color: ${themeVars.textColor};
29
- background-color: ${themeVars.transparent};
30
- margin-left: ${space.s8}px;
31
- font-size: 13px;
32
- border: none;
33
- outline: none;
34
- resize: none;
35
- }
13
+ import {useActionsMenuContext} from "./contexts/actions-menu-context";
14
+ import {createContext} from "@fibery/react/src/create-context";
15
+ import {composeEventHandlers} from "@fibery/react/src/compose-event-handlers";
36
16
 
37
- & input::placeholder {
38
- color: ${themeVars.accentTextColor};
39
- }
40
- `;
17
+ const [ActionsMenuSubCommandMenuProvider, useActionsMenuSubCommandMenuCtx] = createContext<{
18
+ subMenuOpenRef: RefObject<boolean>;
19
+ subMenuTriggerRef: RefObject<HTMLDivElement>;
20
+ }>("ActionsMenuSubCommandMenu");
41
21
 
42
22
  type ActionsMenuSubCommandMenuProps = React.PropsWithChildren<{
43
23
  trigger?: React.ReactNode;
44
24
  disabled?: boolean;
45
- filter?: React.ComponentPropsWithoutRef<typeof CommandRoot>["filter"];
46
25
  }>;
47
- export const ActionsMenuSubCommandMenu: React.FC<ActionsMenuSubCommandMenuProps> = ({
48
- disabled,
49
- trigger,
50
- filter,
51
- children,
52
- }) => {
26
+ export const ActionsMenuSubCommandMenu: React.FC<ActionsMenuSubCommandMenuProps> = ({disabled, trigger, children}) => {
53
27
  const [open, onOpenChange] = useState(false);
54
28
  const triggerRef = useRef(null);
55
29
  const openRef = useRef(false);
56
30
 
31
+ const ctx = useMemo(
32
+ () => ({
33
+ subMenuOpenRef: openRef,
34
+ subMenuTriggerRef: triggerRef,
35
+ }),
36
+ []
37
+ );
38
+
57
39
  return (
58
40
  <ActionsMenuSubMenu
59
41
  disabled={disabled}
@@ -64,126 +46,99 @@ export const ActionsMenuSubCommandMenu: React.FC<ActionsMenuSubCommandMenuProps>
64
46
  }}
65
47
  trigger={trigger}
66
48
  triggerRef={triggerRef}
49
+ contentClassName={css`
50
+ &:is(&) {
51
+ overflow: hidden;
52
+ display: flex;
53
+ flex-direction: column;
54
+ max-height: 400px; // we use fixed height instead of --radix-dropdown-menu-content-available-height because it doesn't restore well after filtering if submenu was opened near the bottom of viewport. https://the.fibery.io/SoftDev/bug/It's-impossible-to-place-cursor-in-search-input-in-Existing-views-and-Convert-to-popup-10357/comment=14877
55
+ }
56
+ `}
67
57
  >
68
- <CommandRoot
69
- filter={filter}
70
- onClick={stopPropagation}
71
- onBlur={(e) => {
72
- /**
73
- * Submenu Trigger tries to steal the focus from input on every onPointerMove
74
- * to avoid this we lock focus on input and do not let it move to back to triger while menu is still open
75
- *
76
- * We use openRef here because react state will be updated only on next render
77
- */
78
- if (openRef.current && e.target.hasAttribute("cmdk-input") && e.relatedTarget === triggerRef.current) {
79
- e.target.focus();
80
- }
81
- }}
82
- >
83
- {children}
84
- </CommandRoot>
58
+ <ActionsMenuSubCommandMenuProvider value={ctx}>{children}</ActionsMenuSubCommandMenuProvider>
85
59
  </ActionsMenuSubMenu>
86
60
  );
87
61
  };
88
62
 
89
- type ActionsMenuSubCommandMenuInputProps = {
90
- placeholder?: string;
91
- autoFocus?: boolean;
63
+ export const ActionsMenuSubCommandMenuRoot: React.FC<React.ComponentPropsWithoutRef<typeof CommandMenuRoot>> = ({
64
+ className,
65
+ onClick,
66
+ onBlur,
67
+ ...props
68
+ }) => {
69
+ const {subMenuOpenRef, subMenuTriggerRef} = useActionsMenuSubCommandMenuCtx();
70
+
71
+ return (
72
+ <CommandMenuRoot
73
+ className={cx(
74
+ css`
75
+ &:is(&) {
76
+ width: 250px;
77
+ }
78
+ `,
79
+ className
80
+ )}
81
+ onClick={composeEventHandlers(onClick, stopPropagation)}
82
+ onBlur={composeEventHandlers(onBlur, (e) => {
83
+ /**
84
+ * Submenu Trigger tries to steal the focus from input on every onPointerMove
85
+ * to avoid this we lock focus on input and do not let it move to back to triger while menu is still open
86
+ *
87
+ * setTimeout is needed for firefox https://the.fibery.io/SoftDev/bug/Automatically-place-the-cursor-in-the-search-input-in-the-list-of-spaces-in-'Move-to'-option-10524
88
+ *
89
+ * We use subMenuOpenRef here because react state will be updated only on next render. Alternatively we can try to use flushSync
90
+ */
91
+ if (
92
+ subMenuOpenRef.current &&
93
+ e.target.hasAttribute("cmdk-input") &&
94
+ e.relatedTarget === subMenuTriggerRef.current
95
+ ) {
96
+ setTimeout(() => {
97
+ e.target.focus();
98
+ }, 0);
99
+ }
100
+ })}
101
+ {...props}
102
+ />
103
+ );
92
104
  };
105
+
106
+ type ActionsMenuSubCommandMenuInputProps = React.ComponentPropsWithoutRef<typeof CommandMenuInput>;
93
107
  export const ActionsMenuSubCommandMenuInput: React.FC<ActionsMenuSubCommandMenuInputProps> = ({
94
- placeholder,
95
108
  autoFocus = true,
109
+ onKeyDown,
110
+ ...otherProps
96
111
  }) => {
97
112
  return (
98
- <div className={inputContainerCss}>
99
- <Search iconSize={16} aria-hidden />
100
- <CommandInput
101
- onKeyDown={(e) => {
102
- // prevent submenu from closing if input is not empty
103
- if ((e.target as HTMLInputElement).value.length > 0) {
104
- e.stopPropagation();
105
- }
106
- }}
107
- placeholder={placeholder}
108
- autoFocus={autoFocus}
109
- />
110
- </div>
113
+ <CommandMenuInput
114
+ onKeyDown={(e) => {
115
+ // prevent submenu from closing if input is not empty
116
+ if ((e.target as HTMLInputElement).value.length > 0 && e.key === "ArrowLeft") {
117
+ e.stopPropagation();
118
+ }
119
+ onKeyDown?.(e);
120
+ }}
121
+ autoFocus={autoFocus}
122
+ {...otherProps}
123
+ />
111
124
  );
112
125
  };
113
126
 
114
- export const ActionsMenuSubCommandMenuList = styled(CommandList)`
115
- overflow-y: scroll;
116
- width: 250px;
117
- height: var(--cmdk-list-height);
118
- max-height: 600px;
119
- transition: height 100ms ease;
120
- margin-top: ${space.s4}px;
121
- `;
122
-
123
- const commandItemCss = css`
124
- display: flex;
125
- align-items: center;
126
- gap: ${space.s6}px;
127
- padding: 0 ${space.s12}px;
128
- cursor: pointer;
129
- min-height: ${layout.menuItemHeight}px;
130
- margin: 0 ${space.s4}px;
131
-
132
- &[data-selected] {
133
- margin: 0 4px;
134
- background-color: ${themeVars.colorBgActionsMenuItemHover};
135
- border-radius: ${border.radius6}px;
136
- }
137
- `;
138
- const commandItemTitleCss = css`
139
- white-space: nowrap;
140
- text-overflow: ellipsis;
141
- overflow: hidden;
142
- `;
127
+ export const ActionsMenuSubCommandMenuList = CommandMenuList;
143
128
 
144
- type ActionsMenuSubCommandMenuItemProps = React.ComponentPropsWithoutRef<typeof CommandItem> & {
145
- icon?: React.ReactNode;
146
- };
147
-
148
- export const ActionsMenuSubCommandMenuItem: React.FC<ActionsMenuSubCommandMenuItemProps> = ({
129
+ export const ActionsMenuSubCommandMenuItem: React.FC<React.ComponentPropsWithoutRef<typeof CommandMenuItem>> = ({
149
130
  onSelect,
150
- icon,
151
- children,
152
- className,
153
131
  ...props
154
132
  }) => {
155
133
  const {close} = useActionsMenuContext();
156
- const [showTitle, setShowTitle] = useState(false);
157
-
158
134
  const onSelectItem = (value: string) => {
159
135
  onSelect?.(value);
160
136
  close();
161
137
  };
162
138
 
163
- return (
164
- <CommandItem className={cx(commandItemCss, className)} onSelect={onSelectItem} {...props}>
165
- {icon}
166
- <span
167
- title={showTitle ? (children as string) : ""}
168
- onMouseEnter={(e) => {
169
- const target = e.target as HTMLElement;
170
- if (typeof children === "string" && target.offsetWidth < target.scrollWidth) {
171
- setShowTitle(true);
172
- }
173
- }}
174
- className={commandItemTitleCss}
175
- >
176
- {children}
177
- </span>
178
- </CommandItem>
179
- );
139
+ return <CommandMenuItem onSelect={onSelectItem} {...props}></CommandMenuItem>;
180
140
  };
181
141
 
182
- export const ActionsMenuSubCommandMenuEmpty = styled(CommandEmpty)`
183
- ${textStyles.small}
184
- display: flex;
185
- align-items: center;
186
- padding: 0 ${space.s12}px;
187
- min-height: ${layout.itemHeight}px;
188
- color: ${themeVars.accentTextColor};
189
- `;
142
+ export const ActionsMenuSubCommandMenuEmpty = CommandMenuEmpty;
143
+
144
+ export const ActionsMenuSubCommandMenuGroup = CommandMenuGroup;
@@ -22,6 +22,7 @@ type Props = React.PropsWithChildren<{
22
22
  open?: boolean;
23
23
  onOpenChange?: (v: boolean) => void;
24
24
  disabled?: boolean;
25
+ contentClassName?: string;
25
26
  }>;
26
27
 
27
28
  export const ActionsMenuSubMenu: React.FC<Props> = ({
@@ -31,6 +32,7 @@ export const ActionsMenuSubMenu: React.FC<Props> = ({
31
32
  triggerRef,
32
33
  children,
33
34
  disabled = false,
35
+ contentClassName,
34
36
  }) => {
35
37
  const {MenuPrimitive} = useActionsMenuContext();
36
38
 
@@ -51,7 +53,7 @@ export const ActionsMenuSubMenu: React.FC<Props> = ({
51
53
  />
52
54
  </div>
53
55
  </MenuPrimitive.SubTrigger>
54
- <MenuPrimitive.SubContent>{children}</MenuPrimitive.SubContent>
56
+ <MenuPrimitive.SubContent className={contentClassName}>{children}</MenuPrimitive.SubContent>
55
57
  </MenuPrimitive.Sub>
56
58
  );
57
59
  };
@@ -5,6 +5,8 @@ import {ActionsMenuContextProvider} from "./contexts/actions-menu-context";
5
5
  import {ActionsMenuDangerousRowsProvider} from "./contexts/actions-menu-dangerous-rows";
6
6
  import {ActionsMenuProps} from "./actions-menu-props";
7
7
  import {preventDefault} from "@fibery/react/src/prevent-default";
8
+ import {useState} from "react";
9
+ import {ActionsMenuConfirmation, ActionsMenuConfirmationProps} from "./actions-menu-confirmation";
8
10
 
9
11
  export const preventDefaultAndStopPropagation = (event: React.MouseEvent) => {
10
12
  event.preventDefault();
@@ -27,6 +29,7 @@ export const ActionsMenu = ({
27
29
  onOpenChange,
28
30
  children,
29
31
  portalled,
32
+ container,
30
33
  disabled,
31
34
  contentStyles,
32
35
  modal,
@@ -34,9 +37,10 @@ export const ActionsMenu = ({
34
37
  sticky,
35
38
  }: ActionsMenuProps): JSX.Element => {
36
39
  const [isOpen = false, setOpen] = useControllableState({value: open, onChange: onOpenChange});
40
+ const [confirmation, setConfirmation] = useState<ActionsMenuConfirmationProps | null>(null);
37
41
 
38
42
  return (
39
- <ActionsMenuContextProvider setOpen={setOpen} MenuPrimitive={DropdownMenu}>
43
+ <ActionsMenuContextProvider setOpen={setOpen} showConfirmation={setConfirmation} MenuPrimitive={DropdownMenu}>
40
44
  <DropdownMenu.Root open={isOpen} onOpenChange={setOpen} modal={modal || false}>
41
45
  <DropdownMenu.Trigger
42
46
  // backward compatibility for dropdown styles
@@ -55,12 +59,15 @@ export const ActionsMenu = ({
55
59
  sideOffset={sideOffset}
56
60
  className={cx(wide && wideCss, contentStyles)}
57
61
  portalled={portalled}
62
+ container={container}
58
63
  collisionPadding={collisionPadding}
59
64
  onCloseAutoFocus={autoFocusOnClose ? undefined : preventDefault}
60
65
  >
61
66
  <ActionsMenuDangerousRowsProvider open={isOpen}>{children}</ActionsMenuDangerousRowsProvider>
62
67
  </DropdownMenu.Content>
63
68
  </DropdownMenu.Root>
69
+
70
+ {confirmation ? <ActionsMenuConfirmation {...confirmation} /> : null}
64
71
  </ActionsMenuContextProvider>
65
72
  );
66
73
  };
@@ -5,6 +5,8 @@ import * as ContextMenu from "../context-menu";
5
5
  import {ActionsMenuDangerousRowsProvider} from "./contexts/actions-menu-dangerous-rows";
6
6
  import {ActionsMenuProps} from "./actions-menu-props";
7
7
  import {preventDefault} from "@fibery/react/src/prevent-default";
8
+ import {ActionsMenuConfirmation, ActionsMenuConfirmationProps} from "./actions-menu-confirmation";
9
+ import {useState} from "react";
8
10
 
9
11
  export const ContextActionsMenu = ({
10
12
  open,
@@ -15,9 +17,10 @@ export const ContextActionsMenu = ({
15
17
  autoFocusOnClose = true,
16
18
  }: ActionsMenuProps): JSX.Element => {
17
19
  const [isOpen = false, setOpen] = useControllableState({value: open, onChange: onOpenChange});
20
+ const [confirmation, setConfirmation] = useState<ActionsMenuConfirmationProps | null>(null);
18
21
 
19
22
  return (
20
- <ActionsMenuContextProvider setOpen={setOpen} MenuPrimitive={ContextMenu}>
23
+ <ActionsMenuContextProvider setOpen={setOpen} showConfirmation={setConfirmation} MenuPrimitive={ContextMenu}>
21
24
  <ContextMenu.Root onOpenChange={onOpenChange}>
22
25
  <ContextMenu.Trigger disabled={disabled} asChild>
23
26
  {trigger}
@@ -28,6 +31,7 @@ export const ContextActionsMenu = ({
28
31
  </ContextMenu.Content>
29
32
  </ContextMenu.Portal>
30
33
  </ContextMenu.Root>
34
+ {confirmation ? <ActionsMenuConfirmation {...confirmation} /> : null}
31
35
  </ActionsMenuContextProvider>
32
36
  );
33
37
  };
@@ -1,5 +1,6 @@
1
1
  import {createContext} from "@fibery/react/src/create-context";
2
2
  import {useMemo} from "react";
3
+ import {ActionsMenuConfirmationProps} from "../actions-menu-confirmation";
3
4
 
4
5
  type MenuPrimitive = {
5
6
  Item: React.ElementType;
@@ -13,6 +14,7 @@ type MenuPrimitive = {
13
14
 
14
15
  type ActionsMenuContext = {
15
16
  close: () => void;
17
+ showConfirmation: (args: ActionsMenuConfirmationProps | null) => void;
16
18
  MenuPrimitive: MenuPrimitive;
17
19
  };
18
20
 
@@ -20,16 +22,18 @@ const [Provider, useContext] = createContext<ActionsMenuContext>("ActionsMenuCon
20
22
 
21
23
  type Props = React.PropsWithChildren<{
22
24
  setOpen: (value: boolean) => void;
25
+ showConfirmation: (args: ActionsMenuConfirmationProps | null) => void;
23
26
  MenuPrimitive: MenuPrimitive;
24
27
  }>;
25
28
 
26
- export const ActionsMenuContextProvider: React.FC<Props> = ({setOpen, MenuPrimitive, children}) => {
29
+ export const ActionsMenuContextProvider: React.FC<Props> = ({setOpen, showConfirmation, MenuPrimitive, children}) => {
27
30
  const context = useMemo<ActionsMenuContext>(
28
31
  () => ({
29
32
  close: () => setOpen(false),
30
33
  MenuPrimitive,
34
+ showConfirmation,
31
35
  }),
32
- [setOpen, MenuPrimitive]
36
+ [MenuPrimitive, showConfirmation, setOpen]
33
37
  );
34
38
 
35
39
  return <Provider value={context}>{children}</Provider>;
@@ -9,8 +9,7 @@ import {ActionsMenuSeparator} from "../actions-menu-separator";
9
9
  */
10
10
  export const insertSeparators = (sections: (React.ReactNode[] | React.ReactNode)[]) => {
11
11
  const nodes: React.ReactNode[] = [];
12
-
13
- sections.forEach((section, idx) => {
12
+ sections.filter(Boolean).forEach((section, idx) => {
14
13
  if (Array.isArray(section)) {
15
14
  const filtered = section.filter(Boolean);
16
15
  if (nodes.length > 0 && filtered.length > 0) {
@@ -23,6 +22,5 @@ export const insertSeparators = (sections: (React.ReactNode[] | React.ReactNode)
23
22
  nodes.push(section);
24
23
  }
25
24
  });
26
-
27
25
  return nodes;
28
26
  };
@@ -105,7 +105,7 @@ const brandColors = {
105
105
  } as const;
106
106
 
107
107
  export const getDarkenColor = _.memoize((color: string): string => {
108
- return makeChromaColor(color).darken(0.6).css();
108
+ return makeChromaColor(color).darken(0.5).desaturate(0.8).css();
109
109
  });
110
110
 
111
111
  export const themeColors = {
@@ -114,6 +114,7 @@ export const themeColors = {
114
114
  stateColors: [stateColors, stateColors],
115
115
  colorAI: ["hsla(271, 57%, 61%, 1)", "hsla(272, 43%, 50%, 1)"],
116
116
  colorBgAI: ["hsla(271, 57%, 61%, 0.1)", "hsla(272, 43%, 50%, 0.1)"],
117
+ colorSubtleBgAI: ["hsla(271, 57%, 61%, 0.05)", "hsla(272, 43%, 50%, 0.1)"],
117
118
  actionMenuShadow: [
118
119
  `0 0 0 1px ${getOpacities(slate.slate10).opacity10}, 0 12px 16px -4px ${getOpacities(slate.slate10).opacity30}`,
119
120
  `0 0 0 1px ${getOpacities(slateDark.slate1).opacity10}, 0 12px 16px -4px ${
@@ -142,23 +143,24 @@ export const themeColors = {
142
143
  `blur(24px) saturate(190%) contrast(50%) brightness(130%)`,
143
144
  `blur(24px) saturate(180%) contrast(60%) brightness(70%)`,
144
145
  ],
145
- primaryBlue: [indigo.indigo9, indigoDark.indigo10],
146
+ primaryBlue: [indigo.indigo9, indigoDark.indigo9],
146
147
  whiteColor: [whiteA.whiteA0, whiteA.whiteA0],
147
148
  blackColor: [blackA.blackA0, blackA.blackA0],
148
- mainBg: [slate.slate2, slateDark.slate1],
149
+ mainBg: [slate.slate3, slateDark.slate1],
149
150
  panelBg: [whiteA.whiteA0, slateDark.slate2],
150
151
  panelContentBg: [slate.slate2, slateDark.slate2],
152
+ colorBgRelationContainer: [slate.slate2, slateDark.slate1],
151
153
  pageBg: [whiteA.whiteA0, slateDark.slate1],
152
154
  pageContentBg: [whiteA.whiteA0, slateDark.slate2],
153
155
  colorBgPopup: [whiteA.whiteA0, slateDark.slate4],
154
156
  colorBgSidebar: [whiteA.whiteA0, slateDark.slate3],
155
- menuBg: [slate.slate2, slateDark.slate2],
157
+ menuBg: [slate.slate3, slateDark.slate1],
156
158
  menuTextColor: [slate.slate12, slate.slate8],
157
- menuItemHoverColor: [slate.slate4, slateDark.slate6],
159
+ menuItemHoverColor: [slate.slate5, slateDark.slate6],
158
160
  menuSelectedTextColor: [slate.slate2, slate.slate2],
159
161
  menuFooterColor: [getOpacities(whiteA.whiteA0).opacity20, getOpacities(slateDark.slate3).opacity40],
160
162
  menuFooterHoverColor: [getOpacities(whiteA.whiteA0).opacity60, slateDark.slate4],
161
- menuIconColor: [getOpacities(slate.slate10).opacity90, getOpacities(slate.slate10).opacity90],
163
+ menuIconColor: [getOpacities(slate.slate11).opacity90, getOpacities(slateDark.slate11).opacity90],
162
164
  menuSelectedIconColor: [getOpacities(slate.slate1).opacity90, getOpacities(slate.slate1).opacity90],
163
165
  textColor: [slateDark.slate3, slate.slate6],
164
166
  textSelectionColor: [getOpacities(blue.blue10).opacity20, getOpacities(blueDark.blue10).opacity40],
@@ -229,7 +231,7 @@ export const themeColors = {
229
231
  `0 0 0 3px ${getOpacities(red.red11).opacity25}`,
230
232
  `0 0 0 3px ${getOpacities(red.red7).opacity25}`,
231
233
  ],
232
- buttonPrimaryColor: [indigo.indigo10, indigoDark.indigo10],
234
+ buttonPrimaryColor: [indigo.indigo9, indigoDark.indigo9],
233
235
  buttonColor: [slate.slate10, slateDark.slate10],
234
236
  buttonPrimaryTextColor: [slate.slate2, slate.slate6],
235
237
  checkboxColor: [slate.slate10, slateDark.slate10],
@@ -262,7 +264,7 @@ export const themeColors = {
262
264
  iconColor: [slate.slate10, slateDark.slate10],
263
265
  appIconColor: [getOpacities(slate.slate2).opacity90, getOpacities(slate.slate2).opacity70],
264
266
  appIconBgColor: [getOpacities(slate.slate1).opacity90, getOpacities(slate.slate2).opacity50],
265
- mentionBgColor: [slate.slate3, slateDark.slate5],
267
+ mentionBgColor: [getOpacities(slate.slate7).opacity30, getOpacities(slateDark.slate7).opacity40],
266
268
  colorBgSelectMenu: [slate.slate1, slateDark.slate3],
267
269
  shadowSelectMenu: [
268
270
  `0 0 0 1px ${getOpacities(slate.slate10).opacity10}, 0 12px 16px -4px ${getOpacities(slate.slate10).opacity30}`,
@@ -366,14 +368,14 @@ export const themeColors = {
366
368
  opacityMenuItemDragged: [`${opacity.opacity40}`, `${opacity.opacity40}`],
367
369
  colorBgMenuItemSelectedDragged: [indigo.indigo6, indigoDark.indigo6],
368
370
  // Default
369
- colorTextMenuItem: [slate.slate12, slateDark.slate12],
371
+ colorTextMenuItem: [slate.slate12, getOpacities(slateDark.slate12).opacity90],
370
372
  colorBgMenuItem: [transparent, transparent],
371
373
  // :hover
372
- colorBgMenuItemHover: [slate.slate4, slateDark.slate4],
374
+ colorBgMenuItemHover: [slate.slate5, slateDark.slate4],
373
375
  // :focus
374
376
  colorBgMenuItemFocus: [slate.slate6, slateDark.slate6],
375
377
  // Selected
376
- colorBgMenuItemSelected: [indigo.indigo4, indigoDark.indigo4],
378
+ colorBgMenuItemSelected: [indigo.indigo5, indigoDark.indigo4],
377
379
  // :hover
378
380
  colorBgMenuItemSelectedHover: [indigo.indigo6, indigoDark.indigo6],
379
381
  // :focus, :focus:hover
@@ -469,6 +471,7 @@ export const themeColors = {
469
471
  progressBarBg: [getOpacities(indigo.indigo9).opacity25, getOpacities(indigoDark.indigo10).opacity25],
470
472
  searchFiltersBg: [slate.slate1, slateDark.slate2],
471
473
  colorPickerSwatchBorder: [blackA.blackA7, blackA.blackA7],
474
+ colorBorderRichTextMedia: [blackA.blackA7, blackA.blackA7],
472
475
  richTextTableBorder: [blackA.blackA5, whiteA.whiteA7],
473
476
  gridHeaderBgColor: [slate.slate2, slateDark.slate3],
474
477
  gridHeaderHoverBgColor: [slate.slate3, slateDark.slate4],
@@ -98,6 +98,7 @@ const dropdownMenuContentStyles = css`
98
98
  export type ContentProps = DropdownMenuPrimitive.DropdownMenuContentProps & {
99
99
  /* render content in portal. NOTE: Changing this prop will lead to re-mount */
100
100
  portalled?: boolean;
101
+ container?: HTMLElement | null | undefined;
101
102
  collisionPadding?: number;
102
103
  };
103
104
 
@@ -111,11 +112,11 @@ const onContentKeyDown = (e: React.KeyboardEvent) => {
111
112
  };
112
113
 
113
114
  export const Content = forwardRef<HTMLDivElement, ContentProps>(function DropdownMenuContent(
114
- {className, portalled = true, collisionPadding = space.s12, ...rest},
115
+ {className, portalled = true, container, collisionPadding = space.s12, ...rest},
115
116
  ref
116
117
  ) {
117
118
  return (
118
- <Wrap if={portalled} with={DropdownMenuPrimitive.Portal}>
119
+ <Wrap if={portalled} with={DropdownMenuPrimitive.Portal} container={container}>
119
120
  <DropdownMenuPrimitive.Content
120
121
  onKeyDown={onContentKeyDown}
121
122
  ref={ref}
@@ -133,10 +134,15 @@ export const Content = forwardRef<HTMLDivElement, ContentProps>(function Dropdow
133
134
  export const Sub = DropdownMenuPrimitive.Sub;
134
135
 
135
136
  export const SubContent = forwardRef<HTMLDivElement, DropdownMenuPrimitive.DropdownMenuSubContentProps>(
136
- function DropdownMenuSubContent({className, ...rest}, ref) {
137
+ function DropdownMenuSubContent({className, collisionPadding = space.s12, ...rest}, ref) {
137
138
  return (
138
139
  <DropdownMenuPrimitive.Portal>
139
- <DropdownMenuPrimitive.SubContent ref={ref} className={cx(dropdownMenuContentStyles, className)} {...rest} />
140
+ <DropdownMenuPrimitive.SubContent
141
+ ref={ref}
142
+ className={cx(dropdownMenuContentStyles, className)}
143
+ collisionPadding={collisionPadding}
144
+ {...rest}
145
+ />
140
146
  </DropdownMenuPrimitive.Portal>
141
147
  );
142
148
  }
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const FieldUnit: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M3.825 12.6A2.025 2.025 0 0 1 1.8 10.575v-3.15c0-1.118.907-2.025 2.025-2.025h10.35c1.118 0 2.025.907 2.025 2.025v3.15a2.025 2.025 0 0 1-2.025 2.025H3.825Zm0-1.35a.675.675 0 0 1-.675-.675v-3.15c0-.373.302-.675.675-.675h10.35c.373 0 .675.302.675.675v3.15a.675.675 0 0 1-.675.675H3.825ZM8.55 9c0-.373.302-.675.675-.675h3.15a.675.675 0 1 1 0 1.35h-3.15A.675.675 0 0 1 8.55 9ZM5.925 7.575a1.425 1.425 0 1 0 0 2.85 1.425 1.425 0 0 0 0-2.85Z"},"children":[]}],"metadata":""}]},"name":"field-unit"};
7
+
8
+ export default FieldUnit;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const IntegrationsIntegrationDiscourseColor: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"width":20,"height":20,"fill":"none"},"children":[{"type":"element","tagName":"path","properties":{"d":"M10.067 2.223c-4.261 0-7.844 3.452-7.844 7.712v7.987l7.842-.007c4.259 0 7.713-3.586 7.713-7.845 0-4.258-3.457-7.847-7.711-7.847Z","fill":"#231F20"},"children":[]},{"type":"element","tagName":"path","properties":{"d":"M10.143 5.208a4.782 4.782 0 0 0-4.203 7.058l-.865 2.783 3.106-.702a4.782 4.782 0 1 0 1.967-9.139h-.005Z","fill":"#FFF9AE"},"children":[]},{"type":"element","tagName":"path","properties":{"d":"M13.936 7.08a4.779 4.779 0 0 1-5.755 7.259l-3.106.71 3.162-.373a4.778 4.778 0 0 0 5.698-7.597h.001Z","fill":"#00AEEF"},"children":[]},{"type":"element","tagName":"path","properties":{"d":"M13.056 6.198a4.78 4.78 0 0 1-4.965 7.82L5.075 15.05l3.106-.703a4.779 4.779 0 0 0 4.875-8.149Z","fill":"#00A94F"},"children":[]},{"type":"element","tagName":"path","properties":{"d":"M6.226 12.372a4.78 4.78 0 0 1 7.713-5.293 4.78 4.78 0 0 0-7.999 5.187l-.865 2.783 1.151-2.677Z","fill":"#F15D22"},"children":[]},{"type":"element","tagName":"path","properties":{"d":"M5.94 12.266a4.78 4.78 0 0 1 7.115-6.067 4.781 4.781 0 0 0-7.41 5.993l-.569 2.858.864-2.784Z","fill":"#E31B23"},"children":[]}],"metadata":""}]},"name":"integrations-integration-discourse-color"};
7
+
8
+ export default IntegrationsIntegrationDiscourseColor;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const IntegrationsIntegrationIntercomColor: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"width":20,"height":20,"fill":"none"},"children":[{"type":"element","tagName":"path","properties":{"d":"M15.704 10.775a.519.519 0 0 1-1.037 0V6.112a.519.519 0 0 1 1.037 0v4.663Zm-.18 3.246c-.08.068-2.002 1.68-5.524 1.68-3.521 0-5.442-1.612-5.522-1.68a.519.519 0 0 1 .674-.789c.03.026 1.745 1.432 4.849 1.432 3.142 0 4.83-1.416 4.847-1.43a.518.518 0 1 1 .675.787ZM4.296 6.11a.519.519 0 0 1 1.037 0v4.664a.518.518 0 0 1-1.037 0V6.112Zm2.592-1.037a.519.519 0 0 1 1.037 0v6.928a.519.519 0 0 1-1.037 0V5.075Zm2.593-.262a.518.518 0 1 1 1.037 0v7.519a.52.52 0 0 1-1.037 0V4.812Zm2.593.262a.519.519 0 0 1 1.037 0v6.928a.518.518 0 0 1-1.037 0V5.075Zm3.759-2.851H4.167c-1.074 0-1.944.87-1.944 1.944v11.667c0 1.074.87 1.944 1.944 1.944h11.667c1.074 0 1.944-.87 1.944-1.944V4.167c0-1.074-.87-1.944-1.944-1.944Z","fill":"#1F8DED"},"children":[]}],"metadata":""}]},"name":"integrations-integration-intercom-color"};
7
+
8
+ export default IntegrationsIntegrationIntercomColor;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const IntegrationsIntegrationSlackColor: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"width":20,"height":20,"fill":"none"},"children":[{"type":"element","tagName":"path","properties":{"d":"M5.222 12.052c0 .9-.734 1.634-1.634 1.634-.9 0-1.634-.735-1.634-1.634 0-.9.735-1.634 1.634-1.634h1.634v1.634ZM6.046 12.052c0-.9.735-1.634 1.634-1.634.9 0 1.634.735 1.634 1.634v4.092c0 .899-.735 1.634-1.634 1.634-.9 0-1.634-.735-1.634-1.634v-4.092Z","fill":"#E01E5A"},"children":[]},{"type":"element","tagName":"path","properties":{"d":"M7.68 5.49c-.9 0-1.634-.734-1.634-1.633 0-.9.735-1.634 1.634-1.634.9 0 1.634.734 1.634 1.634V5.49H7.68ZM7.68 6.314c.9 0 1.634.735 1.634 1.635 0 .899-.735 1.634-1.634 1.634H3.588c-.9 0-1.634-.735-1.634-1.634 0-.9.735-1.635 1.634-1.635H7.68Z","fill":"#36C5F0"},"children":[]},{"type":"element","tagName":"path","properties":{"d":"M14.241 7.949c0-.9.735-1.635 1.634-1.635.9 0 1.634.735 1.634 1.635 0 .899-.734 1.634-1.634 1.634h-1.634V7.949ZM13.418 7.948c0 .9-.735 1.634-1.634 1.634-.9 0-1.635-.734-1.635-1.634V3.857c0-.9.735-1.634 1.635-1.634.899 0 1.634.734 1.634 1.634v4.091Z","fill":"#2EB67D"},"children":[]},{"type":"element","tagName":"path","properties":{"d":"M11.784 14.51c.899 0 1.634.735 1.634 1.634 0 .9-.735 1.634-1.634 1.634-.9 0-1.635-.735-1.635-1.634V14.51h1.635ZM11.784 13.686c-.9 0-1.635-.735-1.635-1.634 0-.9.735-1.634 1.635-1.634h4.091c.9 0 1.634.735 1.634 1.634 0 .9-.735 1.634-1.634 1.634h-4.091Z","fill":"#ECB22E"},"children":[]}],"metadata":""}]},"name":"integrations-integration-slack-color"};
7
+
8
+ export default IntegrationsIntegrationSlackColor;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const IntegrationsIntegrationZendeskColor: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"width":20,"height":20,"fill":"none"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M9.14 7.21v8.7H1.954l7.186-8.7ZM9.14 4.089a3.598 3.598 0 0 1-3.593 3.603 3.597 3.597 0 0 1-3.593-3.603H9.14ZM10.324 15.91a3.598 3.598 0 0 1 3.593-3.602 3.597 3.597 0 0 1 3.593 3.603h-7.186ZM10.324 12.788v-8.7h7.186l-7.186 8.7Z","fill":"#03363D"},"children":[]}],"metadata":""}]},"name":"integrations-integration-zendesk-color"};
7
+
8
+ export default IntegrationsIntegrationZendeskColor;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const LayoutDouble: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M4.25 4.5a.75.75 0 0 0-.75.75v9.5c0 .414.336.75.75.75h11.5a.75.75 0 0 0 .75-.75v-9.5a.75.75 0 0 0-.75-.75H4.25ZM2 5.25A2.25 2.25 0 0 1 4.25 3h11.5A2.25 2.25 0 0 1 18 5.25v9.5A2.25 2.25 0 0 1 15.75 17H4.25A2.25 2.25 0 0 1 2 14.75v-9.5ZM12.75 6a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5ZM12 9.75a.75.75 0 0 1 .75-.75h1.5a.75.75 0 0 1 0 1.5h-1.5a.75.75 0 0 1-.75-.75ZM5.5 6a.5.5 0 0 0-.5.5v7a.5.5 0 0 0 .5.5H10a.5.5 0 0 0 .5-.5v-7A.5.5 0 0 0 10 6H5.5Z"},"children":[]}],"metadata":""}]},"name":"layout-double"};
7
+
8
+ export default LayoutDouble;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const LayoutSingle: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M4.25 4.5a.75.75 0 0 0-.75.75v9.5c0 .414.336.75.75.75h11.5a.75.75 0 0 0 .75-.75v-9.5a.75.75 0 0 0-.75-.75H4.25ZM2 5.25A2.25 2.25 0 0 1 4.25 3h11.5A2.25 2.25 0 0 1 18 5.25v9.5A2.25 2.25 0 0 1 15.75 17H4.25A2.25 2.25 0 0 1 2 14.75v-9.5Zm3 1.5A.75.75 0 0 1 5.75 6h2.5a.75.75 0 0 1 0 1.5h-2.5A.75.75 0 0 1 5 6.75ZM5.5 9a.5.5 0 0 0-.5.5v4a.5.5 0 0 0 .5.5h9a.5.5 0 0 0 .5-.5v-4a.5.5 0 0 0-.5-.5h-9Z"},"children":[]}],"metadata":""}]},"name":"layout-single"};
7
+
8
+ export default LayoutSingle;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const MoveBottom: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M5.175 16.65a2.025 2.025 0 0 1-2.025-2.025v-3.15c0-1.118.907-2.025 2.025-2.025h8.55c1.118 0 2.025.907 2.025 2.025v3.15a2.025 2.025 0 0 1-2.025 2.025h-8.55ZM4.5 14.625c0 .373.302.675.675.675h8.55a.675.675 0 0 0 .675-.675v-3.15a.675.675 0 0 0-.675-.675h-8.55a.675.675 0 0 0-.675.675v3.15ZM6.948 4.248a.675.675 0 0 1 .954 0L9 5.345v-3.32a.675.675 0 0 1 1.35 0v3.32l1.098-1.097a.675.675 0 0 1 .954.954l-2.25 2.25a.675.675 0 0 1-.954 0l-2.25-2.25a.675.675 0 0 1 0-.954Z"},"children":[]}],"metadata":""}]},"name":"move-bottom"};
7
+
8
+ export default MoveBottom;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const MoveLeft: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M1.8 4.725c0-1.118.907-2.025 2.025-2.025h3.15C8.093 2.7 9 3.607 9 4.725v8.55A2.025 2.025 0 0 1 6.975 15.3h-3.15A2.025 2.025 0 0 1 1.8 13.275v-8.55Zm2.025-.675a.675.675 0 0 0-.675.675v8.55c0 .373.302.675.675.675h3.15a.675.675 0 0 0 .675-.675v-8.55a.675.675 0 0 0-.675-.675h-3.15Zm10.377 2.448a.675.675 0 0 1 0 .954L13.105 8.55h3.32a.675.675 0 1 1 0 1.35h-3.32l1.097 1.098a.675.675 0 0 1-.954.954l-2.25-2.25a.675.675 0 0 1 0-.954l2.25-2.25a.675.675 0 0 1 .954 0Z"},"children":[]}],"metadata":""}]},"name":"move-left"};
7
+
8
+ export default MoveLeft;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const MoveRight: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M9 4.725C9 3.607 9.907 2.7 11.025 2.7h3.15c1.118 0 2.025.907 2.025 2.025v8.55a2.025 2.025 0 0 1-2.025 2.025h-3.15A2.025 2.025 0 0 1 9 13.275v-8.55Zm2.025-.675a.675.675 0 0 0-.675.675v8.55c0 .373.302.675.675.675h3.15a.675.675 0 0 0 .675-.675v-8.55a.675.675 0 0 0-.675-.675h-3.15Zm-7.227 7.902c.263.264.69.264.954 0l2.25-2.25a.675.675 0 0 0 0-.954l-2.25-2.25a.675.675 0 1 0-.954.954L4.895 8.55h-3.32a.675.675 0 0 0 0 1.35h3.32l-1.097 1.098a.675.675 0 0 0 0 .954Z"},"children":[]}],"metadata":""}]},"name":"move-right"};
7
+
8
+ export default MoveRight;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const MoveTop: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M4.275 8.55A2.025 2.025 0 0 1 2.25 6.525v-3.15c0-1.118.907-2.025 2.025-2.025h8.55c1.118 0 2.025.907 2.025 2.025v3.15a2.025 2.025 0 0 1-2.025 2.025h-8.55ZM3.6 6.525c0 .373.302.675.675.675h8.55a.675.675 0 0 0 .675-.675v-3.15a.675.675 0 0 0-.675-.675h-8.55a.675.675 0 0 0-.675.675v3.15Zm7.902 7.227a.675.675 0 0 0 0-.954l-2.25-2.25a.675.675 0 0 0-.954 0l-2.25 2.25a.675.675 0 0 0 .954.954L8.1 12.654v3.32a.675.675 0 1 0 1.35 0v-3.32l1.098 1.098a.675.675 0 0 0 .954 0Z"},"children":[]}],"metadata":""}]},"name":"move-top"};
7
+
8
+ export default MoveTop;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const Pin: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M11.254 1.8a.692.692 0 0 1 .513.198l4.232 4.165a.67.67 0 0 1-.041.992l-3.71 3.097.246 2.342a.669.669 0 0 1-.197.547l-1.228 1.208a.694.694 0 0 1-.97 0l-2.724-2.68-4.404 4.333a.694.694 0 0 1-.97 0 .667.667 0 0 1 0-.954l4.404-4.334-2.957-2.91a.67.67 0 0 1 0-.955l1.228-1.208a.692.692 0 0 1 .556-.194l2.379.243 3.147-3.652a.69.69 0 0 1 .496-.237Zm.07 1.67L8.422 6.835a.692.692 0 0 1-.594.234l-2.414-.246-.512.503 5.681 5.591.512-.503-.25-2.377a.67.67 0 0 1 .238-.585L14.503 6.6l-3.18-3.129Z"},"children":[]}],"metadata":""}]},"name":"pin"};
7
+
8
+ export default Pin;
@@ -0,0 +1,8 @@
1
+
2
+ // This icon file is generated automatically.
3
+
4
+ import { IconDefinition } from '../types';
5
+
6
+ const UserRole: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","clipRule":"evenodd","d":"M6.804 1.75h6.392c.442 0 .818 0 1.126.025.325.027.64.085.942.238.455.232.824.602 1.056 1.057.154.301.212.617.238.94.025.31.025.686.025 1.127v9.726c0 .441 0 .817-.025 1.126-.026.324-.084.64-.238.941a2.417 2.417 0 0 1-1.056 1.057c-.302.153-.617.211-.942.238-.308.025-.684.025-1.126.025H6.804c-.442 0-.818 0-1.126-.025-.325-.027-.64-.085-.942-.238A2.417 2.417 0 0 1 3.68 16.93c-.154-.302-.212-.618-.238-.942-.025-.309-.025-.685-.025-1.126V5.137c0-.441 0-.817.025-1.126.026-.324.084-.64.238-.941a2.417 2.417 0 0 1 1.056-1.057c.302-.153.617-.211.942-.238.308-.025.684-.025 1.126-.025ZM5.8 3.27c-.232.02-.328.052-.383.08a.917.917 0 0 0-.4.4c-.028.055-.061.152-.08.383-.02.24-.02.555-.02 1.034v9.666c0 .48 0 .794.02 1.034.019.232.052.328.08.383a.917.917 0 0 0 .4.4c.055.028.151.06.383.08.24.02.554.02 1.033.02h6.334c.479 0 .793 0 1.033-.02.232-.02.328-.052.383-.08a.917.917 0 0 0 .4-.4c.028-.055.061-.151.08-.383.02-.24.02-.555.02-1.034V5.167c0-.48 0-.794-.02-1.034-.019-.231-.052-.328-.08-.382a.917.917 0 0 0-.4-.401c-.055-.028-.151-.06-.383-.08-.24-.02-.554-.02-1.033-.02H6.833c-.479 0-.793 0-1.033.02ZM7.583 5a.75.75 0 0 1 .75-.75h3.334a.75.75 0 0 1 0 1.5H8.333a.75.75 0 0 1-.75-.75Zm.834 4.167a1.583 1.583 0 1 1 3.166 0 1.583 1.583 0 0 1-3.166 0ZM10 13.25c-.982 0-1.64.563-1.772 1.098a.75.75 0 0 1-1.456-.362c.34-1.368 1.742-2.236 3.228-2.236 1.486 0 2.888.868 3.228 2.236a.75.75 0 0 1-1.456.362c-.133-.535-.79-1.098-1.772-1.098Z"},"children":[]}],"metadata":""}]},"name":"user-role"};
7
+
8
+ export default UserRole;
@@ -83,6 +83,7 @@ export { default as FavoritesChecked } from './FavoritesChecked';
83
83
  export { default as FavoritesOff } from './FavoritesOff';
84
84
  export { default as Favorites } from './Favorites';
85
85
  export { default as FiberyMono } from './FiberyMono';
86
+ export { default as FieldUnit } from './FieldUnit';
86
87
  export { default as Fields } from './Fields';
87
88
  export { default as Figma } from './Figma';
88
89
  export { default as FileUpload } from './FileUpload';
@@ -107,10 +108,16 @@ export { default as ImageXmark } from './ImageXmark';
107
108
  export { default as Import } from './Import';
108
109
  export { default as InfoCircleFilled } from './InfoCircleFilled';
109
110
  export { default as Integration } from './Integration';
111
+ export { default as IntegrationsIntegrationDiscourseColor } from './IntegrationsIntegrationDiscourseColor';
112
+ export { default as IntegrationsIntegrationIntercomColor } from './IntegrationsIntegrationIntercomColor';
113
+ export { default as IntegrationsIntegrationSlackColor } from './IntegrationsIntegrationSlackColor';
114
+ export { default as IntegrationsIntegrationZendeskColor } from './IntegrationsIntegrationZendeskColor';
110
115
  export { default as InvitePeople } from './InvitePeople';
111
116
  export { default as Items } from './Items';
112
117
  export { default as Jira } from './Jira';
113
118
  export { default as Lab } from './Lab';
119
+ export { default as LayoutDouble } from './LayoutDouble';
120
+ export { default as LayoutSingle } from './LayoutSingle';
114
121
  export { default as LeftPanel } from './LeftPanel';
115
122
  export { default as Levels } from './Levels';
116
123
  export { default as LineDivider } from './LineDivider';
@@ -128,6 +135,10 @@ export { default as Mixpanel } from './Mixpanel';
128
135
  export { default as Monitor } from './Monitor';
129
136
  export { default as MoreCompact } from './MoreCompact';
130
137
  export { default as More } from './More';
138
+ export { default as MoveBottom } from './MoveBottom';
139
+ export { default as MoveLeft } from './MoveLeft';
140
+ export { default as MoveRight } from './MoveRight';
141
+ export { default as MoveTop } from './MoveTop';
131
142
  export { default as MySpace } from './MySpace';
132
143
  export { default as NetworkAdd } from './NetworkAdd';
133
144
  export { default as Network } from './Network';
@@ -144,6 +155,7 @@ export { default as PageWideMode } from './PageWideMode';
144
155
  export { default as Pencil } from './Pencil';
145
156
  export { default as People } from './People';
146
157
  export { default as Photo } from './Photo';
158
+ export { default as Pin } from './Pin';
147
159
  export { default as Popup } from './Popup';
148
160
  export { default as Posts } from './Posts';
149
161
  export { default as Question } from './Question';
@@ -243,6 +255,7 @@ export { default as TypeText } from './TypeText';
243
255
  export { default as TypeUrl } from './TypeUrl';
244
256
  export { default as Upgrade } from './Upgrade';
245
257
  export { default as UsbFlashDrive } from './UsbFlashDrive';
258
+ export { default as UserRole } from './UserRole';
246
259
  export { default as ViewBoard } from './ViewBoard';
247
260
  export { default as ViewCalendar } from './ViewCalendar';
248
261
  export { default as ViewCanvas } from './ViewCanvas';
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import FieldUnitSvg from '../ast/FieldUnit';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const FieldUnit = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={FieldUnitSvg} />;
10
+
11
+ FieldUnit.displayName = 'FieldUnit';
12
+ export default FieldUnit;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import IntegrationsIntegrationDiscourseColorSvg from '../ast/IntegrationsIntegrationDiscourseColor';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const IntegrationsIntegrationDiscourseColor = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={IntegrationsIntegrationDiscourseColorSvg} />;
10
+
11
+ IntegrationsIntegrationDiscourseColor.displayName = 'IntegrationsIntegrationDiscourseColor';
12
+ export default IntegrationsIntegrationDiscourseColor;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import IntegrationsIntegrationIntercomColorSvg from '../ast/IntegrationsIntegrationIntercomColor';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const IntegrationsIntegrationIntercomColor = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={IntegrationsIntegrationIntercomColorSvg} />;
10
+
11
+ IntegrationsIntegrationIntercomColor.displayName = 'IntegrationsIntegrationIntercomColor';
12
+ export default IntegrationsIntegrationIntercomColor;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import IntegrationsIntegrationSlackColorSvg from '../ast/IntegrationsIntegrationSlackColor';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const IntegrationsIntegrationSlackColor = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={IntegrationsIntegrationSlackColorSvg} />;
10
+
11
+ IntegrationsIntegrationSlackColor.displayName = 'IntegrationsIntegrationSlackColor';
12
+ export default IntegrationsIntegrationSlackColor;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import IntegrationsIntegrationZendeskColorSvg from '../ast/IntegrationsIntegrationZendeskColor';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const IntegrationsIntegrationZendeskColor = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={IntegrationsIntegrationZendeskColorSvg} />;
10
+
11
+ IntegrationsIntegrationZendeskColor.displayName = 'IntegrationsIntegrationZendeskColor';
12
+ export default IntegrationsIntegrationZendeskColor;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import LayoutDoubleSvg from '../ast/LayoutDouble';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const LayoutDouble = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={LayoutDoubleSvg} />;
10
+
11
+ LayoutDouble.displayName = 'LayoutDouble';
12
+ export default LayoutDouble;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import LayoutSingleSvg from '../ast/LayoutSingle';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const LayoutSingle = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={LayoutSingleSvg} />;
10
+
11
+ LayoutSingle.displayName = 'LayoutSingle';
12
+ export default LayoutSingle;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import MoveBottomSvg from '../ast/MoveBottom';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const MoveBottom = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={MoveBottomSvg} />;
10
+
11
+ MoveBottom.displayName = 'MoveBottom';
12
+ export default MoveBottom;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import MoveLeftSvg from '../ast/MoveLeft';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const MoveLeft = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={MoveLeftSvg} />;
10
+
11
+ MoveLeft.displayName = 'MoveLeft';
12
+ export default MoveLeft;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import MoveRightSvg from '../ast/MoveRight';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const MoveRight = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={MoveRightSvg} />;
10
+
11
+ MoveRight.displayName = 'MoveRight';
12
+ export default MoveRight;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import MoveTopSvg from '../ast/MoveTop';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const MoveTop = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={MoveTopSvg} />;
10
+
11
+ MoveTop.displayName = 'MoveTop';
12
+ export default MoveTop;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import PinSvg from '../ast/Pin';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const Pin = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={PinSvg} />;
10
+
11
+ Pin.displayName = 'Pin';
12
+ export default Pin;
@@ -0,0 +1,12 @@
1
+ // This icon file is generated automatically.
2
+
3
+ import UserRoleSvg from '../ast/UserRole';
4
+ import { Icon } from '../Icon';
5
+ import { IconBaseProps } from '../types';
6
+
7
+ const UserRole = (
8
+ props: IconBaseProps,
9
+ ): JSX.Element => <Icon {...props} icon={UserRoleSvg} />;
10
+
11
+ UserRole.displayName = 'UserRole';
12
+ export default UserRole;
@@ -83,6 +83,7 @@ export { default as FavoritesChecked } from './FavoritesChecked';
83
83
  export { default as FavoritesOff } from './FavoritesOff';
84
84
  export { default as Favorites } from './Favorites';
85
85
  export { default as FiberyMono } from './FiberyMono';
86
+ export { default as FieldUnit } from './FieldUnit';
86
87
  export { default as Fields } from './Fields';
87
88
  export { default as Figma } from './Figma';
88
89
  export { default as FileUpload } from './FileUpload';
@@ -107,10 +108,16 @@ export { default as ImageXmark } from './ImageXmark';
107
108
  export { default as Import } from './Import';
108
109
  export { default as InfoCircleFilled } from './InfoCircleFilled';
109
110
  export { default as Integration } from './Integration';
111
+ export { default as IntegrationsIntegrationDiscourseColor } from './IntegrationsIntegrationDiscourseColor';
112
+ export { default as IntegrationsIntegrationIntercomColor } from './IntegrationsIntegrationIntercomColor';
113
+ export { default as IntegrationsIntegrationSlackColor } from './IntegrationsIntegrationSlackColor';
114
+ export { default as IntegrationsIntegrationZendeskColor } from './IntegrationsIntegrationZendeskColor';
110
115
  export { default as InvitePeople } from './InvitePeople';
111
116
  export { default as Items } from './Items';
112
117
  export { default as Jira } from './Jira';
113
118
  export { default as Lab } from './Lab';
119
+ export { default as LayoutDouble } from './LayoutDouble';
120
+ export { default as LayoutSingle } from './LayoutSingle';
114
121
  export { default as LeftPanel } from './LeftPanel';
115
122
  export { default as Levels } from './Levels';
116
123
  export { default as LineDivider } from './LineDivider';
@@ -128,6 +135,10 @@ export { default as Mixpanel } from './Mixpanel';
128
135
  export { default as Monitor } from './Monitor';
129
136
  export { default as MoreCompact } from './MoreCompact';
130
137
  export { default as More } from './More';
138
+ export { default as MoveBottom } from './MoveBottom';
139
+ export { default as MoveLeft } from './MoveLeft';
140
+ export { default as MoveRight } from './MoveRight';
141
+ export { default as MoveTop } from './MoveTop';
131
142
  export { default as MySpace } from './MySpace';
132
143
  export { default as NetworkAdd } from './NetworkAdd';
133
144
  export { default as Network } from './Network';
@@ -144,6 +155,7 @@ export { default as PageWideMode } from './PageWideMode';
144
155
  export { default as Pencil } from './Pencil';
145
156
  export { default as People } from './People';
146
157
  export { default as Photo } from './Photo';
158
+ export { default as Pin } from './Pin';
147
159
  export { default as Popup } from './Popup';
148
160
  export { default as Posts } from './Posts';
149
161
  export { default as Question } from './Question';
@@ -243,6 +255,7 @@ export { default as TypeText } from './TypeText';
243
255
  export { default as TypeUrl } from './TypeUrl';
244
256
  export { default as Upgrade } from './Upgrade';
245
257
  export { default as UsbFlashDrive } from './UsbFlashDrive';
258
+ export { default as UserRole } from './UserRole';
246
259
  export { default as ViewBoard } from './ViewBoard';
247
260
  export { default as ViewCalendar } from './ViewCalendar';
248
261
  export { default as ViewCanvas } from './ViewCanvas';
package/src/item.tsx CHANGED
@@ -28,7 +28,7 @@ const getGridStyle = ({
28
28
 
29
29
  const hoverClass = css`
30
30
  &:hover {
31
- background-color: ${themeVars.opacity.opacity10};
31
+ background-color: ${themeVars.colorBgMenuItemHover};
32
32
  }
33
33
  `;
34
34
 
@@ -32,7 +32,8 @@ const popupContainerClassName = css`
32
32
  z-index: 1050;
33
33
  `;
34
34
  const popupClassName = css`
35
- max-width: 360px;
35
+ min-width: 320px;
36
+ max-width: 440px;
36
37
  padding-top: ${space.s8}px;
37
38
  padding-bottom: ${space.s4}px;
38
39
  padding-left: ${space.s8}px;
@@ -123,7 +124,7 @@ type Props<Option, IsMulti extends boolean, Group extends GroupBase<Option>> = {
123
124
  virtualized?: boolean;
124
125
  defaultMenuIsOpen?: boolean;
125
126
  placeholder?: string;
126
- noOptionsMessage: () => string | JSX.Element | null;
127
+ noOptionsMessage?: () => string | JSX.Element | null;
127
128
  options: OptionsOrGroups<Option, Group>;
128
129
  filterOption?: SelectProps<Option>["filterOption"];
129
130
  inputValue?: string;
package/src/tooltip.tsx CHANGED
@@ -98,6 +98,7 @@ export type TooltipProps = Omit<TooltipPrimitive.TooltipTriggerProps, "title"> &
98
98
  description?: ReactNode;
99
99
  setContentElement?: (el: HTMLDivElement | null) => void;
100
100
  content?: ReactNode;
101
+ container?: HTMLElement | null | undefined;
101
102
  side?: TooltipPrimitive.TooltipContentProps["side"];
102
103
  sideOffset?: TooltipPrimitive.TooltipContentProps["sideOffset"];
103
104
  align?: TooltipPrimitive.TooltipContentProps["align"];
@@ -144,6 +145,7 @@ export const Tooltip = forwardRef<HTMLButtonElement, TooltipProps>(
144
145
  keepOnClick,
145
146
  disabled,
146
147
  setContentElement,
148
+ container,
147
149
  ...triggerProps
148
150
  },
149
151
  ref
@@ -170,7 +172,7 @@ export const Tooltip = forwardRef<HTMLButtonElement, TooltipProps>(
170
172
  <TooltipPrimitive.Trigger ref={ref} {...triggerProps} {...keepOnClickProps} asChild>
171
173
  {children}
172
174
  </TooltipPrimitive.Trigger>
173
- <TooltipPrimitive.Portal>
175
+ <TooltipPrimitive.Portal container={container}>
174
176
  <TooltipPrimitive.Content
175
177
  ref={setContentElement}
176
178
  side={side}