Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
83bed56
feat: scaffold Vite/React landing page and timetable UI
Anay0305 Jun 13, 2026
a9f6cd5
feat: split batch selector into Year / Stream / Batch dropdowns
Anay0305 Jun 13, 2026
65fc6fc
feat: fetch batch list from backend with local fallback
Anay0305 Jun 13, 2026
c09af30
feat: searchable batch dropdowns, MLSC favicon, 1st-year stream order
Anay0305 Jun 13, 2026
132526d
feat: custom Combobox replaces native <datalist> dropdowns
Anay0305 Jun 13, 2026
2b19bbc
ux(BatchSelector): hold final batch selection ~1s before navigating
Anay0305 Jun 13, 2026
074ebe1
ux(BatchSelector): show spinner+label during the 1s pre-navigation hold
Anay0305 Jun 13, 2026
a67d44c
responsive(landing): show logo in header on mobile, hide left panel
Anay0305 Jun 13, 2026
3b7fa81
fix(landing): re-center MLSC TIMETABLE tagline on desktop
Anay0305 Jun 13, 2026
f692f02
responsive(landing): unify breakpoint at 768px so body logo hides wit…
Anay0305 Jun 13, 2026
218f204
fix(landing): move responsive @media block after base rules so it wins
Anay0305 Jun 13, 2026
6456e7d
responsive(landing): switch breakpoint 768px -> 720px
Anay0305 Jun 13, 2026
2b8b40f
responsive(landing): bump header logo to 56px on mobile
Anay0305 Jun 13, 2026
19186c5
responsive(landing): tighter .main padding+gap on mobile
Anay0305 Jun 13, 2026
a20cf87
responsive(footer): icon-only socials with hover tooltip below 628px
Anay0305 Jun 13, 2026
abd125e
responsive(navbar): hide MLSC logo from bottom pill below 440px
Anay0305 Jun 13, 2026
83bb1bf
style(footer): drop bottom padding
Anay0305 Jun 13, 2026
68d4e5d
fix(layout): drop body padding-bottom hook so footer ends at viewport
Anay0305 Jun 13, 2026
dc661df
style(footer/navbar): vertically center the floating pill within the …
Anay0305 Jun 13, 2026
f2d3f30
feat(timetable): collapsible bottom nav + responsive top header
Anay0305 Jun 14, 2026
edef187
feat(timetable): gate collapsible nav to <=848px and fix touch auto-c…
Anay0305 Jun 14, 2026
798319a
feat(timetable): smooth transition between toggle and full nav
Anay0305 Jun 14, 2026
61b7b0f
fix(timetable): hide inactive nav element instead of stacking it
Anay0305 Jun 14, 2026
9e48387
feat(timetable): vertical slide between toggle and pill
Anay0305 Jun 14, 2026
16e846e
feat(timetable): pill pops out of and back into the arrow
Anay0305 Jun 14, 2026
9df98e2
feat(timetable): close on outside click + slower close animation
Anay0305 Jun 14, 2026
c45a10b
style(timetable): match opening pop duration to closing duration
Anay0305 Jun 14, 2026
135e894
style(timetable): circular toggle with three-dot menu icon
Anay0305 Jun 14, 2026
3b778ec
feat(landing): dynamic sem label + institute affiliation, subtler nav…
Anay0305 Jun 14, 2026
855dd48
style(landing): merge title and sem onto one line
Anay0305 Jun 14, 2026
e4031e7
feat(landing): derive repo link from GITHUB_REPO env
Anay0305 Jun 14, 2026
8b5707f
style(navbar): subtle hover + tooltips on landing nav
Anay0305 Jun 14, 2026
586e014
fix(timetable): add tooltip wrappers on theme and profile buttons
Anay0305 Jun 14, 2026
ab79634
chore: strip navbar and footer to placeholders for handoff
Anay0305 Jun 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Copy this file to .env and fill in the values.
# Used by vite.config.js to power the dev-only /api/contributors endpoint.

# Required: GitHub repo in "owner/name" form to fetch contributors from.
GITHUB_REPO=MicrosoftStudentChapter/mlsc-timetable

# Optional: personal access token to avoid the 60 req/hr unauthenticated rate limit.
# Use a fine-grained token with read-only "public repo" access. Keep in .env.local.
# GITHUB_TOKEN=your_token_here

# Base URL of the timetable backend. The frontend will GET ${VITE_BACKEND_URL}/batch
# for the flat batch list and group it client-side. If unset or unreachable, the
# frontend falls back to src/data/batches.json. Must use the VITE_ prefix so it
# is exposed to the browser.
VITE_BACKEND_URL=http://localhost:8000
57 changes: 57 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

# Dependencies
node_modules
.pnp
.pnp.js

# Build output
dist
dist-ssr
build
out
*.local

# Vite cache
.vite

# Environment variables (never commit secrets)
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
.env.*.local

# Coverage / test output
coverage
*.lcov
.nyc_output

# Deployment / hosting
.vercel
.netlify

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
Thumbs.db
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

# OS files
.DS_Store?
ehthumbs.db
Icon?
21 changes: 21 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import { defineConfig, globalIgnores } from 'eslint/config'

export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{js,jsx}'],
extends: [
js.configs.recommended,
reactHooks.configs.flat.recommended,
reactRefresh.configs.vite,
],
languageOptions: {
globals: globals.browser,
parserOptions: { ecmaFeatures: { jsx: true } },
},
},
])
13 changes: 13 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/png" href="/MLSC-logo.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MLSC Timetable</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
Loading