From cb60ec8480c4dd5f596afb65a2ececdf3dcda582 Mon Sep 17 00:00:00 2001 From: Caleb Burke Date: Fri, 26 Jun 2026 01:25:25 -0700 Subject: [PATCH] flashcards in the frontend!!! --- .../FlashcardDeckCreateDialog.vue | 92 ++++++++ .../FlashcardDeckStartReviewBtn.vue | 30 +++ .../flashcard-decks/FlashcardDeckTree.vue | 204 ++++++++++++++++++ .../flashcard-decks/FlashcardDeckTreeNode.vue | 126 +++++++++++ .../FlashcardDecksDataTableServer.vue | 100 +++++++++ .../flashcards/FlashcardCreateDialog.vue | 104 +++++++++ .../flashcards/FlashcardReviewCard.vue | 130 +++++++++++ .../flashcards/FlashcardsDataTableServer.vue | 107 +++++++++ web/src/components/layout/DefaultAppBar.vue | 14 ++ web/src/pages/FlashcardsPage.vue | 88 ++++++++ .../FlashcardDeckReviewPage.vue | 118 ++++++++++ web/src/router.ts | 17 ++ web/src/theme/DarkTheme.ts | 6 +- web/src/utils/render-markdown.ts | 1 + 14 files changed, 1134 insertions(+), 3 deletions(-) create mode 100644 web/src/components/flashcard-decks/FlashcardDeckCreateDialog.vue create mode 100644 web/src/components/flashcard-decks/FlashcardDeckStartReviewBtn.vue create mode 100644 web/src/components/flashcard-decks/FlashcardDeckTree.vue create mode 100644 web/src/components/flashcard-decks/FlashcardDeckTreeNode.vue create mode 100644 web/src/components/flashcard-decks/FlashcardDecksDataTableServer.vue create mode 100644 web/src/components/flashcards/FlashcardCreateDialog.vue create mode 100644 web/src/components/flashcards/FlashcardReviewCard.vue create mode 100644 web/src/components/flashcards/FlashcardsDataTableServer.vue create mode 100644 web/src/pages/FlashcardsPage.vue create mode 100644 web/src/pages/flashcard-deck-reviews/FlashcardDeckReviewPage.vue diff --git a/web/src/components/flashcard-decks/FlashcardDeckCreateDialog.vue b/web/src/components/flashcard-decks/FlashcardDeckCreateDialog.vue new file mode 100644 index 0000000..5c49a5e --- /dev/null +++ b/web/src/components/flashcard-decks/FlashcardDeckCreateDialog.vue @@ -0,0 +1,92 @@ + + + diff --git a/web/src/components/flashcard-decks/FlashcardDeckStartReviewBtn.vue b/web/src/components/flashcard-decks/FlashcardDeckStartReviewBtn.vue new file mode 100644 index 0000000..9de228f --- /dev/null +++ b/web/src/components/flashcard-decks/FlashcardDeckStartReviewBtn.vue @@ -0,0 +1,30 @@ + + + diff --git a/web/src/components/flashcard-decks/FlashcardDeckTree.vue b/web/src/components/flashcard-decks/FlashcardDeckTree.vue new file mode 100644 index 0000000..7a2affc --- /dev/null +++ b/web/src/components/flashcard-decks/FlashcardDeckTree.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/web/src/components/flashcard-decks/FlashcardDeckTreeNode.vue b/web/src/components/flashcard-decks/FlashcardDeckTreeNode.vue new file mode 100644 index 0000000..ff664c8 --- /dev/null +++ b/web/src/components/flashcard-decks/FlashcardDeckTreeNode.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/web/src/components/flashcard-decks/FlashcardDecksDataTableServer.vue b/web/src/components/flashcard-decks/FlashcardDecksDataTableServer.vue new file mode 100644 index 0000000..1275bd0 --- /dev/null +++ b/web/src/components/flashcard-decks/FlashcardDecksDataTableServer.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/web/src/components/flashcards/FlashcardCreateDialog.vue b/web/src/components/flashcards/FlashcardCreateDialog.vue new file mode 100644 index 0000000..02cba67 --- /dev/null +++ b/web/src/components/flashcards/FlashcardCreateDialog.vue @@ -0,0 +1,104 @@ + + + diff --git a/web/src/components/flashcards/FlashcardReviewCard.vue b/web/src/components/flashcards/FlashcardReviewCard.vue new file mode 100644 index 0000000..c0b72bf --- /dev/null +++ b/web/src/components/flashcards/FlashcardReviewCard.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/web/src/components/flashcards/FlashcardsDataTableServer.vue b/web/src/components/flashcards/FlashcardsDataTableServer.vue new file mode 100644 index 0000000..6e7dd52 --- /dev/null +++ b/web/src/components/flashcards/FlashcardsDataTableServer.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/web/src/components/layout/DefaultAppBar.vue b/web/src/components/layout/DefaultAppBar.vue index f60010c..8e450b1 100644 --- a/web/src/components/layout/DefaultAppBar.vue +++ b/web/src/components/layout/DefaultAppBar.vue @@ -9,6 +9,20 @@ + + + + + diff --git a/web/src/pages/FlashcardsPage.vue b/web/src/pages/FlashcardsPage.vue new file mode 100644 index 0000000..698901a --- /dev/null +++ b/web/src/pages/FlashcardsPage.vue @@ -0,0 +1,88 @@ + + + diff --git a/web/src/pages/flashcard-deck-reviews/FlashcardDeckReviewPage.vue b/web/src/pages/flashcard-deck-reviews/FlashcardDeckReviewPage.vue new file mode 100644 index 0000000..147187a --- /dev/null +++ b/web/src/pages/flashcard-deck-reviews/FlashcardDeckReviewPage.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/web/src/router.ts b/web/src/router.ts index b26128e..17808fe 100644 --- a/web/src/router.ts +++ b/web/src/router.ts @@ -34,6 +34,23 @@ const routes: RouteRecordRaw[] = [ title: "Dashboard", }, }, + { + name: "FlashcardsPage", + path: "flashcards", + component: () => import("@/pages/FlashcardsPage.vue"), + meta: { + title: "Flashcards", + }, + }, + { + name: "FlashcardDeckReviewPage", + path: "flashcard-deck/:flashcardDeckId/review", + component: () => import("@/pages/flashcard-deck-reviews/FlashcardDeckReviewPage.vue"), + props: true, + meta: { + title: "Deck review", + }, + }, { path: "", component: () => import("@/layouts/LayoutWithBreadcrumbs.vue"), diff --git a/web/src/theme/DarkTheme.ts b/web/src/theme/DarkTheme.ts index ac808cf..47002b1 100644 --- a/web/src/theme/DarkTheme.ts +++ b/web/src/theme/DarkTheme.ts @@ -189,8 +189,8 @@ const CHIRPY_JEKYLL_DARK_THEME: ThemeTypes = { "border-opacity": 1, }, colors: { - primary: "#8ab4f8", - secondary: "#40b883", + primary: "#07a8f7", + secondary: "#8ab4f8", info: "#0075d1", success: "#0fa30f", accent: "#8ab4f8", @@ -199,7 +199,7 @@ const CHIRPY_JEKYLL_DARK_THEME: ThemeTypes = { purple: "#b370f5", indigo: "#7c6af0", lightprimary: "#1a2540", - lightsecondary: "#0d2e20", + lightsecondary: "#072a3a", lightsuccess: "#163c24", lighterror: "#3a0000", lightwarning: "#3a2a10", diff --git a/web/src/utils/render-markdown.ts b/web/src/utils/render-markdown.ts index ab5fa49..ada9b36 100644 --- a/web/src/utils/render-markdown.ts +++ b/web/src/utils/render-markdown.ts @@ -4,6 +4,7 @@ import markedKatex from "marked-katex-extension" import "katex/dist/katex.min.css" marked.use(markedKatex({ throwOnError: false })) +marked.use({ breaks: true }) export function renderMarkdown(source: string): string { return DOMPurify.sanitize(marked.parse(source) as string)