feat: expand to 1014 words, add title-case display and 2 new themes

- Move word data from hardcoded seed.py to data/words.json
- Expand from 210 words across 7 categories to 1014 words across 14
  categories (animals, food, colors, sports, space, nature, music,
  science, countries, occupations, ocean, weather, mythology, technology)
- Word list sidebar now shows title case (Tiger) while grid stays
  uppercase; text input remains case-insensitive
- Add Ocean theme (light, blue accents) and Forest theme (dark, amber
  accents on deep green)
- Replace hardcoded rgba values with --coral-bg CSS variable so
  selection highlighting adapts per theme

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Mathew Sir Guest the best
2026-05-07 02:43:43 -06:00
co-authored by Claude Opus 4.6
parent cd1dc9200b
commit 9319f08875
13 changed files with 728 additions and 236 deletions
+14 -222
View File
@@ -1,227 +1,17 @@
"""Seed the database with word categories from data/words.json."""
import json
import os
from db import get_engine, get_session_factory, init_db
from models.category import Category, CategoryWord
SEED_DATA = {
"animals": [
"TIGER",
"DOLPHIN",
"EAGLE",
"WOLF",
"BEAR",
"LION",
"HAWK",
"DEER",
"FROG",
"SHARK",
"SNAKE",
"WHALE",
"ZEBRA",
"PANDA",
"OTTER",
"FALCON",
"BISON",
"CRANE",
"MOOSE",
"RAVEN",
"JAGUAR",
"PARROT",
"TURTLE",
"SALMON",
"FERRET",
"COYOTE",
"OSPREY",
"LIZARD",
"BADGER",
"PELICAN",
"MONKEY",
"RABBIT",
"IGUANA",
"CONDOR",
"JACKAL",
],
"colors": [
"CRIMSON",
"VIOLET",
"AMBER",
"SCARLET",
"INDIGO",
"MAROON",
"CORAL",
"IVORY",
"SILVER",
"GOLDEN",
"BRONZE",
"TEAL",
"OLIVE",
"PLUM",
"RUST",
"SAGE",
"NAVY",
"JADE",
"CYAN",
"MAUVE",
"COBALT",
"COPPER",
"EBONY",
"PEACH",
"CREAM",
"LEMON",
"ORCHID",
"SALMON",
"SIENNA",
"KHAKI",
"LILAC",
"PEARL",
"CHARCOAL",
"MAGENTA",
"EMERALD",
],
"food": [
"PIZZA",
"SUSHI",
"MANGO",
"PASTA",
"TACO",
"BREAD",
"STEAK",
"GRAPE",
"MELON",
"PEACH",
"OLIVE",
"LEMON",
"BACON",
"WAFFLE",
"CREPE",
"DONUT",
"SALAD",
"CURRY",
"BAGEL",
"FUDGE",
"SHRIMP",
"CHEESE",
"BUTTER",
"CHERRY",
"PEPPER",
"GINGER",
"PRETZEL",
"BRISKET",
"NOODLE",
"OYSTER",
"TURNIP",
"RADISH",
"CELERY",
"COOKIE",
"BISQUE",
],
"sports": [
"SOCCER",
"TENNIS",
"BOXING",
"RUGBY",
"GOLF",
"DIVING",
"ROWING",
"HOCKEY",
"FENCING",
"ARCHER",
"SPRINT",
"DISCUS",
"SQUASH",
"KARATE",
"JUDO",
"RELAY",
"SLALOM",
"CRAWL",
"VAULT",
"SERVE",
"VOLLEY",
"TACKLE",
"PADDLE",
"JAVELIN",
"HURDLE",
],
"space": [
"PLANET",
"GALAXY",
"NEBULA",
"COMET",
"ORBIT",
"QUASAR",
"PULSAR",
"LUNAR",
"SOLAR",
"METEOR",
"AURORA",
"ECLIPSE",
"ZENITH",
"CRATER",
"COSMOS",
"PHOTON",
"PLASMA",
"ROCKET",
"SATURN",
"VENUS",
"MARS",
"PLUTO",
"TITAN",
"VORTEX",
"FLARE",
],
"nature": [
"RIVER",
"OCEAN",
"CANYON",
"FOREST",
"DESERT",
"ISLAND",
"GLACIER",
"MEADOW",
"VALLEY",
"SUMMIT",
"LAGOON",
"TUNDRA",
"MARSH",
"CLIFF",
"DELTA",
"FJORD",
"GROVE",
"RIDGE",
"CORAL",
"BROOK",
"DUNE",
"GEYSER",
"CAVERN",
"RAPIDS",
"SAVANNA",
],
"music": [
"GUITAR",
"PIANO",
"DRUMS",
"VIOLIN",
"FLUTE",
"CELLO",
"BANJO",
"ORGAN",
"HARP",
"TRUMPET",
"RHYTHM",
"MELODY",
"CHORD",
"TEMPO",
"FORTE",
"TREBLE",
"OCTAVE",
"SONATA",
"BALLAD",
"OPERA",
"HYMN",
"LYRIC",
"CHORUS",
"BRIDGE",
"DUET",
],
}
DATA_PATH = os.path.join(os.path.dirname(__file__), "data", "words.json")
def load_words():
with open(DATA_PATH) as f:
return json.load(f)
def seed():
@@ -230,7 +20,9 @@ def seed():
Session = get_session_factory(engine)
session = Session()
for cat_name, words in SEED_DATA.items():
word_data = load_words()
for cat_name, words in word_data.items():
existing = session.query(Category).filter_by(name=cat_name).first()
if existing:
cat = existing