@fibery/ui-kit 1.8.0 → 1.9.1
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 +7 -4
- package/src/Button/button-base.tsx +1 -1
- package/src/Select/index.tsx +3 -1
- package/src/app-icon-picker.tsx +50 -0
- package/src/designSystem.ts +5 -13
- package/src/emoji-mart.tsx +122 -0
- package/src/emoji-picker.tsx +32 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fibery/ui-kit",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.1",
|
|
4
4
|
"main": "index.ts",
|
|
5
5
|
"private": false,
|
|
6
6
|
"files": [
|
|
@@ -22,7 +22,10 @@
|
|
|
22
22
|
"src/Pallete.ts",
|
|
23
23
|
"src/tooltip.tsx",
|
|
24
24
|
"src/BackButton.tsx",
|
|
25
|
-
"src/Button"
|
|
25
|
+
"src/Button",
|
|
26
|
+
"src/emoji-mart.tsx",
|
|
27
|
+
"src/emoji-picker.tsx",
|
|
28
|
+
"src/app-icon-picker.tsx"
|
|
26
29
|
],
|
|
27
30
|
"license": "UNLICENSED",
|
|
28
31
|
"dependencies": {
|
|
@@ -92,8 +95,8 @@
|
|
|
92
95
|
"svgo": "2.8.0",
|
|
93
96
|
"typescript": "5.0.3",
|
|
94
97
|
"unist-util-reduce": "0.2.2",
|
|
95
|
-
"@fibery/
|
|
96
|
-
"@fibery/
|
|
98
|
+
"@fibery/babel-preset": "7.2.0",
|
|
99
|
+
"@fibery/eslint-config": "8.3.0"
|
|
97
100
|
},
|
|
98
101
|
"jest": {
|
|
99
102
|
"testEnvironment": "jsdom",
|
package/src/Select/index.tsx
CHANGED
|
@@ -19,6 +19,7 @@ import BaseSelect, {
|
|
|
19
19
|
ActionMeta,
|
|
20
20
|
OnChangeValue,
|
|
21
21
|
PropsValue,
|
|
22
|
+
components as reactSelectComponents,
|
|
22
23
|
} from "react-select";
|
|
23
24
|
import BaseCreatableSelect, {CreatableProps} from "react-select/creatable";
|
|
24
25
|
import WindowedSelect, {components, WindowedMenuList} from "react-windowed-select";
|
|
@@ -245,6 +246,7 @@ export function CreatableSelectInner<
|
|
|
245
246
|
isCollectionMode,
|
|
246
247
|
menuPortalTarget,
|
|
247
248
|
styles = {},
|
|
249
|
+
virtualized = true,
|
|
248
250
|
...rest
|
|
249
251
|
}: CreatableProps<Option, IsMulti, Group> & SelectProps<Option, IsMulti, Group>,
|
|
250
252
|
ref: any
|
|
@@ -263,7 +265,7 @@ export function CreatableSelectInner<
|
|
|
263
265
|
tabSelectsValue={false}
|
|
264
266
|
components={{
|
|
265
267
|
Menu,
|
|
266
|
-
MenuList: WindowedMenuList,
|
|
268
|
+
MenuList: virtualized ? WindowedMenuList : reactSelectComponents.MenuList,
|
|
267
269
|
DropdownIndicator,
|
|
268
270
|
ClearIndicator,
|
|
269
271
|
Option: OptionComponent,
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {forwardRef, useMemo} from "react";
|
|
2
|
+
import {EmojiMartWrapper, NimblePicker, PickerProps} from "./emoji-mart";
|
|
3
|
+
import {useThemeMode} from "./ThemeProvider";
|
|
4
|
+
import {alignTheme} from "./theme-settings";
|
|
5
|
+
import appIcons from "./appIcons.json";
|
|
6
|
+
import {getThemedUrl} from "./AppIconWithFallback";
|
|
7
|
+
|
|
8
|
+
const EMPTY_DATA = {
|
|
9
|
+
aliases: {},
|
|
10
|
+
emojis: {},
|
|
11
|
+
categories: [],
|
|
12
|
+
compressed: false,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type AppIconPickerProps = {borderless?: boolean} & PickerProps;
|
|
16
|
+
|
|
17
|
+
export const AppIconPicker = forwardRef<HTMLDivElement, AppIconPickerProps>(function AppIconPicker(
|
|
18
|
+
{borderless = true, ...pickerProps},
|
|
19
|
+
ref
|
|
20
|
+
) {
|
|
21
|
+
const themeMode = useThemeMode();
|
|
22
|
+
|
|
23
|
+
const alignedTheme = alignTheme(themeMode);
|
|
24
|
+
|
|
25
|
+
const customIcons = useMemo(
|
|
26
|
+
() =>
|
|
27
|
+
appIcons.map((icon) => {
|
|
28
|
+
return {
|
|
29
|
+
...icon,
|
|
30
|
+
imageUrl: getThemedUrl(icon.file, alignedTheme),
|
|
31
|
+
};
|
|
32
|
+
}),
|
|
33
|
+
[alignedTheme]
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
return (
|
|
37
|
+
<EmojiMartWrapper ref={ref} borderless={borderless} hideCategories>
|
|
38
|
+
<NimblePicker
|
|
39
|
+
data={EMPTY_DATA}
|
|
40
|
+
theme={alignedTheme}
|
|
41
|
+
showSkinTones={false}
|
|
42
|
+
showPreview={false}
|
|
43
|
+
title=""
|
|
44
|
+
custom={customIcons}
|
|
45
|
+
emojiSize={22}
|
|
46
|
+
{...pickerProps}
|
|
47
|
+
/>
|
|
48
|
+
</EmojiMartWrapper>
|
|
49
|
+
);
|
|
50
|
+
});
|
package/src/designSystem.ts
CHANGED
|
@@ -237,8 +237,8 @@ const lightColors = {
|
|
|
237
237
|
filterGroupBorder: blackA.blackA3,
|
|
238
238
|
//end
|
|
239
239
|
disabledInversedTextColor: shades.opacity25,
|
|
240
|
-
danger:
|
|
241
|
-
active:
|
|
240
|
+
danger: red.red9,
|
|
241
|
+
active: red.red9,
|
|
242
242
|
warning: "#FFD41E",
|
|
243
243
|
cardBg: "#FFFFFF",
|
|
244
244
|
cardSelected: "#FFFB8F",
|
|
@@ -397,8 +397,8 @@ const darkColors = {
|
|
|
397
397
|
filterGroupBorder: whiteA.whiteA3,
|
|
398
398
|
//end
|
|
399
399
|
disabledInversedTextColor: lights.opacity25,
|
|
400
|
-
danger: redDark.
|
|
401
|
-
active:
|
|
400
|
+
danger: redDark.red10,
|
|
401
|
+
active: redDark.red10,
|
|
402
402
|
warning: "#FFD41E",
|
|
403
403
|
cardBg: slateDark.slate6,
|
|
404
404
|
cardSelected: slateDark.slate5,
|
|
@@ -580,20 +580,12 @@ export const colors = {
|
|
|
580
580
|
brandColors,
|
|
581
581
|
stateColors,
|
|
582
582
|
textColor: "#2A3844",
|
|
583
|
-
disabledTextColor: shades.opacity40,
|
|
584
583
|
inversedTextColor: "#FFFFFF",
|
|
585
584
|
disabledInversedTextColor: lights.opacity25,
|
|
586
585
|
danger: brandColors.red,
|
|
587
|
-
active: brandColors.red,
|
|
588
|
-
warning: "#FFD41E",
|
|
589
|
-
cardBg: "#FFFFFF",
|
|
590
586
|
cardSelected: "#FFFB8F",
|
|
591
587
|
cardSelectedHover: "rgba(240, 244, 247, 0.6)",
|
|
592
|
-
selectedImageBorder: "rgba(42, 56, 68, 0.3)",
|
|
593
588
|
unitBg: "rgba(220, 224, 228, 0.33)",
|
|
594
|
-
infoBox: "rgba(255, 212, 0, 0.2)",
|
|
595
|
-
errorBg: "rgba(255, 241, 240, 1)",
|
|
596
|
-
timelineScaleSelectBorderColor: chroma("#FFFFFF").alpha(opacity.opacity40).css(),
|
|
597
589
|
transparent,
|
|
598
590
|
shades,
|
|
599
591
|
lights,
|
|
@@ -892,7 +884,7 @@ export const textStyles = {
|
|
|
892
884
|
lineHeight: lineHeight.regular,
|
|
893
885
|
fontWeight: fontWeight.regular,
|
|
894
886
|
color: themeVars.textColor,
|
|
895
|
-
border: `1px solid ${
|
|
887
|
+
border: `1px solid ${themeVars.active}`,
|
|
896
888
|
borderRadius: radius,
|
|
897
889
|
},
|
|
898
890
|
} as const;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import "emoji-mart/css/emoji-mart.css";
|
|
2
|
+
import {forwardRef} from "react";
|
|
3
|
+
import {border, space, textStyles, themeVars} from "./designSystem";
|
|
4
|
+
import {cx, css} from "@linaria/core";
|
|
5
|
+
import {Emoji as EmojiMartEmoji, EmojiProps} from "emoji-mart";
|
|
6
|
+
|
|
7
|
+
export {detectEmojiSupportLevel} from "./emojiSupport";
|
|
8
|
+
export {emojiIndex, Picker, NimblePicker} from "emoji-mart";
|
|
9
|
+
export type {BaseEmoji, PickerProps, EmojiSkin} from "emoji-mart";
|
|
10
|
+
|
|
11
|
+
export const backgroundImageFn = () => "https://assets-temp.fibery.io/images/emoji-datasource-apple-5_0_1-64.png";
|
|
12
|
+
|
|
13
|
+
const emojiMartCss = css`
|
|
14
|
+
.emoji-mart {
|
|
15
|
+
background-color: ${themeVars.actionMenuBg};
|
|
16
|
+
margin-top: ${space.xxs}px;
|
|
17
|
+
display: block;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.emoji-mart-bar {
|
|
21
|
+
border-bottom: 1px solid ${themeVars.separatorColor};
|
|
22
|
+
|
|
23
|
+
&:last-child {
|
|
24
|
+
border-top: 1px solid ${themeVars.separatorColor};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.emoji-mart-search {
|
|
29
|
+
padding-bottom: ${space.s}px;
|
|
30
|
+
|
|
31
|
+
& input {
|
|
32
|
+
${textStyles.regular}
|
|
33
|
+
background-color: ${themeVars.inputBgColor};
|
|
34
|
+
color: ${themeVars.textColor};
|
|
35
|
+
box-shadow: ${themeVars.inputBorderColor};
|
|
36
|
+
height: 34px;
|
|
37
|
+
border: 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.emoji-anchor-bar {
|
|
42
|
+
height: ${space.xxs}px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.emoji-mart-category-label {
|
|
46
|
+
& span {
|
|
47
|
+
${textStyles.heading6}
|
|
48
|
+
background-color: ${themeVars.actionMenuBg};
|
|
49
|
+
color: ${themeVars.textColor};
|
|
50
|
+
color: ${themeVars.accentTextColor};
|
|
51
|
+
padding-top: ${space.l}px;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.emoji-mart-category .emoji-mart-emoji span,
|
|
56
|
+
.emoji-mart-anchor {
|
|
57
|
+
cursor: pointer !important;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.emoji-mart-category .emoji-mart-emoji:hover::before {
|
|
61
|
+
background-color: ${themeVars.badgeBgColor} !important;
|
|
62
|
+
border-radius: ${border.radius8}px !important;
|
|
63
|
+
}
|
|
64
|
+
.emoji-mart-dark .emoji-mart-category-label span {
|
|
65
|
+
background-color: ${themeVars.actionMenuBg};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.emoji-mart-skin-swatch {
|
|
69
|
+
cursor: pointer;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.emoji-mart-preview {
|
|
73
|
+
height: 50px;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.emoji-mart-preview-skins {
|
|
77
|
+
right: 15px;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.emoji-mart-emoji {
|
|
81
|
+
/* pathetic attemts to make it a bit faster without forking */
|
|
82
|
+
content-visibility: auto;
|
|
83
|
+
contain-intrinsic-size: 22px;
|
|
84
|
+
}
|
|
85
|
+
.emoji-mart-category-list,
|
|
86
|
+
.emoji-mart-category-list li {
|
|
87
|
+
/* hack to maintain correct size of hidden emojis becuase of content-visibility */
|
|
88
|
+
line-height: 0;
|
|
89
|
+
}
|
|
90
|
+
`;
|
|
91
|
+
|
|
92
|
+
const borderlessEmojiMartCss = css`
|
|
93
|
+
.emoji-mart {
|
|
94
|
+
border-radius: 0;
|
|
95
|
+
border: none;
|
|
96
|
+
}
|
|
97
|
+
`;
|
|
98
|
+
const hideCategoriesEmojiMartCss = css`
|
|
99
|
+
.emoji-mart-bar:first-child {
|
|
100
|
+
display: none;
|
|
101
|
+
}
|
|
102
|
+
`;
|
|
103
|
+
|
|
104
|
+
type EmojiMartWrapperProps = React.PropsWithChildren<{borderless?: boolean; hideCategories?: boolean}>;
|
|
105
|
+
|
|
106
|
+
export const EmojiMartWrapper = forwardRef<HTMLDivElement, EmojiMartWrapperProps>(function EmojiMartWrapper(
|
|
107
|
+
{borderless, hideCategories, children},
|
|
108
|
+
ref
|
|
109
|
+
) {
|
|
110
|
+
return (
|
|
111
|
+
<div
|
|
112
|
+
ref={ref}
|
|
113
|
+
className={cx(emojiMartCss, borderless && borderlessEmojiMartCss, hideCategories && hideCategoriesEmojiMartCss)}
|
|
114
|
+
>
|
|
115
|
+
{children}
|
|
116
|
+
</div>
|
|
117
|
+
);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
export const Emoji: React.FC<EmojiProps> = (props) => {
|
|
121
|
+
return <EmojiMartEmoji backgroundImageFn={backgroundImageFn} {...props} />;
|
|
122
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {forwardRef} from "react";
|
|
2
|
+
import {useTheme, useThemeMode} from "./ThemeProvider";
|
|
3
|
+
import {EmojiMartWrapper, Picker, PickerProps, backgroundImageFn} from "./emoji-mart";
|
|
4
|
+
import {alignTheme} from "./theme-settings";
|
|
5
|
+
|
|
6
|
+
type EmojiPickerProps = {
|
|
7
|
+
borderless?: boolean;
|
|
8
|
+
} & PickerProps;
|
|
9
|
+
|
|
10
|
+
export const EmojiPicker = forwardRef<HTMLDivElement, EmojiPickerProps>(function EmojiPickerComponent(
|
|
11
|
+
{borderless = true, ...pickerProps},
|
|
12
|
+
ref
|
|
13
|
+
) {
|
|
14
|
+
const themeMode = useThemeMode();
|
|
15
|
+
const theme = useTheme();
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<EmojiMartWrapper ref={ref} borderless={borderless}>
|
|
19
|
+
<Picker
|
|
20
|
+
theme={alignTheme(themeMode)}
|
|
21
|
+
backgroundImageFn={backgroundImageFn}
|
|
22
|
+
native
|
|
23
|
+
title={""}
|
|
24
|
+
showPreview={false}
|
|
25
|
+
color={theme.primary}
|
|
26
|
+
emoji=""
|
|
27
|
+
emojiSize={22}
|
|
28
|
+
{...pickerProps}
|
|
29
|
+
/>
|
|
30
|
+
</EmojiMartWrapper>
|
|
31
|
+
);
|
|
32
|
+
});
|