@huridocs/react-text-selection-handler 0.2.0 → 0.2.9

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.
@@ -0,0 +1,10 @@
1
+ import React, { FunctionComponent } from 'react';
2
+ import { TextSelection } from './TextSelection';
3
+ interface SelectionHandlerProps {
4
+ onSelect: (textSelection: TextSelection) => any;
5
+ onDeselect?: () => any;
6
+ children?: React.ReactNode;
7
+ }
8
+ declare const HandleTextSelection: FunctionComponent<SelectionHandlerProps>;
9
+ export { HandleTextSelection };
10
+ //# sourceMappingURL=HandleTextSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HandleTextSelection.d.ts","sourceRoot":"","sources":["../src/HandleTextSelection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAqB,MAAM,OAAO,CAAC;AAGpE,OAAO,EAA+B,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE7E,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,CAAC,aAAa,EAAE,aAAa,KAAK,GAAG,CAAC;IAChD,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAcD,QAAA,MAAM,mBAAmB,EAAE,iBAAiB,CAAC,qBAAqB,CA8DjE,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,56 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+ import { elementContainsDomRect } from './elementContainsDomRect';
3
+ import { rangeToTextRects } from './rangeToTextRects';
4
+ import { domRectToSelectionRectangle } from './TextSelection';
5
+ const notNull = (value) => value !== null;
6
+ const normalizedFirefoxRange = (selection) => {
7
+ const finalRange = selection.getRangeAt(selection.rangeCount - 1);
8
+ const firstRange = selection.getRangeAt(0);
9
+ const range = document.createRange();
10
+ range.setStart(firstRange.startContainer, firstRange.startOffset);
11
+ range.setEnd(finalRange.endContainer, finalRange.endOffset);
12
+ return range;
13
+ };
14
+ const HandleTextSelection = ({ onSelect, onDeselect, children, }) => {
15
+ const ref = useRef(null);
16
+ const hasSelected = useRef(false);
17
+ const deselectionHandler = () => {
18
+ if (onDeselect && hasSelected.current) {
19
+ onDeselect();
20
+ hasSelected.current = false;
21
+ }
22
+ };
23
+ useEffect(() => {
24
+ document.addEventListener('selectionchange', deselectionHandler);
25
+ return () => {
26
+ document.removeEventListener('selectionchange', deselectionHandler);
27
+ };
28
+ }, []);
29
+ const getSelection = () => {
30
+ const selection = window.getSelection();
31
+ if (!ref.current || !(selection === null || selection === void 0 ? void 0 : selection.toString().trim())) {
32
+ return;
33
+ }
34
+ hasSelected.current = true;
35
+ const regionElements = Array.from(ref.current.querySelectorAll('div[data-region-selector-id]'));
36
+ const range = normalizedFirefoxRange(selection);
37
+ const selectionRectangles = rangeToTextRects(range)
38
+ .map(rectangle => {
39
+ const region = regionElements.find(elementContainsDomRect(rectangle));
40
+ if (!region) {
41
+ return null;
42
+ }
43
+ return domRectToSelectionRectangle(rectangle, region);
44
+ })
45
+ .filter(notNull);
46
+ onSelect({ text: selection.toString(), selectionRectangles });
47
+ };
48
+ return (React.createElement("div", { role: "none", ref: ref, onMouseDown: e => {
49
+ var _a;
50
+ if (!e.shiftKey) {
51
+ (_a = window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();
52
+ }
53
+ }, onMouseUp: getSelection }, children));
54
+ };
55
+ export { HandleTextSelection };
56
+ //# sourceMappingURL=HandleTextSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HandleTextSelection.js","sourceRoot":"","sources":["../src/HandleTextSelection.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { FunctionComponent } from 'react';
2
+ import { TextSelection } from './TextSelection';
3
+ interface HighlightProps {
4
+ textSelection: TextSelection;
5
+ color?: string;
6
+ }
7
+ declare const Highlight: FunctionComponent<HighlightProps>;
8
+ export { Highlight };
9
+ //# sourceMappingURL=Highlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Highlight.d.ts","sourceRoot":"","sources":["../src/Highlight.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAiB,iBAAiB,EAAc,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,UAAU,cAAc;IACtB,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,QAAA,MAAM,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAiChD,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,26 @@
1
+ import React, { useContext } from 'react';
2
+ import { SelectionRegionContext } from './SelectionRegion';
3
+ const Highlight = ({ textSelection, color }) => {
4
+ const regionId = useContext(SelectionRegionContext);
5
+ return (React.createElement(React.Fragment, null, textSelection.selectionRectangles
6
+ .filter(rectangle => rectangle.regionId && regionId ? rectangle.regionId === regionId : true)
7
+ .map(selectionRectangle => {
8
+ const style = {
9
+ top: selectionRectangle.top,
10
+ left: selectionRectangle.left,
11
+ width: selectionRectangle.width,
12
+ height: selectionRectangle.height,
13
+ padding: 0,
14
+ margin: 0,
15
+ position: 'absolute',
16
+ display: 'block',
17
+ mixBlendMode: 'darken',
18
+ opacity: 0.5,
19
+ backgroundColor: color || 'orange',
20
+ zIndex: 1,
21
+ };
22
+ return (React.createElement("div", { className: "highlight-rectangle", style: style, key: [selectionRectangle.top, selectionRectangle.left].join('') }));
23
+ })));
24
+ };
25
+ export { Highlight };
26
+ //# sourceMappingURL=Highlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Highlight.js","sourceRoot":"","sources":["../src/Highlight.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAoC,UAAU,EAAE,MAAM,OAAO,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAQ3D,MAAM,SAAS,GAAsC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE;IAChF,MAAM,QAAQ,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACpD,OAAO,CACL,0CACG,aAAa,CAAC,mBAAmB;SAC/B,MAAM,CAAC,SAAS,CAAC,EAAE,CAClB,SAAS,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CACxE;SACA,GAAG,CAAC,kBAAkB,CAAC,EAAE;QACxB,MAAM,KAAK,GAAkB;YAC3B,GAAG,EAAE,kBAAkB,CAAC,GAAG;YAC3B,IAAI,EAAE,kBAAkB,CAAC,IAAI;YAC7B,KAAK,EAAE,kBAAkB,CAAC,KAAK;YAC/B,MAAM,EAAE,kBAAkB,CAAC,MAAM;YACjC,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC;YACT,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,QAAQ;YACtB,OAAO,EAAE,GAAG;YACZ,eAAe,EAAE,KAAK,IAAI,QAAQ;YAClC,MAAM,EAAE,CAAC;SACV,CAAC;QACF,OAAO,CACL,6BACE,SAAS,EAAC,qBAAqB,EAC/B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAC/D,CACH,CAAC;IACJ,CAAC,CAAC,CACH,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React, { FunctionComponent } from 'react';
2
+ export declare const SelectionRegionContext: React.Context<string>;
3
+ interface SelectionRegionProps {
4
+ regionId?: string;
5
+ children?: React.ReactNode;
6
+ }
7
+ declare const SelectionRegion: FunctionComponent<SelectionRegionProps>;
8
+ export { SelectionRegion };
9
+ //# sourceMappingURL=SelectionRegion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionRegion.d.ts","sourceRoot":"","sources":["../src/SelectionRegion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEjD,eAAO,MAAM,sBAAsB,uBAA0B,CAAC;AAE9D,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,QAAA,MAAM,eAAe,EAAE,iBAAiB,CAAC,oBAAoB,CAO5D,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export const SelectionRegionContext = React.createContext('');
3
+ const SelectionRegion = ({ regionId = 'selectionRegion', children, }) => (React.createElement(SelectionRegionContext.Provider, { value: regionId },
4
+ React.createElement("div", { "data-region-selector-id": regionId }, children)));
5
+ export { SelectionRegion };
6
+ //# sourceMappingURL=SelectionRegion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionRegion.js","sourceRoot":"","sources":["../src/SelectionRegion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;AAO9D,MAAM,eAAe,GAA4C,CAAC,EAChE,QAAQ,GAAG,iBAAiB,EAC5B,QAAQ,GACT,EAAE,EAAE,CAAC,CACJ,oBAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ;IAC9C,wDAA8B,QAAQ,IAAG,QAAQ,CAAO,CACxB,CACnC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface SelectionRectangle {
2
+ left: number;
3
+ top: number;
4
+ width: number;
5
+ height: number;
6
+ regionId?: string;
7
+ }
8
+ export interface TextSelection {
9
+ selectionRectangles: SelectionRectangle[];
10
+ text?: string;
11
+ }
12
+ export declare const domRectToSelectionRectangle: (rectangle: DOMRect, region: Element) => SelectionRectangle;
13
+ //# sourceMappingURL=TextSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextSelection.d.ts","sourceRoot":"","sources":["../src/TextSelection.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,aAAa;IAC5B,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,2BAA2B,cAC3B,OAAO,UACV,OAAO,KACd,kBAUF,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const domRectToSelectionRectangle = (rectangle, region) => {
2
+ const regionDomRect = region.getBoundingClientRect();
3
+ const regionId = region.getAttribute('data-region-selector-id');
4
+ return Object.assign({ top: rectangle.y - regionDomRect.y, left: rectangle.x - regionDomRect.x, width: rectangle.width, height: rectangle.height }, (regionId ? { regionId } : {}));
5
+ };
6
+ //# sourceMappingURL=TextSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextSelection.js","sourceRoot":"","sources":["../src/TextSelection.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,SAAkB,EAClB,MAAe,EACK,EAAE;IACtB,MAAM,aAAa,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAChE,uBACE,GAAG,EAAE,SAAS,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,EAClC,IAAI,EAAE,SAAS,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,EACnC,KAAK,EAAE,SAAS,CAAC,KAAK,EACtB,MAAM,EAAE,SAAS,CAAC,MAAM,IACrB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EACjC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const elementContainsDomRect: (rect: DOMRect) => (region: Element) => boolean;
2
+ //# sourceMappingURL=elementContainsDomRect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elementContainsDomRect.d.ts","sourceRoot":"","sources":["../src/elementContainsDomRect.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,SAAU,OAAO,cAAc,OAAO,YAKxE,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const elementContainsDomRect = (rect) => (region) => {
2
+ const regionRect = region.getBoundingClientRect();
3
+ const horizontalMatch = regionRect.x <= rect.x && rect.x <= regionRect.x + regionRect.width;
4
+ const verticalMatch = regionRect.y <= rect.y && rect.y <= regionRect.y + regionRect.height;
5
+ return horizontalMatch && verticalMatch;
6
+ };
7
+ //# sourceMappingURL=elementContainsDomRect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elementContainsDomRect.js","sourceRoot":"","sources":["../src/elementContainsDomRect.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,CAAC,MAAe,EAAE,EAAE;IAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAClD,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;IAC5F,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC3F,OAAO,eAAe,IAAI,aAAa,CAAC;AAC1C,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { Highlight } from './Highlight';
2
+ export { HandleTextSelection } from './HandleTextSelection';
3
+ export { SelectionRegion } from './SelectionRegion';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { Highlight } from './Highlight';
2
+ export { HandleTextSelection } from './HandleTextSelection';
3
+ export { SelectionRegion } from './SelectionRegion';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const rangeToTextRects: (range: Range) => DOMRect[];
2
+ //# sourceMappingURL=rangeToTextRects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rangeToTextRects.d.ts","sourceRoot":"","sources":["../src/rangeToTextRects.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,UAAW,KAAK,cA6C5C,CAAC"}
@@ -0,0 +1,35 @@
1
+ export const rangeToTextRects = (range) => {
2
+ var _a, _b, _c;
3
+ const textNodeIterator = document.createNodeIterator(range.commonAncestorContainer, NodeFilter.SHOW_TEXT);
4
+ const selection = window.getSelection();
5
+ if (selection === null)
6
+ return [];
7
+ const extended = ((_b = (_a = selection.focusNode) === null || _a === void 0 ? void 0 : _a.childNodes) === null || _b === void 0 ? void 0 : _b.length) || 0 > 1;
8
+ const position = ((_c = selection.anchorNode) === null || _c === void 0 ? void 0 : _c.compareDocumentPosition(selection.focusNode)) === 4
9
+ ? 'FOLLOWING'
10
+ : 'PRECEDING';
11
+ const extentNode = extended || position === 'PRECEDING' ? selection.anchorNode : selection.focusNode;
12
+ const nodes = [];
13
+ while (textNodeIterator.nextNode()) {
14
+ const isValidNode = !(nodes.length === 0 && textNodeIterator.referenceNode !== range.startContainer);
15
+ if (isValidNode) {
16
+ nodes.push(textNodeIterator.referenceNode);
17
+ }
18
+ if (extentNode === textNodeIterator.referenceNode ||
19
+ extentNode === textNodeIterator.referenceNode.parentElement)
20
+ break;
21
+ }
22
+ return nodes.reduce((rects, n, index) => {
23
+ const myRange = document.createRange();
24
+ myRange.selectNode(n);
25
+ if (index === 0) {
26
+ myRange.setStart(n, range.startOffset);
27
+ }
28
+ if (index === nodes.length - 1) {
29
+ // @ts-expect-error - TS cannot now if Node is a text node, but this in handling text selections, so it's safe to assume it's a text node
30
+ myRange.setEnd(n, !extended ? range.endOffset : n.length);
31
+ }
32
+ return [...rects, ...Array.from(myRange.getClientRects())];
33
+ }, []);
34
+ };
35
+ //# sourceMappingURL=rangeToTextRects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rangeToTextRects.js","sourceRoot":"","sources":["../src/rangeToTextRects.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAY,EAAE,EAAE;;IAC/C,MAAM,gBAAgB,GAAG,QAAQ,CAAC,kBAAkB,CAClD,KAAK,CAAC,uBAAuB,EAC7B,UAAU,CAAC,SAAS,CACrB,CAAC;IAEF,MAAM,SAAS,GAAqB,MAAM,CAAC,YAAY,EAAE,CAAC;IAC1D,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,QAAQ,GAAG,CAAA,MAAA,MAAA,SAAS,CAAC,SAAS,0CAAE,UAAU,0CAAE,MAAM,KAAI,CAAC,GAAG,CAAC,CAAC;IAClE,MAAM,QAAQ,GACZ,CAAA,MAAA,SAAS,CAAC,UAAU,0CAAE,uBAAuB,CAAC,SAAS,CAAC,SAAU,CAAC,MAAK,CAAC;QACvE,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,WAAW,CAAC;IAElB,MAAM,UAAU,GACd,QAAQ,IAAI,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC;IAEpF,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,CAAC,CACnB,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,gBAAgB,CAAC,aAAa,KAAK,KAAK,CAAC,cAAc,CAC9E,CAAC;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC;QACD,IACE,UAAU,KAAK,gBAAgB,CAAC,aAAa;YAC7C,UAAU,KAAK,gBAAgB,CAAC,aAAa,CAAC,aAAa;YAE3D,MAAM;IACV,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,CAAY,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;QACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,yIAAyI;YACzI,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@huridocs/react-text-selection-handler",
3
- "version": "0.2.0",
3
+ "version": "0.2.9",
4
4
  "main": "./dist/index.js",
5
5
  "description": "React pdf handler allows to render a PDF and handle text selection and highlights.",
6
6
  "author": "HURIDOCS",
@@ -19,7 +19,7 @@
19
19
  "scripts": {
20
20
  "prepublish": "yarn build",
21
21
  "before_publish": "yarn eslint && yarn check-types && yarn test",
22
- "publish_to_npm": "np --testScript before_publish",
22
+ "publish_to_npm": "np --access=public --testScript before_publish",
23
23
  "build-test-app": "webpack --config ./e2e/webpack.config.js",
24
24
  "test": "yarn build && yarn build-test-app && jest --projects e2e/jest.e2e.config.ts",
25
25
  "build": "tsc --build tsconfig.build.json",