@fibery/ui-kit 1.8.0 → 1.9.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fibery/ui-kit",
3
- "version": "1.8.0",
3
+ "version": "1.9.0",
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/eslint-config": "8.3.0",
96
- "@fibery/babel-preset": "7.2.0"
98
+ "@fibery/babel-preset": "7.2.0",
99
+ "@fibery/eslint-config": "8.3.0"
97
100
  },
98
101
  "jest": {
99
102
  "testEnvironment": "jsdom",
@@ -31,7 +31,7 @@ const getBorderColor = ({
31
31
  if (primary) {
32
32
  return mainColor;
33
33
  }
34
- return getOpacities(mainColor).opacity15;
34
+ return getOpacities(mainColor).opacity30;
35
35
  };
36
36
 
37
37
  const getHoverBorderColor = ({
@@ -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
+ });
@@ -237,8 +237,8 @@ const lightColors = {
237
237
  filterGroupBorder: blackA.blackA3,
238
238
  //end
239
239
  disabledInversedTextColor: shades.opacity25,
240
- danger: brandColors.red,
241
- active: brandColors.red,
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.red9,
401
- active: brandColors.red,
400
+ danger: redDark.red10,
401
+ active: redDark.red10,
402
402
  warning: "#FFD41E",
403
403
  cardBg: slateDark.slate6,
404
404
  cardSelected: slateDark.slate5,
@@ -584,16 +584,11 @@ export const colors = {
584
584
  inversedTextColor: "#FFFFFF",
585
585
  disabledInversedTextColor: lights.opacity25,
586
586
  danger: brandColors.red,
587
- active: brandColors.red,
588
- warning: "#FFD41E",
589
- cardBg: "#FFFFFF",
590
587
  cardSelected: "#FFFB8F",
591
588
  cardSelectedHover: "rgba(240, 244, 247, 0.6)",
592
- selectedImageBorder: "rgba(42, 56, 68, 0.3)",
593
589
  unitBg: "rgba(220, 224, 228, 0.33)",
594
590
  infoBox: "rgba(255, 212, 0, 0.2)",
595
591
  errorBg: "rgba(255, 241, 240, 1)",
596
- timelineScaleSelectBorderColor: chroma("#FFFFFF").alpha(opacity.opacity40).css(),
597
592
  transparent,
598
593
  shades,
599
594
  lights,
@@ -892,7 +887,7 @@ export const textStyles = {
892
887
  lineHeight: lineHeight.regular,
893
888
  fontWeight: fontWeight.regular,
894
889
  color: themeVars.textColor,
895
- border: `1px solid ${colors.active}`,
890
+ border: `1px solid ${themeVars.active}`,
896
891
  borderRadius: radius,
897
892
  },
898
893
  } as const;
@@ -0,0 +1,111 @@
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
+
81
+ const borderlessEmojiMartCss = css`
82
+ .emoji-mart {
83
+ border-radius: 0;
84
+ border: none;
85
+ }
86
+ `;
87
+ const hideCategoriesEmojiMartCss = css`
88
+ .emoji-mart-bar:first-child {
89
+ display: none;
90
+ }
91
+ `;
92
+
93
+ type EmojiMartWrapperProps = React.PropsWithChildren<{borderless?: boolean; hideCategories?: boolean}>;
94
+
95
+ export const EmojiMartWrapper = forwardRef<HTMLDivElement, EmojiMartWrapperProps>(function EmojiMartWrapper(
96
+ {borderless, hideCategories, children},
97
+ ref
98
+ ) {
99
+ return (
100
+ <div
101
+ ref={ref}
102
+ className={cx(emojiMartCss, borderless && borderlessEmojiMartCss, hideCategories && hideCategoriesEmojiMartCss)}
103
+ >
104
+ {children}
105
+ </div>
106
+ );
107
+ });
108
+
109
+ export const Emoji: React.FC<EmojiProps> = (props) => {
110
+ return <EmojiMartEmoji backgroundImageFn={backgroundImageFn} {...props} />;
111
+ };
@@ -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
+ });