From 3eb3a968dcd3f979aaf2a4f047af4b4bc456c140 Mon Sep 17 00:00:00 2001 From: George Powell Date: Sat, 21 Mar 2026 23:33:47 -0400 Subject: [PATCH] feat: add progress page with activity calendar, book grid, and insights Adds a new /progress route showing a personalized Bible knowledge dashboard with stat cards, book mastery grid, 30-day activity calendar, skill growth chart, streak milestones, and section insights. Links added from WinScreen (logged-in users) and DevButtons. Co-Authored-By: Claude Sonnet 4.6 --- export-verses.sh | 87 +++ src/lib/components/ActivityCalendar.svelte | 200 +++++++ src/lib/components/DevButtons.svelte | 6 + src/lib/components/ProgressStatCard.svelte | 25 + src/lib/components/WinScreen.svelte | 9 +- src/routes/progress/+page.server.ts | 278 +++++++++ src/routes/progress/+page.svelte | 658 +++++++++++++++++++++ verses.json | 94 +++ 8 files changed, 1356 insertions(+), 1 deletion(-) create mode 100755 export-verses.sh create mode 100644 src/lib/components/ActivityCalendar.svelte create mode 100644 src/lib/components/ProgressStatCard.svelte create mode 100644 src/routes/progress/+page.server.ts create mode 100644 src/routes/progress/+page.svelte create mode 100644 verses.json diff --git a/export-verses.sh b/export-verses.sh new file mode 100755 index 0000000..1f1b8a3 --- /dev/null +++ b/export-verses.sh @@ -0,0 +1,87 @@ +#!/bin/bash +# Export all daily verses to JSON +# Usage: ./export-verses.sh [path/to/database.db] [output.json] + +DB="${1:-./local.db}" +OUT="${2:-verses.json}" + +sqlite3 "$DB" <<'SQL' > "$OUT" +.mode json +SELECT + CASE book_id + WHEN 'GEN' THEN 'Genesis' + WHEN 'EXO' THEN 'Exodus' + WHEN 'LEV' THEN 'Leviticus' + WHEN 'NUM' THEN 'Numbers' + WHEN 'DEU' THEN 'Deuteronomy' + WHEN 'JOS' THEN 'Joshua' + WHEN 'JDG' THEN 'Judges' + WHEN 'RUT' THEN 'Ruth' + WHEN '1SA' THEN '1 Samuel' + WHEN '2SA' THEN '2 Samuel' + WHEN '1KI' THEN '1 Kings' + WHEN '2KI' THEN '2 Kings' + WHEN '1CH' THEN '1 Chronicles' + WHEN '2CH' THEN '2 Chronicles' + WHEN 'EZR' THEN 'Ezra' + WHEN 'NEH' THEN 'Nehemiah' + WHEN 'EST' THEN 'Esther' + WHEN 'JOB' THEN 'Job' + WHEN 'PSA' THEN 'Psalms' + WHEN 'PRO' THEN 'Proverbs' + WHEN 'ECC' THEN 'Ecclesiastes' + WHEN 'SNG' THEN 'Song of Solomon' + WHEN 'ISA' THEN 'Isaiah' + WHEN 'JER' THEN 'Jeremiah' + WHEN 'LAM' THEN 'Lamentations' + WHEN 'EZK' THEN 'Ezekiel' + WHEN 'DAN' THEN 'Daniel' + WHEN 'HOS' THEN 'Hosea' + WHEN 'JOL' THEN 'Joel' + WHEN 'AMO' THEN 'Amos' + WHEN 'OBA' THEN 'Obadiah' + WHEN 'JON' THEN 'Jonah' + WHEN 'MIC' THEN 'Micah' + WHEN 'NAM' THEN 'Nahum' + WHEN 'HAB' THEN 'Habakkuk' + WHEN 'ZEP' THEN 'Zephaniah' + WHEN 'HAG' THEN 'Haggai' + WHEN 'ZEC' THEN 'Zechariah' + WHEN 'MAL' THEN 'Malachi' + WHEN 'MAT' THEN 'Matthew' + WHEN 'MRK' THEN 'Mark' + WHEN 'LUK' THEN 'Luke' + WHEN 'JHN' THEN 'John' + WHEN 'ACT' THEN 'Acts' + WHEN 'ROM' THEN 'Romans' + WHEN '1CO' THEN '1 Corinthians' + WHEN '2CO' THEN '2 Corinthians' + WHEN 'GAL' THEN 'Galatians' + WHEN 'EPH' THEN 'Ephesians' + WHEN 'PHP' THEN 'Philippians' + WHEN 'COL' THEN 'Colossians' + WHEN '1TH' THEN '1 Thessalonians' + WHEN '2TH' THEN '2 Thessalonians' + WHEN '1TI' THEN '1 Timothy' + WHEN '2TI' THEN '2 Timothy' + WHEN 'TIT' THEN 'Titus' + WHEN 'PHM' THEN 'Philemon' + WHEN 'HEB' THEN 'Hebrews' + WHEN 'JAS' THEN 'James' + WHEN '1PE' THEN '1 Peter' + WHEN '2PE' THEN '2 Peter' + WHEN '1JN' THEN '1 John' + WHEN '2JN' THEN '2 John' + WHEN '3JN' THEN '3 John' + WHEN 'JUD' THEN 'Jude' + WHEN 'REV' THEN 'Revelation' + ELSE book_id + END AS book, + verse_text AS verse, + reference AS citation, + date +FROM daily_verses +ORDER BY date; +SQL + +echo "Exported to $OUT" diff --git a/src/lib/components/ActivityCalendar.svelte b/src/lib/components/ActivityCalendar.svelte new file mode 100644 index 0000000..d1326b5 --- /dev/null +++ b/src/lib/components/ActivityCalendar.svelte @@ -0,0 +1,200 @@ + + + +

+ Activity +

+ +
+ {#each ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] as d (d)} +
+ {d} +
+ {/each} +
+ + {#each calendarRows as row, rowIdx (rowIdx)} + {#if row.monthLabel} +
+ {row.monthLabel} +
+ {/if} +
+ {#each row.cells as cell, cellIdx (cellIdx)} + {#if cell} +
+ {cell.dayNum} +
+ {:else} +
+ {/if} + {/each} +
+ {/each} + +
+ + + 1 guess + + + + 2–3 guesses + + + + 4–5 guesses + + + + 6–7 guesses + + + + 8+ guesses + +
+
diff --git a/src/lib/components/DevButtons.svelte b/src/lib/components/DevButtons.svelte index 5361a3e..8a7127b 100644 --- a/src/lib/components/DevButtons.svelte +++ b/src/lib/components/DevButtons.svelte @@ -69,6 +69,12 @@ > 📊 View Stats + + 📈 View Progress + {#if user}
diff --git a/src/lib/components/ProgressStatCard.svelte b/src/lib/components/ProgressStatCard.svelte new file mode 100644 index 0000000..7ef31f7 --- /dev/null +++ b/src/lib/components/ProgressStatCard.svelte @@ -0,0 +1,25 @@ + + + +
+
{emoji}
+
+ {value}{#if suffix} {suffix}{/if} +
+
{label}
+
+
diff --git a/src/lib/components/WinScreen.svelte b/src/lib/components/WinScreen.svelte index ed64244..c40db6a 100644 --- a/src/lib/components/WinScreen.svelte +++ b/src/lib/components/WinScreen.svelte @@ -329,7 +329,14 @@ {/if} - {#if !isLoggedIn} + {#if isLoggedIn} + + View your progress → + + {:else}