@fibery/ui-kit 1.22.0 → 1.23.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.22.0",
3
+ "version": "1.23.0",
4
4
  "main": "index.ts",
5
5
  "private": false,
6
6
  "files": [
@@ -69,9 +69,9 @@
69
69
  "react-windowed-select": "5.0.0",
70
70
  "screenfull": "6.0.1",
71
71
  "ua-parser-js": "0.7.24",
72
- "@fibery/react": "1.3.0",
72
+ "@fibery/emoji-data": "2.3.0",
73
73
  "@fibery/helpers": "1.2.0",
74
- "@fibery/emoji-data": "2.2.1"
74
+ "@fibery/react": "1.3.0"
75
75
  },
76
76
  "peerDependencies": {
77
77
  "react": "^18.2.0",
@@ -746,6 +746,8 @@ export const spaceNestedTreeInterval = 0;
746
746
  export const layout = {
747
747
  logoSize: 16,
748
748
  menuDefaultWidth: 243,
749
+ desktopToolbarHeight: 32,
750
+ desktopMenuMinWidth: 160,
749
751
  menuMinWidth: 47, //TODO: make dependency to itemHeight
750
752
  menuMaxWidth: 480,
751
753
  menuItemMinWidth: 80,
@@ -1,7 +1,7 @@
1
1
  import {css} from "@linaria/core";
2
2
  import {compact} from "lodash";
3
3
  import {Button} from "../button";
4
- import {AntTabs} from "../antd";
4
+ import {AntTabs} from "../antd/Tabs";
5
5
  import {space, textStyles} from "../design-system";
6
6
  import {$TSFixMe} from "../tsfixme";
7
7
  import {AppIconPicker, AppIconPickerProps} from "./app-icon-picker";
@@ -4,7 +4,7 @@ import {memo} from "react";
4
4
  import {useInView} from "react-intersection-observer";
5
5
  import {IconButton} from "../../button/icon-button";
6
6
  import {space, textStyles, themeVars} from "../../design-system";
7
- import {Settings} from "../../icons/react";
7
+ import Settings from "../../icons/react/Settings";
8
8
  import {useEmojiDataStoreSelector} from "../stores/emoji-data-store";
9
9
  import {useEmojiPickerContentSettings} from "./content";
10
10
  import {Emoji} from "./emoji";
@@ -19,7 +19,9 @@ type AllCategoriesProps = Pick<EmojiPickerCategoryProps, "renderEmoji" | "scroll
19
19
  const AllCategories: React.FC<AllCategoriesProps> = ({renderEmoji, scrollParent}) => {
20
20
  const contentSettings = useEmojiPickerContentSettings();
21
21
 
22
+ // TODO: accessing emojiData inside useMemo is not reactive so it won't be re-rendered when emojis are modified
22
23
  const emojiData = useEmojiDataStore();
24
+
23
25
  const categories = useEmojiDataStoreSelector((store) => store.getCategories());
24
26
 
25
27
  const recentCategory = useMemo(
@@ -1,7 +1,7 @@
1
1
  import type {EmojiData} from "@fibery/emoji-data";
2
2
  import {PubSub, makePubSub} from "@fibery/helpers/utils/pub-sub";
3
3
  import {createContext} from "@fibery/react/src/create-context";
4
- import {useMemo, useSyncExternalStore} from "react";
4
+ import {useSyncExternalStore} from "react";
5
5
 
6
6
  export type EmojiDataStore = EmojiData & {pubSub: PubSub};
7
7
 
@@ -11,6 +11,10 @@ export const makeEmojiDataStore = (emojiData: EmojiData): EmojiDataStore => {
11
11
  return {
12
12
  ...emojiData,
13
13
 
14
+ setData(...args: Parameters<EmojiData["setData"]>) {
15
+ emojiData.setData(...args);
16
+ pubSub.publish();
17
+ },
14
18
  setCustom(...args: Parameters<EmojiData["setCustom"]>) {
15
19
  emojiData.setCustom(...args);
16
20
  pubSub.publish();
@@ -30,20 +34,19 @@ export const makeEmojiDataStore = (emojiData: EmojiData): EmojiDataStore => {
30
34
 
31
35
  const [DataStoreProvider, useDataStoreCtx] = createContext<EmojiDataStore>("EmojiDataStore");
32
36
 
33
- export const EmojiDataStoreProvider: React.FC<
34
- React.PropsWithChildren<{
35
- data: EmojiData;
36
- }>
37
- > = ({data, children}) => {
38
- const emojiDataStore = useMemo(() => makeEmojiDataStore(data), [data]);
39
-
40
- return <DataStoreProvider value={emojiDataStore}>{children}</DataStoreProvider>;
41
- };
37
+ export const EmojiDataStoreProvider = DataStoreProvider;
42
38
 
43
39
  export const useEmojiDataStore = useDataStoreCtx;
44
40
 
41
+ // TODO: this https://github.com/facebook/react/blob/main/packages/use-sync-external-store/with-selector.js can be used
42
+ // for more flexible selections (e.g. getManyEmojis(ids: string[]){})
43
+ // but it's not documented by react yet. Even though react-redux uses it in useSelector
45
44
  export const useEmojiDataStoreSelector = <Snapshot,>(getter: (emojiDataStore: EmojiDataStore) => Snapshot) => {
46
45
  const dataStore = useDataStoreCtx();
47
46
 
48
47
  return useSyncExternalStore(dataStore.pubSub.subscribe, () => getter(dataStore));
49
48
  };
49
+
50
+ const getIsInitialized = (store: EmojiDataStore) => store.getIsInitialized();
51
+
52
+ export const useIsInitializedEmojiDataStore = () => useEmojiDataStoreSelector(getIsInitialized);
@@ -1,6 +1,6 @@
1
1
  import {RawCustomEmoji, makeEmojiData} from "@fibery/emoji-data";
2
2
  import {Suspense, lazy} from "react";
3
- import {EmojiDataStoreProvider} from "./emoji-data-store";
3
+ import {EmojiDataStoreProvider, makeEmojiDataStore} from "./emoji-data-store";
4
4
  import {getImageUrl} from "../../app-icon-with-fallback";
5
5
 
6
6
  const EMPTY_DATA = {
@@ -24,9 +24,11 @@ const LazyAppIcons = lazy(async () => {
24
24
 
25
25
  appIconsEmojiData.setCustom(custom);
26
26
 
27
+ const appIconsEmojiStore = makeEmojiDataStore(appIconsEmojiData);
28
+
27
29
  return {
28
30
  default: function EmojiDataStore({children}: React.PropsWithChildren) {
29
- return <EmojiDataStoreProvider data={appIconsEmojiData}>{children}</EmojiDataStoreProvider>;
31
+ return <EmojiDataStoreProvider value={appIconsEmojiStore}>{children}</EmojiDataStoreProvider>;
30
32
  },
31
33
  };
32
34
  });
@@ -1,16 +1,21 @@
1
- import {FC, ReactNode, useMemo} from "react";
2
1
  import {makeEmojiData} from "@fibery/emoji-data";
3
- import {getEmojiSet} from "../utils/emoji-set";
4
- import {EmojiDataStoreProvider} from "./emoji-data-store";
5
2
  import rawData from "@fibery/emoji-data/data/all.json";
6
-
7
- // Static means "preloaded", "non-lazy" here
3
+ import {FC, ReactNode, useMemo} from "react";
4
+ import {getEmojiSet} from "../utils/emoji-set";
5
+ import {EmojiDataStoreProvider, makeEmojiDataStore} from "./emoji-data-store";
8
6
 
9
7
  interface EmojiDataProviderProps {
10
8
  children?: ReactNode;
11
9
  }
12
10
 
11
+ /**
12
+ * @deprecated
13
+ * Static means "preloaded", "non-lazy" here
14
+ * Should Not outside of tests
15
+ */
13
16
  export const StaticEmojiDataStore: FC<EmojiDataProviderProps> = ({children}) => {
14
17
  const emojiData = useMemo(() => makeEmojiData(rawData, {set: getEmojiSet()}), []);
15
- return <EmojiDataStoreProvider data={emojiData}>{children}</EmojiDataStoreProvider>;
18
+ const emojiDataStore = useMemo(() => makeEmojiDataStore(emojiData), [emojiData]);
19
+
20
+ return <EmojiDataStoreProvider value={emojiDataStore}>{children}</EmojiDataStoreProvider>;
16
21
  };
@@ -28,17 +28,25 @@ export const listRowSurfaceStylesBase = css`
28
28
  color: ${themeVars.textColor};
29
29
  border-radius: ${border.radius6}px;
30
30
  transition: background-color;
31
+
32
+ &:focus {
33
+ outline: none;
34
+ }
35
+
31
36
  ${NATURAL_HOVER},
32
37
  &.hover {
33
38
  cursor: pointer;
34
39
  }
40
+
35
41
  &.done {
36
42
  cursor: not-allowed;
37
43
  color: ${themeVars.colorTextListItemGeneralDisabled};
44
+
38
45
  > * {
39
46
  opacity: ${themeVars.opacityListItemGeneralDisabled};
40
47
  }
41
48
  }
49
+
42
50
  &.selected {
43
51
  cursor: default;
44
52
  }
@@ -103,6 +103,11 @@ function countOptions<Option, Group extends GroupBase<Option>>(categorizedOption
103
103
  }, 0);
104
104
  }
105
105
 
106
+ /**
107
+ * Draws a select input.
108
+ * Please use formatOptionLabel instead of Option component override. Select has smart optimisations for large lists
109
+ * those would be lost and your select slow if options are too numerous
110
+ */
106
111
  export const Select = forwardRef(function Select<
107
112
  Option = unknown,
108
113
  IsMulti extends boolean = boolean,
@@ -1,29 +0,0 @@
1
- import {makeEmojiData} from "@fibery/emoji-data";
2
- import {Suspense, lazy} from "react";
3
- import {EmojiDataStoreProvider} from "./emoji-data-store";
4
- import {getEmojiSet} from "../utils/emoji-set";
5
- import {loadEmojiData} from "../utils/load-emoji-data";
6
-
7
- const LazyEmojiDataStoreComponent = lazy(async () => {
8
- const rawData = await loadEmojiData();
9
-
10
- const emojiData = makeEmojiData(rawData, {set: getEmojiSet()});
11
-
12
- return {
13
- default: function EmojiDataStore({children}: React.PropsWithChildren) {
14
- return <EmojiDataStoreProvider data={emojiData}>{children}</EmojiDataStoreProvider>;
15
- },
16
- };
17
- });
18
-
19
- export const LazyEmojiDataStore: React.FC<
20
- React.PropsWithChildren<{
21
- fallback: React.ReactNode;
22
- }>
23
- > = ({fallback, children}) => {
24
- return (
25
- <Suspense fallback={fallback}>
26
- <LazyEmojiDataStoreComponent>{children}</LazyEmojiDataStoreComponent>
27
- </Suspense>
28
- );
29
- };