From a3f24ea79b14394b24c4b60a010651eb29eeb872 Mon Sep 17 00:00:00 2001
From: polwex <polwex@sortug.com>
Date: Thu, 29 May 2025 12:10:22 +0700
Subject: glorious new db

---
 src/components/Flashcard/SyllableModal.tsx | 110 +++++++++++++++++++++++++++++
 1 file changed, 110 insertions(+)
 create mode 100644 src/components/Flashcard/SyllableModal.tsx

(limited to 'src/components/Flashcard/SyllableModal.tsx')

diff --git a/src/components/Flashcard/SyllableModal.tsx b/src/components/Flashcard/SyllableModal.tsx
new file mode 100644
index 0000000..a00fd10
--- /dev/null
+++ b/src/components/Flashcard/SyllableModal.tsx
@@ -0,0 +1,110 @@
+// This is a Server Component
+import React from "react";
+import db from "@/lib/db";
+import {
+  Card,
+  CardHeader,
+  CardDescription,
+  CardContent,
+  CardFooter,
+  CardTitle,
+} from "@/components/ui/card";
+import { NLP } from "sortug-ai";
+import {
+  BookOpen,
+  Volume2,
+  Link as LinkIcon,
+  ChevronDown,
+  ChevronUp,
+  Search,
+  Info,
+  MessageSquareQuote,
+  Tags,
+  ListTree,
+  Lightbulb,
+} from "lucide-react";
+import {
+  Example,
+  SubSense,
+  RelatedEntry,
+  Sense,
+  WordData,
+} from "@/zoom/logic/types";
+import { isTonal } from "@/lib/lang/utils";
+
+type WordProps = { text: string; lang: string };
+export default async function (props: WordProps) {
+  const { text, lang } = props;
+  const data = db.fetchWordBySpelling(text, lang);
+
+  if (!data) return <p>oh...</p>;
+  console.log(data.senses[0]);
+  return (
+    <Card className="overflow-y-scroll max-h-[80vh]">
+      <CardHeader>
+        <CardTitle>
+          <h1 className="text-5xl">{text}</h1>
+        </CardTitle>
+        <CardDescription>
+          <IpaDisplay ipaEntries={data.ipa} />
+        </CardDescription>
+      </CardHeader>
+      <CardContent>
+        {isTonal(text) ? <Tones {...props} /> : <NotTones {...props} />}
+      </CardContent>
+      <CardFooter></CardFooter>
+    </Card>
+  );
+  // return (
+  //   <div className="p-6">
+  //     <h3 className="mb-2 text-2xl font-bold">{word}</h3>
+  //     <p className="mb-1 text-xl text-green-600">${word.}</p>
+  //     <p className="text-gray-700">{word}</p>
+  //     <p className="mt-4 text-xs text-gray-500">
+  //       Content rendered on the server at: {new Date().toLocaleTimeString()}
+  //     </p>
+  //   </div>
+  // );
+}
+
+// Helper component for IPA display
+const IpaDisplay = ({
+  ipaEntries,
+}: {
+  ipaEntries: Array<{ ipa: string; tags?: string[] }>;
+}) => {
+  if (!ipaEntries || ipaEntries.length === 0) return null;
+  return (
+    <div className="flex items-center space-x-2 flex-wrap">
+      {ipaEntries.map((entry, index) => {
+        const tags = entry.tags ? entry.tags : [];
+        return (
+          <span key={index} className="text-lg text-blue-600 font-serif">
+            {entry.ipa}{" "}
+            {tags.length > 0 && (
+              <span className="text-xs text-gray-500">({tags.join(", ")})</span>
+            )}
+          </span>
+        );
+      })}
+      <button
+        className="p-1 text-blue-500 hover:text-blue-700 transition-colors"
+        title="Pronounce"
+        // onClick={() => {
+        //   /* Pronunciation logic would be client-side or a server roundtrip for audio file. */ alert(
+        //     "Pronunciation feature not implemented for server component.",
+        //   );
+        // }}
+      >
+        <Volume2 size={20} />
+      </button>
+    </div>
+  );
+};
+
+function Tones({ text, lang }: WordProps) {
+  return <div></div>;
+}
+function NotTones({ text, lang }: WordProps) {
+  return <div></div>;
+}
-- 
cgit v1.2.3

