react-input-emoji 5.7.0 → 5.8.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/README.md CHANGED
@@ -66,6 +66,7 @@ export default function Example() {
66
66
  | `buttonElement` | HTMLElement | - | Allows you to provide a custom HTMLElement that, when clicked, triggers the emoji picker. If this prop is provided, the default emoji picker button is removed. |
67
67
  | `buttonRef` | React.MutableRefObject | - | Accepts a React mutable ref object that, when referenced, triggers the emoji picker. If this prop is provided, the default emoji picker button is removed. |
68
68
  | `cleanOnEnter` | boolean | false | When set to true, the input value will be cleared after the user presses the Enter key. |
69
+ | `color` | string | "black" | Specifies the color of the input text. Accepts any valid CSS color value. |
69
70
  | `fontSize` | number | 15 | Controls the font size (in pixels) of the placeholder text and input value. |
70
71
  | `fontFamily` | string | "sans-serif" | Specifies the font family for the placeholder text and input value. Accepts any valid CSS font-family value. |
71
72
  | `height` | number | 40 | Sets the total height (in pixels) of the area in which the input element is rendered. |
@@ -79,6 +80,7 @@ export default function Example() {
79
80
  | `onResize` | function | - | A callback function that is invoked when the width or height of the input element changes. It receives the current size value as its argument. |
80
81
  | `placeholder` | string | "Type a message" | Specifies the placeholder text to be displayed when the input is empty. |
81
82
  | `placeholderColor` | string | "#C4C4C4" | Specifies the color of the placeholder text. Accepts any valid CSS color value. |
83
+ | `shouldConvertEmojiToImage` | boolean | false | When set to true, emojis in the input value will be converted to images. |
82
84
  | `shouldReturn` | boolean | - | When set to true, allows the user to create a new line using the `Shift + Enter` or `Ctrl + Enter` keyboard shortcuts. |
83
85
  | `theme` | string | - | Specifies the theme for the emoji picker popup. Available values: "light", "dark", "auto". |
84
86
  | `value` | string | "" | The current value of the input element. |
package/dist/index.es.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import React, { useRef, useCallback, useImperativeHandle, useEffect, forwardRef, useMemo, useState, memo } from 'react';
2
+ import { renderToString } from 'react-dom/server';
2
3
  import ReactDOM from 'react-dom';
3
4
 
4
5
  function styleInject(css, ref) {
@@ -780,7 +781,213 @@ function addLineBreak() {
780
781
  }
781
782
  }
782
783
 
784
+ // Inspiration: https://github.com/facebook/react/issues/3386
785
+
786
+ function replace(string, regexpOrSubstr, newValueOrFn, globalOffset) {
787
+ if (typeof string !== 'string') throw new Error('First param must be a string');
788
+ if (typeof regexpOrSubstr !== 'string' && !(regexpOrSubstr instanceof RegExp)) throw new Error('Second param must be a string pattern or a regular expression');
789
+ var fn = typeof regexpOrSubstr === 'string' ? replaceUsingString : replaceUsingRegexp;
790
+ return fn(string, regexpOrSubstr, newValueOrFn, globalOffset);
791
+ }
792
+ function replaceUsingString(string, patternString, newValueOrFn, globalOffset) {
793
+ var index = string.indexOf(patternString);
794
+ if (index >= 0) {
795
+ var arr = [];
796
+ var endIndex = index + patternString.length;
797
+ if (index > 0) {
798
+ arr.push(string.substring(0, index));
799
+ }
800
+ arr.push(typeof newValueOrFn === 'function' ? newValueOrFn(string.substring(index, endIndex), index + globalOffset, string) : newValueOrFn);
801
+ if (endIndex < string.length) {
802
+ arr.push(string.substring(endIndex));
803
+ }
804
+ return arr;
805
+ } else {
806
+ return [string];
807
+ }
808
+ }
809
+ function replaceUsingRegexp(string, regexp, newValueOrFn, globalOffset) {
810
+ var output = [];
811
+ var replacerIsFn = typeof newValueOrFn === 'function';
812
+ var storedLastIndex = regexp.lastIndex;
813
+ regexp.lastIndex = 0;
814
+ var result;
815
+ var lastIndex = 0;
816
+ while (result = regexp.exec(string)) {
817
+ var index = result.index;
818
+ if (result[0] === '') {
819
+ // When the regexp is an empty string
820
+ // we still want to advance our cursor to the next item.
821
+ // This is the behavior of String.replace.
822
+ regexp.lastIndex++;
823
+ }
824
+ if (index !== lastIndex) {
825
+ output.push(string.substring(lastIndex, index));
826
+ }
827
+ var match = result[0];
828
+ lastIndex = index + match.length;
829
+ var out = replacerIsFn ? newValueOrFn.apply(this, result.concat(index + globalOffset, result.input)) : newValueOrFn;
830
+ output.push(out);
831
+ if (!regexp.global) {
832
+ break;
833
+ }
834
+ }
835
+ if (lastIndex < string.length) {
836
+ output.push(string.substring(lastIndex));
837
+ }
838
+ regexp.lastIndex = storedLastIndex;
839
+ return output;
840
+ }
841
+ var stringReplaceToArray = function stringReplaceToArray(stringOrArray, regexpOrSubstr, newSubStrOrFn) {
842
+ if (typeof stringOrArray === 'string') {
843
+ return replace(stringOrArray, regexpOrSubstr, newSubStrOrFn, 0);
844
+ } else if (!Array.isArray(stringOrArray) || !stringOrArray[0]) {
845
+ throw new TypeError('First argument must be an array or non-empty string');
846
+ } else {
847
+ var len = stringOrArray.length;
848
+ var output = [];
849
+ var globalOffset = 0;
850
+ for (var i = 0; i < len; ++i) {
851
+ var arrayItem = stringOrArray[i];
852
+ if (typeof arrayItem === 'string') {
853
+ output.push.apply(output, replace(arrayItem, regexpOrSubstr, newSubStrOrFn, globalOffset));
854
+ globalOffset += arrayItem.length;
855
+ } else {
856
+ output.push(arrayItem);
857
+ }
858
+ }
859
+ return output;
860
+ }
861
+ };
862
+
863
+ // This is based off of https://github.com/twitter/twemoji/blob/gh-pages/2/twemoji.js
864
+ //
865
+ // Ideally we'd use twemoji instead of replicating its logic.
866
+ // The reason we can't is that we need to run our own replace.
867
+ //
868
+ // We could use it for most things (by essentially running twemoji.parse for each
869
+ // regex match, and reading the code from the callback), but the one thing we'd always need
870
+ // to copy and paste into this file is the regex since we need it to run the replace.
871
+ //
872
+ // Another option is to fork twemoji and expose a method in it that could help us, then
873
+ // ask them to pull it in.
874
+ //
875
+
876
+ // RegExp based on emoji's official Unicode standards
877
+ // http://www.unicode.org/Public/UNIDATA/EmojiSources.txt
878
+ var re = /(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83e\udef1\ud83c\udffb\u200d\ud83e\udef2\ud83c[\udffc-\udfff]|\ud83e\udef1\ud83c\udffc\u200d\ud83e\udef2\ud83c[\udffb\udffd-\udfff]|\ud83e\udef1\ud83c\udffd\u200d\ud83e\udef2\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\udef1\ud83c\udffe\u200d\ud83e\udef2\ud83c[\udffb-\udffd\udfff]|\ud83e\udef1\ud83c\udfff\u200d\ud83e\udef2\ud83c[\udffb-\udffe]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83e\udd1d\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|\ud83e\udd1d)|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g;
879
+ function toCodePoint(unicodeSurrogates, sep) {
880
+ var r = [],
881
+ c = 0,
882
+ p = 0,
883
+ i = 0;
884
+ while (i < unicodeSurrogates.length) {
885
+ c = unicodeSurrogates.charCodeAt(i++);
886
+ if (p) {
887
+ r.push((0x10000 + (p - 0xD800 << 10) + (c - 0xDC00)).toString(16));
888
+ p = 0;
889
+ } else if (0xD800 <= c && c <= 0xDBFF) {
890
+ p = c;
891
+ } else {
892
+ r.push(c.toString(16));
893
+ }
894
+ }
895
+ return r.join(sep || '-');
896
+ }
897
+
898
+ // avoid runtime RegExp creation for not so smart,
899
+ // not JIT based, and old browsers / engines
900
+ var UFE0Fg = /\uFE0F/g;
901
+
902
+ // avoid using a string literal like '\u200D' here because minifiers expand it inline
903
+ var U200D = String.fromCharCode(0x200D);
904
+
905
+ /**
906
+ * Used to both remove the possible variant
907
+ * and to convert utf16 into code points.
908
+ * If there is a zero-width-joiner (U+200D), leave the variants in.
909
+ * @param string the raw text of the emoji match
910
+ */
911
+ function grabTheRightIcon(rawText) {
912
+ // if variant is present as \uFE0F
913
+ return toCodePoint(rawText.indexOf(U200D) < 0 ? rawText.replace(UFE0Fg, '') : rawText);
914
+ }
915
+ var replaceEmoji$1 = function replaceEmoji(string, render) {
916
+ // Note: the latest regex added an empty matching group, so we ignore it.
917
+ return stringReplaceToArray(string, re, function emojiReplacer(match, _, offset) {
918
+ var icon = grabTheRightIcon(match);
919
+ return render(icon, match, offset);
920
+ });
921
+ };
922
+
923
+ var createElement = React.createElement;
924
+ var pageProtocol = typeof location === 'undefined' ? '' : location.protocol === 'https:' ? 'https:' : 'http:';
925
+ var emojiStyle = {
926
+ height: '1em',
927
+ width: '1em',
928
+ margin: '0 .05em 0 .1em',
929
+ verticalAlign: '-0.1em'
930
+ };
931
+
932
+ // Accept protocol with or without a colon
933
+ function normalizeProtocol(protocol) {
934
+ if (protocol && protocol.length > 0 && protocol.charAt(protocol.length - 1) !== ':') {
935
+ return protocol + ':';
936
+ }
937
+ return protocol;
938
+ }
939
+ var makeTwemojiRenderer$1 = function makeTwemojiRenderer(options) {
940
+ options = merge({
941
+ protocol: pageProtocol,
942
+ baseUrl: '//cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/',
943
+ size: '72x72',
944
+ ext: '.png',
945
+ props: null
946
+ }, options);
947
+ return function renderTwemoji(icon, match, offset) {
948
+ var src = '';
949
+ if (options.baseUrl.indexOf('http') !== 0) {
950
+ src += normalizeProtocol(options.protocol);
951
+ }
952
+ src += options.baseUrl + options.size + '/' + icon + options.ext;
953
+ return createElement('img', merge({
954
+ key: offset,
955
+ alt: match,
956
+ draggable: false,
957
+ src: src,
958
+ style: emojiStyle
959
+ }, options.props));
960
+ };
961
+ };
962
+ function merge() {
963
+ var out = {},
964
+ len = arguments.length;
965
+ for (var i = 0; i < len; ++i) {
966
+ var source = arguments[i];
967
+ if (source) {
968
+ for (var key in source) {
969
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
970
+ out[key] = source[key];
971
+ }
972
+ }
973
+ }
974
+ }
975
+ return out;
976
+ }
977
+
978
+ var replaceEmoji = replaceEmoji$1;
979
+
980
+ var makeTwemojiRenderer = makeTwemojiRenderer$1;
981
+
982
+ var reactEasyEmoji = function reactEasyEmoji(element, optionsOrFn) {
983
+ var render = typeof optionsOrFn === 'function' ? optionsOrFn : makeTwemojiRenderer(optionsOrFn);
984
+ return replaceEmoji(element, render);
985
+ };
986
+
987
+ var emoji = reactEasyEmoji;
988
+
783
989
  // @ts-check
990
+ var EMOJI_REGEX = new RegExp(/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?)*/g);
784
991
 
785
992
  /**
786
993
  * @typedef {import('../types/types').SanitizeFn} SanitizeFn
@@ -789,8 +996,9 @@ function addLineBreak() {
789
996
  // eslint-disable-next-line valid-jsdoc
790
997
  /**
791
998
  * @param {boolean} shouldReturn
999
+ * @param {boolean} shouldConvertEmojiToImage
792
1000
  */
793
- function useSanitize(shouldReturn) {
1001
+ function useSanitize(shouldReturn, shouldConvertEmojiToImage) {
794
1002
  /** @type {React.MutableRefObject<SanitizeFn[]>} */
795
1003
  var sanitizeFnsRef = useRef([]);
796
1004
  var sanitizedTextRef = useRef("");
@@ -806,9 +1014,12 @@ function useSanitize(shouldReturn) {
806
1014
  return fn(acc);
807
1015
  }, html);
808
1016
  result = replaceAllHtmlToString(result, shouldReturn);
1017
+ if (shouldConvertEmojiToImage) {
1018
+ result = convertEmojiToImage(result);
1019
+ }
809
1020
  sanitizedTextRef.current = result;
810
1021
  return result;
811
- }, []);
1022
+ }, [shouldReturn, shouldConvertEmojiToImage]);
812
1023
  return {
813
1024
  addSanitizeFn: addSanitizeFn,
814
1025
  sanitize: sanitize,
@@ -837,6 +1048,28 @@ function replaceAllHtmlToString(html, shouldReturn) {
837
1048
  return text;
838
1049
  }
839
1050
 
1051
+ /**
1052
+ *
1053
+ * @param {string} text
1054
+ * @return {string}
1055
+ */
1056
+ function convertEmojiToImage(text) {
1057
+ text = handleEmoji(text);
1058
+ text = renderToString(emoji(text));
1059
+ text = text.replace(new RegExp('&lt;span class=&quot;message-emoji&quot;&gt;', 'g'), '<span class="message-emoji">');
1060
+ text = text.replace(new RegExp('&lt;/span&gt;', 'g'), '</span>');
1061
+ return text;
1062
+ }
1063
+
1064
+ /**
1065
+ *
1066
+ * @param {string} text
1067
+ * @return {string}
1068
+ */
1069
+ function handleEmoji(text) {
1070
+ return text.replace(EMOJI_REGEX, '<span class="message-emoji">$&</span>');
1071
+ }
1072
+
840
1073
  // @ts-check
841
1074
 
842
1075
  /**
@@ -845,6 +1078,7 @@ function replaceAllHtmlToString(html, shouldReturn) {
845
1078
  * @property {React.MutableRefObject<import('../text-input').Ref | null>} textInputRef
846
1079
  * @property {(value: string) => void} setValue
847
1080
  * @property {() => void} emitChange
1081
+ * @property {boolean=} shouldConvertEmojiToImage
848
1082
  */
849
1083
 
850
1084
  /**
@@ -855,8 +1089,9 @@ function useExpose(_ref) {
855
1089
  var ref = _ref.ref,
856
1090
  textInputRef = _ref.textInputRef,
857
1091
  setValue = _ref.setValue,
858
- emitChange = _ref.emitChange;
859
- var _useSanitize = useSanitize(false),
1092
+ emitChange = _ref.emitChange,
1093
+ shouldConvertEmojiToImage = _ref.shouldConvertEmojiToImage;
1094
+ var _useSanitize = useSanitize(false, shouldConvertEmojiToImage),
860
1095
  sanitize = _useSanitize.sanitize,
861
1096
  sanitizedTextRef = _useSanitize.sanitizedTextRef;
862
1097
  useImperativeHandle(ref, function () {
@@ -936,7 +1171,7 @@ var _excluded = ["placeholder", "style", "tabIndex", "className", "onChange"];
936
1171
  * @property {(event: React.ClipboardEvent) => void} onCopy
937
1172
  * @property {(event: React.ClipboardEvent) => void} onPaste
938
1173
  * @property {string} placeholder
939
- * @property {{borderRadius?: number; borderColor?: string; fontSize?: number; fontFamily?: string; background: string; placeholderColor?: string;}} style
1174
+ * @property {{borderRadius?: number; color?: string; borderColor?: string; fontSize?: number; fontFamily?: string; background: string; placeholderColor?: string;}} style
940
1175
  * @property {number} tabIndex
941
1176
  * @property {string} className
942
1177
  * @property {(html: string) => void} onChange
@@ -1030,7 +1265,16 @@ var TextInput = function TextInput(_ref, ref) {
1030
1265
  placeholderStyle.color = style.placeholderColor;
1031
1266
  }
1032
1267
  return placeholderStyle;
1033
- }, [style.placeholderColor]);
1268
+ }, [style === null || style === void 0 ? void 0 : style.placeholderColor]);
1269
+
1270
+ /** @type {React.CSSProperties} */
1271
+ var inputStyle = useMemo(function () {
1272
+ var inputStyle = {};
1273
+ if (style.color) {
1274
+ inputStyle.color = style.color;
1275
+ }
1276
+ return inputStyle;
1277
+ }, [style === null || style === void 0 ? void 0 : style.color]);
1034
1278
 
1035
1279
  /** @type {React.MutableRefObject<HTMLDivElement | null>} */
1036
1280
  var placeholderRef = useRef(null);
@@ -1107,7 +1351,8 @@ var TextInput = function TextInput(_ref, ref) {
1107
1351
  onBlur: props.onBlur,
1108
1352
  onCopy: props.onCopy,
1109
1353
  onPaste: props.onPaste,
1110
- "data-testid": "react-input-emoji--input"
1354
+ "data-testid": "react-input-emoji--input",
1355
+ style: inputStyle
1111
1356
  })));
1112
1357
  };
1113
1358
  var TextInputWithRef = /*#__PURE__*/forwardRef(TextInput);
@@ -4501,11 +4746,12 @@ function usePollute() {
4501
4746
  * @property {(text: string) => void=} onEnter
4502
4747
  * @property {string=} placeholder
4503
4748
  * @property {string=} placeholderColor
4749
+ * @property {string=} color
4504
4750
  * @property {(size: {width: number, height: number}) => void=} onResize
4505
4751
  * @property {() => void=} onClick
4506
4752
  * @property {() => void=} onFocus
4507
4753
  * @property {() => void=} onBlur
4508
- * @property {boolean=} shouldReturn
4754
+ * @property {boolean} shouldReturn
4509
4755
  * @property {number=} maxLength
4510
4756
  * @property {boolean=} keepOpened
4511
4757
  * @property {(event: KeyboardEvent) => void=} onKeyDown
@@ -4523,6 +4769,7 @@ function usePollute() {
4523
4769
  * @property {(text: string) => Promise<MetionUser[]>=} searchMention
4524
4770
  * @property {HTMLDivElement=} buttonElement
4525
4771
  * @property {React.MutableRefObject=} buttonRef
4772
+ * @property {boolean} shouldConvertEmojiToImage
4526
4773
  */
4527
4774
 
4528
4775
  /**
@@ -4534,7 +4781,6 @@ function usePollute() {
4534
4781
  function InputEmoji(props, ref) {
4535
4782
  var onChange = props.onChange,
4536
4783
  onEnter = props.onEnter,
4537
- shouldReturn = props.shouldReturn,
4538
4784
  onResize = props.onResize,
4539
4785
  onClick = props.onClick,
4540
4786
  onFocus = props.onFocus,
@@ -4554,19 +4800,22 @@ function InputEmoji(props, ref) {
4554
4800
  searchMention = props.searchMention,
4555
4801
  buttonElement = props.buttonElement,
4556
4802
  buttonRef = props.buttonRef,
4803
+ shouldReturn = props.shouldReturn,
4804
+ shouldConvertEmojiToImage = props.shouldConvertEmojiToImage,
4557
4805
  borderRadius = props.borderRadius,
4558
4806
  borderColor = props.borderColor,
4559
4807
  fontSize = props.fontSize,
4560
4808
  fontFamily = props.fontFamily,
4561
4809
  background = props.background,
4562
- placeholderColor = props.placeholderColor;
4810
+ placeholderColor = props.placeholderColor,
4811
+ color = props.color;
4563
4812
 
4564
4813
  /** @type {React.MutableRefObject<import('./text-input').Ref | null>} */
4565
4814
  var textInputRef = useRef(null);
4566
4815
  var _useEventListeners = useEventListeners(),
4567
4816
  addEventListener = _useEventListeners.addEventListener,
4568
4817
  listeners = _useEventListeners.listeners;
4569
- var _useSanitize = useSanitize(props.shouldReturn),
4818
+ var _useSanitize = useSanitize(shouldReturn, shouldConvertEmojiToImage),
4570
4819
  addSanitizeFn = _useSanitize.addSanitizeFn,
4571
4820
  sanitize = _useSanitize.sanitize,
4572
4821
  sanitizedTextRef = _useSanitize.sanitizedTextRef;
@@ -4592,7 +4841,8 @@ function InputEmoji(props, ref) {
4592
4841
  ref: ref,
4593
4842
  setValue: setValue,
4594
4843
  textInputRef: textInputRef,
4595
- emitChange: emitChange
4844
+ emitChange: emitChange,
4845
+ shouldConvertEmojiToImage: shouldConvertEmojiToImage
4596
4846
  });
4597
4847
  useEffect(function () {
4598
4848
  if (sanitizedTextRef.current !== value) {
@@ -4730,7 +4980,8 @@ function InputEmoji(props, ref) {
4730
4980
  fontSize: fontSize,
4731
4981
  fontFamily: fontFamily,
4732
4982
  background: background,
4733
- placeholderColor: placeholderColor
4983
+ placeholderColor: placeholderColor,
4984
+ color: color
4734
4985
  },
4735
4986
  tabIndex: tabIndex,
4736
4987
  className: inputClass,
@@ -4755,11 +5006,13 @@ InputEmojiWithRef.defaultProps = {
4755
5006
  placeholder: "Type a message",
4756
5007
  borderRadius: 21,
4757
5008
  borderColor: "#EAEAEA",
5009
+ color: "black",
4758
5010
  fontSize: 15,
4759
5011
  fontFamily: "sans-serif",
4760
5012
  background: "white",
4761
5013
  tabIndex: 0,
4762
5014
  shouldReturn: false,
5015
+ shouldConvertEmojiToImage: false,
4763
5016
  customEmojis: [],
4764
5017
  language: undefined
4765
5018
  };