diff --git a/.changeset/fast-points-complain.md b/.changeset/fast-points-complain.md
new file mode 100644
index 00000000000..4f641e0fae6
--- /dev/null
+++ b/.changeset/fast-points-complain.md
@@ -0,0 +1,5 @@
+---
+"@khanacademy/perseus-editor": minor
+---
+
+Creation of new Vector Graph Editor
diff --git a/packages/perseus-editor/src/__testdata__/interactive-graph-question-builder.ts b/packages/perseus-editor/src/__testdata__/interactive-graph-question-builder.ts
index 2b4659217d6..18b7460be83 100644
--- a/packages/perseus-editor/src/__testdata__/interactive-graph-question-builder.ts
+++ b/packages/perseus-editor/src/__testdata__/interactive-graph-question-builder.ts
@@ -302,6 +302,14 @@ class InteractiveGraphQuestionBuilder {
return this;
}
+ withVector(options?: {
+ coords?: CollinearTuple;
+ startCoords?: CollinearTuple;
+ }): InteractiveGraphQuestionBuilder {
+ this.interactiveFigureConfig = new VectorGraphConfig(options);
+ return this;
+ }
+
withPolygon(
snapTo?: SnapTo,
options?: {
@@ -842,6 +850,30 @@ class ExponentialGraphConfig implements InteractiveFigureConfig {
}
}
+class VectorGraphConfig implements InteractiveFigureConfig {
+ private coords?: CollinearTuple;
+ private startCoords?: CollinearTuple;
+
+ constructor(options?: {
+ coords?: CollinearTuple;
+ startCoords?: CollinearTuple;
+ }) {
+ this.coords = options?.coords;
+ this.startCoords = options?.startCoords;
+ }
+
+ correct(): PerseusGraphType {
+ return {
+ type: "vector",
+ coords: this.coords,
+ };
+ }
+
+ graph(): PerseusGraphType {
+ return {type: "vector", startCoords: this.startCoords};
+ }
+}
+
class PolygonGraphConfig implements InteractiveFigureConfig {
private snapTo: SnapTo;
private match?: "similar" | "congruent" | "approx";
diff --git a/packages/perseus-editor/src/__testdata__/interactive-graph.testdata.ts b/packages/perseus-editor/src/__testdata__/interactive-graph.testdata.ts
index 5bcd723b3b4..4a23d3c0d0c 100644
--- a/packages/perseus-editor/src/__testdata__/interactive-graph.testdata.ts
+++ b/packages/perseus-editor/src/__testdata__/interactive-graph.testdata.ts
@@ -157,6 +157,9 @@ export const sinusoidMinimalQuestion: PerseusRenderer =
export const exponentialMinimalQuestion: PerseusRenderer =
interactiveGraphQuestionBuilder().withExponential().build();
+export const vectorMinimalQuestion: PerseusRenderer =
+ interactiveGraphQuestionBuilder().withVector().build();
+
export const segmentWithLockedFigures: PerseusRenderer =
interactiveGraphQuestionBuilder()
.addLockedPointAt(-7, -7, {labels: [{text: "A"}], ariaLabel: "Point A"})
diff --git a/packages/perseus-editor/src/widgets/__docs__/interactive-graph-editor.stories.tsx b/packages/perseus-editor/src/widgets/__docs__/interactive-graph-editor.stories.tsx
index f268dd9d628..6f65294e40f 100644
--- a/packages/perseus-editor/src/widgets/__docs__/interactive-graph-editor.stories.tsx
+++ b/packages/perseus-editor/src/widgets/__docs__/interactive-graph-editor.stories.tsx
@@ -27,6 +27,7 @@ import {
segmentWithLockedFigures,
segmentWithStartingCoordsQuestion,
exponentialMinimalQuestion,
+ vectorMinimalQuestion,
sinusoidMinimalQuestion,
sinusoidWithStartingCoordsAndPiTicksQuestion,
unlimitedPolygonWithCorrectAnswerQuestion,
@@ -121,6 +122,10 @@ export const InteractiveGraphExponential = (): React.ReactElement => {
);
};
+export const InteractiveGraphVector = (): React.ReactElement => {
+ return ;
+};
+
export const InteractiveGraphSinusoid = (): React.ReactElement => {
return (
diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/components/graph-type-selector.tsx b/packages/perseus-editor/src/widgets/interactive-graph-editor/components/graph-type-selector.tsx
index bbb8324530b..1cd7e3166ab 100644
--- a/packages/perseus-editor/src/widgets/interactive-graph-editor/components/graph-type-selector.tsx
+++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/components/graph-type-selector.tsx
@@ -29,6 +29,11 @@ const GraphTypeSelector = (props: GraphTypeSelectorProps) => {
"interactive-graph-tangent",
);
+ const showVector = isFeatureOn(
+ {apiOptions: props.apiOptions},
+ "interactive-graph-vector",
+ );
+
return (
{
+ {showVector && }
);
diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/start-coords-settings.tsx b/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/start-coords-settings.tsx
index d4a6e57c81b..6576a207b38 100644
--- a/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/start-coords-settings.tsx
+++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/start-coords-settings.tsx
@@ -11,6 +11,7 @@ import {
getSegmentCoords,
getSinusoidCoords,
getTangentCoords,
+ getVectorCoords,
} from "@khanacademy/perseus";
import Button from "@khanacademy/wonder-blocks-button";
import {View} from "@khanacademy/wonder-blocks-core";
@@ -124,6 +125,15 @@ const StartCoordsSettingsInner = (props: Props) => {
/>
);
}
+ case "vector": {
+ const vectorCoords = getVectorCoords(props, range, step);
+ return (
+
+ );
+ }
case "tangent":
const tangentCoords = getTangentCoords(props, range, step);
return (
diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/types.ts b/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/types.ts
index 144613b0c59..20315622aa1 100644
--- a/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/types.ts
+++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/types.ts
@@ -13,7 +13,8 @@ type GraphTypesThatHaveStartCoords =
| {type: "segment"}
| {type: "sinusoid"}
| {type: "exponential"}
- | {type: "tangent"};
+ | {type: "tangent"}
+ | {type: "vector"};
export type StartCoords = Extract<
PerseusGraphType,
diff --git a/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/util.ts b/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/util.ts
index d527e9f82f5..ece0c4f47a7 100644
--- a/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/util.ts
+++ b/packages/perseus-editor/src/widgets/interactive-graph-editor/start-coords/util.ts
@@ -12,6 +12,7 @@ import {
getSegmentCoords,
getSinusoidCoords,
getTangentCoords,
+ getVectorCoords,
} from "@khanacademy/perseus";
import {UnreachableCaseError} from "@khanacademy/wonder-stuff-core";
@@ -46,6 +47,12 @@ export function getDefaultGraphStartCoords(
range,
step,
);
+ case "vector":
+ return getVectorCoords(
+ {...graph, startCoords: undefined},
+ range,
+ step,
+ );
case "segment":
return getSegmentCoords(
{...graph, startCoords: undefined},