summaryrefslogtreecommitdiff
path: root/src/zoom/FullText.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/zoom/FullText.tsx')
-rw-r--r--src/zoom/FullText.tsx62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/zoom/FullText.tsx b/src/zoom/FullText.tsx
new file mode 100644
index 0000000..615fe66
--- /dev/null
+++ b/src/zoom/FullText.tsx
@@ -0,0 +1,62 @@
+import React from "react";
+import { motion, AnimatePresence } from "motion/react";
+import Paragraph from "./Paragraph";
+import { useZoom } from "./hooks/useZoom";
+import { containerVariants, buttonVariants } from "./animations";
+import { NLP } from "sortug-ai";
+
+interface TextFocusMorphProps {
+ text: string;
+ doc: NLP.Spacy.SpacyRes;
+ stanza?: NLP.Stanza.StanzaRes | undefined;
+}
+
+const FullText: React.FC<TextFocusMorphProps> = ({ text, doc, stanza }) => {
+ const { viewState, navigateBack, handleElementClick } = useZoom();
+ const { level } = viewState;
+
+ // Split text into paragraphs
+ const paragraphs = text
+ .split("\n\n")
+ .map((p) => p.trim())
+ .filter(Boolean);
+
+ return (
+ <div className="text-focus-morph">
+ {level !== "text" && (
+ <AnimatePresence>
+ <motion.button
+ className="back-button"
+ onClick={navigateBack}
+ variants={buttonVariants}
+ initial="initial"
+ animate="animate"
+ exit="exit"
+ >
+ ← Back
+ </motion.button>
+ </AnimatePresence>
+ )}
+
+ <motion.div
+ className="content-container"
+ variants={containerVariants}
+ initial="text"
+ animate={level}
+ >
+ {paragraphs.map((paragraph, idx) => (
+ <Paragraph
+ doc={doc}
+ stanza={stanza}
+ key={paragraph + idx}
+ rawText={paragraph}
+ context={{ idx, parentText: text, segmented: paragraphs }}
+ idx={idx}
+ />
+ ))}
+ </motion.div>
+ </div>
+ );
+};
+
+export default FullText;