@macrostrat/feedback-components 1.1.2 → 1.1.4
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/CHANGELOG.md +10 -0
- package/dist/esm/{feedback-components.95dbe7d7.js → feedback-components.00434ff7.js} +10 -1
- package/dist/esm/feedback-components.00434ff7.js.map +1 -0
- package/dist/esm/{feedback-components.46a7a347.js → feedback-components.1c15f37f.js} +101 -12
- package/dist/esm/feedback-components.1c15f37f.js.map +1 -0
- package/dist/esm/{feedback-components.586103e8.js → feedback-components.204f7d2b.js} +27 -276
- package/dist/esm/feedback-components.204f7d2b.js.map +1 -0
- package/dist/esm/{feedback-components.3b3a5357.js → feedback-components.28ba71be.js} +19 -8
- package/dist/esm/feedback-components.28ba71be.js.map +1 -0
- package/dist/esm/{feedback-components.5df2a926.js → feedback-components.707e3490.js} +5 -7
- package/dist/esm/feedback-components.707e3490.js.map +1 -0
- package/dist/esm/feedback-components.7e879290.js +286 -0
- package/dist/esm/feedback-components.7e879290.js.map +1 -0
- package/dist/esm/{feedback-components.5509fab3.js → feedback-components.d55a1d18.js} +6 -6
- package/dist/esm/{feedback-components.5509fab3.js.map → feedback-components.d55a1d18.js.map} +1 -1
- package/dist/esm/{feedback-components.fb60c70d.css → feedback-components.d591ffec.css} +20 -1
- package/dist/esm/feedback-components.d591ffec.css.map +1 -0
- package/dist/esm/{feedback-components.fa1d3641.js → feedback-components.f6605b83.js} +49 -7
- package/dist/esm/feedback-components.f6605b83.js.map +1 -0
- package/dist/esm/feedback-components.fd8ac9ca.js +230 -0
- package/dist/esm/feedback-components.fd8ac9ca.js.map +1 -0
- package/dist/esm/index.d.ts +5 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/node/feedback-components.0eef8d0c.js +2 -0
- package/dist/node/feedback-components.0eef8d0c.js.map +1 -0
- package/dist/node/{feedback-components.a39f7653.js → feedback-components.2f740fc7.js} +2 -2
- package/dist/node/{feedback-components.a39f7653.js.map → feedback-components.2f740fc7.js.map} +1 -1
- package/dist/node/feedback-components.41db283a.js +2 -0
- package/dist/node/feedback-components.41db283a.js.map +1 -0
- package/dist/node/feedback-components.69d0ccd0.js +2 -0
- package/dist/node/feedback-components.69d0ccd0.js.map +1 -0
- package/dist/node/feedback-components.a7b43cfa.js +2 -0
- package/dist/node/feedback-components.a7b43cfa.js.map +1 -0
- package/dist/node/feedback-components.b22d37d1.js +2 -0
- package/dist/node/feedback-components.b22d37d1.js.map +1 -0
- package/dist/node/feedback-components.b9317f9c.js +2 -0
- package/dist/node/feedback-components.b9317f9c.js.map +1 -0
- package/dist/node/{feedback-components.c88cb37f.css → feedback-components.e096504e.css} +2 -2
- package/dist/node/feedback-components.e096504e.css.map +1 -0
- package/dist/node/feedback-components.e140ac86.js +2 -0
- package/dist/node/feedback-components.e140ac86.js.map +1 -0
- package/dist/node/feedback-components.f8373b58.js +2 -0
- package/dist/node/feedback-components.f8373b58.js.map +1 -0
- package/dist/node/index.js +1 -1
- package/dist/node/index.js.map +1 -1
- package/package.json +3 -2
- package/src/extractions/index.ts +7 -2
- package/src/extractions/types.ts +1 -0
- package/src/feedback/edit-state.ts +52 -3
- package/src/feedback/feedback.module.sass +17 -1
- package/src/feedback/graph.ts +17 -4
- package/src/feedback/index.ts +14 -309
- package/src/feedback/matches.ts +241 -0
- package/src/feedback/text-visualizer.ts +114 -4
- package/src/feedback/typelist.ts +312 -0
- package/dist/esm/feedback-components.3b3a5357.js.map +0 -1
- package/dist/esm/feedback-components.46a7a347.js.map +0 -1
- package/dist/esm/feedback-components.586103e8.js.map +0 -1
- package/dist/esm/feedback-components.5df2a926.js.map +0 -1
- package/dist/esm/feedback-components.95dbe7d7.js.map +0 -1
- package/dist/esm/feedback-components.fa1d3641.js.map +0 -1
- package/dist/esm/feedback-components.fb60c70d.css.map +0 -1
- package/dist/node/feedback-components.561466ac.js +0 -2
- package/dist/node/feedback-components.561466ac.js.map +0 -1
- package/dist/node/feedback-components.571ee23c.js +0 -2
- package/dist/node/feedback-components.571ee23c.js.map +0 -1
- package/dist/node/feedback-components.8b03e8be.js +0 -2
- package/dist/node/feedback-components.8b03e8be.js.map +0 -1
- package/dist/node/feedback-components.b7946db4.js +0 -2
- package/dist/node/feedback-components.b7946db4.js.map +0 -1
- package/dist/node/feedback-components.c459cc27.js +0 -2
- package/dist/node/feedback-components.c459cc27.js.map +0 -1
- package/dist/node/feedback-components.c88cb37f.css.map +0 -1
- package/dist/node/feedback-components.ec54a1e7.js +0 -2
- package/dist/node/feedback-components.ec54a1e7.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":"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","sources":["<anon>","packages/feedback-components/src/feedback/text-visualizer.ts"],"sourcesContent":["import \"./feedback-components.c459cc27.js\";\nimport \"./feedback-components.8b03e8be.js\";\nimport $h8ona$macrostrathyper from \"@macrostrat/hyper\";\nimport {useRef as $h8ona$useRef, useEffect as $h8ona$useEffect} from \"react\";\n\n\nfunction $parcel$interopDefault(a) {\n return a && a.__esModule ? a.default : a;\n}\n\n var $parcel$global = globalThis;\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequirea149\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequirea149\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\n\nvar $9wFEx = parcelRequire(\"9wFEx\");\n\n\nvar $edvRb = parcelRequire(\"edvRb\");\n\nconst $d6cf457c7790c03a$var$h = (0, $h8ona$macrostrathyper).styled((0, (/*@__PURE__*/$parcel$interopDefault($9wFEx))));\nfunction $d6cf457c7790c03a$var$buildTags(highlights, selectedNodes) {\n let tags = [];\n // If entity ID has already been seen, don't add it again\n const entities = new Set();\n for (const highlight of highlights){\n // Don't add multiply-linked entities multiple times\n if (entities.has(highlight.id)) continue;\n const highlighted = $d6cf457c7790c03a$var$isHighlighted(highlight, selectedNodes);\n const active = $d6cf457c7790c03a$var$isActive(highlight, selectedNodes);\n const tagStyle = (0, $edvRb.getTagStyle)(highlight.backgroundColor, {\n highlighted: highlighted,\n active: active\n });\n const tag = {\n color: tagStyle.color,\n tagStyle: {\n display: \"none\"\n },\n markStyle: {\n backgroundColor: tagStyle.backgroundColor\n },\n ...highlight,\n backgroundColor: tagStyle.backgroundColor\n };\n tags.push(tag);\n entities.add(highlight.id);\n }\n return tags;\n}\nfunction $d6cf457c7790c03a$var$isActive(tag, selectedNodes) {\n return selectedNodes.includes(tag.id);\n}\nfunction $d6cf457c7790c03a$var$isHighlighted(tag, selectedNodes) {\n if (selectedNodes.length === 0) return true;\n return (selectedNodes.includes(tag.id) || tag.parents?.some((d)=>selectedNodes.includes(d))) ?? false;\n}\nfunction $d6cf457c7790c03a$export$6e107db9091b8219(props) {\n // Convert input to tags\n const { text: text, selectedNodes: selectedNodes, nodes: nodes, dispatch: dispatch, allowOverlap: allowOverlap } = props;\n const allTags = $d6cf457c7790c03a$var$buildTags((0, $edvRb.buildHighlights)(nodes, null), selectedNodes);\n return $d6cf457c7790c03a$var$h(\"div.feedback-text-wrapper\", {\n tabIndex: 0,\n onKeyDown: (e)=>{\n if (e.key === \"Backspace\") dispatch({\n type: \"delete-node\",\n payload: {\n ids: selectedNodes\n }\n });\n }\n }, $d6cf457c7790c03a$var$h($d6cf457c7790c03a$export$190465bec6b893be, {\n text: text,\n allTags: allTags,\n allowOverlap: allowOverlap,\n dispatch: dispatch,\n selectedNodes: selectedNodes\n }));\n}\nfunction $d6cf457c7790c03a$var$createTagFromSelection({ container: container }) {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed || selection.rangeCount === 0 || !container) return null;\n const range = selection.getRangeAt(0);\n if (!container.contains(range.startContainer) || !container.contains(range.endContainer)) return null;\n const preRange = document.createRange();\n preRange.setStart(container, 0);\n preRange.setEnd(range.startContainer, range.startOffset);\n const start = preRange.toString().length;\n const selectedText = range.toString();\n const end = start + selectedText.length;\n return {\n start: start,\n end: end,\n text: selectedText\n };\n}\nfunction $d6cf457c7790c03a$var$addTag({ tag: tag, dispatch: dispatch, text: text, allTags: allTags, allowOverlap: allowOverlap }) {\n let { start: start, end: end } = tag;\n // snap to text\n if (text[end - 1] != \" \") {\n // double clicking word overselects by one, shouldn't increase to next word\n while(start > 0 && /\\w/.test(text[start - 1]))start--;\n while(end < text.length && /\\w/.test(text[end]))end++;\n }\n let payload = {\n start: start,\n end: end,\n text: text.slice(start, end)\n };\n if (payload.text.trim() === \"\") {\n console.log(\"Blank tag found, ignoring\");\n return;\n }\n const duplicate = allTags.find((t)=>t.start === payload.start && (t.end === payload.end || t.end === payload.end - 1));\n if (duplicate) {\n console.log(\"Duplicate tag found, ignoring\");\n return;\n }\n if (payload.text.endsWith(\" \")) {\n payload.text = payload.text.slice(0, -1);\n payload.end -= 1;\n }\n const inside = allTags.some((t)=>t.start <= payload.start && t.end >= payload.end);\n const overlap = allTags.some((t)=>t.start < payload.end && t.end > payload.start);\n if ((inside || overlap) && !allowOverlap) {\n console.log(\"Tag is inside another tag, ignoring\");\n return;\n }\n dispatch({\n type: \"create-node\",\n payload: payload\n });\n}\nfunction $d6cf457c7790c03a$var$nestHighlights(text, tags) {\n const events = [];\n for (const tag of tags){\n events.push({\n pos: tag.start,\n type: \"start\",\n tag: tag\n });\n events.push({\n pos: tag.end,\n type: \"end\",\n tag: tag\n });\n }\n events.sort((a, b)=>{\n if (a.pos !== b.pos) return a.pos - b.pos;\n if (a.type === \"end\" && b.type === \"start\") return -1;\n if (a.type === \"start\" && b.type === \"end\") return 1;\n return 0;\n });\n const root = {\n children: [],\n textStart: 0\n };\n const stack = [\n root\n ];\n let lastPos = 0;\n for (const { pos: pos, type: type, tag: tag } of events){\n const parent = stack[stack.length - 1];\n if (pos > lastPos) {\n const slice = text.slice(lastPos, pos);\n parent.children.push(slice);\n }\n if (type === \"start\") {\n const newNode = {\n tag: tag,\n children: [],\n textStart: pos\n };\n parent.children.push(newNode);\n stack.push(newNode);\n } else stack.pop();\n lastPos = pos;\n }\n if (lastPos < text.length) stack[stack.length - 1].children.push(text.slice(lastPos));\n return root;\n}\nfunction $d6cf457c7790c03a$var$renderNode(node, dispatch, selectedNodes, parentSelected) {\n if (typeof node === \"string\") return node;\n const { tag: tag, children: children } = node;\n const isSelected = selectedNodes?.includes(tag.id);\n const showBorder = selectedNodes.length === 0 || isSelected;\n const style = {\n ...tag,\n zIndex: parentSelected ? -1 : 1,\n border: \"1px solid \" + (showBorder ? tag.color : \"transparent\"),\n margin: \"-1px\"\n };\n let moveText = [];\n if (isSelected) {\n for(const key in children)if (Object.prototype.hasOwnProperty.call(children, key)) {\n const child = children[key];\n if (child?.tag) moveText.push(child.children[0]);\n else moveText.push(child);\n }\n }\n return $d6cf457c7790c03a$var$h(\"span\", {\n className: \"highlight\",\n style: style,\n onClick: (e)=>{\n e.stopPropagation();\n if (e.ctrlKey || e.metaKey || selectedNodes[0] === tag.id && selectedNodes.length === 1) {\n // Toggle selection on ctrl/cmd click or when node is only selected node\n e.stopPropagation();\n dispatch({\n type: \"toggle-node-selected\",\n payload: {\n ids: [\n tag.id\n ]\n }\n });\n } else if (e.shiftKey && selectedNodes.length > 0) {\n // Select range from last selected node to this one\n const lastSelected = selectedNodes[selectedNodes.length - 1];\n dispatch({\n type: \"select-range\",\n payload: {\n ids: [\n lastSelected,\n tag.id\n ]\n }\n });\n } else dispatch({\n type: \"select-node\",\n payload: {\n ids: [\n tag.id\n ]\n }\n });\n }\n }, isSelected ? moveText.flat() : children.map((child, i)=>$d6cf457c7790c03a$var$renderNode(child, dispatch, selectedNodes, isSelected)));\n}\nfunction $d6cf457c7790c03a$export$190465bec6b893be(props) {\n const { text: text, allTags: allTags = [], dispatch: dispatch, selectedNodes: selectedNodes, allowOverlap: allowOverlap } = props;\n const tree = $d6cf457c7790c03a$var$nestHighlights(text, allTags);\n const spanRef = (0, $h8ona$useRef)(null);\n (0, $h8ona$useEffect)(()=>{\n const handleMouseUp = ()=>{\n const tag = $d6cf457c7790c03a$var$createTagFromSelection({\n container: spanRef.current\n });\n if (!tag) return;\n $d6cf457c7790c03a$var$addTag({\n tag: tag,\n dispatch: dispatch,\n text: text,\n allTags: allTags,\n allowOverlap: allowOverlap\n });\n };\n document.addEventListener(\"mouseup\", handleMouseUp);\n return ()=>{\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [\n text,\n allTags,\n dispatch,\n allowOverlap\n ]);\n return $d6cf457c7790c03a$var$h(\"span\", {\n ref: spanRef\n }, tree.children.map((child, i)=>$d6cf457c7790c03a$var$renderNode(child, dispatch, selectedNodes, false)));\n}\n\n\nexport {$d6cf457c7790c03a$export$6e107db9091b8219 as FeedbackText, $d6cf457c7790c03a$export$190465bec6b893be as HighlightedText};\n//# sourceMappingURL=feedback-components.ec54a1e7.js.map\n","import { AnnotateBlendTag } from \"react-text-annotate-blend\";\nimport { InternalEntity } from \"./types\";\nimport { TreeDispatch } from \"./edit-state\";\nimport styles from \"./feedback.module.sass\";\nimport hyper from \"@macrostrat/hyper\";\nimport { buildHighlights, getTagStyle } from \"../extractions\";\nimport { Highlight } from \"../extractions/types\";\nimport { useEffect, useRef } from \"react\";\n\nconst h = hyper.styled(styles);\n\nexport interface FeedbackTextProps {\n text: string;\n selectedNodes: number[];\n nodes: InternalEntity[];\n updateNodes: (nodes: string[]) => void;\n dispatch: TreeDispatch;\n lineHeight: string;\n allowOverlap?: boolean;\n}\n\nfunction buildTags(\n highlights: Highlight[],\n selectedNodes: number[],\n): AnnotateBlendTag[] {\n let tags: AnnotateBlendTag[] = [];\n // If entity ID has already been seen, don't add it again\n const entities = new Set<number>();\n\n for (const highlight of highlights) {\n // Don't add multiply-linked entities multiple times\n if (entities.has(highlight.id)) continue;\n\n const highlighted = isHighlighted(highlight, selectedNodes);\n const active = isActive(highlight, selectedNodes);\n const tagStyle = getTagStyle(highlight.backgroundColor, {\n highlighted,\n active,\n });\n\n const tag = {\n color: tagStyle.color,\n tagStyle: {\n display: \"none\",\n },\n markStyle: {\n backgroundColor: tagStyle.backgroundColor,\n },\n ...highlight,\n backgroundColor: tagStyle.backgroundColor,\n };\n\n tags.push(tag);\n\n entities.add(highlight.id);\n }\n\n return tags;\n}\n\nfunction isActive(tag: Highlight, selectedNodes: number[]) {\n return selectedNodes.includes(tag.id);\n}\n\nfunction isHighlighted(tag: Highlight, selectedNodes: number[]) {\n if (selectedNodes.length === 0) return true;\n return (\n (selectedNodes.includes(tag.id) ||\n tag.parents?.some((d) => selectedNodes.includes(d))) ??\n false\n );\n}\n\nexport function FeedbackText(props: FeedbackTextProps) {\n // Convert input to tags\n const { text, selectedNodes, nodes, dispatch, allowOverlap } = props;\n const allTags: AnnotateBlendTag[] = buildTags(\n buildHighlights(nodes, null),\n selectedNodes,\n );\n\n return h(\n \"div.feedback-text-wrapper\",\n {\n tabIndex: 0,\n onKeyDown: (e) => {\n if (e.key === \"Backspace\") {\n dispatch({\n type: \"delete-node\",\n payload: { ids: selectedNodes },\n });\n }\n },\n },\n h(HighlightedText, {\n text,\n allTags,\n allowOverlap,\n dispatch,\n selectedNodes,\n }),\n );\n}\n\nfunction createTagFromSelection({\n container,\n}: {\n container: HTMLElement | null;\n}) {\n const selection = window.getSelection();\n if (\n !selection ||\n selection.isCollapsed ||\n selection.rangeCount === 0 ||\n !container\n )\n return null;\n\n const range = selection.getRangeAt(0);\n\n if (\n !container.contains(range.startContainer) ||\n !container.contains(range.endContainer)\n ) {\n return null;\n }\n\n const preRange = document.createRange();\n preRange.setStart(container, 0);\n preRange.setEnd(range.startContainer, range.startOffset);\n const start = preRange.toString().length;\n\n const selectedText = range.toString();\n const end = start + selectedText.length;\n\n return {\n start,\n end,\n text: selectedText,\n };\n}\n\nfunction addTag({ tag, dispatch, text, allTags, allowOverlap }) {\n let { start, end } = tag;\n // snap to text\n if (text[end - 1] != \" \") {\n // double clicking word overselects by one, shouldn't increase to next word\n while (start > 0 && /\\w/.test(text[start - 1])) {\n start--;\n }\n while (end < text.length && /\\w/.test(text[end])) {\n end++;\n }\n }\n\n let payload = { start, end, text: text.slice(start, end) };\n\n if (payload.text.trim() === \"\") {\n console.log(\"Blank tag found, ignoring\");\n return;\n }\n\n const duplicate = allTags.find(\n (t) =>\n t.start === payload.start &&\n (t.end === payload.end || t.end === payload.end - 1),\n );\n\n if (duplicate) {\n console.log(\"Duplicate tag found, ignoring\");\n return;\n }\n\n if (payload.text.endsWith(\" \")) {\n payload.text = payload.text.slice(0, -1);\n payload.end -= 1;\n }\n\n const inside = allTags.some(\n (t) => t.start <= payload.start && t.end >= payload.end,\n );\n\n const overlap = allTags.some(\n (t) => t.start < payload.end && t.end > payload.start,\n );\n\n if ((inside || overlap) && !allowOverlap) {\n console.log(\"Tag is inside another tag, ignoring\");\n return;\n }\n\n dispatch({ type: \"create-node\", payload });\n}\n\nfunction nestHighlights(text: string, tags: AnnotateBlendTag[]) {\n const events: Array<{\n pos: number;\n type: \"start\" | \"end\";\n tag: AnnotateBlendTag;\n }> = [];\n\n for (const tag of tags) {\n events.push({ pos: tag.start, type: \"start\", tag });\n events.push({ pos: tag.end, type: \"end\", tag });\n }\n\n events.sort((a, b) => {\n if (a.pos !== b.pos) return a.pos - b.pos;\n if (a.type === \"end\" && b.type === \"start\") return -1;\n if (a.type === \"start\" && b.type === \"end\") return 1;\n return 0;\n });\n\n const root = { children: [], textStart: 0 };\n const stack = [root];\n let lastPos = 0;\n\n for (const { pos, type, tag } of events) {\n const parent = stack[stack.length - 1];\n\n if (pos > lastPos) {\n const slice = text.slice(lastPos, pos);\n parent.children.push(slice);\n }\n\n if (type === \"start\") {\n const newNode = { tag, children: [], textStart: pos };\n parent.children.push(newNode);\n stack.push(newNode);\n } else {\n stack.pop();\n }\n\n lastPos = pos;\n }\n\n if (lastPos < text.length) {\n stack[stack.length - 1].children.push(text.slice(lastPos));\n }\n\n return root;\n}\n\nfunction renderNode(\n node: any,\n dispatch: TreeDispatch,\n selectedNodes: number[],\n parentSelected: boolean,\n): any {\n if (typeof node === \"string\") return node;\n\n const { tag, children } = node;\n const isSelected = selectedNodes?.includes(tag.id);\n const showBorder = selectedNodes.length === 0 || isSelected;\n\n const style = {\n ...tag,\n zIndex: parentSelected ? -1 : 1,\n border: \"1px solid \" + (showBorder ? tag.color : \"transparent\"),\n margin: \"-1px\",\n };\n\n let moveText = [];\n if (isSelected) {\n for (const key in children) {\n if (Object.prototype.hasOwnProperty.call(children, key)) {\n const child = children[key];\n if (child?.tag) {\n moveText.push(child.children[0]);\n } else {\n moveText.push(child);\n }\n }\n }\n }\n\n return h(\n \"span\",\n {\n className: \"highlight\",\n style,\n onClick: (e: MouseEvent) => {\n e.stopPropagation();\n if (\n e.ctrlKey ||\n e.metaKey ||\n (selectedNodes[0] === tag.id && selectedNodes.length === 1)\n ) {\n // Toggle selection on ctrl/cmd click or when node is only selected node\n e.stopPropagation();\n dispatch({\n type: \"toggle-node-selected\",\n payload: { ids: [tag.id] },\n });\n } else if (e.shiftKey && selectedNodes.length > 0) {\n // Select range from last selected node to this one\n const lastSelected = selectedNodes[selectedNodes.length - 1];\n\n dispatch({\n type: \"select-range\",\n payload: { ids: [lastSelected, tag.id] },\n });\n } else {\n dispatch({\n type: \"select-node\",\n payload: { ids: [tag.id] },\n });\n }\n },\n },\n isSelected\n ? moveText.flat()\n : children.map((child: any, i: number) =>\n renderNode(child, dispatch, selectedNodes, isSelected),\n ),\n );\n}\n\nexport function HighlightedText(props: {\n text: string;\n allTags: AnnotateBlendTag[];\n lineHeight: string;\n allowOverlap?: boolean;\n dispatch: TreeDispatch;\n selectedNodes: number[];\n}) {\n const { text, allTags = [], dispatch, selectedNodes, allowOverlap } = props;\n\n const tree = nestHighlights(text, allTags);\n\n const spanRef = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n const handleMouseUp = () => {\n const tag = createTagFromSelection({ container: spanRef.current });\n if (!tag) return;\n addTag({ tag, dispatch, text, allTags, allowOverlap });\n };\n\n document.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [text, allTags, dispatch, allowOverlap]);\n\n return h(\n \"span\",\n { ref: spanRef },\n tree.children.map((child: any, i: number) =>\n renderNode(child, dispatch, selectedNodes, false),\n ),\n );\n}\n"],"names":["$h8ona$macrostrathyper","useRef","$h8ona$useRef","useEffect","$h8ona$useEffect","$parcel$global","globalThis","$parcel$modules","$parcel$inits","parcelRequire","id","exports","init","module","call","err","Error","code","register","$9wFEx","$edvRb","$d6cf457c7790c03a$var$h","styled","a","__esModule","default","$d6cf457c7790c03a$export$6e107db9091b8219","props","text","selectedNodes","nodes","dispatch","allowOverlap","tabIndex","onKeyDown","e","key","type","payload","ids","$d6cf457c7790c03a$export$190465bec6b893be","allTags","$d6cf457c7790c03a$var$buildTags","highlights","tags","entities","Set","highlight","tag","has","highlighted","$d6cf457c7790c03a$var$isHighlighted","length","includes","parents","some","d","active","tagStyle","getTagStyle","backgroundColor","color","display","markStyle","push","add","buildHighlights","tree","$d6cf457c7790c03a$var$nestHighlights","events","pos","start","end","sort","b","root","children","textStart","stack","lastPos","parent","slice","newNode","pop","spanRef","handleMouseUp","$d6cf457c7790c03a$var$createTagFromSelection","container","selection","window","getSelection","isCollapsed","rangeCount","range","getRangeAt","contains","startContainer","endContainer","preRange","document","createRange","setStart","setEnd","startOffset","toString","selectedText","current","$d6cf457c7790c03a$var$addTag","test","trim","console","log","find","t","endsWith","inside","overlap","addEventListener","removeEventListener","ref","map","child","i","$d6cf457c7790c03a$var$renderNode","node","parentSelected","isSelected","showBorder","style","zIndex","border","margin","moveText","Object","prototype","hasOwnProperty","className","onClick","stopPropagation","ctrlKey","metaKey","shiftKey","flat","FeedbackText","HighlightedText"],"version":3,"file":"feedback-components.ec54a1e7.js.map","sourceRoot":"../../../../"}
|