emoji-picker-react 4.0.6 → 4.0.7

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.
@@ -7,6 +7,33 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau
7
7
  var React = require('react');
8
8
  var clsx = _interopDefault(require('clsx'));
9
9
 
10
+ var ClassNames;
11
+
12
+ (function (ClassNames) {
13
+ ClassNames["hiddenOnSearch"] = "epr-hidden-on-search";
14
+ ClassNames["searchActive"] = "epr-search-active";
15
+ ClassNames["hidden"] = "epr-hidden";
16
+ ClassNames["visible"] = "epr-visible";
17
+ ClassNames["active"] = "epr-active";
18
+ ClassNames["emoji"] = "epr-emoji";
19
+ ClassNames["category"] = "epr-emoji-category";
20
+ ClassNames["label"] = "epr-emoji-category-label";
21
+ ClassNames["categoryContent"] = "epr-emoji-category-content";
22
+ ClassNames["emojiHasVariatios"] = "epr-emoji-has-variations";
23
+ ClassNames["scrollBody"] = "epr-body";
24
+ ClassNames["external"] = "__EmojiPicker__";
25
+ })(ClassNames || (ClassNames = {}));
26
+
27
+ function asSelectors() {
28
+ for (var _len = arguments.length, classNames = new Array(_len), _key = 0; _key < _len; _key++) {
29
+ classNames[_key] = arguments[_key];
30
+ }
31
+
32
+ return classNames.map(function (c) {
33
+ return "." + c;
34
+ }).join('');
35
+ }
36
+
10
37
  function ElementRefContextProvider(_ref) {
11
38
  var children = _ref.children;
12
39
  var PickerMainRef = React.useRef(null);
@@ -312,19 +339,19 @@ function basePickerConfig() {
312
339
  categories: baseCategoriesConfig(),
313
340
  defaultSkinTone: exports.SkinTones.NEUTRAL,
314
341
  emojiStyle: exports.EmojiStyle.APPLE,
342
+ height: 450,
315
343
  lazyLoadEmojis: false,
316
344
  onEmojiClick: function defaultOnClickHandler( // @ts-ignore
317
345
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
318
346
  emoji, // @ts-ignore
319
347
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
320
348
  event) {},
321
- height: 450,
322
- width: 350,
323
349
  previewConfig: _extends({}, basePreviewConfig),
324
350
  searchPlaceHolder: 'Search',
325
351
  skinTonesDisabled: false,
326
352
  suggestedEmojisMode: exports.SuggestionMode.FREQUENT,
327
- theme: exports.Theme.LIGHT
353
+ theme: exports.Theme.LIGHT,
354
+ width: 350
328
355
  };
329
356
  }
330
357
  var basePreviewConfig = {
@@ -15234,32 +15261,6 @@ function useOnMouseMove() {
15234
15261
  }, [BodyRef, allowMouseMove, isMouseDisallowed]);
15235
15262
  }
15236
15263
 
15237
- var ClassNames;
15238
-
15239
- (function (ClassNames) {
15240
- ClassNames["hiddenOnSearch"] = "epr-hidden-on-search";
15241
- ClassNames["searchActive"] = "epr-search-active";
15242
- ClassNames["hidden"] = "epr-hidden";
15243
- ClassNames["visible"] = "epr-visible";
15244
- ClassNames["active"] = "epr-active";
15245
- ClassNames["emoji"] = "epr-emoji";
15246
- ClassNames["category"] = "epr-emoji-category";
15247
- ClassNames["label"] = "epr-emoji-category-label";
15248
- ClassNames["categoryContent"] = "epr-emoji-category-content";
15249
- ClassNames["emojiHasVariatios"] = "epr-emoji-has-variations";
15250
- ClassNames["external"] = "__EmojiPicker__";
15251
- })(ClassNames || (ClassNames = {}));
15252
-
15253
- function asSelectors() {
15254
- for (var _len = arguments.length, classNames = new Array(_len), _key = 0; _key < _len; _key++) {
15255
- classNames[_key] = arguments[_key];
15256
- }
15257
-
15258
- return classNames.map(function (c) {
15259
- return "." + c;
15260
- }).join('');
15261
- }
15262
-
15263
15264
  function elementCountInRow(parent, element) {
15264
15265
  if (!parent || !element) {
15265
15266
  return 0;
@@ -15389,19 +15390,54 @@ function elementHeight(element) {
15389
15390
  return (_element$clientHeight = element == null ? void 0 : element.clientHeight) != null ? _element$clientHeight : 0;
15390
15391
  }
15391
15392
  function emojiTrueOffsetTop(element) {
15392
- var _category$clientHeigh, _categoryWithoutLabel;
15393
-
15394
15393
  if (!element) {
15395
15394
  return 0;
15396
15395
  }
15397
15396
 
15398
15397
  var button = buttonFromTarget(element);
15399
- var categoryWithoutLabel = closestCategoryContent(button);
15400
- var category = closestCategory(categoryWithoutLabel); // compensate for the label height
15398
+ var category = closestCategory(button); // compensate for the label height
15401
15399
 
15402
- var labelHeight = ((_category$clientHeigh = category == null ? void 0 : category.clientHeight) != null ? _category$clientHeigh : 0) - ((_categoryWithoutLabel = categoryWithoutLabel == null ? void 0 : categoryWithoutLabel.clientHeight) != null ? _categoryWithoutLabel : 0);
15400
+ var labelHeight = categoryLabelHeight(category);
15403
15401
  return elementOffsetTop(button) + elementOffsetTop(category) + labelHeight;
15404
15402
  }
15403
+ function categoryLabelHeight(category) {
15404
+ var _category$clientHeigh, _categoryWithoutLabel;
15405
+
15406
+ if (!category) {
15407
+ return 0;
15408
+ }
15409
+
15410
+ var categoryWithoutLabel = category.querySelector(asSelectors(ClassNames.categoryContent));
15411
+ return ((_category$clientHeigh = category == null ? void 0 : category.clientHeight) != null ? _category$clientHeigh : 0) - ((_categoryWithoutLabel = categoryWithoutLabel == null ? void 0 : categoryWithoutLabel.clientHeight) != null ? _categoryWithoutLabel : 0);
15412
+ }
15413
+ function isEmojiBehindLabel(emoji) {
15414
+ if (!emoji) {
15415
+ return false;
15416
+ }
15417
+
15418
+ return emojiDistanceFromScrollTop(emoji) < categoryLabelHeight(closestCategory(emoji));
15419
+ }
15420
+ function queryScrollBody(root) {
15421
+ return root ? root.matches(asSelectors(ClassNames.scrollBody)) ? root : root.querySelector(ClassNames.scrollBody) : null;
15422
+ }
15423
+ function emojiDistanceFromScrollTop(emoji) {
15424
+ var _closestScrollBody$sc, _closestScrollBody;
15425
+
15426
+ if (!emoji) {
15427
+ return 0;
15428
+ }
15429
+
15430
+ return emojiTrueOffsetTop(emoji) - ((_closestScrollBody$sc = (_closestScrollBody = closestScrollBody(emoji)) == null ? void 0 : _closestScrollBody.scrollTop) != null ? _closestScrollBody$sc : 0);
15431
+ }
15432
+ function closestScrollBody(element) {
15433
+ var _element$closest;
15434
+
15435
+ if (!element) {
15436
+ return null;
15437
+ }
15438
+
15439
+ return (_element$closest = element.closest(asSelectors(ClassNames.scrollBody))) != null ? _element$closest : null;
15440
+ }
15405
15441
  function emojiTruOffsetLeft(element) {
15406
15442
  var button = buttonFromTarget(element);
15407
15443
  var category = closestCategory(button);
@@ -15684,8 +15720,56 @@ function focusFirstElementChild(element) {
15684
15720
  focusElement(first);
15685
15721
  }
15686
15722
 
15723
+ function scrollTo(root, top) {
15724
+ if (top === void 0) {
15725
+ top = 0;
15726
+ }
15727
+
15728
+ var $eprBody = queryScrollBody(root);
15729
+
15730
+ if (!$eprBody) {
15731
+ return;
15732
+ }
15733
+
15734
+ requestAnimationFrame(function () {
15735
+ $eprBody.scrollTop = top + 1;
15736
+ });
15737
+ }
15738
+ function scrollBy(root, by) {
15739
+ var $eprBody = queryScrollBody(root);
15740
+
15741
+ if (!$eprBody) {
15742
+ return;
15743
+ }
15744
+
15745
+ requestAnimationFrame(function () {
15746
+ $eprBody.scrollTop = $eprBody.scrollTop + by;
15747
+ });
15748
+ }
15749
+ function useScrollTo() {
15750
+ var BodyRef = useBodyRef();
15751
+ return React.useCallback(function (top) {
15752
+ requestAnimationFrame(function () {
15753
+ if (BodyRef.current) {
15754
+ BodyRef.current.scrollTop = top;
15755
+ }
15756
+ });
15757
+ }, [BodyRef]);
15758
+ }
15759
+ function scrollEmojiAboveLabel(emoji) {
15760
+ if (!isEmojiBehindLabel(emoji)) {
15761
+ return;
15762
+ }
15763
+
15764
+ var scrollBody = closestScrollBody(emoji);
15765
+ var by = emojiDistanceFromScrollTop(emoji);
15766
+ scrollBy(scrollBody, -(categoryLabelHeight(closestCategory(emoji)) - by));
15767
+ }
15768
+
15687
15769
  function focusFirstVisibleEmoji(parent) {
15688
- focusElement(firstVisibleEmoji(parent));
15770
+ var emoji = firstVisibleEmoji(parent);
15771
+ focusElement(emoji);
15772
+ scrollEmojiAboveLabel(emoji);
15689
15773
  }
15690
15774
  function focusAndClickFirstVisibleEmoji(parent) {
15691
15775
  var firstEmoji = firstVisibleEmoji(parent);
@@ -15707,6 +15791,7 @@ function focusNextVisibleEmoji(element) {
15707
15791
  }
15708
15792
 
15709
15793
  focusElement(next);
15794
+ scrollEmojiAboveLabel(next);
15710
15795
  }
15711
15796
  function focusPrevVisibleEmoji(element) {
15712
15797
  if (!element) {
@@ -15720,6 +15805,7 @@ function focusPrevVisibleEmoji(element) {
15720
15805
  }
15721
15806
 
15722
15807
  focusElement(prev);
15808
+ scrollEmojiAboveLabel(prev);
15723
15809
  }
15724
15810
  function focusVisibleEmojiOneRowUp(element, exitUp) {
15725
15811
  if (!element) {
@@ -15733,6 +15819,7 @@ function focusVisibleEmojiOneRowUp(element, exitUp) {
15733
15819
  }
15734
15820
 
15735
15821
  focusElement(prev);
15822
+ scrollEmojiAboveLabel(prev);
15736
15823
  }
15737
15824
  function focusVisibleEmojiOneRowDown(element) {
15738
15825
  if (!element) {
@@ -15961,30 +16048,31 @@ function useOnScroll(BodyRef) {
15961
16048
  }, [BodyRef, closeAllOpenToggles]);
15962
16049
  }
15963
16050
 
15964
- function scrollTo(root, top) {
15965
- if (top === void 0) {
15966
- top = 0;
15967
- }
15968
-
15969
- var $eprBody = root ? root.querySelector('.epr-body') : null;
15970
-
15971
- if (!root || !$eprBody) {
15972
- return;
15973
- }
16051
+ function useFocusSearchInput() {
16052
+ var SearchInputRef = useSearchInputRef();
16053
+ return React.useCallback(function () {
16054
+ focusElement(SearchInputRef.current);
16055
+ }, [SearchInputRef]);
16056
+ }
16057
+ function useFocusSkinTonePicker() {
16058
+ var SkinTonePickerRef = useSkinTonePickerRef();
16059
+ return React.useCallback(function () {
16060
+ if (!SkinTonePickerRef.current) {
16061
+ return;
16062
+ }
15974
16063
 
15975
- requestAnimationFrame(function () {
15976
- $eprBody.scrollTop = top + 1;
15977
- });
16064
+ focusFirstElementChild(SkinTonePickerRef.current);
16065
+ }, [SkinTonePickerRef]);
15978
16066
  }
15979
- function useScrollTo() {
15980
- var BodyRef = useBodyRef();
15981
- return React.useCallback(function (top) {
15982
- requestAnimationFrame(function () {
15983
- if (BodyRef.current) {
15984
- BodyRef.current.scrollTop = top;
15985
- }
15986
- });
15987
- }, [BodyRef]);
16067
+ function useFocusCategoryNavigation() {
16068
+ var CategoryNavigationRef = useCategoryNavigationRef();
16069
+ return React.useCallback(function () {
16070
+ if (!CategoryNavigationRef.current) {
16071
+ return;
16072
+ }
16073
+
16074
+ focusFirstElementChild(CategoryNavigationRef.current);
16075
+ }, [CategoryNavigationRef]);
15988
16076
  }
15989
16077
 
15990
16078
  function useSetFilterRef() {
@@ -16001,12 +16089,14 @@ function useSetFilterRef() {
16001
16089
  function useClearSearch() {
16002
16090
  var applySearch = useApplySearch();
16003
16091
  var SearchInputRef = useSearchInputRef();
16092
+ var focusSearchInput = useFocusSearchInput();
16004
16093
  return function clearSearch() {
16005
16094
  if (SearchInputRef.current) {
16006
16095
  SearchInputRef.current.value = '';
16007
16096
  }
16008
16097
 
16009
16098
  applySearch('');
16099
+ focusSearchInput();
16010
16100
  };
16011
16101
  }
16012
16102
  function useAppendSearch() {
@@ -16014,10 +16104,10 @@ function useAppendSearch() {
16014
16104
  var applySearch = useApplySearch();
16015
16105
  return function appendSearch(str) {
16016
16106
  if (SearchInputRef.current) {
16017
- SearchInputRef.current.value = SearchInputRef.current.value + str;
16018
- applySearch(SearchInputRef.current.value);
16107
+ SearchInputRef.current.value = "" + SearchInputRef.current.value + str;
16108
+ applySearch(getNormalizedSearchTerm(SearchInputRef.current.value));
16019
16109
  } else {
16020
- applySearch(str);
16110
+ applySearch(getNormalizedSearchTerm(str));
16021
16111
  }
16022
16112
  };
16023
16113
  }
@@ -16036,8 +16126,9 @@ function useFilter() {
16036
16126
  SearchInputRef: SearchInputRef
16037
16127
  };
16038
16128
 
16039
- function onChange(nextValue) {
16129
+ function onChange(inputValue) {
16040
16130
  var filter = filterRef.current;
16131
+ var nextValue = inputValue.toLowerCase();
16041
16132
 
16042
16133
  if (filter != null && filter[nextValue] || nextValue.length <= 1) {
16043
16134
  return applySearch(nextValue);
@@ -16067,7 +16158,7 @@ function useApplySearch() {
16067
16158
  var PickerMainRef = usePickerMainRef();
16068
16159
  return function applySearch(searchTerm) {
16069
16160
  requestAnimationFrame(function () {
16070
- setSearchTerm(searchTerm.toLowerCase()).then(function () {
16161
+ setSearchTerm(searchTerm ? searchTerm == null ? void 0 : searchTerm.toLowerCase() : searchTerm).then(function () {
16071
16162
  scrollTo(PickerMainRef.current, 0);
16072
16163
  });
16073
16164
  });
@@ -16102,7 +16193,7 @@ function useIsEmojiFiltered() {
16102
16193
  searchTerm = _useSearchTermState3[0];
16103
16194
 
16104
16195
  return function (unified) {
16105
- return isEmojiFilteredBySearchTerm(unified, filter, searchTerm.toLowerCase());
16196
+ return isEmojiFilteredBySearchTerm(unified, filter, searchTerm);
16106
16197
  };
16107
16198
  }
16108
16199
 
@@ -16138,6 +16229,14 @@ function findLongestMatch(keyword, dict) {
16138
16229
  return null;
16139
16230
  }
16140
16231
 
16232
+ function getNormalizedSearchTerm(str) {
16233
+ if (!str || typeof str !== 'string') {
16234
+ return '';
16235
+ }
16236
+
16237
+ return str.trim().toLowerCase();
16238
+ }
16239
+
16141
16240
  function useIsEmojiHidden() {
16142
16241
  var _useEmojisThatFailedT = useEmojisThatFailedToLoadState(),
16143
16242
  emojisThatFailedToLoad = _useEmojisThatFailedT[0];
@@ -16159,6 +16258,14 @@ function asEmoji(emoji) {
16159
16258
  return emoji;
16160
16259
  }
16161
16260
 
16261
+ function Button(props) {
16262
+ return React.createElement("button", Object.assign({
16263
+ type: "button"
16264
+ }, props, {
16265
+ className: clsx('epr-btn', props.className)
16266
+ }), props.children);
16267
+ }
16268
+
16162
16269
  function ClickableEmoji(_ref) {
16163
16270
  var _clsx;
16164
16271
 
@@ -16172,12 +16279,11 @@ function ClickableEmoji(_ref) {
16172
16279
  size = _ref.size,
16173
16280
  lazyLoad = _ref.lazyLoad;
16174
16281
  var hasVariations = emojiHasVariations(emoji);
16175
- return React.createElement("button", {
16282
+ return React.createElement(Button, {
16176
16283
  className: clsx(ClassNames.emoji, (_clsx = {}, _clsx[ClassNames.hidden] = hidden, _clsx[ClassNames.hiddenOnSearch] = hiddenOnSearch, _clsx[ClassNames.visible] = !hidden && !hiddenOnSearch, _clsx[ClassNames.emojiHasVariatios] = hasVariations && showVariations, _clsx)),
16177
16284
  "data-unified": unified,
16178
16285
  "aria-label": emojiName(emoji),
16179
- "data-full-name": emojiNames(emoji),
16180
- type: "button"
16286
+ "data-full-name": emojiNames(emoji)
16181
16287
  }, React.createElement(ViewOnlyEmoji, {
16182
16288
  unified: unified,
16183
16289
  emoji: emoji,
@@ -16503,7 +16609,7 @@ function Body() {
16503
16609
  useMouseDownHandlers(BodyRef);
16504
16610
  useOnMouseMove();
16505
16611
  return React.createElement("div", {
16506
- className: "epr-body",
16612
+ className: ClassNames.scrollBody,
16507
16613
  ref: BodyRef
16508
16614
  }, React.createElement(EmojiVariationPicker, null), React.createElement(EmojiList, null));
16509
16615
  }
@@ -16714,6 +16820,13 @@ function useActiveCategoryScrollDetection(setActiveCategory) {
16714
16820
  }, [BodyRef, setActiveCategory]);
16715
16821
  }
16716
16822
 
16823
+ function useIsSearchMode() {
16824
+ var _useSearchTermState = useSearchTermState(),
16825
+ searchTerm = _useSearchTermState[0];
16826
+
16827
+ return !!searchTerm;
16828
+ }
16829
+
16717
16830
  function useScrollCategoryIntoView() {
16718
16831
  var BodyRef = useBodyRef();
16719
16832
  var PickerMainRef = usePickerMainRef();
@@ -16742,6 +16855,7 @@ function CategoryNavigation() {
16742
16855
 
16743
16856
  var scrollCategoryIntoView = useScrollCategoryIntoView();
16744
16857
  useActiveCategoryScrollDetection(setActiveCategory);
16858
+ var isSearchMode = useIsSearchMode();
16745
16859
  var categoriesConfig = useCategoriesConfig();
16746
16860
  var CategoryNavigationRef = useCategoryNavigationRef();
16747
16861
  return React.createElement("div", {
@@ -16751,8 +16865,8 @@ function CategoryNavigation() {
16751
16865
  var _clsx;
16752
16866
 
16753
16867
  var category = categoryFromCategoryConfig(categoryConfig);
16754
- return React.createElement("button", {
16755
- type: "button",
16868
+ return React.createElement(Button, {
16869
+ tabIndex: isSearchMode ? -1 : 0,
16756
16870
  className: clsx('epr-cat-btn', "epr-icn-" + category, (_clsx = {}, _clsx[ClassNames.active] = category === activeCategory, _clsx)),
16757
16871
  key: category,
16758
16872
  onClick: function onClick() {
@@ -16803,43 +16917,17 @@ function Search() {
16803
16917
  ref: SearchInputRef
16804
16918
  }), React.createElement("div", {
16805
16919
  className: "epr-icn-search"
16806
- }), React.createElement("button", {
16920
+ }), React.createElement(Button, {
16807
16921
  className: clsx('epr-btn-clear-search', 'epr-visible-on-search-only'),
16808
- onClick: clearSearch,
16809
- type: "button"
16810
- }));
16922
+ onClick: clearSearch
16923
+ }, React.createElement("div", {
16924
+ className: "epr-icn-clear-search"
16925
+ })));
16811
16926
  }
16812
16927
 
16813
16928
  function CssSearch(_ref) {
16814
16929
  var value = _ref.value;
16815
- return value ? React.createElement("style", null, "\n .EmojiPickerReact button.epr-emoji:not([data-full-name*=\"" + value.toLowerCase() + "\"]) {\n display: none;\n }\n ") : null;
16816
- }
16817
-
16818
- function useFocusSearchInput() {
16819
- var SearchInputRef = useSearchInputRef();
16820
- return React.useCallback(function () {
16821
- focusElement(SearchInputRef.current);
16822
- }, [SearchInputRef]);
16823
- }
16824
- function useFocusSkinTonePicker() {
16825
- var SkinTonePickerRef = useSkinTonePickerRef();
16826
- return React.useCallback(function () {
16827
- if (!SkinTonePickerRef.current) {
16828
- return;
16829
- }
16830
-
16831
- focusFirstElementChild(SkinTonePickerRef.current);
16832
- }, [SkinTonePickerRef]);
16833
- }
16834
- function useFocusCategoryNavigation() {
16835
- var CategoryNavigationRef = useCategoryNavigationRef();
16836
- return React.useCallback(function () {
16837
- if (!CategoryNavigationRef.current) {
16838
- return;
16839
- }
16840
-
16841
- focusFirstElementChild(CategoryNavigationRef.current);
16842
- }, [CategoryNavigationRef]);
16930
+ return value ? React.createElement("style", null, "\n .EmojiPickerReact button.epr-emoji:not([data-full-name*=\"" + getNormalizedSearchTerm(value) + "\"]) {\n display: none;\n }\n ") : null;
16843
16931
  }
16844
16932
 
16845
16933
  function SkinTonePicker() {
@@ -16872,8 +16960,7 @@ function SkinTonePicker() {
16872
16960
  var _clsx;
16873
16961
 
16874
16962
  var active = skinToneVariation === activeSkinTone;
16875
- return React.createElement("button", {
16876
- type: "button",
16963
+ return React.createElement(Button, {
16877
16964
  style: {
16878
16965
  transform: clsx("translateX(-" + i * (isOpen ? 28 : 0) + "px)", isOpen && active && 'scale(1.3)')
16879
16966
  },
@@ -16904,13 +16991,6 @@ function Header() {
16904
16991
  }, React.createElement(Search, null), React.createElement(SkinTonePicker, null)), React.createElement(CategoryNavigation, null));
16905
16992
  }
16906
16993
 
16907
- function useIsSearchMode() {
16908
- var _useSearchTermState = useSearchTermState(),
16909
- searchTerm = _useSearchTermState[0];
16910
-
16911
- return !!searchTerm;
16912
- }
16913
-
16914
16994
  function getActiveElement() {
16915
16995
  return document.activeElement;
16916
16996
  }
@@ -16947,16 +17027,10 @@ function usePickerMainKeyboardEvents() {
16947
17027
  var onKeyDown = React.useMemo(function () {
16948
17028
  return function onKeyDown(event) {
16949
17029
  var key = event.key;
17030
+ disallowMouseMove();
16950
17031
 
16951
17032
  switch (key) {
16952
- case KeyboardEvents.ArrowDown:
16953
- case KeyboardEvents.ArrowUp:
16954
- case KeyboardEvents.ArrowLeft:
16955
- case KeyboardEvents.ArrowRight:
16956
- disallowMouseMove();
16957
- break;
16958
17033
  // eslint-disable-next-line no-fallthrough
16959
-
16960
17034
  case KeyboardEvents.Escape:
16961
17035
  event.preventDefault();
16962
17036