src/ ~8,000 lines

All application source code. Organized into four layers that depend only downward: UI consumes Context, Context calls Core and Data, Core and Data have no internal dependencies.

Entry
main.jsxApp.jsx
Children
context/, core/, data/, ui/

Children

Layer dependency rules

graph LR UI["ui/ (12 components)"] CTX["context/ (2 contexts)"] CORE["core/ (7 modules — pure)"] DATA["data/ (4 adapters — I/O only)"] UI -->|"usePlanner()\nuseTheme()"| CTX CTX -->|"pure fn calls"| CORE CTX -->|"async I/O"| DATA style UI fill:#ddf4ff,stroke:#0969da style CTX fill:#fbefff,stroke:#8250df style CORE fill:#dafbe1,stroke:#1a7f37 style DATA fill:#fff8c5,stroke:#9a6700
Import direction. Core never imports React; Data never imports Core.

Entry points: main.jsx + App.jsx

main.jsx is 4 lines — it mounts React in StrictMode and renders App.

App.jsx wraps the app in providers and computes the uiScale factor:

App() → JSX
Wraps everything in <ThemeProvider> then <PlannerProvider>. Inside those, PlannerApp renders the fixed-size shell and uses a ResizeObserver to compute uiScale = containerWidth / BASE_WIDTH. The entire app div receives transform: scale(uiScale) so all pixel values in components can be written at one canonical desktop size.

File inventory

FileLayerLinesPurpose
main.jsx4React root mount
App.jsx~60Provider wrapper + uiScale
context/PlannerContext.jsxContext~1,600All application state
context/ThemeContext.jsxContext~65CSS variable injection
core/gradRequirements.jsCore~500Graduation requirement checking
core/prereqEval.jsCore~80Prerequisite satisfaction
core/courseModel.jsCore~120Course normalization + edges
core/semGrid.jsCore~80Semester grid generation
core/planModel.jsCore~200Plan helpers + PDF export
core/themes.jsCore~160CSS variable token sets
core/constants.jsCore~100Global compile-time constants
data/courseLoader.jsData~30Fetch course catalog
data/majorLoader.jsData~50Fetch major/minor requirements
data/minorLoader.jsData~40Fetch minor requirements
data/persistence.jsData~30localStorage read/write
ui/Header.jsxUI~780Top bar: controls, plan management, settings
ui/BankPanel.jsxUI~850Course bank + grad panel sidebar
ui/GradPanel.jsxUI~1,000Graduation requirement tree UI
ui/SemRow.jsxUI~850Semester row (fall/spring/special)
ui/SummerRow.jsxUI~850Paired summer semester columns
ui/CourseCard.jsxUI~500Draggable course tile
ui/InfoPanel.jsxUI~400Bottom drawer for selected course
ui/RelationLines.jsxUI~100SVG overlay for prereq/coreq lines