@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 +3 -3
- package/src/design-system.ts +2 -0
- package/src/emoji-picker/icon-emoji-picker.tsx +1 -1
- package/src/emoji-picker/primitives/category.tsx +1 -1
- package/src/emoji-picker/primitives/grid.tsx +2 -0
- package/src/emoji-picker/stores/emoji-data-store.tsx +13 -10
- package/src/emoji-picker/stores/lazy-icon-data-store.tsx +4 -2
- package/src/emoji-picker/stores/static-emoji-data-store.tsx +11 -6
- package/src/lists/list-row-surface.tsx +8 -0
- package/src/select/index.tsx +5 -0
- package/src/emoji-picker/stores/lazy-emoji-data-store.tsx +0 -29
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fibery/ui-kit",
|
|
3
|
-
"version": "1.
|
|
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/
|
|
72
|
+
"@fibery/emoji-data": "2.3.0",
|
|
73
73
|
"@fibery/helpers": "1.2.0",
|
|
74
|
-
"@fibery/
|
|
74
|
+
"@fibery/react": "1.3.0"
|
|
75
75
|
},
|
|
76
76
|
"peerDependencies": {
|
|
77
77
|
"react": "^18.2.0",
|
package/src/design-system.ts
CHANGED
|
@@ -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
|
|
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 {
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/select/index.tsx
CHANGED
|
@@ -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
|
-
};
|