diff --git a/app/(pages)/judges/(app)/_components/Projects/ExpandedMapModal.tsx b/app/(pages)/judges/(app)/_components/Projects/ExpandedMapModal.tsx new file mode 100644 index 000000000..6d60631e4 --- /dev/null +++ b/app/(pages)/judges/(app)/_components/Projects/ExpandedMapModal.tsx @@ -0,0 +1,83 @@ +import Image from 'next/image'; +import closeIcon from '@public/judges/projects/x.svg'; +import venueMap from '@public/judges/projects/venueMap2026.svg'; +import { TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch'; + +export default function ExpandedMapModal({ + setMapExpanded, +}: { + setMapExpanded: (expanded: boolean) => void; +}) { + return ( +
setMapExpanded(false)} + > +
e.stopPropagation()} + > + + + + {() => ( + +
+
+ first floor map +
+
+
+ )} +
+
+
+ ); +} diff --git a/app/(pages)/judges/(app)/_components/Projects/ReportModal.module.scss b/app/(pages)/judges/(app)/_components/Projects/ReportModal.module.scss deleted file mode 100644 index 6bcc88710..000000000 --- a/app/(pages)/judges/(app)/_components/Projects/ReportModal.module.scss +++ /dev/null @@ -1,55 +0,0 @@ -.background_container { - position: fixed; - left: 0; - right: 0; - top: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.1); - display: flex; - align-items: center; - justify-content: center; - padding: 24px; - - &.hidden { - display: none; - } -} - -.container { - width: 100%; - max-width: 400px; - border-radius: 16px; - background: #FFF; - box-shadow: 0px 4px 16px 0px rgba(205, 205, 205, 0.25); - display: flex; - flex-direction: column; - padding: 24px; -} - -.close_button { - align-self: flex-end; - cursor: pointer; - - .exit_button { - font-size: 1.5rem; - } -} - -.success_container, .error_container { - display: flex; - flex-direction: column; - gap: 16px; - - .ack_button { - display: flex; - justify-content: center; - align-items: center; - padding: 15px 32px; - border-radius: 8px; - background: #005271; - color: white; - font-weight: 600; - cursor: pointer; - } - -} \ No newline at end of file diff --git a/app/(pages)/judges/(app)/_components/Projects/ReportModal.tsx b/app/(pages)/judges/(app)/_components/Projects/ReportModal.tsx deleted file mode 100644 index f8d442b9b..000000000 --- a/app/(pages)/judges/(app)/_components/Projects/ReportModal.tsx +++ /dev/null @@ -1,66 +0,0 @@ -'use client'; - -import Loader from '@pages/_components/Loader/Loader'; -import styles from './ReportModal.module.scss'; -import { RxCross2 } from 'react-icons/rx'; - -interface ReportModalProps { - modalStage: 'hidden' | 'loading' | 'error' | 'success'; - setModalStage: React.Dispatch< - React.SetStateAction<'hidden' | 'loading' | 'error' | 'success'> - >; - errorMsg: string | null; -} - -export default function ReportModal({ - modalStage, - setModalStage, - errorMsg, -}: ReportModalProps) { - const loadingContent = ; - - const successContent = ( -
-

Team successfully reported!

-
setModalStage('hidden')} - > - Back to judging -
-
- ); - - const errorContent = ( -
-

Something went wrong.

-

{errorMsg}

-
- ); - - const content: { - [state: string]: React.ReactNode; - } = { - loading: loadingContent, - success: successContent, - error: errorContent, - }; - - return ( -
-
-
setModalStage('hidden')} - > - -
- {content[modalStage]} -
-
- ); -} diff --git a/app/(pages)/judges/(app)/_components/Projects/ReportTeamModal.tsx b/app/(pages)/judges/(app)/_components/Projects/ReportTeamModal.tsx new file mode 100644 index 000000000..9be16dd93 --- /dev/null +++ b/app/(pages)/judges/(app)/_components/Projects/ReportTeamModal.tsx @@ -0,0 +1,98 @@ +import Image from 'next/image'; +import type { Dispatch, SetStateAction } from 'react'; +import Team from '@typeDefs/team'; +import ProjectTab from './ProjectTab'; + +import closeIcon from '@public/judges/projects/x.svg'; +import missingTeams from '@public/judges/projects/missingTeams.svg'; +import whiteArrow from '@public/judges/projects/whiteArrow.svg'; + +type ModalStage = 'hidden' | 'loading' | 'success' | 'error'; + +export default function ReportTeamModal({ + currentTeam, + setExpandReportButton, + handleTeamReport, + modalStage, + setModalStage, + errorMsg, +}: { + currentTeam: Team; + setExpandReportButton: (expand: boolean) => void; + handleTeamReport: (team: Team) => void | Promise; + modalStage: ModalStage; + setModalStage: Dispatch>; + errorMsg: string | null; +}) { + const isLoading = modalStage === 'loading'; + const isError = modalStage === 'error'; + + return ( +
+
+ {/* X button */} + + + {/* Image */} +
+ Missing Teams +
+ + {/* Content */} +
+ {/* Team pill */} + + + {/* Confirmation text */} +
+

+ Are you sure this team is + missing? +

+

+ By flagging this team as missing, it will be placed in the Missing + Teams section of your dashboard. +

+
+ + {/* Confirm button */} + + + {isError && errorMsg && ( +

{errorMsg}

+ )} +
+
+
+ ); +} diff --git a/app/(pages)/judges/(app)/_components/Projects/UnscoredPage.tsx b/app/(pages)/judges/(app)/_components/Projects/UnscoredPage.tsx index 5cc23d890..c5bdb9e27 100644 --- a/app/(pages)/judges/(app)/_components/Projects/UnscoredPage.tsx +++ b/app/(pages)/judges/(app)/_components/Projects/UnscoredPage.tsx @@ -5,13 +5,13 @@ import { useSession } from 'next-auth/react'; import ProjectTab from './ProjectTab'; import Team from '@typeDefs/team'; import { reportMissingProject } from '@actions/teams/reportMissingTeam'; -import ReportModal from './ReportModal'; import EmptyState from './EmptyState'; import { FaChevronRight } from 'react-icons/fa6'; import { IoExpandOutline } from 'react-icons/io5'; import venueMap from '@public/judges/projects/venueMap2026.svg'; -import closeIcon from '@public/judges/projects/x.svg'; +import ExpandedMapModal from './ExpandedMapModal'; +import ReportTeamModal from './ReportTeamModal'; interface UnscoredPageProps { teams: Team[]; @@ -52,10 +52,10 @@ export default function UnscoredPage({ setModalStage('error'); } else { setErrorMsg(null); - setModalStage('success'); revalidateData(); + setExpandReportButton(false); + setModalStage('hidden'); } - setExpandReportButton(false); }; return ( @@ -71,7 +71,6 @@ export default function UnscoredPage({ Projects must be judged in order one by one order.

- {/* To-score Project Button */} - {/* Map card */}
-
+
setMapExpanded(true)} + > first floor map
- {/* Flag section */}

@@ -110,37 +108,28 @@ export default function UnscoredPage({ red button{' '} below.

- - {/* TODO: TURN INTO POPUP */} - {expandReportButton ? ( - <> -
- Are you sure? -
-
- - -
- - ) : ( - - )} +
+ {/* Missing Team Modal Overlay */} + {expandReportButton && ( + + )}
{/* Next up */} @@ -158,41 +147,7 @@ export default function UnscoredPage({ )} {/* Expanded Map Modal */} - {mapExpanded && ( -
setMapExpanded(false)} - > -
e.stopPropagation()} - > - - -
-
- first floor map -
-
-
-
- )} - - + {mapExpanded && } ); diff --git a/package-lock.json b/package-lock.json index 480390194..83d1639f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,6 +51,7 @@ "react-chartjs-2": "^5.3.0", "react-dom": "^19.1.1", "react-icons": "^4.12.0", + "react-zoom-pan-pinch": "^4.0.3", "sass": "^1.69.5", "sharp": "^0.33.5", "tailwind-merge": "^2.6.1", @@ -3605,18 +3606,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -5070,17 +5059,6 @@ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "license": "MIT" }, - "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.8.tgz", - "integrity": "sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==", - "license": "MIT", - "optional": true, - "peer": true, - "peerDependencies": { - "acorn": "^8.9.0" - } - }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -5201,14 +5179,6 @@ "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "license": "MIT" }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -5787,138 +5757,6 @@ "node": ">= 20" } }, - "node_modules/@vue/compiler-core": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.27.tgz", - "integrity": "sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/shared": "3.5.27", - "entities": "^7.0.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-core/node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz", - "integrity": "sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vue/compiler-core": "3.5.27", - "@vue/shared": "3.5.27" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz", - "integrity": "sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/compiler-core": "3.5.27", - "@vue/compiler-dom": "3.5.27", - "@vue/compiler-ssr": "3.5.27", - "@vue/shared": "3.5.27", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz", - "integrity": "sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.5.27", - "@vue/shared": "3.5.27" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.27.tgz", - "integrity": "sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vue/shared": "3.5.27" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.27.tgz", - "integrity": "sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vue/reactivity": "3.5.27", - "@vue/shared": "3.5.27" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.27.tgz", - "integrity": "sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vue/reactivity": "3.5.27", - "@vue/runtime-core": "3.5.27", - "@vue/shared": "3.5.27", - "csstype": "^3.2.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.27.tgz", - "integrity": "sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vue/compiler-ssr": "3.5.27", - "@vue/shared": "3.5.27" - }, - "peerDependencies": { - "vue": "3.5.27" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.27.tgz", - "integrity": "sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", @@ -6100,7 +5938,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -6384,7 +6222,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "engines": { "node": ">= 0.4" @@ -7652,14 +7490,6 @@ "node": ">=8" } }, - "node_modules/devalue": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", - "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -9331,14 +9161,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esm-env": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", - "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -9384,17 +9206,6 @@ "node": ">=0.10" } }, - "node_modules/esrap": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.2.tgz", - "integrity": "sha512-zA6497ha+qKvoWIK+WM9NAh5ni17sKZKhbS5B3PoYbBvaYHZWoS33zmFybmyqpn07RLUxSmn+RCls2/XF+d0oQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -9418,14 +9229,6 @@ "node": ">=4.0" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -10760,17 +10563,6 @@ "node": ">=8" } }, - "node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/estree": "^1.0.6" - } - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -12485,14 +12277,6 @@ "node": ">=18" } }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -12622,17 +12406,6 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -14643,6 +14416,20 @@ "react-dom": ">=16.8.0" } }, + "node_modules/react-zoom-pan-pinch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-4.0.3.tgz", + "integrity": "sha512-N2Hi6L78fFmhRra+ORpFSW7WST5x6kxpOPplIvtB0b7b+U2anpo1z1wLgaWRPS2kUSqcraRG+JgBCIlDJnqqAg==", + "license": "MIT", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -16042,34 +15829,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svelte": { - "version": "5.49.1", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.49.1.tgz", - "integrity": "sha512-jj95WnbKbXsXXngYj28a4zx8jeZx50CN/J4r0CEeax2pbfdsETv/J1K8V9Hbu3DCXnpHz5qAikICuxEooi7eNQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "@jridgewell/sourcemap-codec": "^1.5.0", - "@sveltejs/acorn-typescript": "^1.0.5", - "@types/estree": "^1.0.5", - "acorn": "^8.12.1", - "aria-query": "^5.3.1", - "axobject-query": "^4.1.0", - "clsx": "^2.1.1", - "devalue": "^5.6.2", - "esm-env": "^1.2.1", - "esrap": "^2.2.2", - "is-reference": "^3.0.3", - "locate-character": "^3.0.0", - "magic-string": "^0.30.11", - "zimmerframe": "^1.1.2" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/synckit": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", @@ -16955,29 +16714,6 @@ "spdx-expression-parse": "^3.0.0" } }, - "node_modules/vue": { - "version": "3.5.27", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.27.tgz", - "integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@vue/compiler-dom": "3.5.27", - "@vue/compiler-sfc": "3.5.27", - "@vue/runtime-dom": "3.5.27", - "@vue/server-renderer": "3.5.27", - "@vue/shared": "3.5.27" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -17433,14 +17169,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zimmerframe": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", - "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", diff --git a/package.json b/package.json index 7c41719f3..801147abf 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,7 @@ "react-chartjs-2": "^5.3.0", "react-dom": "^19.1.1", "react-icons": "^4.12.0", + "react-zoom-pan-pinch": "^4.0.3", "sass": "^1.69.5", "sharp": "^0.33.5", "tailwind-merge": "^2.6.1", diff --git a/public/judges/projects/missingTeams.svg b/public/judges/projects/missingTeams.svg new file mode 100644 index 000000000..c01295568 --- /dev/null +++ b/public/judges/projects/missingTeams.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/judges/projects/whiteArrow.svg b/public/judges/projects/whiteArrow.svg new file mode 100644 index 000000000..0a62b9a61 --- /dev/null +++ b/public/judges/projects/whiteArrow.svg @@ -0,0 +1,3 @@ + + +