Gallery

@ljoukov/sheet

Overview Poster, routes, and visual contextCatalog Supported surfaces, inputs, and live previewsWorksheets Whole sheet demos with seeded contentFeedback cards Question-level tutor note statesFeedback thread Conversation bubbles and reply composerFill Blank and inline-answer question rowMCQ Choice layout and review rhythmLines Ruled long-answer surfaceCalc Formula prompt and unit inputMatch Pairing interactions and spacingSpelling Word correction layoutMarkdown Rich text, code, and maths rendering
  1. Gallery
  2. /
  3. Catalog
Catalog

Sheet UI surface catalog.

Canonical inventory of the current `@ljoukov/sheet` surfaces. Each preview renders the actual exported component or the underlying sheet renderer, not a static mock.

Coverage

Use this route to check what the library already supports before adding exam-specific variants or consumer-specific wrappers.

12

Catalogued surfaces

6

Question input types

7

Feedback / runtime states

1

Adjacent surfaces

src/lib/Sheet.sveltesrc/lib/SheetFeedbackCard.sveltesrc/lib/SheetFeedbackThread.sveltesrc/lib/components/sheet/paper-sheet.sveltesrc/lib/components/sheet/paper-sheet-question-feedback.sveltesrc/lib/components/sheet/paper-sheet-feedback-chat.svelte

Sheet frame and review summary

Top-level worksheet surfaces that define the page shell and grading banner.

Sheet root

Sheet

Full worksheet surface that owns numbering, theming, section state, answer state, and optional review overlays.

Required inputs

document.iddocument.subjectdocument.leveldocument.titledocument.subtitledocument.colordocument.accentdocument.lightdocument.borderdocument.sections[]

Optional inputs

seedAnswersreviewmockReviewfeedbackThreadsfeedbackStatemodeallowRepliesshowFooter

KS2 · History

The Roman Empire

Year 4 · History

Total marks

21

Over 2,000 years ago, one of the greatest empires the world has ever seen stretched across three continents. The Romans built mighty armies, beautiful cities, and roads that still exist today. But how did they end up in Britain — and what did they leave behind?

The Roman Empire was ruled from the city of Rome in Italy. At its peak, it covered parts of Europe, North Africa, and western Asia. The Romans first tried to invade Britain in 55 BC under Julius Caesar, but the full conquest came in 43 AD under Emperor Claudius. Roman soldiers were called legionaries and were among the best-trained soldiers in the ancient world.

1
[1m]
The Romans first attempted to invade Britain in under Julius Caesar.
2
[1m]
The successful Roman conquest of Britain happened in under Emperor Claudius.
3
[1m]

What were Roman soldiers called?

4
[1m]

From which city was the Roman Empire ruled?

In 122 AD, Emperor Hadrian visited Britain and ordered a massive wall to be built across the north of England. It stretched 73 miles (117 km) from coast to coast. The wall marked the northern frontier of the Roman Empire and kept out tribes from modern-day Scotland, called the Picts. Soldiers lived in forts along the wall and watched for attacks.

🧱

Fast Fact

Hadrian’s Wall took about 6 years to build and required thousands of soldiers and workers. Parts of it still stand today!

5
[1m]
Hadrian's Wall was built in .
6
[1m]
The wall stretched from coast to coast.
7
[1m]

Which group of people did the wall keep out?

8
[2m]

Explain why you think the Romans built Hadrian’s Wall rather than continuing to conquer further north. Give at least one reason.

The Romans changed Britain dramatically. They built straight roads to move armies quickly — many modern roads follow the same routes. They built bathhouses where people washed and socialised. Wealthy Romans lived in large country houses called villas, with mosaic floors and underfloor heating called a hypocaust. They introduced new foods like apples, pears, and even cats!

9
[2m]
Match each Roman word to its correct meaning. (Click a term, then click its meaning)
10
[1m]

Why did the Romans build straight roads?

11
[3m]

Describe THREE ways the Romans changed life in Britain. Use evidence from the theory above.

By 410 AD, the Roman Empire was struggling. Tribes called the Visigoths attacked Rome itself, and the Emperor told the people of Britain they would have to defend themselves. After nearly 400 years, Roman rule in Britain came to an end. The Romans left, but their language, buildings, and ideas stayed behind — shaping Britain forever.

12
[1m]
Roman rule in Britain ended in .
13
[1m]
The Romans ruled Britain for nearly years.
14
[1m]

Which group attacked Rome and contributed to the empire's collapse?

15
[3m]

Do you think the Roman invasion of Britain was good or bad for the people living here? Use what you have learned to explain your answer.

Review summary

Sheet

Top-level grading banner that communicates marks, grading message, and whether teacher-review marks remain open.

Required inputs

review.score.gotreview.score.totalreview.labelreview.messagereview.notereview.questions

Optional inputs

review.objectiveQuestionCountreview.teacherReviewMarksreview.teacherReviewQuestionCount

Olympiad · Mathematics

Hamilton 2023

Andrew Hamilton · sample student submission

Total marks

60

Sample grading summary

42 / 60

Hamilton 2023 combined grading file transcribed into the sheet preview.

Sample worksheet seeded from the Hamilton 2023 combined grading file. Each section shows the original problem statement with Andrew Hamilton's transcribed notebook submission prefilled, including [unclear] markers where the source image was faint.

Susie thinks of a positive integer nnn. She notices that, when she divides 202320232023 by nnn, she is left with a remainder of 434343. Find how many possible values of nnn there are.

1
[10m]

Student solution transcript

Since the remainder is 434343, n>44n > 44n>44 and

2023−43=19802023 - 43 = 19802023−43=1980

is a multiple of nnn.

1980=22×32×5×11.1980 = 2^2 \times 3^2 \times 5 \times 11.1980=22×32×5×11.

This means its factors greater than 434343 are [partly unclear]

55,60,66,90,99,110,132,165,180,198,220,330,495,990.55, 60, 66, 90, 99, 110, 132, 165, 180, 198, 220, 330, 495, 990.55,60,66,90,99,110,132,165,180,198,220,330,495,990.

So there are 141414 possible nnn's.

The key observation is correct: 2023−43=19802023 - 43 = 19802023−43=1980 must be divisible by nnn. The issue is the count. The condition should be n>43n > 43n>43, so 444444 is valid, and several larger factors are still missing from the list.

The two positive integers a,ba, ba,b with a>ba > ba>b are such that a%a\%a% of b%b\%b% of aaa and b%b\%b% of a%a\%a% of bbb differ by 0.0030.0030.003. Find all possible pairs (a,b)(a, b)(a,b).

2
[10m]

Student solution transcript

%\%% is equivalent to multiplying by 1100\frac{1}{100}1001​.

a% of b% of a=a100×b100×a=a2b104a\%\text{ of }b\%\text{ of }a = \frac{a}{100}\times\frac{b}{100}\times a = \frac{a^2b}{10^4}a% of b% of a=100a​×100b​×a=104a2b​

and

b% of a% of b=b100×a100×b=ab2104.b\%\text{ of }a\%\text{ of }b = \frac{b}{100}\times\frac{a}{100}\times b = \frac{ab^2}{10^4}.b% of a% of b=100b​×100a​×b=104ab2​.

Since they differ by

0.003=3103=30104,0.003 = \frac{3}{10^3} = \frac{30}{10^4},0.003=1033​=10430​,

and since a>ba > ba>b,

a2b104>ab2104\frac{a^2b}{10^4} > \frac{ab^2}{10^4}104a2b​>104ab2​

so

a2b−ab2=30a^2b - ab^2 = 30a2b−ab2=30

and hence

ab(a−b)=30.ab(a - b) = 30.ab(a−b)=30.

Since aaa and bbb are integers, ab>a−bab > a - bab>a−b, and so

(ab,a−b)=(30,1),(15,2),(10,3),(6,5).(ab, a - b) = (30, 1), (15, 2), (10, 3), (6, 5).(ab,a−b)=(30,1),(15,2),(10,3),(6,5).

Case 1:

ab=30, a−b=1⇒a=6, b=5.ab = 30,\ a - b = 1 \Rightarrow a = 6,\ b = 5.ab=30, a−b=1⇒a=6, b=5.

Case 2:

ab=15, a−b=2⇒a=5, b=3.ab = 15,\ a - b = 2 \Rightarrow a = 5,\ b = 3.ab=15, a−b=2⇒a=5, b=3.

Case 3:

ab=10, a−b=3⇒a=5, b=2.ab = 10,\ a - b = 3 \Rightarrow a = 5,\ b = 2.ab=10, a−b=3⇒a=5, b=2.

Case 4:

ab=6, a−b=5⇒a=6, b=1.ab = 6,\ a - b = 5 \Rightarrow a = 6,\ b = 1.ab=6, a−b=5⇒a=6, b=1.

So

(a,b)=(6,5),(5,3),(5,2),(6,1).(a, b) = (6, 5), (5, 3), (5, 2), (6, 1).(a,b)=(6,5),(5,3),(5,2),(6,1).

This is essentially complete. You convert both percentage expressions correctly, reach ab(a−b)=30ab(a - b) = 30ab(a−b)=30, and recover the right four solution pairs. The only missing piece is making the discarded negative roots explicit in each case.

The nnnth term of a sequence is the first non-zero digit of the decimal expansion of 1n\frac{1}{\sqrt{n}}n​1​. How many of the first one million terms of the sequence are equal to 111?

3
[10m]

Student solution transcript

Thus for this to be true:

1≤1n<21 \le \frac{1}{\sqrt{n}} < 21≤n​1​<2

or

0.1≤1n<0.20.1 \le \frac{1}{\sqrt{n}} < 0.20.1≤n​1​<0.2

or

0.01≤1n<0.020.01 \le \frac{1}{\sqrt{n}} < 0.020.01≤n​1​<0.02

or [continuation to the next place value].

Then [faint / partial interval work]

0.01≤1n<0.020.01 \le \frac{1}{\sqrt{n}} < 0.020.01≤n​1​<0.02

and [unclear continuation].

[No final count is visible on the photographed page.]

The starting idea is right: the first non-zero digit is 111 exactly when 1n\frac{1}{\sqrt{n}}n​1​ falls into intervals like [1,2)[1, 2)[1,2), [0.1,0.2)[0.1, 0.2)[0.1,0.2), and so on. The photographed work stops before those intervals are converted into full ranges for nnn and counted.

In the parallelogram ABCDABCDABCD, a line through AAA meets BDBDBD at PPP, CDCDCD at QQQ and BCBCBC extended at RRR. Prove that PQPR=(PDPB)2\frac{PQ}{PR} = \left(\frac{PD}{PB}\right)^2PRPQ​=(PBPD​)2.

4
[10m]

Student solution transcript

Now since ABCDABCDABCD is a parallelogram,

AD∥CB,CD∥AB.AD \parallel CB,\qquad CD \parallel AB.AD∥CB,CD∥AB.

This means that

∠QDP=∠ABP\angle QDP = \angle ABP∠QDP=∠ABP

and

∠QPD=∠BAP,\angle QPD = \angle BAP,∠QPD=∠BAP,

so

△DPQ∼△BAP\triangle DPQ \sim \triangle BAP△DPQ∼△BAP

and

PDPB=PQAP.\frac{PD}{PB} = \frac{PQ}{AP}.PBPD​=APPQ​.

Since BR∥AQBR \parallel AQBR∥AQ [equivalently, using the same transversal / parallel structure],

△DBR∼△ADP\triangle DBR \sim \triangle ADP△DBR∼△ADP

and

PDPB=APPR.\frac{PD}{PB} = \frac{AP}{PR}.PBPD​=PRAP​.

Therefore

(PDPB)(PDPB)=(PQAP)(APPR)\left(\frac{PD}{PB}\right)\left(\frac{PD}{PB}\right) = \left(\frac{PQ}{AP}\right)\left(\frac{AP}{PR}\right)(PBPD​)(PBPD​)=(APPQ​)(PRAP​)

so

(PDPB)2=PQPR.\left(\frac{PD}{PB}\right)^2 = \frac{PQ}{PR}.(PBPD​)2=PRPQ​.

Complete proof. You identify one similar-triangle pair to get PDPB=PQAP\frac{PD}{PB} = \frac{PQ}{AP}PBPD​=APPQ​, a second pair to get PDPB=APPR\frac{PD}{PB} = \frac{AP}{PR}PBPD​=PRAP​, and then multiply the results to reach the required identity.

Mickey writes down on a board nnn consecutive whole numbers, the smallest of which is 202320232023. He repeatedly replaces the largest two numbers with their difference until only one number remains. For which values of nnn is the last remaining number 000?

5
[10m]

Student solution transcript

Now subtracting 222 integers from each other and replacing by the difference doesn't change parity.

For final sum to be 000, sum must be even.

Now the largest 222 numbers are consecutive and will be replaced by 111.

If nnn is a multiple of 444, all larger numbers will have been replaced by [pairs of] 111's and then 000's [unclear wording], so final sum is 000.

If nnn is 111 more than a multiple of 444, [unclear continuation].

If nnn is 333 more than a multiple of 444, [unclear continuation; the photographed argument appears to continue but is not fully legible].

Two strong ideas are present: parity is preserved, and the largest consecutive numbers repeatedly collapse to 111. The missing part is the hard odd-case analysis, so the final set of valid nnn values is not fully established from the visible work.

Find all triples (m,n,p)(m, n, p)(m,n,p) which satisfy pn+3600=m2p^n + 3600 = m^2pn+3600=m2, where ppp is prime and m,nm, nm,n are positive integers.

6
[10m]

Student solution transcript

Rearrange this equation, we get

pn=(m+60)(m−60).p^n = (m + 60)(m - 60).pn=(m+60)(m−60).

Now since ppp is prime, pnp^npn is prime [power], and

pa−pb=120.p^a - p^b = 120.pa−pb=120.

This must be divisible by ppp.

Now

120=pa−pb120 = p^a - p^b120=pa−pb

must be divisible by ppp.

So

p=2,3,5.p = 2, 3, 5.p=2,3,5.

Now if p=2p = 2p=2, for

pa−pb=120p^a - p^b = 120pa−pb=120 pb(pa−b−1)=120p^b(p^{a - b} - 1) = 120pb(pa−b−1)=120

so pb<120p^b < 120pb<120 and pa>120p^a > 120pa>120.

For p=2p = 2p=2,

pb=2,4,8,16,32,64,128p^b = 2, 4, 8, 16, 32, 64, 128pb=2,4,8,16,32,64,128

[continuation].

We have

pa=128, pb=8.p^a = 128,\ p^b = 8.pa=128, pb=8. m+60=128 and m−60=8m + 60 = 128 \text{ and } m - 60 = 8m+60=128 and m−60=8

so

m=68.m = 68.m=68.

This gives

(m,n,p)=(68,10,2).(m, n, p) = (68, 10, 2).(m,n,p)=(68,10,2).

If p=3p = 3p=3, again pa>120p^a > 120pa>120 as then if pa−pb≥2×120p^a - p^b \ge 2 \times 120pa−pb≥2×120, no solution.

p=3,9,27,81,p = 3, 9, 27, 81,p=3,9,27,81,

as 243−81=162>120243 - 81 = 162 > 120243−81=162>120.

Thus there is no solution.

If p=5p = 5p=5, obviously only 555, 252525 and 125125125.

m+60=125,m−60=5m + 60 = 125,\quad m - 60 = 5m+60=125,m−60=5 m=65m = 65m=65

This gives

(m,n,p)=(65,4,5).(m, n, p) = (65, 4, 5).(m,n,p)=(65,4,5).

So

(m,n,p)=(68,10,2) or (65,4,5).(m, n, p) = (68, 10, 2) \text{ or } (65, 4, 5).(m,n,p)=(68,10,2) or (65,4,5).

The factorisation pn=(m+60)(m−60)p^n = (m + 60)(m - 60)pn=(m+60)(m−60) is correct, and the casework for p=2,3,5p = 2, 3, 5p=2,3,5 is mostly good. The gap is the special case m−60=1m - 60 = 1m−60=1, which produces the extra solution (61,2,11)(61, 2, 11)(61,2,11).

Question input types

All problem row variants currently handled by the shared sheet renderer.

Fill in the blanks

Sheet

Inline sentence-completion row for short retrieval answers with one or two blank fields.

Required inputs

question.idquestion.type = "fill"question.marksquestion.promptquestion.blanks[]question.after

Optional inputs

question.conjunctionblank.placeholderblank.minWidth

Answer payload

answers[question.id] = Record<"0" | "1", string>

KS2 · History

Fill Question

Single-blank retrieval prompt with inline paper styling.

Total marks

1

Focused demo of the fill question surface.

The Roman Empire was ruled from the city of Rome in Italy. At its peak, it covered parts of Europe, North Africa, and western Asia. The Romans first tried to invade Britain in 55 BC under Julius Caesar, but the full conquest came in 43 AD under Emperor Claudius. Roman soldiers were called legionaries and were among the best-trained soldiers in the ancient world.

1
[1m]
The Romans first attempted to invade Britain in under Julius Caesar.

Multiple choice

Sheet

Single-select option row with roomy paper buttons and review-aware selection states.

Required inputs

question.idquestion.type = "mcq"question.marksquestion.promptquestion.options[]

Answer payload

answers[question.id] = string

Schema minimum is two options.

KS2 · History

Multiple Choice

Objective question row with roomy options and paper accents.

Total marks

1

Focused demo of the multiple choice surface.

The Roman Empire was ruled from the city of Rome in Italy. At its peak, it covered parts of Europe, North Africa, and western Asia. The Romans first tried to invade Britain in 55 BC under Julius Caesar, but the full conquest came in 43 AD under Emperor Claudius. Roman soldiers were called legionaries and were among the best-trained soldiers in the ancient world.

1
[1m]

What were Roman soldiers called?

Lines / extended response

Sheet

Freeform long-answer row that can stay as a ruled textarea or render locked markdown output.

Required inputs

question.idquestion.type = "lines"question.marksquestion.promptquestion.lines

Optional inputs

question.renderMode

Answer payload

answers[question.id] = string

`renderMode = "markdown"` switches locked output to rendered markdown.

KS2 · History

Lines Question

Ruled writing area for longer student responses.

Total marks

2

Focused demo of the lines question surface.

In 122 AD, Emperor Hadrian visited Britain and ordered a massive wall to be built across the north of England. It stretched 73 miles (117 km) from coast to coast. The wall marked the northern frontier of the Roman Empire and kept out tribes from modern-day Scotland, called the Picts. Soldiers lived in forts along the wall and watched for attacks.

🧱

Fast Fact

Hadrian’s Wall took about 6 years to build and required thousands of soldiers and workers. Parts of it still stand today!

1
[2m]

Explain why you think the Romans built Hadrian’s Wall rather than continuing to conquer further north. Give at least one reason.

Calculation row

Sheet

Compact numeric or symbolic answer row with a left label and a right-side unit.

Required inputs

question.idquestion.type = "calc"question.marksquestion.promptquestion.inputLabelquestion.unit

Optional inputs

question.hint

Answer payload

answers[question.id] = string

KS3 · Science

Calculation Question

Formula-led prompt with compact answer and unit treatment.

Total marks

1

Focused demo of the calculation question surface.

Iron is a strong, hard metal with a high melting point. It is magnetic, meaning it is attracted to magnets. Iron has a density of 7.88 g/cm³, which means it is much denser than water. These properties make iron ideal for making nails, girders, and machinery. Pure iron is actually quite soft — it is usually combined with carbon to make steel, which is much stronger.

1
[1m]

Iron has a density of 7.88 g/cm³. Calculate the mass of an iron nail with a volume of 2 cm³.

Hint: Mass = Density × Volume
Mass = g

Match pairs

Sheet

Two-column matching row where the student selects a term, then assigns the paired meaning.

Required inputs

question.idquestion.type = "match"question.marksquestion.promptquestion.pairs[]

Answer payload

answers[question.id] = Record<string, string>

Each pair needs both `term` and `match`.

KS2 · History

Match Question

Term-to-definition layout with two aligned columns.

Total marks

2

Focused demo of the match question surface.

The Romans changed Britain dramatically. They built straight roads to move armies quickly — many modern roads follow the same routes. They built bathhouses where people washed and socialised. Wealthy Romans lived in large country houses called villas, with mosaic floors and underfloor heating called a hypocaust. They introduced new foods like apples, pears, and even cats!

1
[2m]
Match each Roman word to its correct meaning. (Click a term, then click its meaning)

Spelling correction

Sheet

Correction list that shows the misspelled word and captures the repaired spelling inline.

Required inputs

question.idquestion.type = "spelling"question.marksquestion.promptquestion.words[]

Answer payload

answers[question.id] = Record<string, string>

Each word entry currently requires `wrong`.

KS2 · English

Spelling Question

Correction rows that keep prompt text and answer rhythm aligned.

Total marks

2

Focused demo of the spelling question surface.

Many English words change form depending on how they are used in a sentence. A noun names a thing or idea. A verb shows action or being. An adjective describes a noun. Understanding root words helps you spell and understand new words — for example, 'determine' is the root of 'determined' and 'determination'.

1
[2m]

Correct the spelling of these words.

threatning →
deafning →

Question-level tutor feedback

Conversation surfaces for open notes, streamed responses, and attachment review.

Question feedback note

SheetFeedbackCard

Review-note surface that combines a tutor note, optional thread, and inline reply composer.

Required inputs

review.statusreview.notequestionLabel

Optional inputs

threaddraftprocessingruntimeStatusthinkingTextassistantDraftTextshowComposershowFollowUpButtononDraftChangeonReply

Your setup is right, but the final count still misses some divisors. Recount the factors greater than 43 and explain where 44 fits.

I think I forgot 44 and some of the larger factor pairs.

That is the right place to check. Recount in order so the missing values stand out.

Feedback attachments

SheetFeedbackThread

Student or tutor turns can include image and file attachments alongside the threaded conversation.

Required inputs

thread.turns[].idthread.turns[].speakerthread.turns[].text or thread.turns[].attachments[]attachment.idattachment.filenameattachment.contentTypeattachment.sizeBytes

Optional inputs

attachment.url

Here is the part of my working where I recounted the factors.

Good. The image makes the missing values easier to see. Compare the written list against the factors above 43.

Runtime feedback progression

SheetFeedbackCard

The tutor note can represent pending, thinking, responding, and resolved states while the conversation progresses.

Required inputs

reviewquestionLabel

Optional inputs

thread.statusthread.turns[]processingruntimeStatusthinkingTextassistantDraftTextshowComposershowFollowUpButton

Your setup is right, but the final count still misses some divisors. Recount the factors greater than 43 and explain where 44 fits.

Your setup is right, but the final count still misses some divisors. Recount the factors greater than 43 and explain where 44 fits.

Can you check whether 44 should be included?

Thinking stream

I can keep the divisor idea and fix the count. The condition is n > 43, so 44 is allowed.

Your setup is right, but the final count still misses some divisors. Recount the factors greater than 43 and explain where 44 fits.

Please check the corrected count.

Response stream

Your setup is right: remainder 43 means n | 1980 and n > 43.

The missing factors are 44, 45, 396, 660, and 1980.

So there are 19 possible values of n.

The corrected count is complete and the conclusion now matches the divisor list.

I recounted the factors and there are 19 values.

Exactly. 44, 45, 396, 660, and 1980 were the missing values in the first list.

Standalone rendering surfaces

Shared adjacent components that are used alongside the worksheet flow.

Markdown surface

Markdown

Standalone markdown renderer for prose, maths, tables, and fenced code blocks with theme-aware styling.

Required inputs

markdown

Optional inputs

inlineclass

Worked example

The remainder is 43, so we know:

2023−43=19802023 - 43 = 19802023−43=1980

That means n must divide 1980.

Strategy

  1. Factorise 1980
  2. List factors greater than 43
  3. Check that each factor gives remainder 43

The cleanest final sentence is the one that repeats the corrected count.

ts
const factors = [44, 45, 55, 60, 66];
console.log(factors.length);