emoji-picker-react 4.3.0 → 4.4.0-rc.2

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.
Files changed (36) hide show
  1. package/README.md +26 -16
  2. package/dist/DomUtils/classNames.d.ts +4 -1
  3. package/dist/components/Layout/Absolute.d.ts +8 -0
  4. package/dist/components/Layout/Relative.d.ts +2 -1
  5. package/dist/components/Layout/Space.d.ts +7 -0
  6. package/dist/components/footer/Preview.d.ts +1 -0
  7. package/dist/components/header/Search.d.ts +1 -0
  8. package/dist/components/header/SkinTonePicker.d.ts +10 -1
  9. package/dist/config/config.d.ts +3 -1
  10. package/dist/config/useConfig.d.ts +3 -1
  11. package/dist/emoji-picker-react.cjs.development.css +4 -4
  12. package/dist/emoji-picker-react.cjs.development.js +252 -106
  13. package/dist/emoji-picker-react.cjs.development.js.map +1 -1
  14. package/dist/emoji-picker-react.cjs.production.min.js +1 -1
  15. package/dist/emoji-picker-react.cjs.production.min.js.map +1 -1
  16. package/dist/emoji-picker-react.esm.js +264 -118
  17. package/dist/emoji-picker-react.esm.js.map +1 -1
  18. package/dist/hooks/useShouldShowSkinTonePicker.d.ts +4 -0
  19. package/dist/types/exposedTypes.d.ts +4 -0
  20. package/package.json +1 -1
  21. package/src/DomUtils/classNames.ts +4 -1
  22. package/src/EmojiPickerReact.css +3 -0
  23. package/src/components/Layout/Absolute.tsx +15 -0
  24. package/src/components/Layout/Relative.tsx +3 -2
  25. package/src/components/Layout/Space.tsx +11 -0
  26. package/src/components/footer/Preview.css +2 -0
  27. package/src/components/footer/Preview.tsx +23 -11
  28. package/src/components/header/Header.tsx +2 -7
  29. package/src/components/header/Search.tsx +25 -3
  30. package/src/components/header/SkinTonePicker.css +19 -9
  31. package/src/components/header/SkinTonePicker.tsx +41 -4
  32. package/src/config/config.ts +11 -1
  33. package/src/config/useConfig.ts +11 -0
  34. package/src/hooks/useKeyboardNavigation.ts +69 -26
  35. package/src/hooks/useShouldShowSkinTonePicker.ts +22 -0
  36. package/src/types/exposedTypes.ts +10 -5
@@ -24,6 +24,9 @@ var ClassNames;
24
24
  ClassNames["emojiList"] = "epr-emoji-list";
25
25
  ClassNames["external"] = "__EmojiPicker__";
26
26
  ClassNames["emojiPicker"] = "EmojiPickerReact";
27
+ ClassNames["open"] = "epr-open";
28
+ ClassNames["vertical"] = "epr-vertical";
29
+ ClassNames["horizontal"] = "epr-horizontal";
27
30
  })(ClassNames || (ClassNames = {}));
28
31
 
29
32
  function asSelectors() {
@@ -232,6 +235,13 @@ function _createForOfIteratorHelperLoose(o, allowArrayLike) {
232
235
  Categories["FLAGS"] = "flags";
233
236
  })(exports.Categories || (exports.Categories = {}));
234
237
 
238
+ var SkinTonePickerLocation;
239
+
240
+ (function (SkinTonePickerLocation) {
241
+ SkinTonePickerLocation["SEARCH"] = "SEARCH";
242
+ SkinTonePickerLocation["PREVIEW"] = "PREVIEW";
243
+ })(SkinTonePickerLocation || (SkinTonePickerLocation = {}));
244
+
235
245
  var CDN_URL_APPLE = 'https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/';
236
246
  var CDN_URL_FACEBOOK = 'https://cdn.jsdelivr.net/npm/emoji-datasource-facebook/img/facebook/64/';
237
247
  var CDN_URL_TWITTER = 'https://cdn.jsdelivr.net/npm/emoji-datasource-twitter/img/twitter/64/';
@@ -16777,9 +16787,11 @@ function mergeConfig(userConfig) {
16777
16787
  var categories = mergeCategoriesConfig(userConfig.categories, {
16778
16788
  suggestionMode: config.suggestedEmojisMode
16779
16789
  });
16790
+ var skinTonePickerLocation = config.searchDisabled ? SkinTonePickerLocation.PREVIEW : config.skinTonePickerLocation;
16780
16791
  return _extends({}, config, {
16781
16792
  categories: categories,
16782
- previewConfig: previewConfig
16793
+ previewConfig: previewConfig,
16794
+ skinTonePickerLocation: skinTonePickerLocation
16783
16795
  });
16784
16796
  }
16785
16797
  function basePickerConfig() {
@@ -16798,7 +16810,9 @@ function basePickerConfig() {
16798
16810
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
16799
16811
  event) {},
16800
16812
  previewConfig: _extends({}, basePreviewConfig),
16813
+ searchDisabled: false,
16801
16814
  searchPlaceHolder: 'Search',
16815
+ skinTonePickerLocation: SkinTonePickerLocation.SEARCH,
16802
16816
  skinTonesDisabled: false,
16803
16817
  suggestedEmojisMode: exports.SuggestionMode.FREQUENT,
16804
16818
  theme: exports.Theme.LIGHT,
@@ -16911,9 +16925,21 @@ function useEmojiVersionConfig() {
16911
16925
 
16912
16926
  return emojiVersion;
16913
16927
  }
16914
- function useGetEmojiUrlConfig() {
16928
+ function useSearchDisabledConfig() {
16915
16929
  var _usePickerConfig14 = usePickerConfig(),
16916
- getEmojiUrl = _usePickerConfig14.getEmojiUrl;
16930
+ searchDisabled = _usePickerConfig14.searchDisabled;
16931
+
16932
+ return searchDisabled;
16933
+ }
16934
+ function useSkinTonePickerLocationConfig() {
16935
+ var _usePickerConfig15 = usePickerConfig(),
16936
+ skinTonePickerLocation = _usePickerConfig15.skinTonePickerLocation;
16937
+
16938
+ return skinTonePickerLocation;
16939
+ }
16940
+ function useGetEmojiUrlConfig() {
16941
+ var _usePickerConfig16 = usePickerConfig(),
16942
+ getEmojiUrl = _usePickerConfig16.getEmojiUrl;
16917
16943
 
16918
16944
  return getEmojiUrl;
16919
16945
  }
@@ -18624,6 +18650,15 @@ function useEmojiPreviewEvents(allow, setPreviewEmoji) {
18624
18650
  }, [BodyRef, allow, setPreviewEmoji, isMouseDisallowed, allowMouseMove]);
18625
18651
  }
18626
18652
 
18653
+ function useIsSkinToneInSearch() {
18654
+ var skinTonePickerLocationConfig = useSkinTonePickerLocationConfig();
18655
+ return skinTonePickerLocationConfig === SkinTonePickerLocation.SEARCH;
18656
+ }
18657
+ function useIsSkinToneInPreview() {
18658
+ var skinTonePickerLocationConfig = useSkinTonePickerLocationConfig();
18659
+ return skinTonePickerLocationConfig === SkinTonePickerLocation.PREVIEW;
18660
+ }
18661
+
18627
18662
  var FlexDirection;
18628
18663
 
18629
18664
  (function (FlexDirection) {
@@ -18644,8 +18679,141 @@ function Flex(_ref) {
18644
18679
  }, children);
18645
18680
  }
18646
18681
 
18682
+ function Space(_ref) {
18683
+ var className = _ref.className,
18684
+ _ref$style = _ref.style,
18685
+ style = _ref$style === void 0 ? {} : _ref$style;
18686
+ return React.createElement("div", {
18687
+ style: _extends({
18688
+ flex: 1
18689
+ }, style),
18690
+ className: clsx(className)
18691
+ });
18692
+ }
18693
+
18694
+ function Absolute(_ref) {
18695
+ var children = _ref.children,
18696
+ className = _ref.className,
18697
+ style = _ref.style;
18698
+ return React.createElement("div", {
18699
+ style: _extends({}, style, {
18700
+ position: 'absolute'
18701
+ }),
18702
+ className: className
18703
+ }, children);
18704
+ }
18705
+
18706
+ function Relative(_ref) {
18707
+ var children = _ref.children,
18708
+ className = _ref.className,
18709
+ style = _ref.style;
18710
+ return React.createElement("div", {
18711
+ style: _extends({}, style, {
18712
+ position: 'relative'
18713
+ }),
18714
+ className: className
18715
+ }, children);
18716
+ }
18717
+
18718
+ var ITEM_SIZE = 28;
18719
+ function SkinTonePickerMenu() {
18720
+ return React.createElement(Relative, {
18721
+ style: {
18722
+ height: ITEM_SIZE
18723
+ }
18724
+ }, React.createElement(Absolute, {
18725
+ style: {
18726
+ bottom: 0,
18727
+ right: 0
18728
+ }
18729
+ }, React.createElement(SkinTonePicker, {
18730
+ direction: SkinTonePickerDirection.VERTICAL
18731
+ })));
18732
+ }
18733
+ function SkinTonePicker(_ref) {
18734
+ var _clsx;
18735
+
18736
+ var _ref$direction = _ref.direction,
18737
+ direction = _ref$direction === void 0 ? SkinTonePickerDirection.HORIZONTAL : _ref$direction;
18738
+ var SkinTonePickerRef = useSkinTonePickerRef();
18739
+ var isDisabled = useSkinTonesDisabledConfig();
18740
+
18741
+ var _useSkinToneFanOpenSt = useSkinToneFanOpenState(),
18742
+ isOpen = _useSkinToneFanOpenSt[0],
18743
+ setIsOpen = _useSkinToneFanOpenSt[1];
18744
+
18745
+ var _useActiveSkinToneSta = useActiveSkinToneState(),
18746
+ activeSkinTone = _useActiveSkinToneSta[0],
18747
+ setActiveSkinTone = _useActiveSkinToneSta[1];
18748
+
18749
+ var closeAllOpenToggles = useCloseAllOpenToggles();
18750
+ var focusSearchInput = useFocusSearchInput();
18751
+
18752
+ if (isDisabled) {
18753
+ return null;
18754
+ }
18755
+
18756
+ var fullWidth = ITEM_SIZE * skinToneVariations.length + "px";
18757
+ var expandedSize = isOpen ? fullWidth : ITEM_SIZE + 'px';
18758
+ var vertical = direction === SkinTonePickerDirection.VERTICAL;
18759
+ return React.createElement(Relative, {
18760
+ className: clsx('epr-skin-tones', direction, (_clsx = {}, _clsx[ClassNames.open] = isOpen, _clsx)),
18761
+ style: vertical ? {
18762
+ flexBasis: expandedSize,
18763
+ height: expandedSize
18764
+ } : {
18765
+ flexBasis: expandedSize
18766
+ }
18767
+ }, React.createElement("div", {
18768
+ className: "epr-skin-tone-select",
18769
+ ref: SkinTonePickerRef
18770
+ }, skinToneVariations.map(function (skinToneVariation, i) {
18771
+ var _clsx2;
18772
+
18773
+ var active = skinToneVariation === activeSkinTone;
18774
+ return React.createElement(Button, {
18775
+ style: {
18776
+ transform: clsx(vertical ? "translateY(-" + i * (isOpen ? ITEM_SIZE : 0) + "px)" : "translateX(-" + i * (isOpen ? ITEM_SIZE : 0) + "px)", isOpen && active && 'scale(1.3)')
18777
+ },
18778
+ onClick: function onClick() {
18779
+ if (isOpen) {
18780
+ setActiveSkinTone(skinToneVariation);
18781
+ focusSearchInput();
18782
+ } else {
18783
+ setIsOpen(true);
18784
+ }
18785
+
18786
+ closeAllOpenToggles();
18787
+ },
18788
+ key: skinToneVariation,
18789
+ className: clsx("epr-tone-" + skinToneVariation, 'epr-tone', (_clsx2 = {}, _clsx2[ClassNames.active] = active, _clsx2)),
18790
+ tabIndex: isOpen ? 0 : -1,
18791
+ "aria-pressed": active,
18792
+ "aria-label": "Skin tone " + skinTonesNamed[skinToneVariation]
18793
+ });
18794
+ })));
18795
+ }
18796
+ var SkinTonePickerDirection;
18797
+
18798
+ (function (SkinTonePickerDirection) {
18799
+ SkinTonePickerDirection["VERTICAL"] = "epr-vertical";
18800
+ SkinTonePickerDirection["HORIZONTAL"] = "epr-horizontal";
18801
+ })(SkinTonePickerDirection || (SkinTonePickerDirection = {}));
18802
+
18647
18803
  function Preview() {
18648
18804
  var previewConfig = usePreviewConfig();
18805
+ var isSkinToneInPreview = useIsSkinToneInPreview();
18806
+
18807
+ if (!previewConfig.showPreview) {
18808
+ return null;
18809
+ }
18810
+
18811
+ return React.createElement(Flex, {
18812
+ className: "epr-preview"
18813
+ }, React.createElement(PreviewBody, null), React.createElement(Space, null), isSkinToneInPreview ? React.createElement(SkinTonePickerMenu, null) : null);
18814
+ }
18815
+ function PreviewBody() {
18816
+ var previewConfig = usePreviewConfig();
18649
18817
 
18650
18818
  var _useState = React.useState(null),
18651
18819
  previewEmoji = _useState[0],
@@ -18658,16 +18826,9 @@ function Preview() {
18658
18826
 
18659
18827
  var getEmojiUrl = useGetEmojiUrlConfig();
18660
18828
  useEmojiPreviewEvents(previewConfig.showPreview, setPreviewEmoji);
18661
-
18662
- if (!previewConfig.showPreview) {
18663
- return null;
18664
- }
18665
-
18666
18829
  var emoji = emojiByUnified(previewEmoji == null ? void 0 : previewEmoji.originalUnified);
18667
18830
  var show = emoji != null && previewEmoji != null;
18668
- return React.createElement(Flex, {
18669
- className: "epr-preview"
18670
- }, React.createElement(PreviewContent, null));
18831
+ return React.createElement(PreviewContent, null);
18671
18832
 
18672
18833
  function PreviewContent() {
18673
18834
  var defaultEmoji = asEmoji(variationPickerEmoji != null ? variationPickerEmoji : emojiByUnified(previewConfig.defaultEmoji));
@@ -18692,17 +18853,6 @@ function Preview() {
18692
18853
  }
18693
18854
  }
18694
18855
 
18695
- function Relative(_ref) {
18696
- var children = _ref.children,
18697
- className = _ref.className;
18698
- return React.createElement("div", {
18699
- style: {
18700
- position: 'relative'
18701
- },
18702
- className: className
18703
- }, children);
18704
- }
18705
-
18706
18856
  function categoryNameFromDom($category) {
18707
18857
  var _$category$getAttribu;
18708
18858
 
@@ -18811,6 +18961,18 @@ function CategoryNavigation() {
18811
18961
  }));
18812
18962
  }
18813
18963
 
18964
+ function SearchContainer() {
18965
+ var searchDisabled = useSearchDisabledConfig();
18966
+ var isSkinToneInSearch = useIsSkinToneInSearch();
18967
+
18968
+ if (searchDisabled) {
18969
+ return null;
18970
+ }
18971
+
18972
+ return React.createElement(Flex, {
18973
+ className: "epr-header-overlay"
18974
+ }, React.createElement(Search, null), isSkinToneInSearch ? React.createElement(SkinTonePicker, null) : null);
18975
+ }
18814
18976
  function Search() {
18815
18977
  var _useState = React.useState(0),
18816
18978
  inc = _useState[0],
@@ -18870,65 +19032,10 @@ function CssSearch(_ref) {
18870
19032
  return React.createElement("style", null, "\n " + CSS_SEARCH_SELECTOR + " " + asSelectors(ClassNames.category) + ":not(:has(" + searchQuery + ")) {\n display: none;\n }\n\n " + CSS_SEARCH_SELECTOR + " button" + asSelectors(ClassNames.emoji) + ":not(" + searchQuery + ") {\n display: none;\n }\n ");
18871
19033
  }
18872
19034
 
18873
- function SkinTonePicker() {
18874
- var SkinTonePickerRef = useSkinTonePickerRef();
18875
- var isDisabled = useSkinTonesDisabledConfig();
18876
-
18877
- var _useSkinToneFanOpenSt = useSkinToneFanOpenState(),
18878
- isOpen = _useSkinToneFanOpenSt[0],
18879
- setIsOpen = _useSkinToneFanOpenSt[1];
18880
-
18881
- var _useActiveSkinToneSta = useActiveSkinToneState(),
18882
- activeSkinTone = _useActiveSkinToneSta[0],
18883
- setActiveSkinTone = _useActiveSkinToneSta[1];
18884
-
18885
- var closeAllOpenToggles = useCloseAllOpenToggles();
18886
- var focusSearchInput = useFocusSearchInput();
18887
-
18888
- if (isDisabled) {
18889
- return null;
18890
- }
18891
-
18892
- return React.createElement(Relative, {
18893
- className: clsx('epr-skin-tones', {
18894
- open: isOpen
18895
- })
18896
- }, React.createElement("div", {
18897
- className: "epr-skin-tone-select",
18898
- ref: SkinTonePickerRef
18899
- }, skinToneVariations.map(function (skinToneVariation, i) {
18900
- var _clsx;
18901
-
18902
- var active = skinToneVariation === activeSkinTone;
18903
- return React.createElement(Button, {
18904
- style: {
18905
- transform: clsx("translateX(-" + i * (isOpen ? 28 : 0) + "px)", isOpen && active && 'scale(1.3)')
18906
- },
18907
- onClick: function onClick() {
18908
- if (isOpen) {
18909
- setActiveSkinTone(skinToneVariation);
18910
- focusSearchInput();
18911
- } else {
18912
- setIsOpen(true);
18913
- }
18914
-
18915
- closeAllOpenToggles();
18916
- },
18917
- key: skinToneVariation,
18918
- className: clsx("epr-tone-" + skinToneVariation, 'epr-tone', (_clsx = {}, _clsx[ClassNames.active] = active, _clsx)),
18919
- tabIndex: isOpen ? 0 : -1,
18920
- "aria-pressed": active,
18921
- "aria-label": "Skin tone " + skinTonesNamed[skinToneVariation]
18922
- });
18923
- })));
18924
- }
18925
-
18926
19035
  function Header() {
18927
19036
  return React.createElement(Relative, {
18928
19037
  className: "epr-header"
18929
- }, React.createElement(Flex, {
18930
- className: "epr-header-overlay"
18931
- }, React.createElement(Search, null), React.createElement(SkinTonePicker, null)), React.createElement(CategoryNavigation, null));
19038
+ }, React.createElement(SearchContainer, null), React.createElement(CategoryNavigation, null));
18932
19039
  }
18933
19040
 
18934
19041
  function getActiveElement() {
@@ -19010,12 +19117,17 @@ function useSearchInputKeyboardEvents() {
19010
19117
  setSkinToneFanOpenState = _useSkinToneFanOpenSt[1];
19011
19118
 
19012
19119
  var goDownFromSearchInput = useGoDownFromSearchInput();
19120
+ var isSkinToneInSearch = useIsSkinToneInSearch();
19013
19121
  var onKeyDown = React.useMemo(function () {
19014
19122
  return function onKeyDown(event) {
19015
19123
  var key = event.key;
19016
19124
 
19017
19125
  switch (key) {
19018
19126
  case KeyboardEvents.ArrowRight:
19127
+ if (!isSkinToneInSearch) {
19128
+ return;
19129
+ }
19130
+
19019
19131
  event.preventDefault();
19020
19132
  setSkinToneFanOpenState(true);
19021
19133
  focusSkinTonePicker();
@@ -19057,48 +19169,82 @@ function useSkinTonePickerKeyboardEvents() {
19057
19169
  isOpen = _useSkinToneFanOpenSt2[0],
19058
19170
  setIsOpen = _useSkinToneFanOpenSt2[1];
19059
19171
 
19172
+ var isSkinToneInPreview = useIsSkinToneInPreview();
19173
+ var isSkinToneInSearch = useIsSkinToneInSearch();
19060
19174
  var onType = useOnType();
19061
19175
  var onKeyDown = React.useMemo(function () {
19062
- return function onKeyDown(event) {
19063
- var key = event.key;
19176
+ return (// eslint-disable-next-line complexity
19177
+ function onKeyDown(event) {
19178
+ var key = event.key;
19064
19179
 
19065
- switch (key) {
19066
- case KeyboardEvents.ArrowLeft:
19067
- event.preventDefault();
19180
+ if (isSkinToneInSearch) {
19181
+ switch (key) {
19182
+ case KeyboardEvents.ArrowLeft:
19183
+ event.preventDefault();
19068
19184
 
19069
- if (!isOpen) {
19070
- return focusSearchInput();
19071
- }
19185
+ if (!isOpen) {
19186
+ return focusSearchInput();
19187
+ }
19072
19188
 
19073
- focusNextSkinTone(focusSearchInput);
19074
- break;
19189
+ focusNextSkinTone(focusSearchInput);
19190
+ break;
19075
19191
 
19076
- case KeyboardEvents.ArrowRight:
19077
- event.preventDefault();
19192
+ case KeyboardEvents.ArrowRight:
19193
+ event.preventDefault();
19078
19194
 
19079
- if (!isOpen) {
19080
- return focusSearchInput();
19081
- }
19195
+ if (!isOpen) {
19196
+ return focusSearchInput();
19197
+ }
19082
19198
 
19083
- focusPrevSkinTone();
19084
- break;
19199
+ focusPrevSkinTone();
19200
+ break;
19085
19201
 
19086
- case KeyboardEvents.ArrowDown:
19087
- event.preventDefault();
19202
+ case KeyboardEvents.ArrowDown:
19203
+ event.preventDefault();
19204
+
19205
+ if (isOpen) {
19206
+ setIsOpen(false);
19207
+ }
19208
+
19209
+ goDownFromSearchInput();
19210
+ break;
19088
19211
 
19089
- if (isOpen) {
19090
- setIsOpen(false);
19212
+ default:
19213
+ onType(event);
19214
+ break;
19091
19215
  }
19216
+ }
19092
19217
 
19093
- goDownFromSearchInput();
19094
- break;
19218
+ if (isSkinToneInPreview) {
19219
+ switch (key) {
19220
+ case KeyboardEvents.ArrowUp:
19221
+ event.preventDefault();
19095
19222
 
19096
- default:
19097
- onType(event);
19098
- break;
19223
+ if (!isOpen) {
19224
+ return focusSearchInput();
19225
+ }
19226
+
19227
+ focusNextSkinTone(focusSearchInput);
19228
+ break;
19229
+
19230
+ case KeyboardEvents.ArrowDown:
19231
+ event.preventDefault();
19232
+
19233
+ if (!isOpen) {
19234
+ return focusSearchInput();
19235
+ }
19236
+
19237
+ focusPrevSkinTone();
19238
+ break;
19239
+
19240
+ default:
19241
+ onType(event);
19242
+ break;
19243
+ }
19244
+ }
19099
19245
  }
19100
- };
19101
- }, [isOpen, focusSearchInput, setIsOpen, goDownFromSearchInput, onType]);
19246
+ );
19247
+ }, [isOpen, focusSearchInput, setIsOpen, goDownFromSearchInput, onType, isSkinToneInPreview, isSkinToneInSearch]);
19102
19248
  React.useEffect(function () {
19103
19249
  var current = SkinTonePickerRef.current;
19104
19250