@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.
- package/package.json +4 -3
- package/src/antd/styles.ts +21 -4
- package/src/designSystem.ts +18 -28
- package/src/emoji-picker/app-icon-picker.tsx +31 -26
- package/src/emoji-picker/emoji-picker-content-with-color.tsx +107 -0
- package/src/emoji-picker/emoji-picker.tsx +34 -37
- package/src/emoji-picker/emoji.tsx +4 -7
- package/src/emoji-picker/icon-emoji-picker.tsx +17 -8
- package/src/emoji-picker/primitives/category.tsx +95 -25
- package/src/emoji-picker/primitives/emoji.tsx +37 -78
- package/src/emoji-picker/primitives/footer.tsx +3 -1
- package/src/emoji-picker/primitives/grid.tsx +53 -23
- package/src/emoji-picker/primitives/root.tsx +13 -3
- package/src/emoji-picker/primitives/search.tsx +38 -20
- package/src/emoji-picker/primitives/skin-tone.tsx +21 -11
- package/src/emoji-picker/stores/emoji-data-store.tsx +0 -1
- package/src/emoji-picker/stores/lazy-icon-data-store.tsx +44 -0
- package/src/emoji-picker/stores/static-emoji-data-store.tsx +16 -0
- package/src/emoji-picker/utils/emoji-set.ts +1 -1
- package/src/icons/ast/AiAssistant.ts +1 -1
- package/src/icons/ast/AiAvatar.ts +1 -1
- package/src/icons/ast/AppTemplates.ts +1 -1
- package/src/icons/ast/BellCircle.ts +8 -0
- package/src/icons/ast/BellX.ts +8 -0
- package/src/icons/ast/Bolt.ts +8 -0
- package/src/icons/ast/CheckCircle.ts +8 -0
- package/src/icons/ast/ClockForward.ts +8 -0
- package/src/icons/ast/ColorCodingFilled.ts +8 -0
- package/src/icons/ast/Delete.ts +1 -1
- package/src/icons/ast/EmojiDelete.ts +8 -0
- package/src/icons/ast/ExtensionAssignments.ts +1 -1
- package/src/icons/ast/Fields.ts +1 -1
- package/src/icons/ast/Figma.ts +8 -0
- package/src/icons/ast/GoogleDrive.ts +8 -0
- package/src/icons/ast/GoogleMap.ts +8 -0
- package/src/icons/ast/InvitePeople.ts +1 -1
- package/src/icons/ast/LineDivider.ts +8 -0
- package/src/icons/ast/Loom.ts +8 -0
- package/src/icons/ast/Miro.ts +8 -0
- package/src/icons/ast/Mixpanel.ts +8 -0
- package/src/icons/ast/Shared.ts +1 -1
- package/src/icons/ast/Twitter.ts +8 -0
- package/src/icons/ast/Youtube.ts +8 -0
- package/src/icons/ast/index.tsx +16 -0
- package/src/icons/react/BellCircle.tsx +12 -0
- package/src/icons/react/BellX.tsx +12 -0
- package/src/icons/react/Bolt.tsx +12 -0
- package/src/icons/react/CheckCircle.tsx +12 -0
- package/src/icons/react/ClockForward.tsx +12 -0
- package/src/icons/react/ColorCodingFilled.tsx +12 -0
- package/src/icons/react/EmojiDelete.tsx +12 -0
- package/src/icons/react/Figma.tsx +12 -0
- package/src/icons/react/GoogleDrive.tsx +12 -0
- package/src/icons/react/GoogleMap.tsx +12 -0
- package/src/icons/react/LineDivider.tsx +12 -0
- package/src/icons/react/Loom.tsx +12 -0
- package/src/icons/react/Miro.tsx +12 -0
- package/src/icons/react/Mixpanel.tsx +12 -0
- package/src/icons/react/Twitter.tsx +12 -0
- package/src/icons/react/Youtube.tsx +12 -0
- package/src/icons/react/index.tsx +16 -0
- package/src/Button/icon-button-with-tooltip.tsx +0 -15
- package/src/emoji-picker/index.tsx +0 -5
- package/src/emoji-picker/lazy-icon-data-store.tsx +0 -55
- /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.
|
|
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/
|
|
64
|
-
"@fibery/
|
|
64
|
+
"@fibery/react": "1.0.3",
|
|
65
|
+
"@fibery/emoji-data": "2.1.1"
|
|
65
66
|
},
|
|
66
67
|
"peerDependencies": {
|
|
67
68
|
"react": "^18.2.0",
|
package/src/antd/styles.ts
CHANGED
|
@@ -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"},
|
package/src/designSystem.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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(
|
|
612
|
-
dark: a11yColor(getOpacities(
|
|
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
|
|
2
|
-
import {
|
|
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 {
|
|
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 {
|
|
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: "
|
|
34
|
-
<
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
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
|
-
<
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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:
|
|
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> =
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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>
|