├── .prettierignore ├── .gitignore ├── src ├── components │ ├── GetStarted.css │ ├── SearchResult.css │ ├── IndexSelector.css │ ├── App.css │ ├── IconLink.css │ ├── BorderlessButton.css │ ├── ClassSubCell.css │ ├── App.tsx │ ├── BorderlessButton.tsx │ ├── Main.css │ ├── ScheduleActions.css │ ├── QuestImporter.css │ ├── ClassListItem.css │ ├── IconLink.tsx │ ├── TopArea.css │ ├── Footer.css │ ├── GetStarted.tsx │ ├── UWFlowLink.tsx │ ├── SearchResult.tsx │ ├── Popup.css │ ├── IndexSelector.tsx │ ├── Popup.tsx │ ├── CourseSearch.css │ ├── TopArea.tsx │ ├── Footer.tsx │ ├── ClassList.tsx │ ├── ColumnCell.tsx │ ├── ColumnCell.css │ ├── QuestImporter.tsx │ ├── ScheduleGrid.css │ ├── ScheduleActions.tsx │ ├── ClassListItem.tsx │ ├── ClassSubCell.tsx │ ├── ScheduleGrid.tsx │ ├── Main.tsx │ └── CourseSearch.tsx ├── icons │ ├── OverlapIcon.css │ ├── style.css │ ├── ExpandIcon.tsx │ ├── CollapseIcon.tsx │ ├── CloseIcon.tsx │ ├── ImportIcon.tsx │ ├── AddIcon.tsx │ ├── UWFlowIcon.tsx │ ├── DeleteIcon.tsx │ ├── CloneIcon.tsx │ ├── MaximizeIcon.tsx │ ├── MinimizeIcon.tsx │ ├── PrintIcon.tsx │ ├── DarkIcon.tsx │ ├── GitHubIcon.tsx │ ├── OverlapIcon.tsx │ └── LightIcon.tsx ├── data │ ├── StoredClass.ts │ ├── LoadingStatus.ts │ ├── NamedCourse.ts │ ├── ClassTime.ts │ ├── ScheduleSlot.ts │ ├── ClassDate.ts │ ├── ArrayWithSelected.ts │ ├── Course.ts │ ├── OfferingsParser.ts │ ├── Class.ts │ ├── UWParser.ts │ ├── Session.ts │ ├── Importer.ts │ ├── ClassSlot.ts │ ├── CourseInfoParser.ts │ └── Schedule.tsx ├── main.tsx ├── helpers │ ├── UseConfigBoolean.ts │ ├── UseRemainingHeight.ts │ ├── UseClassList.ts │ └── UseClassListStore.ts └── index.css ├── public ├── logo.png └── logo.svg ├── vite.config.ts ├── tsconfig.node.json ├── index.html ├── tsconfig.json ├── .eslintrc.cjs ├── README.md ├── package.json └── server.js /.prettierignore: -------------------------------------------------------------------------------- 1 | dist -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /src/components/GetStarted.css: -------------------------------------------------------------------------------- 1 | #main-title { 2 | margin-top: 0; 3 | } 4 | -------------------------------------------------------------------------------- /src/icons/OverlapIcon.css: -------------------------------------------------------------------------------- 1 | .alert { 2 | color: var(--alert); 3 | } 4 | -------------------------------------------------------------------------------- /src/components/SearchResult.css: -------------------------------------------------------------------------------- 1 | .search-result { 2 | cursor: pointer; 3 | } 4 | -------------------------------------------------------------------------------- /src/components/IndexSelector.css: -------------------------------------------------------------------------------- 1 | .selected-button { 2 | color: var(--link); 3 | } 4 | -------------------------------------------------------------------------------- /public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BrandonXLF/wisp-standalone/main/public/logo.png -------------------------------------------------------------------------------- /src/components/App.css: -------------------------------------------------------------------------------- 1 | #container { 2 | display: flex; 3 | flex-direction: column; 4 | height: 100%; 5 | } 6 | -------------------------------------------------------------------------------- /src/data/StoredClass.ts: -------------------------------------------------------------------------------- 1 | type StoredClass = [string, string, string]; 2 | 3 | export default StoredClass; 4 | -------------------------------------------------------------------------------- /src/data/LoadingStatus.ts: -------------------------------------------------------------------------------- 1 | enum LoadingStatus { 2 | Loading, 3 | Ready, 4 | Error 5 | } 6 | 7 | export default LoadingStatus; 8 | -------------------------------------------------------------------------------- /src/components/IconLink.css: -------------------------------------------------------------------------------- 1 | .icon-link { 2 | white-space: nowrap; 3 | } 4 | 5 | .icon-link svg { 6 | padding-right: 0.2em; 7 | } 8 | -------------------------------------------------------------------------------- /src/components/BorderlessButton.css: -------------------------------------------------------------------------------- 1 | .borderless-btn { 2 | border: none; 3 | background: none; 4 | padding: 0; 5 | font-size: inherit; 6 | cursor: pointer; 7 | } 8 | -------------------------------------------------------------------------------- /src/icons/style.css: -------------------------------------------------------------------------------- 1 | .icon { 2 | height: 1em; 3 | vertical-align: text-bottom; 4 | stroke-linecap: round; 5 | stroke-linejoin: round; 6 | stroke: currentColor; 7 | fill: none; 8 | stroke-width: 2.5; 9 | } 10 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import react from '@vitejs/plugin-react-swc'; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | base: './', 7 | plugins: [react()] 8 | }); 9 | -------------------------------------------------------------------------------- /src/components/ClassSubCell.css: -------------------------------------------------------------------------------- 1 | .expanded-content:not(:last-child) { 2 | padding-bottom: 8px; 3 | } 4 | 5 | .slot-top span[tabIndex] { 6 | cursor: pointer; 7 | user-select: none; 8 | } 9 | 10 | .course-code { 11 | font-weight: bold; 12 | } 13 | -------------------------------------------------------------------------------- /src/components/App.tsx: -------------------------------------------------------------------------------- 1 | import './App.css'; 2 | import Footer from './Footer'; 3 | import Main from './Main'; 4 | 5 | export default function App() { 6 | return ( 7 |
8 | See how different courses offered at the University of Waterloo fit into 9 | your class schedule. 10 |
11 |To get started, search for courses to add to your schedule.
12 |
26 |