Skip to content

Latest commit

 

History

History
81 lines (70 loc) · 3.95 KB

File metadata and controls

81 lines (70 loc) · 3.95 KB

CoordBash

A practice platform for contest math, in the spirit of Euclid, CSIMC, AMC, AIME, USAMO, COMC, CMO, and HMMT. Problems are original, written for CoordBash, not copied from any contest. Grading covers full proofs, not just final answers, and scores are shown against the distribution of other submissions.

Stack

Next.js (App Router) + Tailwind. lucide-react for icons, katex / react-katex wired in as a dependency for rendering math notation once statements move from plain text to LaTeX source.

Structure

src/
  app/
    layout.jsx                  shared shell: navbar + page container
    page.jsx                    redirects to /problems
    problems/page.jsx           problem list, filters by difficulty, format, topic
    problems/[slug]/page.jsx    single problem: statement, tabs, submission editor
    submissions/page.jsx        a user's submission history (reached via account menu)
    profile/[username]/page.jsx public profile: streak, rank, solved counts
  components/
    Navbar.jsx                  gradient logo, search, notifications, streak, account avatar
    AccountMenu.jsx             dropdown from the avatar circle
    NotificationsMenu.jsx       dropdown from the bell icon
    SideRail.jsx                left icon rail: Problems, Explore, Study Paths, My Lists
    HeroCarousel.jsx            promo banner row above the problem list
    TopicChips.jsx              topic filter row with per-topic counts
    FormatTabs.jsx               All / Proof / Numerical toggle
    DifficultyBadge.jsx         Easy / Medium / Hard / Advanced pill
    FilterSidebar.jsx           difficulty, format, and topic checkboxes (list view filters)
    ProblemsTable.jsx           problem list rows
    ProblemStatement.jsx        renders statement text and any figures
    SubmissionEditor.jsx        proof/answer entry, image attachment, grading result
    PercentileAxis.jsx          score plotted on an axis with a percentile marker
    SimilarContestPicker.jsx    "have you seen a similar problem on a contest" prompt
    StreakCalendar.jsx          right-rail streak widget
    TrendingContests.jsx        right-rail panel of most-tagged contests
    Tabs.jsx                    small reusable tab bar
  data/
    problems.json                mock problem set, replace with the real bank
    contests.json                contests used only as reference tags, not a source
    topics.json                  topic taxonomy for filtering
    users.json                   mock signed-in user
  lib/
    percentile.js                percentile-rank scoring helpers

Data model notes

Problem carries difficulty (Easy/Medium/Hard/Advanced), format (Proof/Numerical), topics (array, multi-select filter), points (max score, meaningful mainly for Proof format), images (figures for geometry-style problems, read by the grading model's vision step when present in a submission too), and stats.

Submission (not yet a JSON file, wire up once a backend exists) should carry the submitted text, any attached images, a score out of the problem's points, and a percentile computed from lib/percentile.js against that problem's score distribution. Proof-format problems are graded on quality, not just correctness, so score is a partial-credit integer, never a boolean.

Contest tags are community-submitted links between a CoordBash problem and a real contest problem it resembles, gathered through SimilarContestPicker. They are display-only signal, never treated as the problem's source, since every problem here is original.

Next steps to wire up a real backend

  1. Replace the JSON files in src/data with API calls (REST or a database client), keeping the same shapes so the components need no changes.
  2. Point SubmissionEditor's handleSubmit at a real grading endpoint that accepts text and image attachments and returns a score plus written feedback.
  3. Add auth and swap the hardcoded users[0] in layout.jsx for the signed-in session.