react-textarea-with-suggest 2.2.0 → 2.3.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
@@ -1,7 +1,13 @@
1
1
  # react-textarea-with-suggest
2
2
  Textarea with suggest for React app v2
3
3
 
4
- [![npm version](https://badge.fury.io/js/react-textarea-with-suggest.svg)](https://badge.fury.io/js/react-textarea-with-suggest)
4
+ [![GitHub package.json version (branch)](https://img.shields.io/github/package-json/v/marylorian/react-textarea-with-suggest/master?label=latest%20version)](https://www.npmjs.com/package/react-textarea-with-suggest)
5
+ ![NPM](https://img.shields.io/npm/l/react-textarea-with-suggest)
6
+ ![npm type definitions](https://img.shields.io/npm/types/react-textarea-with-suggest)
7
+ ![npm peer dependency version](https://img.shields.io/npm/dependency-version/react-textarea-with-suggest/peer/react)
8
+ ![npm peer dependency version](https://img.shields.io/npm/dependency-version/react-textarea-with-suggest/peer/react-dom)
9
+ ![npm bundle size (version)](https://img.shields.io/bundlephobia/minzip/react-textarea-with-suggest/latest)
10
+ ![Server Side Rendering](https://img.shields.io/badge/SSR-supported-green)
5
11
 
6
12
  ### Last changes
7
13
  [You can find in CHANGELOG.md](./CHANGELOG.md)
@@ -63,7 +63,22 @@ function App() {
63
63
 
64
64
  return (
65
65
  <div className="example">
66
- <h1>TextareaWithSuggest Example</h1>
66
+ <h1>Textarea With Suggest Example page</h1>
67
+
68
+ <p>
69
+ You can check <code>react-textarea-with-suggest</code> npm page{" "}
70
+ <a
71
+ href="https://www.npmjs.com/package/react-textarea-with-suggest"
72
+ target="_blank"
73
+ rel="noreferrer"
74
+ >
75
+ here
76
+ </a>
77
+ </p>
78
+ <p>
79
+ You can check <code>onChange</code> and <code>onSearch</code> firing in
80
+ your Browser console
81
+ </p>
67
82
 
68
83
  <ExampleItem
69
84
  title="Default"
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const NativeTextarea: React.ForwardRefExoticComponent<Pick<React.HTMLProps<HTMLTextAreaElement>, "value" | "target" | "accept" | "acceptCharset" | "action" | "allowFullScreen" | "allowTransparency" | "alt" | "as" | "async" | "autoComplete" | "autoFocus" | "autoPlay" | "capture" | "cellPadding" | "cellSpacing" | "charSet" | "challenge" | "checked" | "cite" | "classID" | "cols" | "colSpan" | "content" | "controls" | "coords" | "crossOrigin" | "data" | "dateTime" | "default" | "defer" | "disabled" | "download" | "encType" | "form" | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "frameBorder" | "headers" | "height" | "high" | "href" | "hrefLang" | "htmlFor" | "httpEquiv" | "integrity" | "keyParams" | "keyType" | "kind" | "label" | "list" | "loop" | "low" | "manifest" | "marginHeight" | "marginWidth" | "max" | "maxLength" | "media" | "mediaGroup" | "method" | "min" | "minLength" | "multiple" | "muted" | "name" | "noValidate" | "open" | "optimum" | "pattern" | "placeholder" | "playsInline" | "poster" | "preload" | "readOnly" | "rel" | "required" | "reversed" | "rows" | "rowSpan" | "sandbox" | "scope" | "scoped" | "scrolling" | "seamless" | "selected" | "shape" | "size" | "sizes" | "span" | "src" | "srcDoc" | "srcLang" | "srcSet" | "start" | "step" | "summary" | "type" | "useMap" | "width" | "wmode" | "wrap" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "nonce" | "slot" | "spellCheck" | "style" | "tabIndex" | "title" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onResize" | "onResizeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "key"> & React.RefAttributes<HTMLTextAreaElement>>;
@@ -1,13 +1,12 @@
1
- import React, { ReactNode, RefObject } from "react";
2
- import { Nullable } from "./utils";
3
- interface SuggestProps<T> {
1
+ import React, { RefObject } from "react";
2
+ import { CustomSuggestItemRenderer, Nullable, OnItemClickHandler } from "../types";
3
+ export interface SuggestProps<T> {
4
4
  className?: string;
5
5
  textareaRef: RefObject<Nullable<HTMLTextAreaElement>>;
6
6
  selectedItemIndex?: number;
7
7
  values: T[];
8
8
  isHidden?: boolean;
9
- onItemClickHandler: (item: T) => () => void;
10
- customSuggestItemRenderer?: (item: T, isSelected?: boolean) => ReactNode;
9
+ onItemClickHandler: OnItemClickHandler<T>;
10
+ customSuggestItemRenderer?: CustomSuggestItemRenderer<T>;
11
11
  }
12
12
  export declare const SuggestResults: <T extends React.ReactNode>({ textareaRef, values, isHidden, className, selectedItemIndex, customSuggestItemRenderer, onItemClickHandler, }: SuggestProps<T>) => JSX.Element | null;
13
- export {};
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { CustomSuggestItemRenderer, OnItemClickHandler } from "../types";
3
+ interface SuggestResultsItemProps<T> {
4
+ item: T;
5
+ isSelected: boolean;
6
+ className?: string;
7
+ customSuggestItemRenderer?: CustomSuggestItemRenderer<T>;
8
+ onItemClickHandler: OnItemClickHandler<T>;
9
+ }
10
+ export declare const SuggestResultsItem: React.MemoExoticComponent<(<T>({ isSelected, item: itemProp, className, customSuggestItemRenderer, onItemClickHandler, }: SuggestResultsItemProps<T>) => JSX.Element)>;
11
+ export {};
@@ -0,0 +1,26 @@
1
+ /**
2
+ * React textarea with suggest v2.0.0
3
+ *
4
+ *
5
+ * Copyright (c) 2019-present,
6
+ * by Mariia Lobareva (marialobareva97@gmail.com).
7
+ *
8
+ * LICENSE MIT.
9
+ */
10
+ import React, { HTMLProps, ChangeEvent } from "react";
11
+ import { CustomSuggestItemRenderer } from "../types";
12
+ interface TextareaSuggestProps<SuggestItemType> extends Partial<Omit<HTMLProps<HTMLTextAreaElement>, "style">> {
13
+ className?: string;
14
+ autosizable?: boolean;
15
+ searchMarker?: string;
16
+ searchRegexp?: RegExp;
17
+ suggestList?: SuggestItemType[];
18
+ value?: string;
19
+ closeSuggestOnFocusOut?: boolean;
20
+ cancelSearchOnFocusOut?: boolean;
21
+ onChange?: (event: ChangeEvent<HTMLTextAreaElement>) => void;
22
+ onSearch: (newValue: string) => void;
23
+ customSuggestItemRenderer?: CustomSuggestItemRenderer<SuggestItemType>;
24
+ }
25
+ export declare const TextareaWithSuggests: <SuggestItemType extends React.ReactNode>({ autosizable, value, searchMarker, searchRegexp: searchRegexpProp, suggestList, closeSuggestOnFocusOut, cancelSearchOnFocusOut, onSearch, onChange, customSuggestItemRenderer, ...props }: TextareaSuggestProps<SuggestItemType>) => JSX.Element;
26
+ export {};
@@ -0,0 +1,2 @@
1
+ export { NativeTextarea } from "./NativeTextarea";
2
+ export { SuggestResults } from "./SuggestResults";
@@ -0,0 +1,9 @@
1
+ export declare enum KeyCodes {
2
+ ArrowUp = "ArrowUp",
3
+ ArrowDown = "ArrowDown",
4
+ Enter = "Enter",
5
+ Escape = "Escape"
6
+ }
7
+ export declare const SUPPORTED_KEYDOWN: KeyCodes[];
8
+ export declare const SEARCH_MARKER = "@";
9
+ export declare const ENDING_SYMBOLS: string[];
package/lib/index.d.ts CHANGED
@@ -1,25 +1,2 @@
1
- /**
2
- * React textarea with suggest v2.0.0
3
- *
4
- *
5
- * Copyright (c) 2019-present,
6
- * by Mariia Lobareva (marialobareva97@gmail.com).
7
- *
8
- * LICENSE MIT.
9
- */
10
- import React, { ReactNode, HTMLProps, ChangeEvent } from "react";
11
- interface TextareaSuggestProps<SuggestItemType> extends Partial<Omit<HTMLProps<HTMLTextAreaElement>, "style">> {
12
- className?: string;
13
- autosizable?: boolean;
14
- searchMarker?: string;
15
- searchRegexp?: RegExp;
16
- suggestList?: SuggestItemType[];
17
- value?: string;
18
- closeSuggestOnFocusOut?: boolean;
19
- cancelSearchOnFocusOut?: boolean;
20
- onChange?: (event: ChangeEvent<HTMLTextAreaElement>) => void;
21
- onSearch: (newValue: string) => void;
22
- customSuggestItemRenderer?: (suggestItem: SuggestItemType) => ReactNode;
23
- }
24
- declare const TextareaSuggest: <SuggestItemType extends React.ReactNode>({ autosizable, value, searchMarker, searchRegexp: searchRegexpProp, suggestList, closeSuggestOnFocusOut, cancelSearchOnFocusOut, onSearch, onChange, customSuggestItemRenderer, ...props }: TextareaSuggestProps<SuggestItemType>) => JSX.Element;
25
- export default TextareaSuggest;
1
+ import { TextareaWithSuggests } from "./components/TextareaWithSuggests";
2
+ export default TextareaWithSuggests;
package/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("react-textarea-autosize");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=n(e),a=n(t),o=function(){return o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var a in t=arguments[n])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e},o.apply(this,arguments)};function i(t){var n=e.useRef();return e.useEffect((function(){n.current=t}),[t]),n.current}function c(){if("undefined"==typeof navigator||"undefined"==typeof window)return!1;var e,t=!1;return e=navigator.userAgent||navigator.vendor||"opera"in window&&window.opera,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(e.substr(0,4)))&&(t=!0),t}var u=function(e){var t=!1,n=!1;return{nativeEvent:e,currentTarget:e.currentTarget,target:e.target,bubbles:e.bubbles,cancelable:e.cancelable,defaultPrevented:e.defaultPrevented,eventPhase:e.eventPhase,isTrusted:e.isTrusted,preventDefault:function(){t=!0,e.preventDefault()},isDefaultPrevented:function(){return t},stopPropagation:function(){n=!0,e.stopPropagation()},isPropagationStopped:function(){return n},persist:function(){},timeStamp:e.timeStamp,type:e.type}},l=function(t){var n=t.textareaRef,a=t.values,o=void 0===a?[]:a,i=t.isHidden,u=t.className,l=t.selectedItemIndex,s=t.customSuggestItemRenderer,d=t.onItemClickHandler;if(i||!(null==o?void 0:o.length)||!n.current)return null;var v=e.useMemo((function(){var e;return(null===(e=n.current)||void 0===e?void 0:e.getBoundingClientRect())||{}}),[n.current]),f=v.width,p=void 0===f?0:f,m=v.left,g=void 0===m?0:m,b=c(),w=e.useCallback((function(e,t){var n=l===t,a=["textarea-suggest-item",n?"textarea-suggest-item_selected":"",u?"".concat(u,"__results__item"):"",n&&u?"".concat(u,"__results__item_selected"):""].filter(Boolean).join(" ");return s?r.default.createElement("div",{className:a,onMouseDown:b?void 0:d(e),onTouchStart:b?d(e):void 0},s(e,n)):r.default.createElement("div",{className:a,onMouseDown:b?void 0:d(e),onTouchStart:b?d(e):void 0},r.default.createElement("div",{className:"textarea-suggest-item__info"},e))}),[d,s,l]);return r.default.createElement("div",{className:"textarea-suggest__results ".concat(u?"".concat(u,"__results"):""),style:{position:"absolute",width:p,left:g}},o.map((function(t,n){return r.default.createElement(e.Fragment,{key:n},w(t,n))})))},s=e.forwardRef((function(e,t){return r.default.createElement("textarea",o({},e,{ref:t}))}));exports.default=function(t){var n=t.autosizable,d=void 0!==n&&n,v=t.value,f=void 0===v?"":v,p=t.searchMarker,m=void 0===p?"@":p,g=t.searchRegexp,b=t.suggestList,w=void 0===b?[]:b,h=t.closeSuggestOnFocusOut,y=void 0!==h&&h,k=t.cancelSearchOnFocusOut,x=void 0!==k&&k,O=t.onSearch,E=t.onChange,S=t.customSuggestItemRenderer,_=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n}(t,["autosizable","value","searchMarker","searchRegexp","suggestList","closeSuggestOnFocusOut","cancelSearchOnFocusOut","onSearch","onChange","customSuggestItemRenderer"]),P=e.useState(f),j=P[0],I=P[1],z=e.useState(null==f?void 0:f.includes(m)),D=z[0],R=z[1],T=e.useState(!0),C=T[0],M=T[1],F=e.useState(void 0),N=F[0],q=F[1],A=i(j),B=i(f),H=e.useRef(null),K=d?a.default:s,L=e.useMemo((function(){return g?new RegExp(g):new RegExp("".concat(m,"([a-z0-9-_.]+[a-z0-9])"),"gim")}),[g]);e.useEffect((function(){if(m.length>1)throw new TypeError("Max length of searchMarker is 1 symbol. Please change your searchMarker to char")}),[]),e.useEffect((function(){f&&A!==f&&B!==f&&(I(f),Q(void 0,f))}),[j,f,A,B]);var U=e.useCallback((function(e){var t,n=e.code,r=D&&!C&&w.length;if(null===(t=_.onKeyDown)||void 0===t||t.call(_,e),r&&["ArrowUp","ArrowDown","Enter","Escape"].includes(n))switch(e.stopPropagation(),e.nativeEvent.stopImmediatePropagation(),n){case"ArrowUp":return e.preventDefault(),q((function(e){return void 0===e||0===e?w.length-1:e-1}));case"ArrowDown":return e.preventDefault(),q((function(e){return void 0===e||e===w.length-1?0:e+1}));case"Enter":return void(void 0!==N&&(e.preventDefault(),V(w[N])()));case"Escape":R(!1),q(void 0)}}),[_.onKeyDown,N,w,D,C]),G=e.useCallback((function(e){var t;y&&M(!0),x&&R(!1),null===(t=_.onBlur)||void 0===t||t.call(_,e)}),[y,x,_.onBlur]),J=e.useCallback((function(e){var t;C&&M(!1),null===(t=_.onFocus)||void 0===t||t.call(_,e)}),[y,x,_.onFocus]),Q=function(e,t){var n,r,a;void 0===t&&(t="");var i=e?void 0===(null===(n=e.currentTarget)||void 0===n?void 0:n.value)?j:(null===(r=e.currentTarget)||void 0===r?void 0:r.value)||"":t,c=!!e&&(void 0===e.isTrusted||e.isTrusted),l=null===(a=H.current)||void 0===a?void 0:a.selectionEnd,s=l?i.slice(l-1,l):i.slice(-1);if(I(i),s===m&&(t&&M(!1),R(!0)),i.includes(m)&&![" ","\n","\r"].includes(s)||!D||R(!1),s!==m&&D){var d=i.slice(0,l),v=d.slice(d.lastIndexOf(m)).match(L),f=v?v[0].slice(1):s;O(f)}if(!e&&H.current&&(H.current.value=i),e&&c)return null==E?void 0:E(e);if(e&&!c)return null==E?void 0:E(o(o({},e),{currentTarget:H.current,target:H.current}));var p=function(e,t){var n=new Event("change",{bubbles:!0});return Object.defineProperty(n,"target",{writable:!1,value:e}),u(n)}(H.current);return null==E?void 0:E(p)},V=e.useCallback((function(e){return function(){var t,n,r=null===(t=H.current)||void 0===t?void 0:t.selectionEnd,a=j.slice(0,r).lastIndexOf(m),o=j.slice(a);if(-1!==a){var i=(o.includes(" ")?o.indexOf(" "):j.length)+a;o.lastIndexOf(m)>0&&(i=o.lastIndexOf(m)+a),(!i||i<a)&&(i=j.length);var u=j.slice(0,a||0)+j.slice(a).replace(j.slice(a,i),"".concat(m).concat(e," "));if(c()){var l=u.slice(a).indexOf(" ")+a+1;null===(n=H.current)||void 0===n||n.setSelectionRange(l,l)}H.current&&(!function(e,t){var n,r,a=null===(n=Object.getOwnPropertyDescriptor(e,"value"))||void 0===n?void 0:n.set,o=Object.getPrototypeOf(e),i=null===(r=Object.getOwnPropertyDescriptor(o,"value"))||void 0===r?void 0:r.set;a&&a!==i?null==i||i.call(e,t):null==a||a.call(e,t),e.dispatchEvent(new Event("input",{bubbles:!0}))}(H.current,u),setTimeout((function(){var e;return null===(e=H.current)||void 0===e?void 0:e.focus()}))),q(void 0),R(!1),I(u)}}}),[H,j]);return r.default.createElement("div",{className:"textarea-suggest"},r.default.createElement(K,o({},_,{onKeyDown:U,onBlur:G,onFocus:J,ref:H,onChange:Q,value:j||f})),r.default.createElement(l,{className:_.className,textareaRef:H,values:w,selectedItemIndex:N,isHidden:C||!D,customSuggestItemRenderer:S,onItemClickHandler:V}))};
1
+ Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("react-textarea-autosize");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=n(e),a=n(t),o=function(){return o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var a in t=arguments[n])Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a]);return e},o.apply(this,arguments)};function i(t){var n=e.useRef();return e.useEffect((function(){n.current=t}),[t]),n.current}var c,l=function(e){var t=!1,n=!1;return{nativeEvent:e,currentTarget:e.currentTarget,target:e.target,bubbles:e.bubbles,cancelable:e.cancelable,defaultPrevented:e.defaultPrevented,eventPhase:e.eventPhase,isTrusted:e.isTrusted,preventDefault:function(){t=!0,e.preventDefault()},isDefaultPrevented:function(){return t},stopPropagation:function(){n=!0,e.stopPropagation()},isPropagationStopped:function(){return n},persist:function(){},timeStamp:e.timeStamp,type:e.type}},u=e.forwardRef((function(e,t){return r.default.createElement("textarea",o({},e,{ref:t}))})),s=r.default.memo((function(t){var n=t.isSelected,a=t.item,o=t.className,i=t.customSuggestItemRenderer,c=t.onItemClickHandler,l=e.useRef(!1),u=a,s=["textarea-suggest-item",n?"textarea-suggest-item_selected":"",o?"".concat(o,"__results__item"):"",n&&o?"".concat(o,"__results__item_selected"):""].filter(Boolean).join(" ");return r.default.createElement("div",{className:s,onMouseDown:function(e){if(l.current)return e.preventDefault(),e.stopPropagation(),void(l.current=!1);c(u)()},onTouchStart:function(e){l.current=!0,e.stopPropagation(),c(u)()}},i?i(u,n):r.default.createElement("div",{className:"textarea-suggest-item__info"},u))})),d=function(t){var n=t.textareaRef,a=t.values,o=void 0===a?[]:a,i=t.isHidden,c=t.className,l=t.selectedItemIndex,u=t.customSuggestItemRenderer,d=t.onItemClickHandler,v=e.useMemo((function(){var e,t;return(null===(t=null===(e=null==n?void 0:n.current)||void 0===e?void 0:e.getBoundingClientRect)||void 0===t?void 0:t.call(e))||{}}),[null==n?void 0:n.current]),f=v.width,p=void 0===f?0:f,m=v.left,g=void 0===m?0:m;return!i&&(null==o?void 0:o.length)&&(null==n?void 0:n.current)?r.default.createElement("div",{className:"textarea-suggest__results ".concat(c?"".concat(c,"__results"):""),style:{position:"absolute",width:p,left:g}},o.map((function(e,t){return r.default.createElement(s,{key:t,className:c,item:e,isSelected:t===l,onItemClickHandler:d,customSuggestItemRenderer:u})}))):null};!function(e){e.ArrowUp="ArrowUp",e.ArrowDown="ArrowDown",e.Enter="Enter",e.Escape="Escape"}(c||(c={}));var v=[c.ArrowUp,c.ArrowDown,c.Enter,c.Escape],f=[" ","\n","\r"];exports.default=function(t){var n=t.autosizable,s=void 0!==n&&n,p=t.value,m=void 0===p?"":p,g=t.searchMarker,b=void 0===g?"@":g,w=t.searchRegexp,h=t.suggestList,y=void 0===h?[]:h,k=t.closeSuggestOnFocusOut,x=void 0!==k&&k,O=t.cancelSearchOnFocusOut,E=void 0!==O&&O,S=t.onSearch,P=t.onChange,_=t.customSuggestItemRenderer,I=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n}(t,["autosizable","value","searchMarker","searchRegexp","suggestList","closeSuggestOnFocusOut","cancelSearchOnFocusOut","onSearch","onChange","customSuggestItemRenderer"]),j=e.useState(m),R=j[0],D=j[1],z=e.useState(null==m?void 0:m.includes(b)),C=z[0],T=z[1],A=e.useState(!0),M=A[0],N=A[1],q=e.useState(void 0),F=q[0],H=q[1],B=i(R),U=i(m),K=e.useRef(null),L=s?a.default:u,G=e.useMemo((function(){return w?new RegExp(w):new RegExp("".concat(b,"([a-z0-9-_.]+[a-z0-9])"),"gim")}),[w]);e.useEffect((function(){if(b.length>1)throw new TypeError("Max length of searchMarker is 1 symbol. Please change your searchMarker to char")}),[]),e.useEffect((function(){m&&B!==m&&U!==m&&(D(m),W(void 0,m))}),[R,m,B,U]);var J=e.useCallback((function(e){var t,n=e.code,r=C&&!M&&y.length;if(null===(t=I.onKeyDown)||void 0===t||t.call(I,e),r&&v.includes(n))switch(e.stopPropagation(),e.nativeEvent.stopImmediatePropagation(),n){case c.ArrowUp:return e.preventDefault(),H((function(e){return void 0===e||0===e?y.length-1:e-1}));case c.ArrowDown:return e.preventDefault(),H((function(e){return void 0===e||e===y.length-1?0:e+1}));case c.Enter:return void(void 0!==F&&(e.preventDefault(),X(y[F])()));case c.Escape:T(!1),H(void 0)}}),[I.onKeyDown,F,y,C,M]),Q=e.useCallback((function(e){var t;x&&N(!0),E&&T(!1),null===(t=I.onBlur)||void 0===t||t.call(I,e)}),[x,E,I.onBlur]),V=e.useCallback((function(e){var t;M&&N(!1),null===(t=I.onFocus)||void 0===t||t.call(I,e)}),[x,E,I.onFocus]),W=function(e,t){var n,r,a;void 0===t&&(t="");var i=e?void 0===(null===(n=e.currentTarget)||void 0===n?void 0:n.value)?R:(null===(r=e.currentTarget)||void 0===r?void 0:r.value)||"":t,c=!!e&&(void 0===e.isTrusted||e.isTrusted),u=null===(a=K.current)||void 0===a?void 0:a.selectionEnd,s=u?i.slice(u-1,u):i.slice(-1);if(D(i),s===b&&(t&&N(!1),T(!0)),i.includes(b)&&!f.includes(s)||!C||T(!1),s!==b&&C){var d=i.slice(0,u),v=d.slice(d.lastIndexOf(b)).match(G),p=v?v[0].slice(1):s;S(p)}if(!e&&K.current&&(K.current.value=i),e&&c)return null==P?void 0:P(e);if(e&&!c)return null==P?void 0:P(o(o({},e),{currentTarget:K.current,target:K.current}));var m=function(e,t){var n=new Event("change",{bubbles:!0});return Object.defineProperty(n,"target",{writable:!1,value:e}),l(n)}(K.current);return null==P?void 0:P(m)},X=e.useCallback((function(e){return function(){var t,n,r=null===(t=K.current)||void 0===t?void 0:t.selectionEnd,a=R.slice(0,r).lastIndexOf(b),o=R.slice(a);if(-1!==a){var i=(o.includes(" ")?o.indexOf(" "):R.length)+a;o.lastIndexOf(b)>0&&(i=o.lastIndexOf(b)+a),(!i||i<a)&&(i=R.length);var c=R.slice(0,a||0)+R.slice(a).replace(R.slice(a,i),"".concat(b).concat(e," "));if(function(){if("undefined"==typeof navigator||"undefined"==typeof window)return!1;var e,t=!1;return e=navigator.userAgent||navigator.vendor||"opera"in window&&window.opera,(/(android|bb\d+|meego).+mobile|tablet|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/gi.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0,4)))&&(t=!0),t}()){var l=c.slice(a).indexOf(" ")+a+1;null===(n=K.current)||void 0===n||n.setSelectionRange(l,l)}K.current&&(!function(e,t){var n,r,a=null===(n=Object.getOwnPropertyDescriptor(e,"value"))||void 0===n?void 0:n.set,o=Object.getPrototypeOf(e),i=null===(r=Object.getOwnPropertyDescriptor(o,"value"))||void 0===r?void 0:r.set;a&&a!==i?null==i||i.call(e,t):null==a||a.call(e,t),e.dispatchEvent(new Event("input",{bubbles:!0}))}(K.current,c),setTimeout((function(){var e;return null===(e=K.current)||void 0===e?void 0:e.focus()}))),H(void 0),T(!1),D(c)}}}),[K,R]);return r.default.createElement("div",{className:"textarea-suggest"},r.default.createElement(L,o({},I,{onKeyDown:J,onBlur:Q,onFocus:V,ref:K,onChange:W,value:R||m})),r.default.createElement(d,{className:I.className,textareaRef:K,values:y,selectedItemIndex:F,isHidden:M||!C,customSuggestItemRenderer:_,onItemClickHandler:X}))};
2
2
  //# sourceMappingURL=index.js.map
package/lib/types.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { ReactNode } from "react";
2
+ export type Nullable<T> = T | null;
3
+ export type CustomSuggestItemRenderer<T> = (item: T, isSelected?: boolean) => ReactNode;
4
+ export type OnItemClickHandler<T> = (item: T) => () => void;
@@ -0,0 +1,4 @@
1
+ export { usePrevious } from "./usePrevious";
2
+ export { isMobileAndTabletCheck } from "./isMobileAndTabletCheck";
3
+ export { setNativeValue } from "./nativeEvents";
4
+ export { createSyntheticEvent, createSyntheticEventByTarget, } from "./syntheticEvents";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * from http://detectmobilebrowsers.com/
3
+ * https://www.quirksmode.org/js/detect.html
4
+ */
5
+ export declare function isMobileAndTabletCheck(): boolean;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * dispatching syntetic events no longer supported by react
3
+ * https://github.com/facebook/react/issues/12344
4
+ */
5
+ export declare function setNativeValue(element: Element, value: string): void;
@@ -0,0 +1,3 @@
1
+ import { SyntheticEvent } from "react";
2
+ export declare const createSyntheticEventByTarget: <T extends Element>(target: T, eventType?: string) => SyntheticEvent<T, Event>;
3
+ export declare const createSyntheticEvent: <T extends Element, E extends Event>(event: E) => SyntheticEvent<T, E>;
@@ -0,0 +1 @@
1
+ export declare function usePrevious<T>(value: T): T | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-textarea-with-suggest",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Textarea with suggest for React app",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -15,7 +15,9 @@
15
15
  "prettier": "prettier --write .",
16
16
  "build:debug": "npm install && npm run build && rm -rf node_modules",
17
17
  "build": "rollup -c",
18
- "start": "rollup -c -w"
18
+ "start": "rollup -c -w",
19
+ "deploy:demo": "cd ./example && rm -rf node_modules && rm package-lock.json && npm i && npm run deploy && cd ../",
20
+ "test": "jest --coverage --"
19
21
  },
20
22
  "license": "MIT",
21
23
  "eslintConfig": {
@@ -36,7 +38,7 @@
36
38
  "bugs": {
37
39
  "url": "https://github.com/marylorian/react-textarea-with-suggest/issues"
38
40
  },
39
- "homepage": "https://github.com/marylorian/react-textarea-with-suggest#readme",
41
+ "homepage": "https://marylorian.github.io/react-textarea-with-suggest/",
40
42
  "browserslist": {
41
43
  "production": [
42
44
  ">0.2%",
@@ -56,12 +58,7 @@
56
58
  "@babel/preset-typescript"
57
59
  ],
58
60
  "plugins": [
59
- [
60
- "@babel/plugin-proposal-class-properties",
61
- {
62
- "loose": true
63
- }
64
- ]
61
+ "@babel/plugin-proposal-class-properties"
65
62
  ]
66
63
  },
67
64
  "peerDependencies": {
@@ -78,9 +75,13 @@
78
75
  "@rollup/plugin-babel": "^6.0.3",
79
76
  "@rollup/plugin-terser": "^0.2.1",
80
77
  "@rollup/plugin-typescript": "^10.0.1",
78
+ "@testing-library/jest-dom": "^5.16.5",
79
+ "@testing-library/react": "^13.4.0",
81
80
  "@types/react": "^18.0.26",
82
81
  "babel-loader": "^8.0.6",
83
82
  "css-loader": "^6.7.3",
83
+ "jest": "^29.3.1",
84
+ "jest-environment-jsdom": "^29.3.1",
84
85
  "prettier": "2.7.1",
85
86
  "rollup": "^2.79.1",
86
87
  "rollup-plugin-css-only": "^4.3.0",
package/lib/utils.d.ts DELETED
@@ -1,11 +0,0 @@
1
- import { SyntheticEvent } from "react";
2
- export type Nullable<T> = T | null;
3
- export declare function usePrevious<T>(value: T): T | undefined;
4
- export declare function isMobileAndTabletCheck(): boolean;
5
- /**
6
- * syntetic events no longer supported by react
7
- * https://github.com/facebook/react/issues/12344
8
- */
9
- export declare function setNativeValue(element: Element, value: string): void;
10
- export declare const createSyntheticEventByTarget: <T extends Element>(target: T, eventType?: string) => SyntheticEvent<T, Event>;
11
- export declare const createSyntheticEvent: <T extends Element, E extends Event>(event: E) => SyntheticEvent<T, E>;