emoji-picker-react 4.4.0-rc.1 → 4.4.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.
Files changed (40) 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 -3
  10. package/dist/config/useConfig.d.ts +3 -3
  11. package/dist/emoji-picker-react.cjs.development.css +4 -4
  12. package/dist/emoji-picker-react.cjs.development.js +254 -128
  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 +266 -140
  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 -4
  33. package/src/config/useConfig.ts +11 -8
  34. package/src/hooks/useDisallowedEmojis.ts +4 -17
  35. package/src/hooks/useFilter.ts +9 -10
  36. package/src/hooks/useKeyboardNavigation.ts +69 -26
  37. package/src/hooks/useShouldShowSkinTonePicker.ts +22 -0
  38. package/src/types/exposedTypes.ts +10 -5
  39. package/dist/predicates/isFunction.d.ts +0 -1
  40. package/src/predicates/isFunction.ts +0 -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,8 +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',
16802
- showEmoji: undefined,
16815
+ skinTonePickerLocation: SkinTonePickerLocation.SEARCH,
16803
16816
  skinTonesDisabled: false,
16804
16817
  suggestedEmojisMode: exports.SuggestionMode.FREQUENT,
16805
16818
  theme: exports.Theme.LIGHT,
@@ -16912,17 +16925,23 @@ function useEmojiVersionConfig() {
16912
16925
 
16913
16926
  return emojiVersion;
16914
16927
  }
16915
- function useGetEmojiUrlConfig() {
16928
+ function useSearchDisabledConfig() {
16916
16929
  var _usePickerConfig14 = usePickerConfig(),
16917
- getEmojiUrl = _usePickerConfig14.getEmojiUrl;
16930
+ searchDisabled = _usePickerConfig14.searchDisabled;
16918
16931
 
16919
- return getEmojiUrl;
16932
+ return searchDisabled;
16920
16933
  }
16921
- function useShowEmojiConfig() {
16934
+ function useSkinTonePickerLocationConfig() {
16922
16935
  var _usePickerConfig15 = usePickerConfig(),
16923
- showEmoji = _usePickerConfig15.showEmoji;
16936
+ skinTonePickerLocation = _usePickerConfig15.skinTonePickerLocation;
16937
+
16938
+ return skinTonePickerLocation;
16939
+ }
16940
+ function useGetEmojiUrlConfig() {
16941
+ var _usePickerConfig16 = usePickerConfig(),
16942
+ getEmojiUrl = _usePickerConfig16.getEmojiUrl;
16924
16943
 
16925
- return showEmoji;
16944
+ return getEmojiUrl;
16926
16945
  }
16927
16946
 
16928
16947
  function getDimension(dimensionConfig) {
@@ -16972,37 +16991,24 @@ function useDebouncedState(initialValue, delay) {
16972
16991
  return [state, debouncedSetState];
16973
16992
  }
16974
16993
 
16975
- function isFunction(value) {
16976
- return typeof value === 'function';
16977
- }
16978
-
16979
16994
  function useDisallowedEmojis() {
16980
16995
  var DisallowedEmojisRef = React.useRef({});
16981
16996
  var emojiVersionConfig = useEmojiVersionConfig();
16982
- var shouldShowEmoji = useShowEmojiConfig();
16983
16997
  return React.useMemo(function () {
16984
16998
  var emojiVersion = parseFloat("" + emojiVersionConfig);
16985
16999
 
16986
- if ((!emojiVersionConfig || Number.isNaN(emojiVersion)) && !shouldShowEmoji) {
17000
+ if (!emojiVersionConfig || Number.isNaN(emojiVersion)) {
16987
17001
  return DisallowedEmojisRef.current;
16988
17002
  }
16989
17003
 
16990
17004
  return allEmojis.reduce(function (disallowedEmojis, emoji) {
16991
- if (isFunction(shouldShowEmoji) && !shouldShowEmoji(emoji)) {
16992
- disallowEmoji();
16993
- }
16994
-
16995
17005
  if (addedInNewerVersion(emoji, emojiVersion)) {
16996
- disallowEmoji();
17006
+ disallowedEmojis[emojiUnified(emoji)] = true;
16997
17007
  }
16998
17008
 
16999
17009
  return disallowedEmojis;
17000
-
17001
- function disallowEmoji() {
17002
- disallowedEmojis[emojiUnified(emoji)] = true;
17003
- }
17004
17010
  }, DisallowedEmojisRef.current);
17005
- }, [emojiVersionConfig, shouldShowEmoji]);
17011
+ }, [emojiVersionConfig]);
17006
17012
  }
17007
17013
 
17008
17014
  function addedInNewerVersion(emoji, supportedLevel) {
@@ -18009,7 +18015,7 @@ function useFocusCategoryNavigation() {
18009
18015
  function useSetFilterRef() {
18010
18016
  var filterRef = useFilterRef();
18011
18017
  return function setFilter(setter) {
18012
- if (isFunction(setter)) {
18018
+ if (typeof setter === 'function') {
18013
18019
  return setFilter(setter(filterRef.current));
18014
18020
  }
18015
18021
 
@@ -18644,6 +18650,15 @@ function useEmojiPreviewEvents(allow, setPreviewEmoji) {
18644
18650
  }, [BodyRef, allow, setPreviewEmoji, isMouseDisallowed, allowMouseMove]);
18645
18651
  }
18646
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
+
18647
18662
  var FlexDirection;
18648
18663
 
18649
18664
  (function (FlexDirection) {
@@ -18664,8 +18679,141 @@ function Flex(_ref) {
18664
18679
  }, children);
18665
18680
  }
18666
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
+
18667
18803
  function Preview() {
18668
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();
18669
18817
 
18670
18818
  var _useState = React.useState(null),
18671
18819
  previewEmoji = _useState[0],
@@ -18678,16 +18826,9 @@ function Preview() {
18678
18826
 
18679
18827
  var getEmojiUrl = useGetEmojiUrlConfig();
18680
18828
  useEmojiPreviewEvents(previewConfig.showPreview, setPreviewEmoji);
18681
-
18682
- if (!previewConfig.showPreview) {
18683
- return null;
18684
- }
18685
-
18686
18829
  var emoji = emojiByUnified(previewEmoji == null ? void 0 : previewEmoji.originalUnified);
18687
18830
  var show = emoji != null && previewEmoji != null;
18688
- return React.createElement(Flex, {
18689
- className: "epr-preview"
18690
- }, React.createElement(PreviewContent, null));
18831
+ return React.createElement(PreviewContent, null);
18691
18832
 
18692
18833
  function PreviewContent() {
18693
18834
  var defaultEmoji = asEmoji(variationPickerEmoji != null ? variationPickerEmoji : emojiByUnified(previewConfig.defaultEmoji));
@@ -18712,17 +18853,6 @@ function Preview() {
18712
18853
  }
18713
18854
  }
18714
18855
 
18715
- function Relative(_ref) {
18716
- var children = _ref.children,
18717
- className = _ref.className;
18718
- return React.createElement("div", {
18719
- style: {
18720
- position: 'relative'
18721
- },
18722
- className: className
18723
- }, children);
18724
- }
18725
-
18726
18856
  function categoryNameFromDom($category) {
18727
18857
  var _$category$getAttribu;
18728
18858
 
@@ -18831,6 +18961,18 @@ function CategoryNavigation() {
18831
18961
  }));
18832
18962
  }
18833
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
+ }
18834
18976
  function Search() {
18835
18977
  var _useState = React.useState(0),
18836
18978
  inc = _useState[0],
@@ -18890,65 +19032,10 @@ function CssSearch(_ref) {
18890
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 ");
18891
19033
  }
18892
19034
 
18893
- function SkinTonePicker() {
18894
- var SkinTonePickerRef = useSkinTonePickerRef();
18895
- var isDisabled = useSkinTonesDisabledConfig();
18896
-
18897
- var _useSkinToneFanOpenSt = useSkinToneFanOpenState(),
18898
- isOpen = _useSkinToneFanOpenSt[0],
18899
- setIsOpen = _useSkinToneFanOpenSt[1];
18900
-
18901
- var _useActiveSkinToneSta = useActiveSkinToneState(),
18902
- activeSkinTone = _useActiveSkinToneSta[0],
18903
- setActiveSkinTone = _useActiveSkinToneSta[1];
18904
-
18905
- var closeAllOpenToggles = useCloseAllOpenToggles();
18906
- var focusSearchInput = useFocusSearchInput();
18907
-
18908
- if (isDisabled) {
18909
- return null;
18910
- }
18911
-
18912
- return React.createElement(Relative, {
18913
- className: clsx('epr-skin-tones', {
18914
- open: isOpen
18915
- })
18916
- }, React.createElement("div", {
18917
- className: "epr-skin-tone-select",
18918
- ref: SkinTonePickerRef
18919
- }, skinToneVariations.map(function (skinToneVariation, i) {
18920
- var _clsx;
18921
-
18922
- var active = skinToneVariation === activeSkinTone;
18923
- return React.createElement(Button, {
18924
- style: {
18925
- transform: clsx("translateX(-" + i * (isOpen ? 28 : 0) + "px)", isOpen && active && 'scale(1.3)')
18926
- },
18927
- onClick: function onClick() {
18928
- if (isOpen) {
18929
- setActiveSkinTone(skinToneVariation);
18930
- focusSearchInput();
18931
- } else {
18932
- setIsOpen(true);
18933
- }
18934
-
18935
- closeAllOpenToggles();
18936
- },
18937
- key: skinToneVariation,
18938
- className: clsx("epr-tone-" + skinToneVariation, 'epr-tone', (_clsx = {}, _clsx[ClassNames.active] = active, _clsx)),
18939
- tabIndex: isOpen ? 0 : -1,
18940
- "aria-pressed": active,
18941
- "aria-label": "Skin tone " + skinTonesNamed[skinToneVariation]
18942
- });
18943
- })));
18944
- }
18945
-
18946
19035
  function Header() {
18947
19036
  return React.createElement(Relative, {
18948
19037
  className: "epr-header"
18949
- }, React.createElement(Flex, {
18950
- className: "epr-header-overlay"
18951
- }, React.createElement(Search, null), React.createElement(SkinTonePicker, null)), React.createElement(CategoryNavigation, null));
19038
+ }, React.createElement(SearchContainer, null), React.createElement(CategoryNavigation, null));
18952
19039
  }
18953
19040
 
18954
19041
  function getActiveElement() {
@@ -19030,12 +19117,17 @@ function useSearchInputKeyboardEvents() {
19030
19117
  setSkinToneFanOpenState = _useSkinToneFanOpenSt[1];
19031
19118
 
19032
19119
  var goDownFromSearchInput = useGoDownFromSearchInput();
19120
+ var isSkinToneInSearch = useIsSkinToneInSearch();
19033
19121
  var onKeyDown = React.useMemo(function () {
19034
19122
  return function onKeyDown(event) {
19035
19123
  var key = event.key;
19036
19124
 
19037
19125
  switch (key) {
19038
19126
  case KeyboardEvents.ArrowRight:
19127
+ if (!isSkinToneInSearch) {
19128
+ return;
19129
+ }
19130
+
19039
19131
  event.preventDefault();
19040
19132
  setSkinToneFanOpenState(true);
19041
19133
  focusSkinTonePicker();
@@ -19077,48 +19169,82 @@ function useSkinTonePickerKeyboardEvents() {
19077
19169
  isOpen = _useSkinToneFanOpenSt2[0],
19078
19170
  setIsOpen = _useSkinToneFanOpenSt2[1];
19079
19171
 
19172
+ var isSkinToneInPreview = useIsSkinToneInPreview();
19173
+ var isSkinToneInSearch = useIsSkinToneInSearch();
19080
19174
  var onType = useOnType();
19081
19175
  var onKeyDown = React.useMemo(function () {
19082
- return function onKeyDown(event) {
19083
- var key = event.key;
19176
+ return (// eslint-disable-next-line complexity
19177
+ function onKeyDown(event) {
19178
+ var key = event.key;
19084
19179
 
19085
- switch (key) {
19086
- case KeyboardEvents.ArrowLeft:
19087
- event.preventDefault();
19180
+ if (isSkinToneInSearch) {
19181
+ switch (key) {
19182
+ case KeyboardEvents.ArrowLeft:
19183
+ event.preventDefault();
19088
19184
 
19089
- if (!isOpen) {
19090
- return focusSearchInput();
19091
- }
19185
+ if (!isOpen) {
19186
+ return focusSearchInput();
19187
+ }
19092
19188
 
19093
- focusNextSkinTone(focusSearchInput);
19094
- break;
19189
+ focusNextSkinTone(focusSearchInput);
19190
+ break;
19095
19191
 
19096
- case KeyboardEvents.ArrowRight:
19097
- event.preventDefault();
19192
+ case KeyboardEvents.ArrowRight:
19193
+ event.preventDefault();
19098
19194
 
19099
- if (!isOpen) {
19100
- return focusSearchInput();
19101
- }
19195
+ if (!isOpen) {
19196
+ return focusSearchInput();
19197
+ }
19102
19198
 
19103
- focusPrevSkinTone();
19104
- break;
19199
+ focusPrevSkinTone();
19200
+ break;
19105
19201
 
19106
- case KeyboardEvents.ArrowDown:
19107
- event.preventDefault();
19202
+ case KeyboardEvents.ArrowDown:
19203
+ event.preventDefault();
19204
+
19205
+ if (isOpen) {
19206
+ setIsOpen(false);
19207
+ }
19208
+
19209
+ goDownFromSearchInput();
19210
+ break;
19108
19211
 
19109
- if (isOpen) {
19110
- setIsOpen(false);
19212
+ default:
19213
+ onType(event);
19214
+ break;
19111
19215
  }
19216
+ }
19112
19217
 
19113
- goDownFromSearchInput();
19114
- break;
19218
+ if (isSkinToneInPreview) {
19219
+ switch (key) {
19220
+ case KeyboardEvents.ArrowUp:
19221
+ event.preventDefault();
19115
19222
 
19116
- default:
19117
- onType(event);
19118
- 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
+ }
19119
19245
  }
19120
- };
19121
- }, [isOpen, focusSearchInput, setIsOpen, goDownFromSearchInput, onType]);
19246
+ );
19247
+ }, [isOpen, focusSearchInput, setIsOpen, goDownFromSearchInput, onType, isSkinToneInPreview, isSkinToneInSearch]);
19122
19248
  React.useEffect(function () {
19123
19249
  var current = SkinTonePickerRef.current;
19124
19250