+ );
+}
diff --git a/src/components/frq/feedback/fallBackData.ts b/src/components/frq/feedback/fallBackData.ts
new file mode 100644
index 00000000..73cff602
--- /dev/null
+++ b/src/components/frq/feedback/fallBackData.ts
@@ -0,0 +1,167 @@
+export const fallbackFeedbackData = {
+ name: "AP Human Geography FRQ 1",
+ creatorID: "1259823594",
+ mostRecentEditor: "1259823594",
+ id: "43281",
+ isVisible: true,
+ feedback: {
+ id: "47231",
+ graderId: "964923741",
+ submittedAt: "2026-07-13T18:30:00Z",
+ questions: [
+ {
+ questionId: "53213",
+ feedback: "",
+ gradingCriteria: [
+ {
+ criterionId: "59684",
+ points: 3,
+ },
+ {
+ criterionId: "85931",
+ points: 1,
+ },
+ ],
+ },
+ {
+ questionId: "53214",
+ feedback: "",
+ gradingCriteria: [
+ {
+ criterionId: "59685",
+ points: 1,
+ },
+ {
+ criterionId: "85930",
+ points: 1,
+ },
+ ],
+ },
+ {
+ questionId: "63213",
+ feedback: "",
+ gradingCriteria: [
+ {
+ criterionId: "69684",
+ points: 3,
+ },
+ {
+ criterionId: "75931",
+ points: 0,
+ },
+ ],
+ },
+ ],
+ },
+ response: {
+ id: "47231",
+ userId: "3749237134",
+ submittedAt: "2026-07-13T18:30:00Z",
+ answers: [
+ {
+ questionId: "53213",
+ value: "1-1 Answer",
+ },
+ {
+ questionId: "53214",
+ value: "1-2 Answer",
+ },
+ {
+ questionId: "63213",
+ value: "2-1 Answer",
+ },
+ ],
+ },
+ frqs: [
+ {
+ id: "12345",
+ name: "FRQ 1",
+ description: {
+ value:
+ "Choice A is incorrect. As $@x = 1$ is a vertical asymptote, the limit as the function approaches that value will not be a definite number, but some infinity. Choice B is incorrect. It is true that as the limit of a function approaches a vertical asymptote, it will approach an infinity. However, we can use simple numerical logic to guide and realize that $@\\displaystyle\\frac{0.9999}{0.9999^2 - 1}$ will be negative, since $@1^-$ indicates a quantity that is slightly smaller than 1. Choice C is correct. A vertical asymptote exists at $@x = 1$, so the one-sided limit will yield an infinite value. As $@x$ approaches $@1$ from the left of the function, the denominator approaches a very small negative value and the numerator is positive. This evaluates to a large negative number, indicating that the limit is $@-\\infty$. Choice D is incorrect. To some extent, it is true that if a limit approaches infinity, it is a case of DNE since it experiences unbounded change. HOWEVER, the convention will ALWAYS be to specify whether or not it is a $@\\pm \\infty$, which makes C a better answer.",
+ files: [],
+ },
+ isVisible: true,
+ questions: [
+ {
+ id: "53213",
+ name: "Question 1",
+ isVisible: true,
+ prompt: {
+ value: "This is a prompt for frq 1 question 1",
+ files: [],
+ },
+ answerType: "text",
+ gradingCriteria: [
+ {
+ id: "59684",
+ text: "Correct Grammar",
+ points: 4,
+ },
+ {
+ id: "85931",
+ text: "Mentions Demographics",
+ points: 2,
+ },
+ ],
+ },
+ {
+ id: "53214",
+ name: "Question 2",
+ isVisible: true,
+ prompt: {
+ value: "This is a prompt for frq 1 question 2",
+ files: [],
+ },
+ answerType: "text",
+ gradingCriteria: [
+ {
+ id: "59685",
+ text: "Correct Math",
+ points: 1,
+ },
+ {
+ id: "85930",
+ text: "Aura",
+ points: 2,
+ },
+ ],
+ },
+ ],
+ },
+ {
+ id: "95312",
+ name: "FRQ 2",
+ description: {
+ value:
+ "Choice A is incorrect. As $@x = 1$ is a vertical asymptote, the limit as the function approaches that value will not be a definite number, but some infinity. Choice B is incorrect. It is true that as the limit of a function approaches a vertical asymptote, it will approach an infinity. However, we can use simple numerical logic to guide and realize that $@\\displaystyle\\frac{0.9999}{0.9999^2 - 1}$ will be negative, since $@1^-$ indicates a quantity that is slightly smaller than 1. Choice C is correct. A vertical asymptote exists at $@x = 1$, so the one-sided limit will yield an infinite value. As $@x$ approaches $@1$ from the left of the function, the denominator approaches a very small negative value and the numerator is positive. This evaluates to a large negative number, indicating that the limit is $@-\\infty$.",
+ files: [],
+ },
+ isVisible: true,
+ questions: [
+ {
+ id: "63213",
+ name: "Question 1",
+ isVisible: true,
+ prompt: {
+ value: "This is a prompt for frq 2 question 1",
+ files: [],
+ },
+ answerType: "text",
+ gradingCriteria: [
+ {
+ id: "69684",
+ text: "Correct Grammar",
+ points: 4,
+ },
+ {
+ id: "75931",
+ text: "Mentions Demographics",
+ points: 2,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+};
diff --git a/src/components/frq/feedback/footer.tsx b/src/components/frq/feedback/footer.tsx
new file mode 100644
index 00000000..012f5eff
--- /dev/null
+++ b/src/components/frq/feedback/footer.tsx
@@ -0,0 +1,111 @@
+"use client";
+
+import { ChevronLeft, ChevronRight, ChevronUp, MapPin, X } from "lucide-react";
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/components/ui/popover";
+import { useState } from "react";
+
+interface FooterProps {
+ testName: string;
+ currentFrqIndex: number;
+ totalFrqs: number;
+ onPrevious: () => void;
+ onNext: () => void;
+ onJumpToFrq: (index: number) => void;
+}
+
+export default function Footer({
+ testName,
+ currentFrqIndex,
+ totalFrqs,
+ onPrevious,
+ onNext,
+ onJumpToFrq,
+}: FooterProps) {
+ const [navigationOpen, setNavigationOpen] = useState(false);
+
+ return (
+
+ );
+}
diff --git a/src/components/frq/feedback/header.tsx b/src/components/frq/feedback/header.tsx
new file mode 100644
index 00000000..8b2e8210
--- /dev/null
+++ b/src/components/frq/feedback/header.tsx
@@ -0,0 +1,22 @@
+import { LogOut } from "lucide-react";
+
+export default function Header({
+ earnedPoints,
+ totalPoints,
+}: {
+ earnedPoints: number;
+ totalPoints: number;
+}) {
+ return (
+
+