react-input-emoji 4.0.7 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -46,7 +46,7 @@ export default function Example() {
46
46
  ## Props
47
47
 
48
48
  | Prop | Type | Default | Description |
49
- | -------------- | -------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------ |
49
+ |----------------|----------|------------------|--------------------------------------------------------------------------------------------------------------------------|
50
50
  | `value` | string | "" | The input value. |
51
51
  | `onChange` | function | - | This function is called when the value of the input changes. The first argument is the current value. |
52
52
  | `onResize` | function | - | This function is called when the width or the height of the input changes. The first argument is the current size value. |
@@ -57,6 +57,7 @@ export default function Example() {
57
57
  | `placeholder` | string | "Type a message" | Set the placeholder of the input. |
58
58
  | `height` | number | 40 | The total height of the area in which the element is rendered. |
59
59
  | `maxLength` | number | - | The maximum number of characters allowed in the element. |
60
+ | `theme` | string | - | Set theme for emoji popup. Available values "light", "dark", "auto" |
60
61
  | `borderRadius` | number | 21 | The border radius of the input container. |
61
62
  | `borderColor` | string | "#EAEAEA" | The border color of the input container. |
62
63
  | `fontSize` | number | 15 | The font size of the placeholder and input container. |
package/dist/index.es.js CHANGED
@@ -30,7 +30,7 @@ function styleInject(css, ref) {
30
30
  }
31
31
  }
32
32
 
33
- var css_248z$1 = ".react-input-emoji--container {\n color: #4b4b4b;\n text-rendering: optimizeLegibility;\n background-color: #fff;\n border: 1px solid #fff;\n border-radius: 21px;\n margin: 5px 10px;\n box-sizing: border-box;\n flex: 1 1 auto;\n font-size: 15px;\n font-family: sans-serif;\n font-weight: 400;\n line-height: 20px;\n min-height: 20px;\n min-width: 0;\n outline: none;\n width: inherit;\n will-change: width;\n vertical-align: baseline;\n border: 1px solid #eaeaea;\n margin-right: 0;\n}\n\n.react-input-emoji--wrapper {\n display: flex;\n overflow: hidden;\n flex: 1;\n position: relative;\n padding-right: 0;\n vertical-align: baseline;\n outline: none;\n margin: 0;\n padding: 0;\n border: 0;\n}\n\n.react-input-emoji--input {\n font-weight: 400;\n max-height: 100px;\n min-height: 20px;\n outline: none;\n overflow-x: hidden;\n overflow-y: auto;\n position: relative;\n white-space: pre-wrap;\n word-wrap: break-word;\n z-index: 1;\n width: 100%;\n user-select: text;\n padding: 9px 12px 11px;\n text-align: left;\n}\n\n.react-input-emoji--input img {\n vertical-align: middle;\n width: 18px !important;\n height: 18px !important;\n display: inline !important;\n margin-left: 1px;\n margin-right: 1px;\n}\n\n.react-input-emoji--overlay {\n position: fixed;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n z-index: 9;\n}\n\n.react-input-emoji--placeholder {\n color: #a0a0a0;\n pointer-events: none;\n position: absolute;\n user-select: none;\n z-index: 2;\n left: 16px;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n width: calc(100% - 22px);\n}\n\n.react-input-emoji--button {\n position: relative;\n display: block;\n text-align: center;\n padding: 0 10px;\n overflow: hidden;\n transition: color 0.1s ease-out;\n margin: 0;\n box-shadow: none;\n background: none;\n border: none;\n outline: none;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.react-input-emoji--button svg {\n fill: #858585;\n}\n\n.react-input-emoji--button__show svg {\n fill: #128b7e;\n}\n\n.react-emoji {\n display: flex;\n align-items: center;\n position: relative;\n width: 100%;\n}\n\n.react-emoji-picker--container {\n position: absolute;\n top: 0;\n width: 100%;\n}\n\n.react-emoji-picker--wrapper {\n position: absolute;\n bottom: 0;\n right: 0;\n height: 357px;\n width: 338px;\n overflow: hidden;\n z-index: 10;\n}\n\n.react-emoji-picker {\n position: absolute;\n top: 0;\n left: 0;\n animation: slidein 0.1s ease-in-out;\n}\n\n.react-emoji-picker__show {\n top: 0;\n}\n\n.react-input-emoji--mention--container {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n z-index: 10;\n}\n\n.react-input-emoji--mention--list {\n background-color: #fafafa;\n border: 1px solid #eaeaea;\n border-radius: 4px;\n margin: 0;\n padding: 0;\n list-style: none;\n display: flex;\n gap: 5px;\n flex-direction: column;\n position: absolute;\n bottom: 0;\n width: 100%;\n left: 0;\n}\n\n.react-input-emoji--mention--item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 5px 10px;\n background-color: transparent;\n width: 100%;\n margin: 0;\n border: 0;\n}\n\n.react-input-emoji--mention--item__selected {\n background-color: #eeeeee;\n}\n\n.react-input-emoji--mention--item--img {\n width: 34px;\n height: 34px;\n border-radius: 50%;\n}\n\n.react-input-emoji--mention--item--name {\n font-size: 16px;\n color: #333;\n}\n\n.react-input-emoji--mention--item--name__selected {\n color: green;\n}\n\n.react-input-emoji--mention--text {\n color: #039be5;\n}\n\n.react-input-emoji--mention--loading {\n background-color: #fafafa;\n border: 1px solid #eaeaea;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 10px 0;\n}\n\n.react-input-emoji--mention--loading--spinner,\n.react-input-emoji--mention--loading--spinner::after {\n border-radius: 50%;\n width: 10em;\n height: 10em;\n}\n\n.react-input-emoji--mention--loading--spinner {\n margin: 1px auto;\n font-size: 2px;\n position: relative;\n text-indent: -9999em;\n border-top: 1.1em solid rgba(0, 0, 0, 0.1);\n border-right: 1.1em solid rgba(0, 0, 0, 0.1);\n border-bottom: 1.1em solid rgba(0, 0, 0, 0.1);\n border-left: 1.1em solid rgba(0, 0, 0, 0.4);\n transform: translateZ(0);\n animation: load8 1.1s infinite linear;\n}\n\n@keyframes load8 {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@keyframes slidein {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n";
33
+ var css_248z$1 = ".react-input-emoji--container {\n color: #4b4b4b;\n text-rendering: optimizeLegibility;\n background-color: #fff;\n border: 1px solid #fff;\n border-radius: 21px;\n margin: 5px 10px;\n box-sizing: border-box;\n flex: 1 1 auto;\n font-size: 15px;\n font-family: sans-serif;\n font-weight: 400;\n line-height: 20px;\n min-height: 20px;\n min-width: 0;\n outline: none;\n width: inherit;\n will-change: width;\n vertical-align: baseline;\n border: 1px solid #eaeaea;\n margin-right: 0;\n}\n\n.react-input-emoji--wrapper {\n display: flex;\n overflow: hidden;\n flex: 1;\n position: relative;\n padding-right: 0;\n vertical-align: baseline;\n outline: none;\n margin: 0;\n padding: 0;\n border: 0;\n}\n\n.react-input-emoji--input {\n font-weight: 400;\n max-height: 100px;\n min-height: 20px;\n outline: none;\n overflow-x: hidden;\n overflow-y: auto;\n position: relative;\n white-space: pre-wrap;\n word-wrap: break-word;\n z-index: 1;\n width: 100%;\n user-select: text;\n padding: 9px 12px 11px;\n text-align: left;\n}\n\n.react-input-emoji--input img {\n vertical-align: middle;\n width: 18px !important;\n height: 18px !important;\n display: inline !important;\n margin-left: 1px;\n margin-right: 1px;\n}\n\n.react-input-emoji--overlay {\n position: fixed;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n z-index: 9;\n}\n\n.react-input-emoji--placeholder {\n color: #a0a0a0;\n pointer-events: none;\n position: absolute;\n user-select: none;\n z-index: 2;\n left: 16px;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n width: calc(100% - 22px);\n}\n\n.react-input-emoji--button {\n position: relative;\n display: block;\n text-align: center;\n padding: 0 10px;\n overflow: hidden;\n transition: color 0.1s ease-out;\n margin: 0;\n box-shadow: none;\n background: none;\n border: none;\n outline: none;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.react-input-emoji--button svg {\n fill: #858585;\n}\n\n.react-input-emoji--button__show svg {\n fill: #128b7e;\n}\n\n.react-emoji {\n display: flex;\n align-items: center;\n position: relative;\n width: 100%;\n}\n\n.react-emoji-picker--container {\n position: absolute;\n top: 0;\n width: 100%;\n}\n\n.react-emoji-picker--wrapper {\n position: absolute;\n bottom: 0;\n right: 0;\n height: 357px;\n width: 338px;\n overflow: hidden;\n z-index: 10;\n}\n\n.react-emoji-picker {\n position: absolute;\n top: 0;\n left: 0;\n animation: slidein 0.1s ease-in-out;\n}\n\n.react-emoji-picker__show {\n top: 0;\n}\n\n.react-input-emoji--mention--container {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n z-index: 10;\n}\n\n.react-input-emoji--mention--list {\n background-color: #fafafa;\n border: 1px solid #eaeaea;\n border-radius: 4px;\n margin: 0;\n padding: 0;\n list-style: none;\n display: flex;\n gap: 5px;\n flex-direction: column;\n position: absolute;\n bottom: 0;\n width: 100%;\n left: 0;\n}\n\n.react-input-emoji--mention--item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 5px 10px;\n background-color: transparent;\n width: 100%;\n margin: 0;\n border: 0;\n}\n\n.react-input-emoji--mention--item__selected {\n background-color: #eeeeee;\n}\n\n.react-input-emoji--mention--item--img {\n width: 34px;\n height: 34px;\n border-radius: 50%;\n}\n\n.react-input-emoji--mention--item--name {\n font-size: 16px;\n color: #333;\n}\n\n.react-input-emoji--mention--item--name__selected {\n color: green;\n}\n\n.react-input-emoji--mention--text {\n color: #039be5;\n}\n\n.react-input-emoji--mention--loading {\n background-color: #fafafa;\n border: 1px solid #eaeaea;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 10px 0;\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n}\n\n.react-input-emoji--mention--loading--spinner,\n.react-input-emoji--mention--loading--spinner::after {\n border-radius: 50%;\n width: 10em;\n height: 10em;\n}\n\n.react-input-emoji--mention--loading--spinner {\n margin: 1px auto;\n font-size: 2px;\n position: relative;\n text-indent: -9999em;\n border-top: 1.1em solid rgba(0, 0, 0, 0.1);\n border-right: 1.1em solid rgba(0, 0, 0, 0.1);\n border-bottom: 1.1em solid rgba(0, 0, 0, 0.1);\n border-left: 1.1em solid rgba(0, 0, 0, 0.4);\n transform: translateZ(0);\n animation: load8 1.1s infinite linear;\n}\n\n@keyframes load8 {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n}\n\n@keyframes slidein {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n";
34
34
  styleInject(css_248z$1);
35
35
 
36
36
  // @ts-check
@@ -52346,6 +52346,7 @@ styleInject(css_248z);
52346
52346
  // vendors
52347
52347
  /**
52348
52348
  * @typedef {object} Props
52349
+ * @property {'light' | 'dark' | 'auto'} theme
52349
52350
  * @property {function(import("../types/types").EmojiMartItem): void} onSelectEmoji
52350
52351
  * @property {boolean} disableRecent
52351
52352
  * @property {object[]} customEmojis
@@ -52357,12 +52358,14 @@ styleInject(css_248z);
52357
52358
  * @return {React.FC}
52358
52359
  */
52359
52360
 
52360
- function EmojiPicker({
52361
- onSelectEmoji,
52362
- disableRecent,
52363
- customEmojis
52364
- }) {
52365
- const excluePicker = useMemo(() => {
52361
+ function EmojiPicker(props) {
52362
+ const {
52363
+ theme,
52364
+ onSelectEmoji,
52365
+ disableRecent,
52366
+ customEmojis
52367
+ } = props;
52368
+ const excludePicker = useMemo(() => {
52366
52369
  /** @type import("emoji-mart").CategoryName[] */
52367
52370
  const exclude = [];
52368
52371
 
@@ -52373,16 +52376,18 @@ function EmojiPicker({
52373
52376
  return exclude;
52374
52377
  }, [disableRecent]);
52375
52378
  return /*#__PURE__*/React.createElement(Picker, {
52379
+ theme: theme,
52380
+ set: "apple",
52376
52381
  showPreview: false,
52377
52382
  showSkinTones: false,
52378
- set: "apple",
52379
52383
  onSelect: onSelectEmoji,
52380
- exclude: excluePicker,
52384
+ exclude: excludePicker,
52381
52385
  custom: customEmojis
52382
52386
  });
52383
52387
  }
52384
52388
 
52385
52389
  EmojiPicker.propTypes = {
52390
+ theme: PropTypes.oneOf(['light', 'dark', 'auto']),
52386
52391
  onSelectEmoji: PropTypes.func,
52387
52392
  disableRecent: PropTypes.bool,
52388
52393
  customEmojis: PropTypes.array
@@ -52400,7 +52405,8 @@ var EmojiPicker$1 = /*#__PURE__*/memo(EmojiPicker);
52400
52405
 
52401
52406
  /**
52402
52407
  * @typedef {Object} Props
52403
- * @property {boolean} keepOpenend
52408
+ * @property {'light' | 'dark' | 'auto'} theme
52409
+ * @property {boolean} keepOpened
52404
52410
  * @property {boolean} disableRecent
52405
52411
  * @property {object[]=} customEmojis
52406
52412
  * @property {(fn: SanitizeFn) => void} addSanitizeFn
@@ -52411,14 +52417,16 @@ var EmojiPicker$1 = /*#__PURE__*/memo(EmojiPicker);
52411
52417
 
52412
52418
  /** @type {React.FC<Props>} */
52413
52419
 
52414
- const EmojiPickerWrapper = ({
52415
- keepOpenend,
52416
- disableRecent,
52417
- customEmojis,
52418
- addSanitizeFn,
52419
- addPolluteFn,
52420
- appendContent
52421
- }) => {
52420
+ const EmojiPickerWrapper = props => {
52421
+ const {
52422
+ theme,
52423
+ keepOpened,
52424
+ disableRecent,
52425
+ customEmojis,
52426
+ addSanitizeFn,
52427
+ addPolluteFn,
52428
+ appendContent
52429
+ } = props;
52422
52430
  const [showPicker, setShowPicker] = useState(false);
52423
52431
  useEffect(() => {
52424
52432
  addSanitizeFn(replaceAllTextEmojiToString);
@@ -52468,7 +52476,7 @@ const EmojiPickerWrapper = ({
52468
52476
  function handleSelectEmoji(emoji) {
52469
52477
  appendContent(getImageEmoji(emoji));
52470
52478
 
52471
- if (!keepOpenend) {
52479
+ if (!keepOpened) {
52472
52480
  setShowPicker(currentShowPicker => !currentShowPicker);
52473
52481
  }
52474
52482
  }
@@ -52481,10 +52489,12 @@ const EmojiPickerWrapper = ({
52481
52489
  }, /*#__PURE__*/React.createElement("div", {
52482
52490
  className: "react-emoji-picker"
52483
52491
  }, /*#__PURE__*/React.createElement(EmojiPicker$1, {
52492
+ theme: theme,
52484
52493
  onSelectEmoji: handleSelectEmoji,
52485
52494
  disableRecent: disableRecent,
52486
52495
  customEmojis: customEmojis
52487
52496
  })))), /*#__PURE__*/React.createElement("button", {
52497
+ type: "button",
52488
52498
  className: `react-input-emoji--button${showPicker ? " react-input-emoji--button__show" : ""}`,
52489
52499
  onClick: toggleShowPicker
52490
52500
  }, /*#__PURE__*/React.createElement("svg", {
@@ -52788,6 +52798,7 @@ const MentionUserList = ({
52788
52798
  }, usersFiltered.map((user, index) => /*#__PURE__*/React.createElement("li", {
52789
52799
  key: user.id
52790
52800
  }, /*#__PURE__*/React.createElement("button", {
52801
+ type: "button",
52791
52802
  onClick: handleClick(user),
52792
52803
  className: `react-input-emoji--mention--item${selectedUser === index ? " react-input-emoji--mention--item__selected" : ""}`,
52793
52804
  onMouseOver: () => setSelectedUser(index)
@@ -53054,6 +53065,7 @@ function usePollute() {
53054
53065
  * @typedef {object} Props
53055
53066
  * @property {string} value
53056
53067
  * @property {(value: string) => void} onChange
53068
+ * @property {"light" | "dark" | "auto"} theme
53057
53069
  * @property {boolean} cleanOnEnter
53058
53070
  * @property {(text: string) => void} onEnter
53059
53071
  * @property {string} placeholder
@@ -53061,7 +53073,7 @@ function usePollute() {
53061
53073
  * @property {() => void} onClick
53062
53074
  * @property {() => void} onFocus
53063
53075
  * @property {number} maxLength
53064
- * @property {boolean} keepOpenend
53076
+ * @property {boolean} keepOpened
53065
53077
  * @property {(event: KeyboardEvent) => void} onKeyDown
53066
53078
  * @property {string} inputClass
53067
53079
  * @property {boolean} disableRecent
@@ -53082,30 +53094,33 @@ function usePollute() {
53082
53094
  * @return {JSX.Element}
53083
53095
  */
53084
53096
 
53085
- function InputEmoji({
53086
- onChange,
53087
- onEnter,
53088
- onResize,
53089
- onClick,
53090
- onFocus,
53091
- onKeyDown,
53092
- cleanOnEnter,
53093
- placeholder,
53094
- maxLength,
53095
- keepOpenend,
53096
- inputClass,
53097
- disableRecent,
53098
- tabIndex,
53099
- value,
53100
- customEmojis,
53101
- searchMention,
53102
- // style
53103
- borderRadius,
53104
- borderColor,
53105
- fontSize,
53106
- fontFamily
53107
- }, ref) {
53097
+ function InputEmoji(props, ref) {
53098
+ const {
53099
+ onChange,
53100
+ onEnter,
53101
+ onResize,
53102
+ onClick,
53103
+ onFocus,
53104
+ onKeyDown,
53105
+ theme,
53106
+ cleanOnEnter,
53107
+ placeholder,
53108
+ maxLength,
53109
+ keepOpened,
53110
+ inputClass,
53111
+ disableRecent,
53112
+ tabIndex,
53113
+ value,
53114
+ customEmojis,
53115
+ searchMention,
53116
+ // style
53117
+ borderRadius,
53118
+ borderColor,
53119
+ fontSize,
53120
+ fontFamily
53121
+ } = props;
53108
53122
  /** @type {React.MutableRefObject<import('./text-input').Ref>} */
53123
+
53109
53124
  const textInputRef = useRef(null);
53110
53125
  const {
53111
53126
  addEventListener,
@@ -53279,7 +53294,8 @@ function InputEmoji({
53279
53294
  className: inputClass,
53280
53295
  onChange: handleTextInputChange
53281
53296
  }), /*#__PURE__*/React.createElement(EmojiPickerWrapper, {
53282
- keepOpenend: keepOpenend,
53297
+ theme: theme,
53298
+ keepOpened: keepOpened,
53283
53299
  disableRecent: disableRecent,
53284
53300
  customEmojis: customEmojis,
53285
53301
  addSanitizeFn: addSanitizeFn,
@@ -53290,6 +53306,9 @@ function InputEmoji({
53290
53306
 
53291
53307
  const InputEmojiWithRef = /*#__PURE__*/forwardRef(InputEmoji);
53292
53308
  InputEmojiWithRef.defaultProps = {
53309
+ theme:
53310
+ /** @type {const} */
53311
+ "auto",
53293
53312
  height: 30,
53294
53313
  placeholder: "Type a message",
53295
53314
  borderRadius: 21,