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},