Marking as you go: tap the ★ on any panel you are happy with to mark it best in class. The bar at the top is how much of the house style is signed off. A ⚑ flag says "this one is wrong"; a star says "this one is finished" ; they are separate on purpose, because one is a worklist and the other is a readiness number.
Every figure helper in the shared kit, rendered live from remix_lib/kit.js using the examples in remix_lib/figure_registry.json. Nothing is hand-drawn, so a panel cannot drift from the helper it documents. Grid panels are generated from remix_lib/grid_standards.json, the same file the grid gates read. Owner: print at 100% on A4 and check every figure prints clearly, especially that gridlines are dark enough to see and draw on. Tell me the number of any that prints faint or wrong. We render ONE house style for every board (your standing decision that the Edexcel grid weight and colours are the standard throughout), so grid_standards.json's per-board tier counts are reference data about the real papers, not what we draw. Panels marked house style differs from some real papers are the deliberate divergences and are worth your eye. Checking labels behave: open a card's Stress test strip. Rather than a random remix, each helper carries a fixed, deliberately awkward spread — the longest labels, the narrowest angles, empty input — because collisions happen at extremes, not at random values, and a fixed case can go into the visual baseline so a fix can never silently come undone. Author agent: find your figure here BEFORE drawing one. A figure with no entry is where a new helper gets proposed, not where a one-off gets invented. Amber-outlined cards are measured by the student and must declare a physical mm width.
Grid standard in force
tier
colour
rgb
weight drawn
Edexcel measured
minor (every square)
#bdbcbc
rgb(189, 188, 188)
0.5u
0.5pt = 0.176mm
major (5th)
#bdbcbc
rgb(189, 188, 188)
1u
1pt = 0.352mm
10th / axis
#bdbcbc
rgb(189, 188, 188)
1.5u
1.5pt = 0.528mm
Colours and the 1:2:3 weight ratio are vector-measured from real Edexcel question papers
(reference/edexcel_grid_calibration.json; 12 lattice figures across 8 papers, 757 strokes).
The two weight columns are not the same thing: the drawn weight is in SVG user units, so what it
prints at depends on each figure's own resolution; the Edexcel column is the physical target on paper.
Each grid panel below reports what it actually drew, measured from its own SVG.
No gallery panel declares a physical width, so none of them can be ruler-checked against the mm
column — a real remix paper can, because its construction grids are mm-pinned.
Open flags on this page
Question figures — drawn in the question the student reads
1bearingFig
A bearing from one point to another: dashed north line with an arrowhead, the clockwise arc, and the three-figure angle.
Four-quadrant coordinate grid: axes THROUGH the origin with arrowheads, an O at the origin, italic x and y at the arrow tips, and one gridline per unit. This is the transformations/coordinates grid.
Use when: ANY question that plots points or moves a shape: transformations, coordinates, vectors on a grid, describing a translation. NOT for a graph with axes at the edge ; that is plotGrid.
The 'm x m block of unit squares plus one extra square touching each of its 4 corners' sequence archetype (AQA-style pattern-count questions), as unit-square rects. Returns SVG INNARDS, not a finished figure, so it composes with other ink; the registry records that with `fragment`.
Use when: A pattern-sequence question built from this specific corner-touching-squares shape (small reference icons AND/OR a student-drawn pattern on a grid).
Replaces: raw <polygon> faces with hand-computed isometric offsets
7cylinderSolid
Cylinder in line art, upright or on its side, SCALED from its real diameter and height. Dimensions via dimLine, so a label can never sit on the line it measures.
Use when: Any cylinder: volume, surface area, capacity, a plan/elevation source solid.
Replaces: hand-rolled cylinder outlines across 7 question files and 6 solution modules
8formulaBox
The bordered 'you are given' formula panel. Every part positioned from MEASURED text width, and its mini diagrams drawn by the real solid helpers so the icon and the question figure cannot drift apart.
Use when: A question that supplies a volume/area formula beside its solid.
formulaBox({x, y, rows:[{text, frac:[n,d], tail, icon}], fs, w, labelIcons})
cone + sphere
formulaBox({"x":10,"y":14,"rows":[{"text":"Volume of a cone =","frac":[1,3],"tail":"πr²h","icon":"cone"},{"text":"Volume of a sphere =","frac":[4,3],"tail":"πr³","icon":"sphere"}]})
cylinder + hemisphere
formulaBox({"x":10,"y":14,"rows":[{"text":"Volume of a cylinder =","tail":"πr²h","icon":"cylinder"},{"text":"Volume of a hemisphere =","frac":[2,3],"tail":"πr³","icon":"hemisphere"}]})
no icons
formulaBox({"x":10,"y":14,"rows":[{"text":"Volume of a cylinder =","tail":"πr²h"},{"text":"Curved surface area =","tail":"2πrh"}]})
stress: very long formula text
formulaBox({"x":10,"y":14,"rows":[{"text":"Volume of a frustum of a cone =","frac":[1,3],"tail":"πh(R²+Rr+r²)","icon":"cone"}]})
Replaces: hand-rolled formula panels at 8 sites, all positioned with tuned per-word x offsets
9freqTree2
Two-level frequency tree: root count splits into two branches, each into two leaves, every node a labelled circle holding a COUNT (never a branch fraction — that's probTree2).
Use when: "Complete the frequency tree" questions with counts (not probabilities) at every node.
Half cylinder open along its axis: a trough/gutter/half-pipe. Semicircular cross-section extruded back-right, opaque front end face.
Use when: Volume or surface area of a trough, gutter or half-pipe. NOT cylinderSolid({horizontal:true}) ; that projection cannot show a cut along the axis.
Arrowed x and y axes with NO grid: the coordinate figure a paper DRAWS FOR you rather than one the student plots on. Returns {s,X,Y,W,H} so the caller adds its own ink in data coordinates and wraps it, which is what lets it compose with a circle, a curve or a tangent in one picture.
Use when: Any 'the diagram shows' coordinate figure that is NOT drawn on graph paper: a sketched curve, a circle centred at the origin, a tangent meeting the axes, a region between lines. NO GRID DOES NOT MEAN NO PENCIL: ocr-jun2024-p5h Q22 is @drawnOn yes and graphspec-registered, because the student sketches a curve freehand onto blank axes. Judge @drawnOn by whether the student marks the figure, not by whether it has squares; only reach for svgWrapMM when something on it is MEASURED.
Replaces: hand-typed <polygon> arrowheads on a pair of axis <line>s, with the x/y/O labels placed by eye
14sphereSolid
Sphere, bowl or dome in LINE ART (owner ruling M119), scaled from its real diameter. Equator drawn front-solid/back-dashed so a sphere does not read as a flat circle.
Use when: Any sphere/hemisphere: volume, surface area, a composite solid's cap.
Replaces: hand-rolled spheres/hemispheres across 13 question files and 13 solution modules; the grey-shaded 3D spheres of edexcel-jun2019-p1h Q12
15pyramidSolid
Square-based (or triangular) pyramid in 45-degree oblique projection, matching the boards own convention: parallelogram base, apex over the centre, hidden back edges dashed.
Use when: A reference/naming pyramid figure (faces/edges/vertices, nets, volume).
A vertical list of empty tick boxes with their option text, in the board's tick-a-box style.
Use when: A question asking the student to TICK a box. A circle/tick/choose MCQ is print-broken on a worksheet unless its options actually render, which is what this helper does.
A bordered box of GIVEN information (a recipe, a price list, a set of facts). Hugs its content; the box position and the text alignment inside it are set separately.
Use when: Any block of given data the student reads but does not write in. `align` positions the BOX, `textAlign` aligns the LINES inside it (owner M139: an ingredients list reads left-justified inside a centred box).
Stress test — 1 deliberately awkward case (longest labels, narrowest angles, empty input)
chord tangent and radius together
Replaces: —
23circleTheoremFig
All eight circle theorems in one helper, correct by construction: angle at the centre, semicircle, same segment, cyclic quadrilateral, tangent-radius, two tangents, alternate segment, perpendicular from the centre bisects a chord.
Use when: Any circle-theorem figure. Do NOT hand-roll one ; the tangent, two-tangent and alternate-segment constructions are the ones that go subtly wrong by hand.
Replaces: the seven per-theorem builders in output/gcse/circle-theorems/gen.js
24plotGridphysical size
THE plotting grid: tiered gridlines to the board's standard, axes, and any of curves, points, bars, lines of best fit, shaded regions, read-off guides.
Use when: ANY grid the student plots on or reads off. The grid KIND (gt) must match the task and is gated by grid_kind_check.js: never a generic lattice ('squared'/'transformations') for a plotting task, and never a forced tiers:1.
Replaces: hand-rolled gridline loops, which also lose the gl/glM print-visibility classes and so vanish from the print oracle
25dimLine
A double-headed dimension arrow with its label centred ON the line, the standard way to mark a measured length beside a shape. The label sits centred by design: that is the legitimate on-line-label idiom.
Use when: Marking a length, height or width alongside a drawn shape. Hand-rolling an arrow with its own polygon head instead is the hand-roll class the adoption gate exists to stop.
dimLine(P, Q, label, {awayFrom, fs, gap})
horizontal 60 m
dimLine([20,120], [220,120], "60 m")
vertical 45 m
dimLine([240,20], [240,180], "45 m")
Replaces: —
26ineqLine
Inequality on a number line: open or filled boundary circle, plus either a direction arrow (one-sided) or a second circle joined to the first (a bounded double inequality).
Use when: Showing or reading an inequality on a number line, one-sided (x > a, boundary + dir) or BOUNDED (a < x <= b, boundary/dir plus boundary2/dir2). Handles the open/closed circle convention per END so it cannot be drawn the wrong way round.
Replaces: hand-drawn line + <circle> boundary + arrow <polygon>
27realLineGraph
Plain line graph with gradient/line overlays, axis labels and padding control.
Use when: A graph that is READ rather than plotted on. If the student plots or measures, use plotGrid instead so the grid kind and physical size are right.
short branch runs (run1/run2) - fits a wide label set
probTree2({"root":"start","out1":["wins","does not win"],"l1":[[9,10],[1,10]],"out2":[["wins","does not win"],["wins","does not win"]],"l2":[[[9,10],[1,10]],[[9,10],[1,10]]],"headers":["Game 1","Game 2"],"run1":120,"run2":105,"dy2":145})
Replaces: hand-drawn branch <line>s with hard-coded label offsets
32regularPolygon
Regular n-gon with equal-side ticks, optional interior/exterior angle arcs and centre spokes.
Use when: Interior/exterior angle work on a regular polygon.
Replaces: hand-positioned <text> columns and a rule <line>
35sampleTable
A bordered data table in the board's plain style: uniform 1px cell edges, bold header TEXT, no thick rules, and a borderless empty top-left corner. Cells can be pre-filled or left blank for the student.
Use when: Any table a student reads from or completes: two-way tables, frequency tables, systematic listing, a results grid. Reaching for raw table markup instead is the class-6 table-fidelity flag (p47 Q9). THE TWO-ROW COMPLETION STANDARD (owner, M124): a table a student WRITES IN takes equalCols + compact, so every non-header column is one width wide enough to write in and the rows are about 20% shorter. Content-sizing is for tables that are only READ; on a completion table it makes the write-in cells the narrowest on the row.
Replaces: two raw <circle> outlines plus manually placed <text> counts
Teaching figures — drawn inside solutions to explain a method
38areaModel
The grid (box) method for expanding brackets, headers outside the grid and partial products inside.
Use when: Expanding a bracket or a pair of brackets by partial products, and the reverse. NOT sampleTable: the headers are the brackets being multiplied and sit OUTSIDE the border, and the cells hold products rather than data. Pass cells:null for the EMPTY grid a student fills in. Column widths follow their content, so a long term does not squash its neighbour.
Replaces: hand-rolled <rect> grids with pinned header coordinates for the box method
39arrowChain
A chain of steps joined by labelled arrows, every width measured from its own text.
Use when: Showing a method as a sequence: a value transformed step by step, a chain of conversions, a reverse-percentage route. The arrow is never shorter than its own caption, so a long caption lengthens the arrow instead of overlapping a neighbour. Pass `sep` to replace the arrows with an OPERATOR and the chain becomes a TERM STRIP (5m + 2n + 8p, each term boxed): an arrow between boxes says "then", a plus says "and", so a strip drawn with arrows is wrong. `sep` takes a string for every gap or an array for one per gap.
Replaces: hand-drawn arrow <line>s with hard-coded label offsets
40barModel
Ratio and part-whole bar model, segments proportional but never narrower than their own label.
Use when: Ratio, proportion, fractions of an amount, part-whole reasoning. 51 of 51 modules hand-rolled this, the highest hand-roll rate of any figure, and it is the most context-portable figure there is.
barModel({parts, labels, total, unit, shades, fs})
Replaces: raw <rect> rows with hand-computed widths
41factorTree
Prime factor tree, splitting at the smallest prime each time. Primes ringed in red.
Use when: OWNER STANDARD: any prime-factorisation solution must show the tree. Lays out from measured label widths, so branches cannot collide.
factorTree(n, {fs, gapY, mmW})
360
factorTree(360)
84
factorTree(84)
Replaces: hand-pinned tree with hard-coded node coordinates · a division ladder (a different method)
42functionMachine
Function machine: input, one or more boxed operations, output, box width from the measured label.
Use when: Function machines, inverse operations, forming or solving an equation step by step. Generalises the Q20 fix: a longer operation gets a wider box, gaps stay uniform, and the output sits clear of the arrowhead.
Replaces: hand-pinned machine diagrams with fixed box widths
43numberLine
Horizontal number line with ticks pointing down and labelled values.
Use when: Any solution that places values on a line: negatives, inequalities, rounding bounds, ordering. THE most-ignored helper in the kit — check here before drawing one.
numberLine({lo, hi, step, unit, arrows, raisedMinus})
Circle sector, arc or segment, with optional shading and angle, radius and arc labels.
Use when: Any sector, arc length, sector area or segment. THE biggest hand-roll class in the corpus (175 modules). Reflex angles draw correctly; returns null rather than a wrong picture for an impossible angle.