@fibery/ui-kit 1.14.0 → 1.16.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 (65) hide show
  1. package/package.json +4 -3
  2. package/src/antd/styles.ts +21 -4
  3. package/src/designSystem.ts +18 -28
  4. package/src/emoji-picker/app-icon-picker.tsx +31 -26
  5. package/src/emoji-picker/emoji-picker-content-with-color.tsx +107 -0
  6. package/src/emoji-picker/emoji-picker.tsx +34 -37
  7. package/src/emoji-picker/emoji.tsx +4 -7
  8. package/src/emoji-picker/icon-emoji-picker.tsx +17 -8
  9. package/src/emoji-picker/primitives/category.tsx +95 -25
  10. package/src/emoji-picker/primitives/emoji.tsx +37 -78
  11. package/src/emoji-picker/primitives/footer.tsx +3 -1
  12. package/src/emoji-picker/primitives/grid.tsx +53 -23
  13. package/src/emoji-picker/primitives/root.tsx +13 -3
  14. package/src/emoji-picker/primitives/search.tsx +38 -20
  15. package/src/emoji-picker/primitives/skin-tone.tsx +21 -11
  16. package/src/emoji-picker/stores/emoji-data-store.tsx +0 -1
  17. package/src/emoji-picker/stores/lazy-icon-data-store.tsx +44 -0
  18. package/src/emoji-picker/stores/static-emoji-data-store.tsx +16 -0
  19. package/src/emoji-picker/utils/emoji-set.ts +1 -1
  20. package/src/icons/ast/AiAssistant.ts +1 -1
  21. package/src/icons/ast/AiAvatar.ts +1 -1
  22. package/src/icons/ast/AppTemplates.ts +1 -1
  23. package/src/icons/ast/BellCircle.ts +8 -0
  24. package/src/icons/ast/BellX.ts +8 -0
  25. package/src/icons/ast/Bolt.ts +8 -0
  26. package/src/icons/ast/CheckCircle.ts +8 -0
  27. package/src/icons/ast/ClockForward.ts +8 -0
  28. package/src/icons/ast/ColorCodingFilled.ts +8 -0
  29. package/src/icons/ast/Delete.ts +1 -1
  30. package/src/icons/ast/EmojiDelete.ts +8 -0
  31. package/src/icons/ast/ExtensionAssignments.ts +1 -1
  32. package/src/icons/ast/Fields.ts +1 -1
  33. package/src/icons/ast/Figma.ts +8 -0
  34. package/src/icons/ast/GoogleDrive.ts +8 -0
  35. package/src/icons/ast/GoogleMap.ts +8 -0
  36. package/src/icons/ast/InvitePeople.ts +1 -1
  37. package/src/icons/ast/LineDivider.ts +8 -0
  38. package/src/icons/ast/Loom.ts +8 -0
  39. package/src/icons/ast/Miro.ts +8 -0
  40. package/src/icons/ast/Mixpanel.ts +8 -0
  41. package/src/icons/ast/Shared.ts +1 -1
  42. package/src/icons/ast/Twitter.ts +8 -0
  43. package/src/icons/ast/Youtube.ts +8 -0
  44. package/src/icons/ast/index.tsx +16 -0
  45. package/src/icons/react/BellCircle.tsx +12 -0
  46. package/src/icons/react/BellX.tsx +12 -0
  47. package/src/icons/react/Bolt.tsx +12 -0
  48. package/src/icons/react/CheckCircle.tsx +12 -0
  49. package/src/icons/react/ClockForward.tsx +12 -0
  50. package/src/icons/react/ColorCodingFilled.tsx +12 -0
  51. package/src/icons/react/EmojiDelete.tsx +12 -0
  52. package/src/icons/react/Figma.tsx +12 -0
  53. package/src/icons/react/GoogleDrive.tsx +12 -0
  54. package/src/icons/react/GoogleMap.tsx +12 -0
  55. package/src/icons/react/LineDivider.tsx +12 -0
  56. package/src/icons/react/Loom.tsx +12 -0
  57. package/src/icons/react/Miro.tsx +12 -0
  58. package/src/icons/react/Mixpanel.tsx +12 -0
  59. package/src/icons/react/Twitter.tsx +12 -0
  60. package/src/icons/react/Youtube.tsx +12 -0
  61. package/src/icons/react/index.tsx +16 -0
  62. package/src/Button/icon-button-with-tooltip.tsx +0 -15
  63. package/src/emoji-picker/index.tsx +0 -5
  64. package/src/emoji-picker/lazy-icon-data-store.tsx +0 -55
  65. /package/src/emoji-picker/{lazy-emoji-data-store.tsx → stores/lazy-emoji-data-store.tsx} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fibery/ui-kit",
3
- "version": "1.14.0",
3
+ "version": "1.16.0",
4
4
  "main": "index.ts",
5
5
  "private": false,
6
6
  "files": [
@@ -28,6 +28,7 @@
28
28
  ],
29
29
  "license": "UNLICENSED",
30
30
  "dependencies": {
31
+ "react-intersection-observer": "9.3.5",
31
32
  "@linaria/core": "3.0.0-beta.15",
32
33
  "@linaria/react": "3.0.0-beta.15",
33
34
  "@popperjs/core": "2.11.6",
@@ -60,8 +61,8 @@
60
61
  "screenfull": "6.0.1",
61
62
  "ua-parser-js": "0.7.24",
62
63
  "@fibery/helpers": "1.1.0",
63
- "@fibery/emoji-data": "2.0.0",
64
- "@fibery/react": "1.0.3"
64
+ "@fibery/react": "1.0.3",
65
+ "@fibery/emoji-data": "2.1.1"
65
66
  },
66
67
  "peerDependencies": {
67
68
  "react": "^18.2.0",
@@ -1,12 +1,28 @@
1
1
  import {css} from "@linaria/core";
2
2
  import {colors, layout, border, shadows, space, textStyles, themeVars, transition} from "../designSystem";
3
3
 
4
+ const inputVariables = {
5
+ default: {
6
+ "--input-border": themeVars.inputBorderColor,
7
+ "--input-hover-border": `0 0 0 1px ${themeVars.opacity.opacity40}`,
8
+ "--input-focus-border": `0 0 0 1px ${themeVars.opacity.opacity25}`,
9
+ "--input-focus-shadow": `0 0 0 3px ${themeVars.focus}`,
10
+ },
11
+ error: {
12
+ "--input-border": themeVars.inputErrorBorderColor,
13
+ "--input-hover-border": themeVars.inputErrorBorderHoverColor,
14
+ "--input-focus-border": themeVars.inputErrorBorderFocusColor,
15
+ "--input-focus-shadow": themeVars.inputErrorBorderFocusShadow,
16
+ },
17
+ };
18
+
4
19
  export const inputOverrides = {
5
20
  main: {
21
+ ...inputVariables.default,
6
22
  font: "inherit",
7
23
  color: themeVars.textColor,
8
24
  outline: "none",
9
- backgroundColor: themeVars.inputBgColor,
25
+ backgroundColor: `${themeVars.inputBgColor} !important`,
10
26
  borderRadius: border.radius6,
11
27
  minHeight: layout.inputHeight,
12
28
  paddingTop: 0,
@@ -16,18 +32,18 @@ export const inputOverrides = {
16
32
  border: 0,
17
33
  borderColor: colors.transparent,
18
34
  transition: `box-shadow ${transition}`,
19
- boxShadow: themeVars.inputBorderColor,
35
+ boxShadow: `var(--input-border, ${themeVars.inputBorderColor})`,
20
36
  letterSpacing: 0,
21
37
  "::placeholder": {
22
38
  color: themeVars.inputPlaceholderTextColor,
23
39
  },
24
40
  },
25
41
  hover: {
26
- boxShadow: `0 0 0 1px ${themeVars.opacity.opacity40} !important`,
42
+ boxShadow: `var(--input-hover-border, 0 0 0 1px ${themeVars.opacity.opacity40}) !important`,
27
43
  transition: `box-shadow ${transition}`,
28
44
  },
29
45
  focus: {
30
- boxShadow: `0 0 0 1px ${themeVars.opacity.opacity25}, 0 0 0 3px ${themeVars.focus} !important`,
46
+ boxShadow: `var(--input-focus-border, 0 0 0 1px ${themeVars.opacity.opacity25}), var(--input-focus-shadow, 0 0 0 3px ${themeVars.focus}) !important`,
31
47
  transition: `box-shadow ${transition}`,
32
48
  },
33
49
  disabled: {
@@ -63,6 +79,7 @@ export const inputStyles = css`
63
79
  },
64
80
  "& .ant-input-group": {borderSpacing: 1, ...textStyles.regular},
65
81
  "& .ant-input": inputOverrides.main,
82
+ "& .ant-input-status-error": inputVariables.error,
66
83
  "& .ant-input[readonly].ant-input[readonly]": {...inputOverrides.disabled, cursor: "inherit"},
67
84
  "& .ant-input:hover[readonly].ant-input:hover[readonly]": {...inputOverrides.disabled, cursor: "inherit"},
68
85
  "& .ant-input-affix-wrapper:hover .ant-input[readonly]": {...inputOverrides.disabled, cursor: "inherit"},
@@ -157,6 +157,10 @@ const lightColors = {
157
157
  inputBorderFocusColor: `0 0 0 1px ${getOpacities(slate.slate8).opacity100}`,
158
158
  inputBorderBlendMode: "multiply",
159
159
  inputPlaceholderTextColor: slate.slate9,
160
+ inputErrorBorderColor: `0 0 0 1px ${red.red11}`,
161
+ inputErrorBorderHoverColor: `0 0 0 1px ${getOpacities(red.red11).opacity40}`,
162
+ inputErrorBorderFocusColor: `0 0 0 1px ${getOpacities(red.red11).opacity25}`,
163
+ inputErrorBorderFocusShadow: `0 0 0 3px ${getOpacities(red.red11).opacity25}`,
160
164
  buttonPrimaryColor: indigo.indigo10,
161
165
  buttonColor: slate.slate10,
162
166
  buttonPrimaryTextColor: slate.slate2,
@@ -241,6 +245,8 @@ const lightColors = {
241
245
  filterGroup1Bg: slate.slate2,
242
246
  filterGroup2Bg: slate.slate3,
243
247
  filterGroupBorder: blackA.blackA3,
248
+ colorBgNotificationFocusedDefault: indigo.indigo3,
249
+ colorBgNotificationFocusedHover: indigo.indigo4,
244
250
  //end
245
251
  disabledInversedTextColor: shades.opacity25,
246
252
  danger: red.red9,
@@ -269,12 +275,12 @@ const lightColors = {
269
275
  gridHeaderTextColor: slate.slate9,
270
276
  // cell
271
277
  gridCellBgColor: whiteA.whiteA0,
272
- gridCellBorderColor: slate.slate4,
278
+ gridCellBorderColor: slate.slate5,
273
279
  gridPinnedCellBorderColor: slate.slate8,
274
280
  gridDisabledCellBgColor: slate.slate2,
275
281
  gridSelectedCellBgColor: indigo.indigo3,
276
282
  gridHighlightedCellBgColor: indigo.indigo4,
277
- gridSelectedCellBorderColor: indigo.indigo5,
283
+ gridSelectedCellBorderColor: indigo.indigo6,
278
284
  gridSelectedPinnedCellBorderColor: indigo.indigo7,
279
285
  gridDisabledSelectedCellBgColor: indigo.indigo4,
280
286
  gridActiveCellBorderColor: indigo.indigo8,
@@ -341,6 +347,10 @@ const darkColors = {
341
347
  inputBorderFocusColor: `0 0 0 1px ${getOpacities(slateDark.slate9).opacity100}`,
342
348
  inputBorderBlendMode: "lighten",
343
349
  inputPlaceholderTextColor: slateDark.slate9,
350
+ inputErrorBorderColor: `0 0 0 1px ${red.red7}`,
351
+ inputErrorBorderHoverColor: `0 0 0 1px ${getOpacities(red.red7).opacity40}`,
352
+ inputErrorBorderFocusColor: `0 0 0 1px ${getOpacities(red.red7).opacity25}`,
353
+ inputErrorBorderFocusShadow: `0 0 0 3px ${getOpacities(red.red7).opacity25}`,
344
354
  buttonPrimaryColor: indigoDark.indigo10,
345
355
  buttonColor: slateDark.slate10,
346
356
  buttonPrimaryTextColor: slate.slate6,
@@ -422,6 +432,8 @@ const darkColors = {
422
432
  filterGroup1Bg: slateDark.slate6,
423
433
  filterGroup2Bg: slateDark.slate7,
424
434
  filterGroupBorder: whiteA.whiteA3,
435
+ colorBgNotificationFocusedDefault: getOpacities(indigoDark.indigo11).opacity20,
436
+ colorBgNotificationFocusedHover: getOpacities(indigoDark.indigo11).opacity30,
425
437
  //end
426
438
  disabledInversedTextColor: lights.opacity25,
427
439
  danger: redDark.red10,
@@ -450,12 +462,12 @@ const darkColors = {
450
462
  gridHeaderTextColor: slateDark.slate10,
451
463
  // cell
452
464
  gridCellBgColor: slateDark.slate2,
453
- gridCellBorderColor: slateDark.slate5,
465
+ gridCellBorderColor: slateDark.slate6,
454
466
  gridPinnedCellBorderColor: slateDark.slate8,
455
467
  gridDisabledCellBgColor: slateDark.slate3,
456
468
  gridSelectedCellBgColor: indigoDark.indigo3,
457
469
  gridHighlightedCellBgColor: indigoDark.indigo5,
458
- gridSelectedCellBorderColor: indigoDark.indigo6,
470
+ gridSelectedCellBorderColor: indigoDark.indigo7,
459
471
  gridSelectedPinnedCellBorderColor: indigoDark.indigo7,
460
472
  gridDisabledSelectedCellBgColor: indigoDark.indigo5,
461
473
  gridActiveCellBorderColor: indigoDark.indigo9,
@@ -592,24 +604,11 @@ export const getLinkedHighlightBackgroundColor = _.memoize(
592
604
  (themeMode, color) => `${themeMode}-${color}`
593
605
  );
594
606
 
595
- // REMOVE AFTER MIGRATION ON BACKEND
596
- export const migrateEnumColor = (color: string) => {
597
- const pastelIdx = pastelColors.indexOf(color);
598
-
599
- if (pastelIdx > -1) {
600
- return cardTypeColors[pastelIdx];
601
- }
602
-
603
- return color;
604
- };
605
-
606
607
  export const getEnumBackgroundColor = _.memoize(
607
608
  (mode: ThemeMode, color: string) => {
608
- const migratedColor = migrateEnumColor(color);
609
-
610
609
  return getThemeValue(mode, {
611
- light: a11yColor(getOpacities(migratedColor).opacity20, lightColors.whiteColor, 1),
612
- dark: a11yColor(getOpacities(migratedColor).opacity30, darkColors.menuBg, 1.3),
610
+ light: a11yColor(getOpacities(color).opacity20, lightColors.whiteColor, 1),
611
+ dark: a11yColor(getOpacities(color).opacity30, darkColors.menuBg, 1.3),
613
612
  });
614
613
  },
615
614
  (themeMode, color) => `${themeMode}-${color}`
@@ -652,8 +651,6 @@ export const cardTypeColors = [
652
651
  "#B04E31",
653
652
  ] as const;
654
653
 
655
- const pastelColors = cardTypeColors.map((color) => makeChromaColor(color).luminance(0.8).hex());
656
-
657
654
  export const dropCursorColor = chroma(brandColors.blue).alpha(0.7).css();
658
655
  export const colors = {
659
656
  ...getTypeColors(brandColors.green, "light"),
@@ -925,13 +922,6 @@ export const textStyles = {
925
922
  fontWeight: fontWeight.regular,
926
923
  color: themeVars.textColor,
927
924
  },
928
- fake: {
929
- fontFamily,
930
- fontSize: typeSizes[7],
931
- lineHeight: lineHeight.regular,
932
- fontWeight: fontWeight.regular,
933
- color: colors.shades.opacity25,
934
- },
935
925
  link: {
936
926
  color: themeVars.linkColor,
937
927
  borderBottom: themeVars.linkBorder,
@@ -1,14 +1,11 @@
1
- import {EmojiItem} from "@fibery/emoji-data/lib/src";
2
- import {ColorPicker} from "../ColorPicker";
1
+ import {CustomEmoji, EmojiItem} from "@fibery/emoji-data";
2
+ import {useThemeMode} from "../ThemeProvider";
3
+ import {cardTypeColors, getIconColor} from "../designSystem";
3
4
  import {$TSFixMe} from "../tsfixme";
4
- import {LazyIconDataStore} from "./lazy-icon-data-store";
5
+ import {EmojiPickerContentWithColor} from "./emoji-picker-content-with-color";
5
6
  import {EmojiPickerContent} from "./primitives/content";
6
- import {EmojiPickerFooter} from "./primitives/footer";
7
- import {EmojiPickerGrid} from "./primitives/grid";
8
- import {EmojiPickerHeader} from "./primitives/header";
9
7
  import {EmojiPickerRoot} from "./primitives/root";
10
- import {EmojiPickerSearch} from "./primitives/search";
11
- import {cardTypeColors} from "../designSystem";
8
+ import {LazyIconDataStore} from "./stores/lazy-icon-data-store";
12
9
 
13
10
  const i18n = {search: "Search icon...", notfound: "No Icons Found"};
14
11
 
@@ -19,35 +16,43 @@ export type AppIconPickerProps = {
19
16
  onColorSelect?: (c: $TSFixMe) => void;
20
17
 
21
18
  onSelect: (emoji: EmojiItem) => void;
19
+ autoFocus?: boolean;
22
20
  };
23
21
  export const AppIconPicker: React.FC<AppIconPickerProps> = ({
24
22
  onSelect,
25
23
  color,
26
- colors = cardTypeColors,
24
+ colors = cardTypeColors as unknown as string[],
27
25
  onColorSelect,
28
26
  getHoverColor,
27
+ autoFocus = true,
29
28
  }) => {
29
+ const themeMode = useThemeMode();
30
+
30
31
  return (
31
32
  <EmojiPickerRoot i18n={i18n} onEmojiSelect={onSelect}>
32
33
  <EmojiPickerContent emojiHoverColor={color ? getHoverColor?.(color) : undefined} emojiSize={20}>
33
- <LazyIconDataStore fallback={<div style={{height: "282px"}}></div>}>
34
- <EmojiPickerHeader>
35
- <EmojiPickerSearch autoFocus />
36
- </EmojiPickerHeader>
37
-
38
- <EmojiPickerGrid />
34
+ <LazyIconDataStore fallback={<div style={{height: "302px"}}></div>}>
35
+ <EmojiPickerContentWithColor
36
+ color={color}
37
+ colors={colors}
38
+ getHoverColor={getHoverColor}
39
+ onColorSelect={onColorSelect}
40
+ searchAutofocus={autoFocus}
41
+ renderEmoji={({emoji}) => (
42
+ <svg
43
+ style={{
44
+ display: "block",
45
+ width: 20,
46
+ height: 20,
47
+ fill: color ? getIconColor(themeMode, color) : undefined,
48
+ }}
49
+ viewBox="0 0 24 24"
50
+ >
51
+ <use href={(emoji as CustomEmoji).imageUrl} />
52
+ </svg>
53
+ )}
54
+ />
39
55
  </LazyIconDataStore>
40
-
41
- {onColorSelect ? (
42
- <EmojiPickerFooter>
43
- <ColorPicker
44
- colors={colors}
45
- getSwatchHoverColor={getHoverColor}
46
- color={color}
47
- onChangeComplete={onColorSelect}
48
- />
49
- </EmojiPickerFooter>
50
- ) : null}
51
56
  </EmojiPickerContent>
52
57
  </EmojiPickerRoot>
53
58
  );
@@ -0,0 +1,107 @@
1
+ import {css} from "@linaria/core";
2
+ import {useState} from "react";
3
+ import {IconButton} from "../Button/icon-button";
4
+ import {CollapsibleContent, CollapsibleRoot, CollapsibleTrigger} from "../Collapsible";
5
+ import {ColorPicker} from "../ColorPicker";
6
+ import {useThemeMode} from "../ThemeProvider";
7
+ import {getIconColor, space} from "../designSystem";
8
+ import ColorCoding from "../icons/react/ColorCoding";
9
+ import ColorCodingFilled from "../icons/react/ColorCodingFilled";
10
+ import {$TSFixMe} from "../tsfixme";
11
+ import {EmojiPickerGrid, EmojiPickerGridProps} from "./primitives/grid";
12
+ import {EmojiPickerHeader} from "./primitives/header";
13
+ import {EmojiPickerSearch} from "./primitives/search";
14
+
15
+ const colorPickerWrapperCss = css`
16
+ padding-top: ${space.l}px;
17
+ `;
18
+
19
+ const disableScrollCss = css`
20
+ overflow-y: hidden;
21
+ `;
22
+
23
+ type ColorPickerCollapsibleTrigger = {opened: boolean; color?: string};
24
+
25
+ const ColorPickerCollapsibleTrigger: React.FC<ColorPickerCollapsibleTrigger> = ({opened, color}) => {
26
+ const themeMode = useThemeMode();
27
+ const iconColor = color ? getIconColor(themeMode, color) : undefined;
28
+
29
+ const Icon = opened ? ColorCodingFilled : ColorCoding;
30
+
31
+ const label = opened ? "Close color picker" : "Open color picker";
32
+
33
+ return (
34
+ <CollapsibleTrigger asChild>
35
+ <IconButton
36
+ aria-label={label}
37
+ size="big"
38
+ className={css`
39
+ border-top-left-radius: 0;
40
+ border-bottom-left-radius: 0;
41
+ `}
42
+ >
43
+ <Icon color={iconColor} iconSize={18} containerSize={20} />
44
+ </IconButton>
45
+ </CollapsibleTrigger>
46
+ );
47
+ };
48
+
49
+ const collapsibleWrapperCss = css`
50
+ max-height: 302px; // search + emoji grid
51
+ overflow: hidden;
52
+ `;
53
+
54
+ export type EmojiPickerContentWithColorProps = {
55
+ color?: string;
56
+ getHoverColor?: (color: string) => string | undefined;
57
+ colors?: string[];
58
+ onColorSelect?: (c: $TSFixMe) => void;
59
+
60
+ searchRef?: React.RefObject<HTMLInputElement>;
61
+ searchAutofocus?: boolean;
62
+ } & Pick<EmojiPickerGridProps, "renderEmoji">;
63
+
64
+ export const EmojiPickerContentWithColor: React.FC<EmojiPickerContentWithColorProps> = ({
65
+ searchRef,
66
+ colors,
67
+ color,
68
+ onColorSelect,
69
+ getHoverColor,
70
+ searchAutofocus = true,
71
+ renderEmoji,
72
+ }) => {
73
+ const [colorOpened, setColorOpened] = useState(false);
74
+
75
+ const showColorPicker = Boolean(onColorSelect);
76
+
77
+ return (
78
+ <CollapsibleRoot
79
+ className={collapsibleWrapperCss}
80
+ open={colorOpened}
81
+ onOpenChange={setColorOpened}
82
+ onWheel={() => setColorOpened(false)}
83
+ >
84
+ <EmojiPickerHeader>
85
+ <EmojiPickerSearch
86
+ searchRef={searchRef}
87
+ autoFocus={searchAutofocus}
88
+ extraAction={showColorPicker ? <ColorPickerCollapsibleTrigger opened={colorOpened} color={color} /> : null}
89
+ />
90
+ {showColorPicker ? (
91
+ <CollapsibleContent>
92
+ <div className={colorPickerWrapperCss}>
93
+ <ColorPicker
94
+ colors={colors}
95
+ getSwatchHoverColor={getHoverColor}
96
+ color={color}
97
+ onChangeComplete={onColorSelect}
98
+ />
99
+ </div>
100
+ </CollapsibleContent>
101
+ ) : null}
102
+ </EmojiPickerHeader>
103
+
104
+ <EmojiPickerGrid className={colorOpened ? disableScrollCss : undefined} renderEmoji={renderEmoji} />
105
+ </CollapsibleRoot>
106
+ );
107
+ };
@@ -1,16 +1,13 @@
1
1
  import {EmojiItem} from "@fibery/emoji-data/lib/src";
2
+ import {css} from "@linaria/core";
3
+ import {Button} from "../Button";
4
+ import {cardTypeColors, space} from "../designSystem";
2
5
  import {$TSFixMe} from "../tsfixme";
3
- import {EmojiPickerRoot} from "./primitives/root";
6
+ import {EmojiPickerContentWithColor} from "./emoji-picker-content-with-color";
4
7
  import {EmojiPickerContent} from "./primitives/content";
5
- import {EmojiPickerHeader} from "./primitives/header";
6
- import {EmojiPickerSearch} from "./primitives/search";
7
- import {cx, css} from "@linaria/core";
8
- import {EmojiPickerSkinTone} from "./primitives/skin-tone";
9
- import {EmojiPickerGrid} from "./primitives/grid";
10
- import {LazyEmojiDataStore} from "./lazy-emoji-data-store";
11
- import {ColorPicker} from "../ColorPicker";
12
8
  import {EmojiPickerFooter} from "./primitives/footer";
13
- import {cardTypeColors} from "../designSystem";
9
+ import {EmojiPickerRoot} from "./primitives/root";
10
+ import {EmojiPickerSkinTone} from "./primitives/skin-tone";
14
11
 
15
12
  const i18n = {search: "Search emoji..."};
16
13
 
@@ -19,54 +16,54 @@ export type EmojiPickerProps = {
19
16
  getHoverColor?: (color: string) => string | undefined;
20
17
  colors?: string[];
21
18
  onColorSelect?: (c: $TSFixMe) => void;
19
+ onCustomCategorySettings?: () => void;
20
+ onAddCustomEmoji?: () => void;
21
+ onSelect: (emoji: EmojiItem) => void;
22
22
  showSkinTones?: boolean;
23
23
 
24
- onSelect: (emoji: EmojiItem) => void;
24
+ searchRef?: React.RefObject<HTMLInputElement>;
25
25
  };
26
26
  export const EmojiPicker: React.FC<EmojiPickerProps> = ({
27
27
  onSelect,
28
28
  color,
29
- colors = cardTypeColors,
29
+ colors = cardTypeColors as unknown as string[],
30
30
  onColorSelect,
31
+ onCustomCategorySettings,
32
+ onAddCustomEmoji,
31
33
  getHoverColor,
32
34
  showSkinTones,
35
+ searchRef,
33
36
  }) => {
37
+ const showFooter = Boolean(onAddCustomEmoji) || showSkinTones;
38
+
34
39
  return (
35
- <EmojiPickerRoot i18n={i18n} onEmojiSelect={onSelect}>
40
+ <EmojiPickerRoot i18n={i18n} onEmojiSelect={onSelect} onCustomCategorySettings={onCustomCategorySettings}>
36
41
  <EmojiPickerContent emojiHoverColor={color ? getHoverColor?.(color) : undefined} emojiSize={20}>
37
- <LazyEmojiDataStore fallback={<div style={{height: "282px"}}></div>}>
38
- <EmojiPickerHeader>
39
- <EmojiPickerSearch
40
- autoFocus
41
- className={cx(
42
- showSkinTones &&
43
- css`
44
- width: 250px !important;
45
- `
46
- )}
47
- />
48
- {/* Temporary hacks. SkinTone should move to footer */}
42
+ <EmojiPickerContentWithColor
43
+ color={color}
44
+ colors={colors}
45
+ getHoverColor={getHoverColor}
46
+ onColorSelect={onColorSelect}
47
+ searchRef={searchRef}
48
+ />
49
+
50
+ {showFooter ? (
51
+ <EmojiPickerFooter>
52
+ {onAddCustomEmoji ? (
53
+ <Button size=":button-size/small" onClick={onAddCustomEmoji}>
54
+ Add Emoji
55
+ </Button>
56
+ ) : null}
57
+
49
58
  {showSkinTones ? (
50
59
  <EmojiPickerSkinTone
51
60
  className={css`
52
61
  position: absolute;
53
62
  top: 4px;
54
- right: 12px;
63
+ right: ${space.l}px;
55
64
  `}
56
65
  />
57
66
  ) : null}
58
- </EmojiPickerHeader>
59
- <EmojiPickerGrid />
60
- </LazyEmojiDataStore>
61
-
62
- {onColorSelect ? (
63
- <EmojiPickerFooter>
64
- <ColorPicker
65
- colors={colors}
66
- getSwatchHoverColor={getHoverColor}
67
- color={color}
68
- onChangeComplete={onColorSelect}
69
- />
70
67
  </EmojiPickerFooter>
71
68
  ) : null}
72
69
  </EmojiPickerContent>
@@ -1,11 +1,8 @@
1
- import {LazyEmojiDataStore} from "./lazy-emoji-data-store";
2
1
  import {Emoji as EmojiPrimitive, EmojiProps as EmojiPrimitiveProps} from "./primitives/emoji";
2
+ import {isApple} from "./utils/emoji-set";
3
+ import {detectEmojiSupportLevel} from "./utils/emoji-support";
3
4
 
4
5
  export type EmojiProps = EmojiPrimitiveProps;
5
- export const Emoji: React.FC<EmojiPrimitiveProps> = function EmojiOrLoader(props) {
6
- return (
7
- <LazyEmojiDataStore fallback={<div style={{width: props.size, height: props.size}} />}>
8
- <EmojiPrimitive {...props} />
9
- </LazyEmojiDataStore>
10
- );
6
+ export const Emoji: React.FC<EmojiPrimitiveProps> = (props) => {
7
+ return <EmojiPrimitive version={detectEmojiSupportLevel()} native={isApple()} {...props} />;
11
8
  };
@@ -6,6 +6,7 @@ import {space, textStyles} from "../designSystem";
6
6
  import {$TSFixMe} from "../tsfixme";
7
7
  import {AppIconPicker, AppIconPickerProps} from "./app-icon-picker";
8
8
  import {EmojiPicker, EmojiPickerProps} from "./emoji-picker";
9
+ import EmojiDelete from "../icons/react/EmojiDelete";
9
10
 
10
11
  const TabHeader: React.FC<React.PropsWithChildren> = ({children}) => (
11
12
  <div
@@ -23,6 +24,8 @@ export type IconEmojiPickerProps = React.PropsWithChildren<{
23
24
  onIconSelect?: AppIconPickerProps["onSelect"];
24
25
  onEmojiSelect?: EmojiPickerProps["onSelect"];
25
26
  onColorSelect?: (c: $TSFixMe) => void;
27
+ onCreateClick?: () => void;
28
+ onCustomEmojisSettings?: () => void;
26
29
  onReset?: () => void;
27
30
  resetLabel?: string;
28
31
  defaultTab?: TabKey;
@@ -34,6 +37,8 @@ export const IconEmojiPicker: React.FC<IconEmojiPickerProps> = ({
34
37
  onIconSelect,
35
38
  onEmojiSelect,
36
39
  onColorSelect,
40
+ onCreateClick,
41
+ onCustomEmojisSettings,
37
42
  defaultTab,
38
43
  onReset,
39
44
  resetLabel = "Reset",
@@ -51,13 +56,17 @@ export const IconEmojiPicker: React.FC<IconEmojiPickerProps> = ({
51
56
  key: "emojis",
52
57
  label: <TabHeader>Emojis</TabHeader>,
53
58
  children: (
54
- <EmojiPicker
55
- color={color}
56
- onColorSelect={showColorPickerOnTabs.includes("emojis") ? onColorSelect : undefined}
57
- getHoverColor={getHoverColor}
58
- onSelect={onEmojiSelect}
59
- showSkinTones
60
- />
59
+ <>
60
+ <EmojiPicker
61
+ color={color}
62
+ onColorSelect={showColorPickerOnTabs.includes("emojis") ? onColorSelect : undefined}
63
+ onCustomCategorySettings={onCustomEmojisSettings}
64
+ onAddCustomEmoji={onCreateClick}
65
+ getHoverColor={getHoverColor}
66
+ onSelect={onEmojiSelect}
67
+ showSkinTones
68
+ />
69
+ </>
61
70
  ),
62
71
  },
63
72
  onIconSelect && {
@@ -80,7 +89,7 @@ export const IconEmojiPicker: React.FC<IconEmojiPickerProps> = ({
80
89
  padding-right: ${space.l}px;
81
90
  `}
82
91
  >
83
- <Button size={":button-size/small"} onClick={onReset}>
92
+ <Button Icon={EmojiDelete} size={":button-size/small"} onClick={onReset}>
84
93
  {resetLabel}
85
94
  </Button>
86
95
  </div>