react-text-range 1.0.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.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/dist/cjs/FullWindow.d.ts +5 -0
  4. package/dist/cjs/FullWindow.js +16 -0
  5. package/dist/cjs/FullWindow.js.map +1 -0
  6. package/dist/cjs/SelectionHandler.d.ts +8 -0
  7. package/dist/cjs/SelectionHandler.js +33 -0
  8. package/dist/cjs/SelectionHandler.js.map +1 -0
  9. package/dist/cjs/TextContainer.d.ts +4 -0
  10. package/dist/cjs/TextContainer.js +10 -0
  11. package/dist/cjs/TextContainer.js.map +1 -0
  12. package/dist/cjs/TextSelectionZone.d.ts +7 -0
  13. package/dist/cjs/TextSelectionZone.js +40 -0
  14. package/dist/cjs/TextSelectionZone.js.map +1 -0
  15. package/dist/cjs/handler-pos.d.ts +5 -0
  16. package/dist/cjs/handler-pos.js +3 -0
  17. package/dist/cjs/handler-pos.js.map +1 -0
  18. package/dist/cjs/index.d.ts +3 -0
  19. package/dist/cjs/index.js +9 -0
  20. package/dist/cjs/index.js.map +1 -0
  21. package/dist/cjs/useTextSelectionEditor.d.ts +13 -0
  22. package/dist/cjs/useTextSelectionEditor.js +146 -0
  23. package/dist/cjs/useTextSelectionEditor.js.map +1 -0
  24. package/dist/esm/FullWindow.d.ts +5 -0
  25. package/dist/esm/FullWindow.js +11 -0
  26. package/dist/esm/FullWindow.js.map +1 -0
  27. package/dist/esm/SelectionHandler.d.ts +8 -0
  28. package/dist/esm/SelectionHandler.js +28 -0
  29. package/dist/esm/SelectionHandler.js.map +1 -0
  30. package/dist/esm/TextContainer.d.ts +4 -0
  31. package/dist/esm/TextContainer.js +6 -0
  32. package/dist/esm/TextContainer.js.map +1 -0
  33. package/dist/esm/TextSelectionZone.d.ts +7 -0
  34. package/dist/esm/TextSelectionZone.js +35 -0
  35. package/dist/esm/TextSelectionZone.js.map +1 -0
  36. package/dist/esm/handler-pos.d.ts +5 -0
  37. package/dist/esm/handler-pos.js +2 -0
  38. package/dist/esm/handler-pos.js.map +1 -0
  39. package/dist/esm/index.d.ts +3 -0
  40. package/dist/esm/index.js +4 -0
  41. package/dist/esm/index.js.map +1 -0
  42. package/dist/esm/useTextSelectionEditor.d.ts +13 -0
  43. package/dist/esm/useTextSelectionEditor.js +142 -0
  44. package/dist/esm/useTextSelectionEditor.js.map +1 -0
  45. package/package.json +50 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ # MIT License
2
+
3
+ Copyright (c) 2023, Aleksandr Novikov <yetanothervan@gmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # react-text-range
@@ -0,0 +1,5 @@
1
+ import React, { FC } from 'react';
2
+ export declare const FullWindow: FC<{
3
+ children: React.ReactNode;
4
+ }>;
5
+ export default FullWindow;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FullWindow = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const fullWindow = {
7
+ height: '100vh',
8
+ widows: '100%',
9
+ };
10
+ const centroContainer = Object.assign(Object.assign({}, fullWindow), { display: 'flex', alignItems: 'center', justifyContent: 'center', flexDirection: 'column' });
11
+ const FullWindow = ({ children }) => {
12
+ return (react_1.default.createElement("div", { style: centroContainer }, children));
13
+ };
14
+ exports.FullWindow = FullWindow;
15
+ exports.default = exports.FullWindow;
16
+ //# sourceMappingURL=FullWindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FullWindow.js","sourceRoot":"","sources":["../../src/FullWindow.tsx"],"names":[],"mappings":";;;;AAAA,0DAAkC;AAElC,MAAM,UAAU,GAAwB;IACtC,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,MAAM;CACf,CAAC;AAEF,MAAM,eAAe,mCAChB,UAAU,KACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,QAAQ,EACpB,cAAc,EAAE,QAAQ,EACxB,aAAa,EAAE,QAAQ,GACxB,CAAC;AAEK,MAAM,UAAU,GAAuC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAE7E,OAAO,CACL,uCAAK,KAAK,EAAE,eAAe,IACxB,QAAQ,CACL,CACP,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,UAAU,cAOrB;AAEF,kBAAe,kBAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { FC } from 'react';
2
+ import { HandlerPos } from './handler-pos';
3
+ export declare const SelectionHandler: FC<{
4
+ pos: HandlerPos | null;
5
+ grab: boolean;
6
+ setGrab: (value: boolean) => void;
7
+ left: boolean;
8
+ }>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SelectionHandler = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const quote_left_svg_1 = require("../assets/quote-left.svg");
7
+ const quote_right_svg_1 = require("../assets/quote-right.svg");
8
+ const SelectionHandler = ({ pos, grab, setGrab, left }) => {
9
+ return (pos &&
10
+ react_1.default.createElement("div", { draggable: false, className: `bg-yellow-300 opacity-80 ${left ? 'rounded-l-md' : 'rounded-r-md'}`, style: {
11
+ position: 'absolute',
12
+ display: 'flex',
13
+ left: left ? pos.left - 24 : pos.left - 1,
14
+ top: pos.top,
15
+ width: '25px',
16
+ height: pos.height,
17
+ cursor: grab ? 'grabbing' : 'grab',
18
+ alignItems: left ? 'flex-start' : 'flex-end',
19
+ }, onMouseDown: () => {
20
+ setGrab(true);
21
+ const handler = () => {
22
+ setGrab(false);
23
+ document.removeEventListener('mouseup', handler);
24
+ };
25
+ document.addEventListener('mouseup', handler);
26
+ }, onMouseUp: () => {
27
+ setGrab(false);
28
+ } }, left
29
+ ? react_1.default.createElement(quote_left_svg_1.ReactComponent, null)
30
+ : react_1.default.createElement(quote_right_svg_1.ReactComponent, null)));
31
+ };
32
+ exports.SelectionHandler = SelectionHandler;
33
+ //# sourceMappingURL=SelectionHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionHandler.js","sourceRoot":"","sources":["../../src/SelectionHandler.tsx"],"names":[],"mappings":";;;;AAAA,0DAAkC;AAElC,6DAAuE;AACvE,+DAAyE;AAElE,MAAM,gBAAgB,GAKxB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;IACpC,OAAO,CACL,GAAG;QACH,uCACE,SAAS,EAAE,KAAK,EAChB,SAAS,EAAE,4BAA4B,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,EAAE,EAC/E,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;gBACzC,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;gBAClC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU;aAC7C,EACD,WAAW,EAAE,GAAG,EAAE;gBAChB,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,OAAO,CAAC,KAAK,CAAC,CAAC;oBACf,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACnD,CAAC,CAAC;gBACF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC,EACD,SAAS,EAAE,GAAG,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,IAEA,IAAI;YACH,CAAC,CAAC,8BAAC,+BAAS,OAAG;YACf,CAAC,CAAC,8BAAC,gCAAU,OAAG,CACd,CACP,CAAC;AACJ,CAAC,CAAC;AAtCW,QAAA,gBAAgB,oBAsC3B"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const TextContainer: React.ForwardRefExoticComponent<{
3
+ children: React.ReactNode;
4
+ } & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TextContainer = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const _TextContainer = ({ children }, ref) => {
7
+ return (react_1.default.createElement("div", { ref: ref, draggable: false, className: "basis-80 w-80 bg-yellow-50 p-11 text-3xl select-none bg-transparent" }, children));
8
+ };
9
+ exports.TextContainer = react_1.default.forwardRef(_TextContainer);
10
+ //# sourceMappingURL=TextContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextContainer.js","sourceRoot":"","sources":["../../src/TextContainer.tsx"],"names":[],"mappings":";;;;AAAA,0DAAwD;AAExD,MAAM,cAAc,GAClB,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE;IACpB,OAAO,CACL,uCAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAC,qEAAqE,IAC7G,QAAQ,CACL,CACP,CAAC;AACJ,CAAC,CAAC;AAGS,QAAA,aAAa,GAAG,eAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { FC } from 'react';
2
+ export declare const TextSelectionZone: FC<{
3
+ initLeftPos: number;
4
+ initRightPos: number;
5
+ children: string;
6
+ }>;
7
+ export default TextSelectionZone;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TextSelectionZone = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = require("react");
6
+ const TextContainer_1 = require("./TextContainer");
7
+ const useTextSelectionEditor_1 = require("./useTextSelectionEditor");
8
+ const SelectionHandler_1 = require("./SelectionHandler");
9
+ const react_2 = tslib_1.__importDefault(require("react"));
10
+ const TextSelectionZone = ({ initLeftPos, initRightPos, children, }) => {
11
+ const [mouseOnLeft, setMouseOnLeft] = (0, react_1.useState)(false);
12
+ const [mouseOnRight, setMouseOnRight] = (0, react_1.useState)(false);
13
+ const [textDiv, leftHandler, rightHandler, rects] = (0, useTextSelectionEditor_1.useTextSelectionEditor)(initLeftPos, initRightPos, mouseOnLeft, mouseOnRight);
14
+ let divs = [];
15
+ if (rects) {
16
+ for (let i = 0; i < rects.length; ++i) {
17
+ const aa = rects.item(i);
18
+ if (aa)
19
+ divs.push(aa);
20
+ }
21
+ }
22
+ return (react_2.default.createElement("div", { draggable: false, style: {
23
+ display: 'flex',
24
+ } },
25
+ divs.map((d, i) => react_2.default.createElement("div", { key: i, className: 'bg-yellow-300', style: {
26
+ userSelect: 'none',
27
+ position: 'absolute',
28
+ top: `${d.top}px`,
29
+ left: `${d.left}px`,
30
+ width: `${d.width}px`,
31
+ height: `${d.height}px`,
32
+ zIndex: -2,
33
+ } }, "\u00A0")),
34
+ react_2.default.createElement(SelectionHandler_1.SelectionHandler, { grab: mouseOnLeft, left: true, pos: leftHandler, setGrab: (v) => setMouseOnLeft(v) }),
35
+ react_2.default.createElement(TextContainer_1.TextContainer, { ref: textDiv }, children),
36
+ react_2.default.createElement(SelectionHandler_1.SelectionHandler, { grab: mouseOnRight, left: false, pos: rightHandler, setGrab: (v) => setMouseOnRight(v) })));
37
+ };
38
+ exports.TextSelectionZone = TextSelectionZone;
39
+ exports.default = exports.TextSelectionZone;
40
+ //# sourceMappingURL=TextSelectionZone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextSelectionZone.js","sourceRoot":"","sources":["../../src/TextSelectionZone.tsx"],"names":[],"mappings":";;;;AAAA,iCAAqC;AACrC,mDAAgD;AAChD,qEAAkE;AAClE,yDAAsD;AACtD,0DAA0B;AAEnB,MAAM,iBAAiB,GAAwE,CAAC,EACrG,WAAW,EACX,YAAY,EACZ,QAAQ,GACT,EAAE,EAAE;IAEH,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,IAAA,gBAAQ,EAAU,KAAK,CAAC,CAAC;IAE/D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAAU,KAAK,CAAC,CAAC;IAEjE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,GAAG,IAAA,+CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAEjI,IAAI,IAAI,GAAc,EAAE,CAAC;IAEzB,IAAI,KAAK,EAAE;QACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YACrC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACvB;KACF;IAED,OAAO,CACL,uCACE,SAAS,EAAE,KAAK,EAChB,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;SAChB;QAEA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,uCAAK,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,eAAe,EAAC,KAAK,EAAE;gBAChE,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI;gBACjB,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI;gBACnB,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI;gBACrB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI;gBACvB,MAAM,EAAE,CAAC,CAAC;aACX,aAAc,CAAC;QAChB,8BAAC,mCAAgB,IAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,GAAI;QACxG,8BAAC,6BAAa,IAAC,GAAG,EAAE,OAAO,IACxB,QAAQ,CACK;QAChB,8BAAC,mCAAgB,IAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,GAAI,CACxG,CACP,CAAC;AACJ,CAAC,CAAC;AA5CW,QAAA,iBAAiB,qBA4C5B;AAEF,kBAAe,yBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface HandlerPos {
2
+ left: number;
3
+ top: number;
4
+ height: number;
5
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=handler-pos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-pos.js","sourceRoot":"","sources":["../../src/handler-pos.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import FullWindow from "./FullWindow";
2
+ import TextSelectionZone from "./TextSelectionZone";
3
+ export { FullWindow, TextSelectionZone };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TextSelectionZone = exports.FullWindow = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const FullWindow_1 = tslib_1.__importDefault(require("./FullWindow"));
6
+ exports.FullWindow = FullWindow_1.default;
7
+ const TextSelectionZone_1 = tslib_1.__importDefault(require("./TextSelectionZone"));
8
+ exports.TextSelectionZone = TextSelectionZone_1.default;
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;AAAA,sEAAsC;AAG7B,qBAHF,oBAAU,CAGE;AAFnB,oFAAoD;AAE/B,4BAFd,2BAAiB,CAEc"}
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { HandlerPos } from './handler-pos';
3
+ declare global {
4
+ interface Document {
5
+ caretPositionFromPoint: any;
6
+ }
7
+ }
8
+ export declare const useTextSelectionEditor: (initLeftPos: number, initRightPos: number, leftDrag: boolean, rightDrag: boolean) => [
9
+ React.MutableRefObject<HTMLDivElement | null>,
10
+ HandlerPos | null,
11
+ HandlerPos | null,
12
+ DOMRectList | null
13
+ ];
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useTextSelectionEditor = void 0;
4
+ const react_1 = require("react");
5
+ const getHandlerRect = (index, node) => {
6
+ const range = document.createRange();
7
+ range.setStart(node, index);
8
+ range.setEnd(node, index);
9
+ const rects = range.getClientRects();
10
+ if (rects.length === 1) {
11
+ return rects[0];
12
+ }
13
+ return null;
14
+ };
15
+ const getAllRects = (node, start, end) => {
16
+ const range = document.createRange();
17
+ range.setStart(node, start);
18
+ range.setEnd(node, end);
19
+ return range.getClientRects();
20
+ };
21
+ const getNodeAndOffsetFromPoint = (x, y) => {
22
+ let range;
23
+ let textNode;
24
+ let offset;
25
+ if (document.caretPositionFromPoint) {
26
+ range = document.caretPositionFromPoint(x, y);
27
+ textNode = range.offsetNode;
28
+ offset = range.offset;
29
+ }
30
+ else if (document.caretRangeFromPoint) {
31
+ range = document.caretRangeFromPoint(x, y);
32
+ textNode = range.startContainer;
33
+ offset = range.startOffset;
34
+ }
35
+ else {
36
+ return null;
37
+ }
38
+ if ((textNode === null || textNode === void 0 ? void 0 : textNode.nodeType) === document.TEXT_NODE) {
39
+ if (!Number.isNaN(offset)) {
40
+ return { node: textNode, offset };
41
+ }
42
+ }
43
+ return null;
44
+ };
45
+ const useTextSelectionEditor = (initLeftPos, initRightPos, leftDrag, rightDrag) => {
46
+ // left handler pos
47
+ const [leftHandler, setLeftHandler] = (0, react_1.useState)(null);
48
+ const [currentLeftPos, setCurrentLeftPos] = (0, react_1.useState)(initLeftPos);
49
+ // right handler pos
50
+ const [rightHandler, setRightHandler] = (0, react_1.useState)(null);
51
+ const [currentRightPos, setCurrentRightPos] = (0, react_1.useState)(initRightPos);
52
+ const [rects, setRects] = (0, react_1.useState)(null);
53
+ // reference
54
+ const textDiv = (0, react_1.useRef)(null);
55
+ // mouse move handler
56
+ // left handler
57
+ (0, react_1.useEffect)(() => {
58
+ const handlerMove = (e) => {
59
+ var _a;
60
+ if (!leftDrag)
61
+ return;
62
+ const sm = getNodeAndOffsetFromPoint(e.clientX, e.clientY);
63
+ if (sm
64
+ && sm.node === ((_a = textDiv.current) === null || _a === void 0 ? void 0 : _a.childNodes[0])
65
+ && sm.offset <= currentRightPos) {
66
+ setCurrentLeftPos(sm.offset);
67
+ }
68
+ };
69
+ document.addEventListener('mousemove', handlerMove);
70
+ return () => {
71
+ document.removeEventListener('mousemove', handlerMove);
72
+ };
73
+ }, [leftDrag, currentRightPos]);
74
+ (0, react_1.useEffect)(() => {
75
+ setCurrentLeftPos(initLeftPos);
76
+ }, [initLeftPos]);
77
+ // right handler
78
+ (0, react_1.useEffect)(() => {
79
+ const handlerMove = (e) => {
80
+ var _a;
81
+ if (!rightDrag)
82
+ return;
83
+ const sm = getNodeAndOffsetFromPoint(e.clientX, e.clientY);
84
+ if (sm
85
+ && sm.node === ((_a = textDiv.current) === null || _a === void 0 ? void 0 : _a.childNodes[0])
86
+ && sm.offset >= currentLeftPos) {
87
+ setCurrentRightPos(sm.offset);
88
+ }
89
+ };
90
+ document.addEventListener('mousemove', handlerMove);
91
+ return () => {
92
+ document.removeEventListener('mousemove', handlerMove);
93
+ };
94
+ }, [rightDrag, currentLeftPos]);
95
+ (0, react_1.useEffect)(() => {
96
+ setCurrentRightPos(initRightPos);
97
+ }, [initRightPos]);
98
+ // draw init left handler
99
+ (0, react_1.useEffect)(() => {
100
+ if (textDiv.current
101
+ && textDiv.current.childNodes.length === 1
102
+ && textDiv.current.childNodes[0].nodeType === document.TEXT_NODE) {
103
+ const rect = getHandlerRect(currentLeftPos, textDiv.current.childNodes[0]);
104
+ if (rect === null) {
105
+ setLeftHandler(null);
106
+ setRects(null);
107
+ }
108
+ else {
109
+ setLeftHandler({
110
+ height: rect.height,
111
+ left: rect.left,
112
+ top: rect.top,
113
+ });
114
+ }
115
+ }
116
+ }, [currentLeftPos]);
117
+ // draw init right handler
118
+ (0, react_1.useEffect)(() => {
119
+ if (textDiv.current
120
+ && textDiv.current.childNodes.length === 1
121
+ && textDiv.current.childNodes[0].nodeType === document.TEXT_NODE) {
122
+ const rect = getHandlerRect(currentRightPos, textDiv.current.childNodes[0]);
123
+ if (rect === null) {
124
+ setRightHandler(null);
125
+ setRects(null);
126
+ }
127
+ else {
128
+ setRightHandler({
129
+ height: rect.height,
130
+ left: rect.left,
131
+ top: rect.top,
132
+ });
133
+ }
134
+ }
135
+ }, [currentRightPos]);
136
+ (0, react_1.useEffect)(() => {
137
+ var _a;
138
+ const n = (_a = textDiv.current) === null || _a === void 0 ? void 0 : _a.childNodes[0];
139
+ if (n)
140
+ setRects(getAllRects(n, currentLeftPos, currentRightPos));
141
+ }, [currentLeftPos, currentRightPos]);
142
+ // return
143
+ return [textDiv, leftHandler, rightHandler, rects];
144
+ };
145
+ exports.useTextSelectionEditor = useTextSelectionEditor;
146
+ //# sourceMappingURL=useTextSelectionEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTextSelectionEditor.js","sourceRoot":"","sources":["../../src/useTextSelectionEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import React, { FC } from 'react';
2
+ export declare const FullWindow: FC<{
3
+ children: React.ReactNode;
4
+ }>;
5
+ export default FullWindow;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ const fullWindow = {
3
+ height: '100vh',
4
+ widows: '100%',
5
+ };
6
+ const centroContainer = Object.assign(Object.assign({}, fullWindow), { display: 'flex', alignItems: 'center', justifyContent: 'center', flexDirection: 'column' });
7
+ export const FullWindow = ({ children }) => {
8
+ return (React.createElement("div", { style: centroContainer }, children));
9
+ };
10
+ export default FullWindow;
11
+ //# sourceMappingURL=FullWindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FullWindow.js","sourceRoot":"","sources":["../../src/FullWindow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAa,MAAM,OAAO,CAAC;AAElC,MAAM,UAAU,GAAwB;IACtC,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,MAAM;CACf,CAAC;AAEF,MAAM,eAAe,mCAChB,UAAU,KACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,QAAQ,EACpB,cAAc,EAAE,QAAQ,EACxB,aAAa,EAAE,QAAQ,GACxB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAuC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;IAE7E,OAAO,CACL,6BAAK,KAAK,EAAE,eAAe,IACxB,QAAQ,CACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { FC } from 'react';
2
+ import { HandlerPos } from './handler-pos';
3
+ export declare const SelectionHandler: FC<{
4
+ pos: HandlerPos | null;
5
+ grab: boolean;
6
+ setGrab: (value: boolean) => void;
7
+ left: boolean;
8
+ }>;
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import { ReactComponent as QuoteLeft } from "../assets/quote-left.svg";
3
+ import { ReactComponent as QuoteRight } from "../assets/quote-right.svg";
4
+ export const SelectionHandler = ({ pos, grab, setGrab, left }) => {
5
+ return (pos &&
6
+ React.createElement("div", { draggable: false, className: `bg-yellow-300 opacity-80 ${left ? 'rounded-l-md' : 'rounded-r-md'}`, style: {
7
+ position: 'absolute',
8
+ display: 'flex',
9
+ left: left ? pos.left - 24 : pos.left - 1,
10
+ top: pos.top,
11
+ width: '25px',
12
+ height: pos.height,
13
+ cursor: grab ? 'grabbing' : 'grab',
14
+ alignItems: left ? 'flex-start' : 'flex-end',
15
+ }, onMouseDown: () => {
16
+ setGrab(true);
17
+ const handler = () => {
18
+ setGrab(false);
19
+ document.removeEventListener('mouseup', handler);
20
+ };
21
+ document.addEventListener('mouseup', handler);
22
+ }, onMouseUp: () => {
23
+ setGrab(false);
24
+ } }, left
25
+ ? React.createElement(QuoteLeft, null)
26
+ : React.createElement(QuoteRight, null)));
27
+ };
28
+ //# sourceMappingURL=SelectionHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionHandler.js","sourceRoot":"","sources":["../../src/SelectionHandler.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAa,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,cAAc,IAAI,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,cAAc,IAAI,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEzE,MAAM,CAAC,MAAM,gBAAgB,GAKxB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;IACpC,OAAO,CACL,GAAG;QACH,6BACE,SAAS,EAAE,KAAK,EAChB,SAAS,EAAE,4BAA4B,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,EAAE,EAC/E,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,MAAM;gBACf,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;gBACzC,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;gBAClC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU;aAC7C,EACD,WAAW,EAAE,GAAG,EAAE;gBAChB,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,OAAO,CAAC,KAAK,CAAC,CAAC;oBACf,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACnD,CAAC,CAAC;gBACF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC,EACD,SAAS,EAAE,GAAG,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,IAEA,IAAI;YACH,CAAC,CAAC,oBAAC,SAAS,OAAG;YACf,CAAC,CAAC,oBAAC,UAAU,OAAG,CACd,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const TextContainer: React.ForwardRefExoticComponent<{
3
+ children: React.ReactNode;
4
+ } & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ const _TextContainer = ({ children }, ref) => {
3
+ return (React.createElement("div", { ref: ref, draggable: false, className: "basis-80 w-80 bg-yellow-50 p-11 text-3xl select-none bg-transparent" }, children));
4
+ };
5
+ export const TextContainer = React.forwardRef(_TextContainer);
6
+ //# sourceMappingURL=TextContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextContainer.js","sourceRoot":"","sources":["../../src/TextContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmC,MAAM,OAAO,CAAC;AAExD,MAAM,cAAc,GAClB,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE;IACpB,OAAO,CACL,6BAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAC,qEAAqE,IAC7G,QAAQ,CACL,CACP,CAAC;AACJ,CAAC,CAAC;AAGJ,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { FC } from 'react';
2
+ export declare const TextSelectionZone: FC<{
3
+ initLeftPos: number;
4
+ initRightPos: number;
5
+ children: string;
6
+ }>;
7
+ export default TextSelectionZone;
@@ -0,0 +1,35 @@
1
+ import { useState } from 'react';
2
+ import { TextContainer } from './TextContainer';
3
+ import { useTextSelectionEditor } from './useTextSelectionEditor';
4
+ import { SelectionHandler } from './SelectionHandler';
5
+ import React from 'react';
6
+ export const TextSelectionZone = ({ initLeftPos, initRightPos, children, }) => {
7
+ const [mouseOnLeft, setMouseOnLeft] = useState(false);
8
+ const [mouseOnRight, setMouseOnRight] = useState(false);
9
+ const [textDiv, leftHandler, rightHandler, rects] = useTextSelectionEditor(initLeftPos, initRightPos, mouseOnLeft, mouseOnRight);
10
+ let divs = [];
11
+ if (rects) {
12
+ for (let i = 0; i < rects.length; ++i) {
13
+ const aa = rects.item(i);
14
+ if (aa)
15
+ divs.push(aa);
16
+ }
17
+ }
18
+ return (React.createElement("div", { draggable: false, style: {
19
+ display: 'flex',
20
+ } },
21
+ divs.map((d, i) => React.createElement("div", { key: i, className: 'bg-yellow-300', style: {
22
+ userSelect: 'none',
23
+ position: 'absolute',
24
+ top: `${d.top}px`,
25
+ left: `${d.left}px`,
26
+ width: `${d.width}px`,
27
+ height: `${d.height}px`,
28
+ zIndex: -2,
29
+ } }, "\u00A0")),
30
+ React.createElement(SelectionHandler, { grab: mouseOnLeft, left: true, pos: leftHandler, setGrab: (v) => setMouseOnLeft(v) }),
31
+ React.createElement(TextContainer, { ref: textDiv }, children),
32
+ React.createElement(SelectionHandler, { grab: mouseOnRight, left: false, pos: rightHandler, setGrab: (v) => setMouseOnRight(v) })));
33
+ };
34
+ export default TextSelectionZone;
35
+ //# sourceMappingURL=TextSelectionZone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextSelectionZone.js","sourceRoot":"","sources":["../../src/TextSelectionZone.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAM,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,iBAAiB,GAAwE,CAAC,EACrG,WAAW,EACX,YAAY,EACZ,QAAQ,GACT,EAAE,EAAE;IAEH,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAE/D,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IAEjE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,GAAG,sBAAsB,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IAEjI,IAAI,IAAI,GAAc,EAAE,CAAC;IAEzB,IAAI,KAAK,EAAE;QACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YACrC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SACvB;KACF;IAED,OAAO,CACL,6BACE,SAAS,EAAE,KAAK,EAChB,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;SAChB;QAEA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,6BAAK,GAAG,EAAE,CAAC,EAAE,SAAS,EAAC,eAAe,EAAC,KAAK,EAAE;gBAChE,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI;gBACjB,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI;gBACnB,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI;gBACrB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI;gBACvB,MAAM,EAAE,CAAC,CAAC;aACX,aAAc,CAAC;QAChB,oBAAC,gBAAgB,IAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,GAAI;QACxG,oBAAC,aAAa,IAAC,GAAG,EAAE,OAAO,IACxB,QAAQ,CACK;QAChB,oBAAC,gBAAgB,IAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,GAAI,CACxG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface HandlerPos {
2
+ left: number;
3
+ top: number;
4
+ height: number;
5
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=handler-pos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-pos.js","sourceRoot":"","sources":["../../src/handler-pos.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import FullWindow from "./FullWindow";
2
+ import TextSelectionZone from "./TextSelectionZone";
3
+ export { FullWindow, TextSelectionZone };
@@ -0,0 +1,4 @@
1
+ import FullWindow from "./FullWindow";
2
+ import TextSelectionZone from "./TextSelectionZone";
3
+ export { FullWindow, TextSelectionZone };
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAA"}
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { HandlerPos } from './handler-pos';
3
+ declare global {
4
+ interface Document {
5
+ caretPositionFromPoint: any;
6
+ }
7
+ }
8
+ export declare const useTextSelectionEditor: (initLeftPos: number, initRightPos: number, leftDrag: boolean, rightDrag: boolean) => [
9
+ React.MutableRefObject<HTMLDivElement | null>,
10
+ HandlerPos | null,
11
+ HandlerPos | null,
12
+ DOMRectList | null
13
+ ];
@@ -0,0 +1,142 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+ const getHandlerRect = (index, node) => {
3
+ const range = document.createRange();
4
+ range.setStart(node, index);
5
+ range.setEnd(node, index);
6
+ const rects = range.getClientRects();
7
+ if (rects.length === 1) {
8
+ return rects[0];
9
+ }
10
+ return null;
11
+ };
12
+ const getAllRects = (node, start, end) => {
13
+ const range = document.createRange();
14
+ range.setStart(node, start);
15
+ range.setEnd(node, end);
16
+ return range.getClientRects();
17
+ };
18
+ const getNodeAndOffsetFromPoint = (x, y) => {
19
+ let range;
20
+ let textNode;
21
+ let offset;
22
+ if (document.caretPositionFromPoint) {
23
+ range = document.caretPositionFromPoint(x, y);
24
+ textNode = range.offsetNode;
25
+ offset = range.offset;
26
+ }
27
+ else if (document.caretRangeFromPoint) {
28
+ range = document.caretRangeFromPoint(x, y);
29
+ textNode = range.startContainer;
30
+ offset = range.startOffset;
31
+ }
32
+ else {
33
+ return null;
34
+ }
35
+ if ((textNode === null || textNode === void 0 ? void 0 : textNode.nodeType) === document.TEXT_NODE) {
36
+ if (!Number.isNaN(offset)) {
37
+ return { node: textNode, offset };
38
+ }
39
+ }
40
+ return null;
41
+ };
42
+ export const useTextSelectionEditor = (initLeftPos, initRightPos, leftDrag, rightDrag) => {
43
+ // left handler pos
44
+ const [leftHandler, setLeftHandler] = useState(null);
45
+ const [currentLeftPos, setCurrentLeftPos] = useState(initLeftPos);
46
+ // right handler pos
47
+ const [rightHandler, setRightHandler] = useState(null);
48
+ const [currentRightPos, setCurrentRightPos] = useState(initRightPos);
49
+ const [rects, setRects] = useState(null);
50
+ // reference
51
+ const textDiv = useRef(null);
52
+ // mouse move handler
53
+ // left handler
54
+ useEffect(() => {
55
+ const handlerMove = (e) => {
56
+ var _a;
57
+ if (!leftDrag)
58
+ return;
59
+ const sm = getNodeAndOffsetFromPoint(e.clientX, e.clientY);
60
+ if (sm
61
+ && sm.node === ((_a = textDiv.current) === null || _a === void 0 ? void 0 : _a.childNodes[0])
62
+ && sm.offset <= currentRightPos) {
63
+ setCurrentLeftPos(sm.offset);
64
+ }
65
+ };
66
+ document.addEventListener('mousemove', handlerMove);
67
+ return () => {
68
+ document.removeEventListener('mousemove', handlerMove);
69
+ };
70
+ }, [leftDrag, currentRightPos]);
71
+ useEffect(() => {
72
+ setCurrentLeftPos(initLeftPos);
73
+ }, [initLeftPos]);
74
+ // right handler
75
+ useEffect(() => {
76
+ const handlerMove = (e) => {
77
+ var _a;
78
+ if (!rightDrag)
79
+ return;
80
+ const sm = getNodeAndOffsetFromPoint(e.clientX, e.clientY);
81
+ if (sm
82
+ && sm.node === ((_a = textDiv.current) === null || _a === void 0 ? void 0 : _a.childNodes[0])
83
+ && sm.offset >= currentLeftPos) {
84
+ setCurrentRightPos(sm.offset);
85
+ }
86
+ };
87
+ document.addEventListener('mousemove', handlerMove);
88
+ return () => {
89
+ document.removeEventListener('mousemove', handlerMove);
90
+ };
91
+ }, [rightDrag, currentLeftPos]);
92
+ useEffect(() => {
93
+ setCurrentRightPos(initRightPos);
94
+ }, [initRightPos]);
95
+ // draw init left handler
96
+ useEffect(() => {
97
+ if (textDiv.current
98
+ && textDiv.current.childNodes.length === 1
99
+ && textDiv.current.childNodes[0].nodeType === document.TEXT_NODE) {
100
+ const rect = getHandlerRect(currentLeftPos, textDiv.current.childNodes[0]);
101
+ if (rect === null) {
102
+ setLeftHandler(null);
103
+ setRects(null);
104
+ }
105
+ else {
106
+ setLeftHandler({
107
+ height: rect.height,
108
+ left: rect.left,
109
+ top: rect.top,
110
+ });
111
+ }
112
+ }
113
+ }, [currentLeftPos]);
114
+ // draw init right handler
115
+ useEffect(() => {
116
+ if (textDiv.current
117
+ && textDiv.current.childNodes.length === 1
118
+ && textDiv.current.childNodes[0].nodeType === document.TEXT_NODE) {
119
+ const rect = getHandlerRect(currentRightPos, textDiv.current.childNodes[0]);
120
+ if (rect === null) {
121
+ setRightHandler(null);
122
+ setRects(null);
123
+ }
124
+ else {
125
+ setRightHandler({
126
+ height: rect.height,
127
+ left: rect.left,
128
+ top: rect.top,
129
+ });
130
+ }
131
+ }
132
+ }, [currentRightPos]);
133
+ useEffect(() => {
134
+ var _a;
135
+ const n = (_a = textDiv.current) === null || _a === void 0 ? void 0 : _a.childNodes[0];
136
+ if (n)
137
+ setRects(getAllRects(n, currentLeftPos, currentRightPos));
138
+ }, [currentLeftPos, currentRightPos]);
139
+ // return
140
+ return [textDiv, leftHandler, rightHandler, rects];
141
+ };
142
+ //# sourceMappingURL=useTextSelectionEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTextSelectionEditor.js","sourceRoot":"","sources":["../../src/useTextSelectionEditor.tsx"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "react-text-range",
3
+ "version": "1.0.0",
4
+ "description": "text selection editor for React",
5
+ "main": "./dist/cjs/index.js",
6
+ "module": "./dist/esm/index.js",
7
+ "types": "./dist/esm/index.d.ts",
8
+ "scripts": {
9
+ "build:esm": "tsc",
10
+ "build:cjs": "tsc --module commonjs --outDir dist/cjs",
11
+ "build": "npm run build:esm && npm run build:cjs",
12
+ "test": "jest --config jestconfig.json",
13
+ "prepare": "npm run build",
14
+ "prepublishOnly": "npm test"
15
+ },
16
+ "keywords": [
17
+ "react",
18
+ "text",
19
+ "selection",
20
+ "range",
21
+ "editor"
22
+ ],
23
+ "author": "Aleksandr Novikov (yetanothervan)",
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/yetanothervan/react-text-range.git"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "LICENSE",
32
+ "README.md"
33
+ ],
34
+ "peerDependencies": {
35
+ "react": ">=16"
36
+ },
37
+ "devDependencies": {
38
+ "@testing-library/react": "^14.0.0",
39
+ "@types/jest": "^29.5.5",
40
+ "@types/react": "^18.2.24",
41
+ "jest": "^29.7.0",
42
+ "jest-canvas-mock": "^2.5.2",
43
+ "jest-environment-jsdom": "^29.7.0",
44
+ "react": "^18.2.0",
45
+ "react-dom": "^18.2.0",
46
+ "ts-jest": "^29.1.1",
47
+ "tslib": "^2.6.2",
48
+ "typescript": "^5.2.2"
49
+ }
50
+ }