@fibery/ui-kit 1.13.0 → 1.14.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.
- package/package.json +5 -7
- package/src/designSystem.ts +2 -0
- package/src/emoji-picker/app-icon-picker.tsx +54 -0
- package/src/emoji-picker/emoji-index.ts +8 -0
- package/src/emoji-picker/emoji-picker.tsx +75 -0
- package/src/emoji-picker/emoji.tsx +11 -0
- package/src/{emoji-mart → emoji-picker}/icon-emoji-picker.tsx +13 -11
- package/src/emoji-picker/index.tsx +5 -0
- package/src/emoji-picker/lazy-emoji-data-store.tsx +29 -0
- package/src/emoji-picker/lazy-icon-data-store.tsx +55 -0
- package/src/emoji-picker/primitives/category.tsx +107 -0
- package/src/emoji-picker/primitives/content.tsx +48 -0
- package/src/emoji-picker/primitives/emoji.tsx +130 -0
- package/src/emoji-picker/primitives/footer.tsx +12 -0
- package/src/emoji-picker/primitives/grid.tsx +67 -0
- package/src/emoji-picker/primitives/header.tsx +11 -0
- package/src/emoji-picker/primitives/layout.ts +5 -0
- package/src/emoji-picker/primitives/root.tsx +79 -0
- package/src/emoji-picker/primitives/search-provider.tsx +22 -0
- package/src/emoji-picker/primitives/search.tsx +133 -0
- package/src/emoji-picker/primitives/skin-provider.tsx +27 -0
- package/src/emoji-picker/primitives/skin-tone.tsx +99 -0
- package/src/emoji-picker/stores/emoji-data-store.tsx +50 -0
- package/src/emoji-picker/utils/emoji-set.ts +5 -0
- package/src/{emoji-mart → emoji-picker/utils}/emoji-support.ts +6 -10
- package/src/emoji-picker/utils/frequently.ts +82 -0
- package/src/emoji-picker/utils/load-emoji-data.ts +4 -0
- package/src/emoji-picker/utils/store.ts +40 -0
- package/src/icons/ast/AddAfter.ts +8 -0
- package/src/icons/ast/AddBefore.ts +8 -0
- package/src/icons/ast/ArrowBarLeft.ts +8 -0
- package/src/icons/ast/ArrowBarRight.ts +8 -0
- package/src/icons/ast/Columns2.ts +8 -0
- package/src/icons/ast/Columns4.ts +8 -0
- package/src/icons/ast/index.tsx +6 -0
- package/src/icons/react/AddAfter.tsx +12 -0
- package/src/icons/react/AddBefore.tsx +12 -0
- package/src/icons/react/ArrowBarLeft.tsx +12 -0
- package/src/icons/react/ArrowBarRight.tsx +12 -0
- package/src/icons/react/Columns2.tsx +12 -0
- package/src/icons/react/Columns4.tsx +12 -0
- package/src/icons/react/index.tsx +6 -0
- package/src/emoji-mart/app-icon-picker.tsx +0 -68
- package/src/emoji-mart/data/get-data.tsx +0 -58
- package/src/emoji-mart/emoji/emoji.tsx +0 -26
- package/src/emoji-mart/emoji/index.tsx +0 -24
- package/src/emoji-mart/emoji-index.ts +0 -5
- package/src/emoji-mart/emoji-mart.tsx +0 -216
- package/src/emoji-mart/emoji-picker.tsx +0 -78
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
|
|
2
|
+
// This icon file is generated automatically.
|
|
3
|
+
|
|
4
|
+
import { IconDefinition } from '../types';
|
|
5
|
+
|
|
6
|
+
const ArrowBarLeft: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"d":"M15.75 3.75a.75.75 0 0 0-1.5 0v12.5a.75.75 0 0 0 1.5 0V3.75ZM6.78 8.03a.75.75 0 0 0-1.06-1.06l-2.5 2.5a.75.75 0 0 0 0 1.06l2.5 2.5a.75.75 0 0 0 1.06-1.06l-1.22-1.22h5.69a.75.75 0 0 0 0-1.5H5.56l1.22-1.22Z"},"children":[]}],"metadata":""}]},"name":"arrow-bar-left"};
|
|
7
|
+
|
|
8
|
+
export default ArrowBarLeft;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
|
|
2
|
+
// This icon file is generated automatically.
|
|
3
|
+
|
|
4
|
+
import { IconDefinition } from '../types';
|
|
5
|
+
|
|
6
|
+
const ArrowBarRight: IconDefinition = {"icon":{"type":"root","children":[{"type":"element","tagName":"svg","properties":{"viewBox":"0 0 20 20"},"children":[{"type":"element","tagName":"path","properties":{"d":"M5.5 16.25a.75.75 0 0 1-1.5 0V3.75a.75.75 0 0 1 1.5 0v12.5ZM14.03 13.03a.75.75 0 1 1-1.06-1.06l1.22-1.22H8.5a.75.75 0 0 1 0-1.5h5.69l-1.22-1.22a.75.75 0 0 1 1.06-1.06l2.5 2.5a.75.75 0 0 1 0 1.06l-2.5 2.5Z"},"children":[]}],"metadata":""}]},"name":"arrow-bar-right"};
|
|
7
|
+
|
|
8
|
+
export default ArrowBarRight;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
|
|
2
|
+
// This icon file is generated automatically.
|
|
3
|
+
|
|
4
|
+
import { IconDefinition } from '../types';
|
|
5
|
+
|
|
6
|
+
const Columns2: 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.75h5v-11h-5Zm6.5 0v11h5a.75.75 0 0 0 .75-.75v-9.5a.75.75 0 0 0-.75-.75h-5ZM2 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.5Z"},"children":[]}],"metadata":""}]},"name":"columns-2"};
|
|
7
|
+
|
|
8
|
+
export default Columns2;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
|
|
2
|
+
// This icon file is generated automatically.
|
|
3
|
+
|
|
4
|
+
import { IconDefinition } from '../types';
|
|
5
|
+
|
|
6
|
+
const Columns4: 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.75H5.5v-11H4.25ZM7 4.5v11h2.25v-11H7Zm3.75 0v11H13v-11h-2.25Zm3.75 0v11h1.25a.75.75 0 0 0 .75-.75v-9.5a.75.75 0 0 0-.75-.75H14.5ZM2 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.5Z"},"children":[]}],"metadata":""}]},"name":"columns-4"};
|
|
7
|
+
|
|
8
|
+
export default Columns4;
|
package/src/icons/ast/index.tsx
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// This icon file is generated automatically.
|
|
2
2
|
export { default as ActivityLog } from './ActivityLog';
|
|
3
3
|
export { default as Activity } from './Activity';
|
|
4
|
+
export { default as AddAfter } from './AddAfter';
|
|
5
|
+
export { default as AddBefore } from './AddBefore';
|
|
4
6
|
export { default as AddCompact } from './AddCompact';
|
|
5
7
|
export { default as AddGroup } from './AddGroup';
|
|
6
8
|
export { default as AddReactions } from './AddReactions';
|
|
@@ -19,6 +21,8 @@ export { default as AppTemplates } from './AppTemplates';
|
|
|
19
21
|
export { default as AppWebhooks } from './AppWebhooks';
|
|
20
22
|
export { default as AppWiki } from './AppWiki';
|
|
21
23
|
export { default as App } from './App';
|
|
24
|
+
export { default as ArrowBarLeft } from './ArrowBarLeft';
|
|
25
|
+
export { default as ArrowBarRight } from './ArrowBarRight';
|
|
22
26
|
export { default as ArrowBottom } from './ArrowBottom';
|
|
23
27
|
export { default as ArrowCollapseVertical } from './ArrowCollapseVertical';
|
|
24
28
|
export { default as ArrowCollapse } from './ArrowCollapse';
|
|
@@ -35,6 +39,8 @@ export { default as Checked } from './Checked';
|
|
|
35
39
|
export { default as ClearValue } from './ClearValue';
|
|
36
40
|
export { default as Close } from './Close';
|
|
37
41
|
export { default as ColorCoding } from './ColorCoding';
|
|
42
|
+
export { default as Columns2 } from './Columns2';
|
|
43
|
+
export { default as Columns4 } from './Columns4';
|
|
38
44
|
export { default as Columns } from './Columns';
|
|
39
45
|
export { default as Copy } from './Copy';
|
|
40
46
|
export { default as CopyUrl } from './CopyUrl';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// This icon file is generated automatically.
|
|
2
|
+
|
|
3
|
+
import AddAfterSvg from '../ast/AddAfter';
|
|
4
|
+
import { Icon } from '../Icon';
|
|
5
|
+
import { IconBaseProps } from '../types';
|
|
6
|
+
|
|
7
|
+
const AddAfter = (
|
|
8
|
+
props: IconBaseProps,
|
|
9
|
+
): JSX.Element => <Icon {...props} icon={AddAfterSvg} />;
|
|
10
|
+
|
|
11
|
+
AddAfter.displayName = 'AddAfter';
|
|
12
|
+
export default AddAfter;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// This icon file is generated automatically.
|
|
2
|
+
|
|
3
|
+
import AddBeforeSvg from '../ast/AddBefore';
|
|
4
|
+
import { Icon } from '../Icon';
|
|
5
|
+
import { IconBaseProps } from '../types';
|
|
6
|
+
|
|
7
|
+
const AddBefore = (
|
|
8
|
+
props: IconBaseProps,
|
|
9
|
+
): JSX.Element => <Icon {...props} icon={AddBeforeSvg} />;
|
|
10
|
+
|
|
11
|
+
AddBefore.displayName = 'AddBefore';
|
|
12
|
+
export default AddBefore;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// This icon file is generated automatically.
|
|
2
|
+
|
|
3
|
+
import ArrowBarLeftSvg from '../ast/ArrowBarLeft';
|
|
4
|
+
import { Icon } from '../Icon';
|
|
5
|
+
import { IconBaseProps } from '../types';
|
|
6
|
+
|
|
7
|
+
const ArrowBarLeft = (
|
|
8
|
+
props: IconBaseProps,
|
|
9
|
+
): JSX.Element => <Icon {...props} icon={ArrowBarLeftSvg} />;
|
|
10
|
+
|
|
11
|
+
ArrowBarLeft.displayName = 'ArrowBarLeft';
|
|
12
|
+
export default ArrowBarLeft;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// This icon file is generated automatically.
|
|
2
|
+
|
|
3
|
+
import ArrowBarRightSvg from '../ast/ArrowBarRight';
|
|
4
|
+
import { Icon } from '../Icon';
|
|
5
|
+
import { IconBaseProps } from '../types';
|
|
6
|
+
|
|
7
|
+
const ArrowBarRight = (
|
|
8
|
+
props: IconBaseProps,
|
|
9
|
+
): JSX.Element => <Icon {...props} icon={ArrowBarRightSvg} />;
|
|
10
|
+
|
|
11
|
+
ArrowBarRight.displayName = 'ArrowBarRight';
|
|
12
|
+
export default ArrowBarRight;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// This icon file is generated automatically.
|
|
2
|
+
|
|
3
|
+
import Columns2Svg from '../ast/Columns2';
|
|
4
|
+
import { Icon } from '../Icon';
|
|
5
|
+
import { IconBaseProps } from '../types';
|
|
6
|
+
|
|
7
|
+
const Columns2 = (
|
|
8
|
+
props: IconBaseProps,
|
|
9
|
+
): JSX.Element => <Icon {...props} icon={Columns2Svg} />;
|
|
10
|
+
|
|
11
|
+
Columns2.displayName = 'Columns2';
|
|
12
|
+
export default Columns2;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// This icon file is generated automatically.
|
|
2
|
+
|
|
3
|
+
import Columns4Svg from '../ast/Columns4';
|
|
4
|
+
import { Icon } from '../Icon';
|
|
5
|
+
import { IconBaseProps } from '../types';
|
|
6
|
+
|
|
7
|
+
const Columns4 = (
|
|
8
|
+
props: IconBaseProps,
|
|
9
|
+
): JSX.Element => <Icon {...props} icon={Columns4Svg} />;
|
|
10
|
+
|
|
11
|
+
Columns4.displayName = 'Columns4';
|
|
12
|
+
export default Columns4;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// This icon file is generated automatically.
|
|
2
2
|
export { default as ActivityLog } from './ActivityLog';
|
|
3
3
|
export { default as Activity } from './Activity';
|
|
4
|
+
export { default as AddAfter } from './AddAfter';
|
|
5
|
+
export { default as AddBefore } from './AddBefore';
|
|
4
6
|
export { default as AddCompact } from './AddCompact';
|
|
5
7
|
export { default as AddGroup } from './AddGroup';
|
|
6
8
|
export { default as AddReactions } from './AddReactions';
|
|
@@ -19,6 +21,8 @@ export { default as AppTemplates } from './AppTemplates';
|
|
|
19
21
|
export { default as AppWebhooks } from './AppWebhooks';
|
|
20
22
|
export { default as AppWiki } from './AppWiki';
|
|
21
23
|
export { default as App } from './App';
|
|
24
|
+
export { default as ArrowBarLeft } from './ArrowBarLeft';
|
|
25
|
+
export { default as ArrowBarRight } from './ArrowBarRight';
|
|
22
26
|
export { default as ArrowBottom } from './ArrowBottom';
|
|
23
27
|
export { default as ArrowCollapseVertical } from './ArrowCollapseVertical';
|
|
24
28
|
export { default as ArrowCollapse } from './ArrowCollapse';
|
|
@@ -35,6 +39,8 @@ export { default as Checked } from './Checked';
|
|
|
35
39
|
export { default as ClearValue } from './ClearValue';
|
|
36
40
|
export { default as Close } from './Close';
|
|
37
41
|
export { default as ColorCoding } from './ColorCoding';
|
|
42
|
+
export { default as Columns2 } from './Columns2';
|
|
43
|
+
export { default as Columns4 } from './Columns4';
|
|
38
44
|
export { default as Columns } from './Columns';
|
|
39
45
|
export { default as Copy } from './Copy';
|
|
40
46
|
export { default as CopyUrl } from './CopyUrl';
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import {forwardRef, useMemo} from "react";
|
|
2
|
-
import {getThemedUrl} from "../AppIconWithFallback";
|
|
3
|
-
import {useThemeMode} from "../ThemeProvider";
|
|
4
|
-
import appIcons from "../appIcons.json";
|
|
5
|
-
import {alignTheme} from "../theme-settings";
|
|
6
|
-
import {$TSFixMe} from "../tsfixme";
|
|
7
|
-
import type {EmojiDataProps} from "./data/get-data";
|
|
8
|
-
import {EmojiMartWrapper, NimblePicker, NimblePickerProps} from "./emoji-mart";
|
|
9
|
-
import {ColorPicker} from "../ColorPicker";
|
|
10
|
-
import {cardTypeColors} from "../designSystem";
|
|
11
|
-
|
|
12
|
-
const EMPTY_DATA = {
|
|
13
|
-
aliases: {},
|
|
14
|
-
emojis: {},
|
|
15
|
-
categories: [],
|
|
16
|
-
compressed: false,
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
type NimblePickerWithData = Omit<NimblePickerProps, keyof EmojiDataProps>;
|
|
20
|
-
|
|
21
|
-
export type AppIconPickerProps = {
|
|
22
|
-
borderless?: boolean;
|
|
23
|
-
color?: string;
|
|
24
|
-
getHoverColor?: (color: string) => string | undefined;
|
|
25
|
-
colors?: string[];
|
|
26
|
-
onColorSelect?: (c: $TSFixMe) => void;
|
|
27
|
-
} & NimblePickerWithData;
|
|
28
|
-
|
|
29
|
-
const i18n = {search: "Search icon...", notfound: "No Icons Found"};
|
|
30
|
-
|
|
31
|
-
export const AppIconPicker = forwardRef<HTMLDivElement, AppIconPickerProps>(function AppIconPicker(
|
|
32
|
-
{borderless = true, color, getHoverColor, colors = cardTypeColors, onColorSelect, ...pickerProps},
|
|
33
|
-
ref
|
|
34
|
-
) {
|
|
35
|
-
const themeMode = useThemeMode();
|
|
36
|
-
|
|
37
|
-
const alignedTheme = alignTheme(themeMode);
|
|
38
|
-
|
|
39
|
-
const customIcons = useMemo(
|
|
40
|
-
() =>
|
|
41
|
-
appIcons.map((icon) => {
|
|
42
|
-
return {
|
|
43
|
-
...icon,
|
|
44
|
-
imageUrl: getThemedUrl(icon.file, alignedTheme),
|
|
45
|
-
};
|
|
46
|
-
}),
|
|
47
|
-
[alignedTheme]
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
return (
|
|
51
|
-
<EmojiMartWrapper
|
|
52
|
-
ref={ref}
|
|
53
|
-
emojiHoverColor={color ? getHoverColor?.(color) : undefined}
|
|
54
|
-
borderless={borderless}
|
|
55
|
-
hideCategories
|
|
56
|
-
>
|
|
57
|
-
<NimblePicker custom={customIcons} i18n={i18n} {...pickerProps} data={EMPTY_DATA} showSkinTones={false} />
|
|
58
|
-
{onColorSelect ? (
|
|
59
|
-
<ColorPicker
|
|
60
|
-
colors={colors}
|
|
61
|
-
getSwatchHoverColor={getHoverColor}
|
|
62
|
-
color={color}
|
|
63
|
-
onChangeComplete={onColorSelect}
|
|
64
|
-
/>
|
|
65
|
-
) : null}
|
|
66
|
-
</EmojiMartWrapper>
|
|
67
|
-
);
|
|
68
|
-
});
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import {detectEmojiSupportLevel} from "../emoji-support";
|
|
2
|
-
import type {Data} from "emoji-mart";
|
|
3
|
-
|
|
4
|
-
export type EmojiDataProps = {
|
|
5
|
-
native: boolean;
|
|
6
|
-
data: Data;
|
|
7
|
-
backgroundImageFn: (set: string) => string;
|
|
8
|
-
set: "apple" | "twitter";
|
|
9
|
-
sheetColumns: number;
|
|
10
|
-
sheetRows: number;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
let promise: Promise<EmojiDataProps>;
|
|
14
|
-
|
|
15
|
-
const backgroundImageFn = (set: string) =>
|
|
16
|
-
`https://fibery-ui-public-assets.s3.eu-central-1.amazonaws.com/images/emoji-datasource-${set}-15_0_1-64.png`;
|
|
17
|
-
|
|
18
|
-
export const loadEmojiData = async () => {
|
|
19
|
-
const data = await import("@fibery/emoji-data/data/all.json");
|
|
20
|
-
return data.default;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const getAppleDataProps = async (): Promise<EmojiDataProps> => {
|
|
24
|
-
const [level, data] = await Promise.all([detectEmojiSupportLevel(), loadEmojiData()]);
|
|
25
|
-
|
|
26
|
-
return {
|
|
27
|
-
native: level >= 14,
|
|
28
|
-
// type declarations between @fibery/emoji-data and emoji-mart conflict a bit but they are compatible
|
|
29
|
-
data: data as unknown as Data,
|
|
30
|
-
backgroundImageFn,
|
|
31
|
-
set: "apple",
|
|
32
|
-
sheetColumns: 61,
|
|
33
|
-
sheetRows: 61,
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
const getTwitterDataProps = async (): Promise<EmojiDataProps> => {
|
|
37
|
-
const data = await loadEmojiData();
|
|
38
|
-
|
|
39
|
-
return {
|
|
40
|
-
native: false,
|
|
41
|
-
// type declarations between @fibery/emoji-data and emoji-mart conflict a bit but they are compatible
|
|
42
|
-
data: data as unknown as Data,
|
|
43
|
-
backgroundImageFn,
|
|
44
|
-
set: "twitter",
|
|
45
|
-
sheetColumns: 61,
|
|
46
|
-
sheetRows: 61,
|
|
47
|
-
};
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const isApple = () => /Mac|iPhone|iPad/.test(navigator.userAgent);
|
|
51
|
-
|
|
52
|
-
export const getEmojiDataProps = async () => {
|
|
53
|
-
if (!promise) {
|
|
54
|
-
promise = isApple() ? getAppleDataProps() : getTwitterDataProps();
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return promise;
|
|
58
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import {css} from "@linaria/core";
|
|
2
|
-
import {NimbleEmoji, NimbleEmojiProps} from "emoji-mart";
|
|
3
|
-
import {themeVars} from "../../designSystem";
|
|
4
|
-
|
|
5
|
-
const emojiWrapperCss = css`
|
|
6
|
-
display: inline-flex;
|
|
7
|
-
align-items: center;
|
|
8
|
-
|
|
9
|
-
& span.emoji-mart-emoji {
|
|
10
|
-
color: ${themeVars.textColor};
|
|
11
|
-
line-height: 1;
|
|
12
|
-
vertical-align: middle;
|
|
13
|
-
& span {
|
|
14
|
-
vertical-align: middle;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
`;
|
|
18
|
-
|
|
19
|
-
export type EmojiMartEmojiProps = NimbleEmojiProps;
|
|
20
|
-
export const EmojiMartEmoji: React.FC<NimbleEmojiProps> = (props) => {
|
|
21
|
-
return (
|
|
22
|
-
<span className={emojiWrapperCss}>
|
|
23
|
-
<NimbleEmoji {...props} />
|
|
24
|
-
</span>
|
|
25
|
-
);
|
|
26
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import {lazy, Suspense} from "react";
|
|
2
|
-
import {EmojiDataProps, getEmojiDataProps} from "../data/get-data";
|
|
3
|
-
import {EmojiMartEmoji, type EmojiMartEmojiProps} from "./emoji";
|
|
4
|
-
|
|
5
|
-
type EmojiProps = Omit<EmojiMartEmojiProps, keyof EmojiDataProps>;
|
|
6
|
-
|
|
7
|
-
const LazyEmojiComponent = lazy(async () => {
|
|
8
|
-
const emojiDataProps = await getEmojiDataProps();
|
|
9
|
-
|
|
10
|
-
function Emoji(props: EmojiProps) {
|
|
11
|
-
return <EmojiMartEmoji {...props} {...emojiDataProps} />;
|
|
12
|
-
}
|
|
13
|
-
return {
|
|
14
|
-
default: Emoji,
|
|
15
|
-
};
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
export const Emoji: React.FC<EmojiProps> = function EmojiOrLoader(props) {
|
|
19
|
-
return (
|
|
20
|
-
<Suspense fallback={<div style={{width: props.size, height: props.size}} />}>
|
|
21
|
-
<LazyEmojiComponent {...props} />
|
|
22
|
-
</Suspense>
|
|
23
|
-
);
|
|
24
|
-
};
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import {CSSProperties, css, cx} from "@linaria/core";
|
|
2
|
-
import "emoji-mart/css/emoji-mart.css";
|
|
3
|
-
import {forwardRef} from "react";
|
|
4
|
-
import {useTheme, useThemeMode} from "../ThemeProvider";
|
|
5
|
-
import {border, fontFamily, space, textStyles, themeVars} from "../designSystem";
|
|
6
|
-
|
|
7
|
-
import {NimblePickerProps, NimblePicker as Picker} from "emoji-mart";
|
|
8
|
-
import {alignTheme} from "../theme-settings";
|
|
9
|
-
|
|
10
|
-
export type {BaseEmoji, EmojiSkin, NimblePickerProps} from "emoji-mart";
|
|
11
|
-
|
|
12
|
-
export const NimblePicker = (props: NimblePickerProps) => {
|
|
13
|
-
const themeMode = useThemeMode();
|
|
14
|
-
const theme = useTheme();
|
|
15
|
-
|
|
16
|
-
return (
|
|
17
|
-
<Picker
|
|
18
|
-
theme={alignTheme(themeMode)}
|
|
19
|
-
title={""}
|
|
20
|
-
showPreview={false}
|
|
21
|
-
skinEmoji="hand"
|
|
22
|
-
color={theme.primary}
|
|
23
|
-
emoji=""
|
|
24
|
-
emojiSize={20}
|
|
25
|
-
emojiTooltip
|
|
26
|
-
{...props}
|
|
27
|
-
/>
|
|
28
|
-
);
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
const emojiMartCss = css`
|
|
32
|
-
padding: 0 ${space.l}px;
|
|
33
|
-
position: relative;
|
|
34
|
-
|
|
35
|
-
.emoji-mart {
|
|
36
|
-
font-family: ${fontFamily};
|
|
37
|
-
background-color: ${themeVars.actionMenuBg};
|
|
38
|
-
margin-top: ${space.xxs}px;
|
|
39
|
-
display: block;
|
|
40
|
-
width: 288px !important;
|
|
41
|
-
|
|
42
|
-
+ * {
|
|
43
|
-
border-top: 1px solid ${themeVars.separatorColor};
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.emoji-mart-bar {
|
|
48
|
-
border-bottom: 1px solid ${themeVars.separatorColor};
|
|
49
|
-
|
|
50
|
-
&:last-child {
|
|
51
|
-
border: 0;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
.emoji-mart-search {
|
|
56
|
-
padding-bottom: ${space.s}px;
|
|
57
|
-
padding-left: 0;
|
|
58
|
-
padding-right: 0;
|
|
59
|
-
|
|
60
|
-
& input {
|
|
61
|
-
${textStyles.regular}
|
|
62
|
-
background-color: ${themeVars.inputBgColor};
|
|
63
|
-
color: ${themeVars.textColor};
|
|
64
|
-
box-shadow: ${themeVars.inputBorderColor};
|
|
65
|
-
height: 32px;
|
|
66
|
-
border: 0;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
& .emoji-mart-search-icon {
|
|
70
|
-
top: 5px;
|
|
71
|
-
right: 4px;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
.emoji-mart-scroll {
|
|
76
|
-
padding-left: 0;
|
|
77
|
-
padding-right: 0;
|
|
78
|
-
height: 238px;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
.emoji-anchor-bar {
|
|
82
|
-
height: ${space.xxs}px;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
.emoji-mart-category-label {
|
|
86
|
-
& span {
|
|
87
|
-
${textStyles.heading6}
|
|
88
|
-
background-color: ${themeVars.actionMenuBg};
|
|
89
|
-
color: ${themeVars.textColor};
|
|
90
|
-
color: ${themeVars.accentTextColor};
|
|
91
|
-
padding-top: ${space.l}px;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
.emoji-mart-category .emoji-mart-emoji span,
|
|
96
|
-
.emoji-mart-anchor {
|
|
97
|
-
cursor: pointer !important;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
.emoji-mart-category .emoji-mart-emoji:hover::before {
|
|
101
|
-
background-color: var(--fibery-emoji-hover-color, ${themeVars.badgeBgColor}) !important;
|
|
102
|
-
border-radius: ${border.radius8}px !important;
|
|
103
|
-
}
|
|
104
|
-
.emoji-mart-dark .emoji-mart-category-label span {
|
|
105
|
-
background-color: ${themeVars.actionMenuBg};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
.emoji-mart-skin-swatch {
|
|
109
|
-
cursor: pointer;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
.emoji-mart-preview {
|
|
113
|
-
height: 0px;
|
|
114
|
-
position: unset;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
.emoji-mart-emoji {
|
|
118
|
-
color: ${themeVars.textColor};
|
|
119
|
-
/* pathetic attemts to make it a bit faster without forking */
|
|
120
|
-
content-visibility: auto;
|
|
121
|
-
contain-intrinsic-size: 20px;
|
|
122
|
-
cursor: pointer;
|
|
123
|
-
}
|
|
124
|
-
.emoji-mart-category-list,
|
|
125
|
-
.emoji-mart-category-list li {
|
|
126
|
-
/* hack to maintain correct size of hidden emojis becuase of content-visibility */
|
|
127
|
-
line-height: 0;
|
|
128
|
-
}
|
|
129
|
-
.emoji-mart-preview-skins {
|
|
130
|
-
top: 16px;
|
|
131
|
-
right: 12px !important;
|
|
132
|
-
z-index: 2;
|
|
133
|
-
background-color: ${themeVars.actionMenuBg};
|
|
134
|
-
|
|
135
|
-
& .emoji-mart-skin-swatches {
|
|
136
|
-
background-color: ${themeVars.actionMenuBg};
|
|
137
|
-
|
|
138
|
-
&.opened {
|
|
139
|
-
& .emoji-mart-skin-swatch {
|
|
140
|
-
width: 32px !important;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
& .emoji-mart-skin-swatch {
|
|
145
|
-
height: 32px !important;
|
|
146
|
-
|
|
147
|
-
&.selected {
|
|
148
|
-
width: 32px !important;
|
|
149
|
-
padding: 0;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
&:hover {
|
|
153
|
-
background-color: ${themeVars.badgeBgColor} !important;
|
|
154
|
-
border-radius: ${border.radius8}px !important;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
& .emoji-mart-skin-text {
|
|
158
|
-
height: auto;
|
|
159
|
-
padding: 0;
|
|
160
|
-
background-color: ${themeVars.actionMenuBg};
|
|
161
|
-
color: ${themeVars.accentTextColor};
|
|
162
|
-
border-radius: 0;
|
|
163
|
-
|
|
164
|
-
&.opened {
|
|
165
|
-
width: 98px;
|
|
166
|
-
padding-left: 8px;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
`;
|
|
172
|
-
|
|
173
|
-
const borderlessEmojiMartCss = css`
|
|
174
|
-
.emoji-mart {
|
|
175
|
-
border-radius: 0;
|
|
176
|
-
border: none;
|
|
177
|
-
}
|
|
178
|
-
`;
|
|
179
|
-
const hideCategoriesEmojiMartCss = css`
|
|
180
|
-
.emoji-mart-bar:first-child {
|
|
181
|
-
display: none;
|
|
182
|
-
}
|
|
183
|
-
`;
|
|
184
|
-
|
|
185
|
-
const emojiMartWithShortSearchCss = css`
|
|
186
|
-
.emoji-mart-search {
|
|
187
|
-
width: 250px;
|
|
188
|
-
}
|
|
189
|
-
`;
|
|
190
|
-
|
|
191
|
-
type EmojiMartWrapperProps = React.PropsWithChildren<{
|
|
192
|
-
borderless?: boolean;
|
|
193
|
-
hideCategories?: boolean;
|
|
194
|
-
shortSearch?: boolean;
|
|
195
|
-
emojiHoverColor?: string;
|
|
196
|
-
}>;
|
|
197
|
-
|
|
198
|
-
export const EmojiMartWrapper = forwardRef<HTMLDivElement, EmojiMartWrapperProps>(function EmojiMartWrapper(
|
|
199
|
-
{borderless, hideCategories, emojiHoverColor, shortSearch, children},
|
|
200
|
-
ref
|
|
201
|
-
) {
|
|
202
|
-
return (
|
|
203
|
-
<div
|
|
204
|
-
style={{"--fibery-emoji-hover-color": emojiHoverColor} as CSSProperties}
|
|
205
|
-
ref={ref}
|
|
206
|
-
className={cx(
|
|
207
|
-
emojiMartCss,
|
|
208
|
-
borderless && borderlessEmojiMartCss,
|
|
209
|
-
hideCategories && hideCategoriesEmojiMartCss,
|
|
210
|
-
shortSearch && emojiMartWithShortSearchCss
|
|
211
|
-
)}
|
|
212
|
-
>
|
|
213
|
-
{children}
|
|
214
|
-
</div>
|
|
215
|
-
);
|
|
216
|
-
});
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import {Suspense, forwardRef, lazy} from "react";
|
|
2
|
-
import {ColorPicker} from "../ColorPicker";
|
|
3
|
-
import {cardTypeColors} from "../designSystem";
|
|
4
|
-
import {$TSFixMe} from "../tsfixme";
|
|
5
|
-
import {EmojiMartWrapper, NimblePicker, NimblePickerProps} from "./emoji-mart";
|
|
6
|
-
import {EmojiDataProps, getEmojiDataProps} from "./data/get-data";
|
|
7
|
-
|
|
8
|
-
type NimblePickerWithData = Omit<NimblePickerProps, keyof EmojiDataProps>;
|
|
9
|
-
|
|
10
|
-
const NimblePickerWithData = lazy(async () => {
|
|
11
|
-
const emojiDataProps = await getEmojiDataProps();
|
|
12
|
-
|
|
13
|
-
return {
|
|
14
|
-
default: function EmojiPicker(props: NimblePickerWithData) {
|
|
15
|
-
return <NimblePicker {...props} {...emojiDataProps} />;
|
|
16
|
-
},
|
|
17
|
-
};
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
const EmojiPickerComponent: React.FC<NimblePickerWithData> = (props) => {
|
|
21
|
-
return (
|
|
22
|
-
<Suspense
|
|
23
|
-
fallback={
|
|
24
|
-
<div
|
|
25
|
-
className="emoji-mart"
|
|
26
|
-
style={{
|
|
27
|
-
height: "280px",
|
|
28
|
-
}}
|
|
29
|
-
/>
|
|
30
|
-
}
|
|
31
|
-
>
|
|
32
|
-
<NimblePickerWithData {...props} />
|
|
33
|
-
</Suspense>
|
|
34
|
-
);
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
export type EmojiPickerProps = {
|
|
38
|
-
borderless?: boolean;
|
|
39
|
-
color?: string;
|
|
40
|
-
getHoverColor?: (color: string) => string | undefined;
|
|
41
|
-
colors?: string[];
|
|
42
|
-
onColorSelect?: (c: $TSFixMe) => void;
|
|
43
|
-
} & NimblePickerWithData;
|
|
44
|
-
|
|
45
|
-
const i18n = {search: "Search emoji..."};
|
|
46
|
-
|
|
47
|
-
export const EmojiPicker = forwardRef<HTMLDivElement, EmojiPickerProps>(function EmojiPicker(
|
|
48
|
-
{
|
|
49
|
-
borderless = true,
|
|
50
|
-
color,
|
|
51
|
-
getHoverColor,
|
|
52
|
-
colors = cardTypeColors,
|
|
53
|
-
onColorSelect,
|
|
54
|
-
showSkinTones = true,
|
|
55
|
-
...pickerProps
|
|
56
|
-
},
|
|
57
|
-
ref
|
|
58
|
-
) {
|
|
59
|
-
return (
|
|
60
|
-
<EmojiMartWrapper
|
|
61
|
-
ref={ref}
|
|
62
|
-
emojiHoverColor={color ? getHoverColor?.(color) : undefined}
|
|
63
|
-
borderless={borderless}
|
|
64
|
-
hideCategories
|
|
65
|
-
shortSearch={showSkinTones}
|
|
66
|
-
>
|
|
67
|
-
<EmojiPickerComponent showSkinTones={showSkinTones} i18n={i18n} {...pickerProps} />
|
|
68
|
-
{onColorSelect ? (
|
|
69
|
-
<ColorPicker
|
|
70
|
-
colors={colors}
|
|
71
|
-
getSwatchHoverColor={getHoverColor}
|
|
72
|
-
color={color}
|
|
73
|
-
onChangeComplete={onColorSelect}
|
|
74
|
-
/>
|
|
75
|
-
) : null}
|
|
76
|
-
</EmojiMartWrapper>
|
|
77
|
-
);
|
|
78
|
-
});
|