- To get started, edit the page.tsx file. -
-- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -
-diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..12b0600 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,58 @@ +# Dependencies +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# Next.js +.next +out +dist + +# Testing +coverage +.nyc_output + +# Misc +.DS_Store +*.pem + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Local env files +.env*.local +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Vercel +.vercel + +# TypeScript +*.tsbuildinfo + +# Git +.git +.gitignore + +# IDE +.vscode +.idea +*.swp +*.swo + +# Playwright +test-results +playwright-report + +# Documentation +README.md +CLAUDE.md +HANZI-LEARNING-APP-SPECIFICATION.md +PROJECT-NAMING.md +LICENSE diff --git a/.gitignore b/.gitignore index 5ef6a52..0706528 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,9 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# SSL certificates (except README) +docker/ssl/*.pem +docker/ssl/*.crt +docker/ssl/*.key +.testcontainer-db-url diff --git a/app/page.tsx b/app/page.tsx deleted file mode 100644 index 295f8fd..0000000 --- a/app/page.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import Image from "next/image"; - -export default function Home() { - return ( -
- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -
-Error
+{error}
++ Imported +
++ {result.imported} +
++ Failed +
++ {result.failed} +
++ Success Rate +
++ {result.imported + result.failed > 0 + ? Math.round( + (result.imported / (result.imported + result.failed)) * + 100 + ) + : 0} + % +
++ {err.line && ( + Line {err.line}: + )} + {err.character && ( + + {err.character} + + )}{" "} + - {err.error} +
++ Source:{" "} + + github.com/drkameleon/complete-hsk-vocabulary + +
+
+ {JSON.stringify(
+ {
+ simplified: "爱好",
+ radical: "爫",
+ level: ["new-1", "old-3"],
+ frequency: 4902,
+ pos: ["n", "v"],
+ forms: [
+ {
+ traditional: "愛好",
+ transcriptions: {
+ pinyin: "ài hào",
+ numeric: "ai4 hao4",
+ },
+ meanings: ["to like; hobby"],
+ classifiers: ["个"],
+ },
+ ],
+ },
+ null,
+ 2
+ )}
+
+
+ {`simplified,traditional,pinyin,meaning,hsk_level,radical,frequency,pos,classifiers
+爱好,愛好,ài hào,"to like; hobby","new-1,old-3",爫,4902,"n,v",个`}
+
+ Loading...
+{error || "Collection not found"}
+ + Back to Collections + +{collection.description}
+ )} ++ {collection.hanziCount} hanzi +
++ This collection is empty. Add some hanzi to get started. +
+ {canModify && ( + + )} ++ ✓ Found: {parseResult.found.length} hanzi +
++ ✗ Not found: {parseResult.notFound.length} hanzi +
++ ⚠ Duplicates in input: {parseResult.duplicates.length} +
++ Create a new collection to organize your hanzi +
+Error
+{error}
++ Organize your hanzi into collections for learning +
++ You don't have any collections yet. +
+ + Create Your First Collection + ++ {collection.description} +
+ )} ++ Created {new Date(collection.createdAt).toLocaleDateString()} +
+ + ))} ++ No HSK collections available yet. Ask an admin to create them. +
++ {collection.description} +
+ )} ++ Start learning Chinese characters with spaced repetition +
++ 0 +
++ No cards due right now +
++ 0 +
++ Characters mastered +
++ 0/50 +
++ Cards reviewed today +
++ View and manage your hanzi collections +
+ + ++ Start a new hanzi collection +
+ + ++ Find hanzi by character, pinyin, or meaning +
+ ++ More features coming soon: Learning sessions, progress tracking, and more! +
+Loading...
+{error || "Hanzi not found"}
+ + Back to Search + ++ Traditional: {defaultForm.traditional} +
+ )} ++ {hanzi.radical} +
++ {hanzi.frequency} +
+Transcriptions:
+Meanings:
++ You don't have any collections yet. +
+ + Create Collection + ++ Search by character, pinyin, or meaning +
++ Found {total} result{total !== 1 ? "s" : ""} + {hskLevel && ` for HSK ${hskLevel.toUpperCase()}`} +
++ Page {currentPage} of {totalPages} +
++ Traditional: {hanzi.traditional} +
+ )} + + {hanzi.pinyin && ( ++ {hanzi.pinyin} +
+ )} + + {hanzi.meaning && ( ++ {hanzi.meaning} +
+ )} + + {hanzi.radical && ( ++ Radical: {hanzi.radical} +
+ )} + + ))} ++ No hanzi found matching "{query}" + {hskLevel && ` in HSK ${hskLevel.toUpperCase()}`} +
++ Try a different search term or remove the HSK filter +
++ Enter a search term to find hanzi +
++ Search by simplified character, traditional character, pinyin, or English meaning +
+Error loading preferences
++ Manage your account and learning preferences +
+记汉字
++ Don't have an account?{' '} + + Sign up + +
+记汉字
++ Already have an account?{' '} + + Sign in + +
++ 记汉字 +
++ Remember Hanzi, effortlessly +
++ A self-hosted web application for learning Chinese characters using spaced repetition. + Master Hanzi with the proven SM-2 algorithm. +
+ ++ Learn efficiently with the scientifically-proven SM-2 algorithm +
++ Access complete HSK vocabulary or create your own collections +
++ Your data stays yours. Deploy and control your own instance +
+