summaryrefslogtreecommitdiff
path: root/src/zoom/Sentence.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/zoom/Sentence.tsx')
-rw-r--r--src/zoom/Sentence.tsx55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/zoom/Sentence.tsx b/src/zoom/Sentence.tsx
new file mode 100644
index 0000000..35e00d6
--- /dev/null
+++ b/src/zoom/Sentence.tsx
@@ -0,0 +1,55 @@
+import React, { memo } from "react";
+import { motion } from "motion/react";
+import type { ViewProps, LoadingStatus } from "./logic/types";
+import { NLP } from "sortug-ai";
+import SpacyClause from "./SpacyClause";
+import { sentenceVariants, createHoverEffect } from "./animations";
+import { useZoom } from "./hooks/useZoom";
+import StanzaClause from "./StanzaClause";
+
+interface Props extends ViewProps {
+ spacy: NLP.Spacy.Sentence;
+ stanzas?: NLP.Stanza.Sentence | undefined;
+}
+
+function Sentence(props: Props) {
+ const { spacy, stanzas, context, idx } = props;
+ const { viewState, handleElementClick } = useZoom();
+ const { level, sIndex } = viewState;
+ const selected = sIndex === idx;
+ const isFocused = level === "sentence" && selected;
+
+ return (
+ <>
+ <motion.span
+ key={idx + spacy.text}
+ className={`sentence-wrapper ${selected ? "selected" : ""}`}
+ custom={selected}
+ variants={sentenceVariants}
+ initial="paragraph"
+ animate={level}
+ onClick={(e) => handleElementClick(e, idx)}
+ whileHover={
+ level === "paragraph"
+ ? createHoverEffect(level, "paragraph", "200, 220, 255")
+ : {}
+ }
+ >
+ {level === "paragraph" || !selected ? (
+ <span className="sentence">{spacy.text}</span>
+ ) : stanzas ? (
+ <StanzaClause
+ {...props}
+ sentence={stanzas}
+ rawText={stanzas.text}
+ data={stanzas.constituency}
+ />
+ ) : (
+ <SpacyClause sentence={spacy} />
+ )}
+ </motion.span>
+ </>
+ );
+}
+
+export default memo(Sentence);