npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@ljoukov/sheet

v0.2.0

Published

Svelte components for paper-style worksheets, reviewed answer sheets, and question-level feedback threads.

Readme

@ljoukov/sheet npm version npm downloads CI license gallery

Paper-first Svelte components for rendering printable-style worksheets, reviewed answer sheets, rich tutor feedback cards, and reply threads.

Live gallery: sheet.ljoukov.workers.dev

What It Includes

  • Sheet: full worksheet renderer with interactive, readonly, review, and demo modes
  • SheetFeedbackCard: question-level review note with optional reply flow
  • SheetFeedbackThread: standalone tutor thread and composer surface
  • Markdown: shared markdown renderer with KaTeX maths and syntax highlighting
  • built-in question layouts for fill-in, multiple choice, lines, calculation, matching, and spelling prompts
  • typed schemas, exported types, and seeded sample documents for local demos

Install

npm install @ljoukov/sheet

Import the package stylesheet once so KaTeX and shared utility styles are available:

<script lang="ts">
	import '@ljoukov/sheet/styles.css';
</script>

Quick Start

<script lang="ts">
	import '@ljoukov/sheet/styles.css';
	import { Sheet, sampleSheets, type SheetAnswers } from '@ljoukov/sheet';

	const sample = sampleSheets[0];
	let answers: SheetAnswers = sample.seedAnswers ?? {};
</script>

<Sheet document={sample.document} mode="demo" mockReview={sample.mockReview} bind:answers />

For live tutoring flows, pass review, feedbackThreads, feedbackState, and onReply into Sheet, or use SheetFeedbackCard and SheetFeedbackThread directly when you need those surfaces outside the full worksheet layout.

Surface Catalog

The sections below show the exported components and built-in Sheet surfaces, with the implementation file, what each surface is for, and the inputs it expects.

Sheet

Implements: Sheet

Description: Top-level worksheet surface with theme tokens, header, optional grading summary, hook/content sections, answer state, and optional tutor feedback.

Required inputs

  • document
  • document.id
  • document.subject
  • document.level
  • document.title
  • document.subtitle
  • document.color
  • document.accent
  • document.light
  • document.border
  • document.sections[]

Optional inputs

  • answers
  • seedAnswers
  • review
  • mockReview
  • feedbackThreads
  • feedbackState
  • mode
  • allowReplies
  • showFooter
  • footerLabel
  • onAnswersChange
  • onReply

Grading summary

Rendered by Sheet, implementation in src/lib/components/sheet/paper-sheet.svelte

Description: Top-level review banner that communicates score, grading note, and whether some marks remain in teacher review.

Required inputs

  • review.score.got
  • review.score.total
  • review.label
  • review.message
  • review.note
  • review.questions

Optional inputs

  • review.objectiveQuestionCount
  • review.teacherReviewMarks
  • review.teacherReviewQuestionCount

Shown near the top of Sheet when review or mockReview is provided.

Feedback card

Implements: SheetFeedbackCard

Description: Per-question feedback surface that wraps a review note, optional conversation thread, and reply composer.

Required inputs

  • review

Optional inputs

  • open
  • draft
  • thread
  • processing
  • runtimeStatus
  • thinkingText
  • assistantDraftText
  • showComposer
  • showFollowUpButton
  • resolvedFollowUpMode
  • draftAttachments
  • draftAttachmentError
  • allowAttachments
  • allowTakePhoto
  • questionLabel
  • onToggle
  • onRequestFollowUp
  • onAttachFiles
  • onRemoveDraftAttachment
  • onDraftChange
  • onReply

Feedback thread

Implements: SheetFeedbackThread

Description: Standalone tutor conversation and composer surface for embedding a feedback thread outside the full worksheet layout.

Required inputs

  • none

Optional inputs

  • thread
  • draft
  • processing
  • runtimeStatus
  • thinkingText
  • assistantDraftText
  • showComposer
  • showFollowUpButton
  • resolvedFollowUpMode
  • draftAttachments
  • draftAttachmentError
  • allowAttachments
  • allowTakePhoto
  • placeholder
  • questionLabel
  • onRequestFollowUp
  • onAttachFiles
  • onRemoveDraftAttachment
  • onDraftChange
  • onReply

Markdown

Implements: Markdown

Description: Shared Markdown renderer with KaTeX maths, syntax-highlighted code blocks, inline rendering, and copy buttons for fenced code.

Required inputs

  • markdown

Optional inputs

  • inline
  • class

Fill in the blanks

Rendered by Sheet, question layout in src/lib/components/sheet/paper-sheet.svelte

Description: Inline sentence-completion row with one or two blank fields for short factual recall and keyword retrieval.

Required inputs

  • question.id
  • question.type = "fill"
  • question.marks
  • question.prompt
  • question.blanks[]
  • question.after

Optional inputs

  • question.conjunction
  • blank.placeholder
  • blank.minWidth

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

Multiple choice

Rendered by Sheet, question layout in src/lib/components/sheet/paper-sheet.svelte

Description: Single-select question row with two or more markdown-capable options.

Required inputs

  • question.id
  • question.type = "mcq"
  • question.marks
  • question.prompt
  • question.options[]

Optional inputs

  • none

Answer payload: answers[question.id] = string

Lines / extended response

Rendered by Sheet, question layout in src/lib/components/sheet/paper-sheet.svelte

Description: Freeform longer-answer row for explanations, justifications, and worked reasoning.

Required inputs

  • question.id
  • question.type = "lines"
  • question.marks
  • question.prompt
  • question.lines

Optional inputs

  • question.renderMode

Answer payload: answers[question.id] = string

Calculation row

Rendered by Sheet, question layout in src/lib/components/sheet/paper-sheet.svelte

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

Required inputs

  • question.id
  • question.type = "calc"
  • question.marks
  • question.prompt
  • question.inputLabel
  • question.unit

Optional inputs

  • question.hint

Answer payload: answers[question.id] = string

Match pairs

Rendered by Sheet, question layout in src/lib/components/sheet/paper-sheet.svelte

Description: Two-column matching interaction where the student connects each term to its paired meaning.

Required inputs

  • question.id
  • question.type = "match"
  • question.marks
  • question.prompt
  • question.pairs[]

Optional inputs

  • none

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

Spelling correction

Rendered by Sheet, question layout in src/lib/components/sheet/paper-sheet.svelte

Description: Correction list that presents a misspelled word and captures the repaired spelling inline.

Required inputs

  • question.id
  • question.type = "spelling"
  • question.marks
  • question.prompt
  • question.words[]

Optional inputs

  • none

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

Public API

import {
	Markdown,
	Sheet,
	SheetFeedbackCard,
	SheetFeedbackThread,
	SheetAnswersSchema,
	SheetDocumentSchema,
	SheetFeedbackAttachmentSchema,
	SheetFeedbackThreadSchema,
	SheetFeedbackTurnSchema,
	SheetReferencesSchema,
	SheetReportSchema,
	SheetReviewSchema,
	sampleSheets,
	type SheetAnswers,
	type SheetDocument,
	type SheetFeedbackState,
	type SheetFeedbackStateMap,
	type SheetFeedbackThreadData,
	type SheetMode,
	type SheetQuestion,
	type SheetQuestionReview,
	type SheetReplyPayload,
	type SheetReview,
	type SheetSample
} from '@ljoukov/sheet';

Sheet accepts a document plus optional answers, seedAnswers, review, mockReview, feedbackThreads, feedbackState, mode, allowReplies, showFooter, footerLabel, onAnswersChange, and onReply.