pdf-quiz-generator/backend/app/routers
Daniel 158930d532
Some checks failed
Tests / backend (push) Failing after 5s
Tests / frontend (push) Successful in 28s
Tests / e2e (push) Failing after 36s
feat: section links in prose, a picker that writes them, and cards that render
**Cross-references can name a section.** `[[264#workup|the workup]]` opens the
reader at that heading, which is what a sentence about one part of a long
article actually means. Whole-article `[[264|label]]` is unchanged, and a
section renamed since is not a broken link — it lands at the top of the right
article, which is a mild disappointment rather than a dead end.

**A picker that writes the marker for you.** 🔗 Link an article, in the editor:
type a few words, click the article — or one of its sections — and the marker
is on the clipboard with the right title as its label. Getting an id used to
mean opening the library in another tab, finding the article and reading the
number out of the address bar, which is four steps and a chance to mistype,
every time. Its own small endpoint, because the listing deliberately does not
carry sections and this needs nothing else.

**Three things about cards that were built but never drawn:**

- A card can carry an image. The column is there, the API returns it, the
  editor accepts one — and no view in the app rendered it, so every picture
  anybody attached to a card was stored and never seen. Both card views show it
  now, small until clicked like every other figure.
- The deck browser printed `[[331|Epiglottitis]]` as brackets and a number. The
  study view has rendered them as links for a while; now both do.
- There was no way to make a deck by hand. Every deck came out of a model —
  generated from a document section or an article — so an educator who wanted
  to write six cards had nowhere to put them, and the add-a-card route could
  only add to a deck that did not exist yet. `+ New deck` on the cards page.

**Generate cards ran in silence.** It starts a real job, and the only place its
progress was drawn was inside the refine panel — which lives in the editor and
is shut. Pressing it on the reading page did nothing visible for ninety
seconds. It now says what it is doing where it was pressed.

**Overlays were invisible to learners.** A stored width is a fraction of the
image, and the stroke is drawn with `non-scaling-stroke`, which makes
`stroke-width` a count of screen pixels — so 0.006 meant six thousandths of a
pixel. The editor has always multiplied by its rendered width; the viewer now
does the same sum. Every region an educator has ever marked was invisible to
everyone who was not editing it.

Also: the figure viewer no longer scrolls, at any width, and the page behind it
is pinned properly (`overflow: hidden` on the body does nothing on iOS, so a
figure opened half-way down an article drifted while it was read). Options are
full width on a phone. The question toolbar's seven glyphs are four, with the
rest folded into the ⋯ that was already there, spelled out in words. The jobs
popover closes on a click anywhere outside it. And the editor has a way back to
Editorial — "back to the article", from an article you opened to edit, is a
loop.

The contract snapshot caught both new routes on the way through, which is what
it is for.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TqXevQJhxFrM7jJg82cgZN
2026-09-13 02:05:02 +02:00
..
__init__.py Initial commit: PDF Quiz Generator app 2026-03-30 20:04:53 +00:00
access.py feat: question folders, per-section notes, and two feedback paths 2026-09-12 18:37:43 +02:00
admin.py fix: thumbnails may be kept, the embedding model may not be changed here 2026-09-12 21:35:26 +02:00
ai_mode.py fix: moderator flag in /auth/me, and AI Mode answers that go wrong 2026-09-12 23:05:55 +02:00
articles.py feat: section links in prose, a picker that writes them, and cards that render 2026-09-13 02:05:02 +02:00
attempts.py refactor: remove the LMS 2026-09-12 23:27:51 +02:00
auth.py feat: a versioned API, refresh tokens, and an end-to-end stack that found four bugs 2026-09-13 01:23:38 +02:00
categories.py Major: categories, question bank, security fixes, mobile layout, UX improvements 2026-03-31 20:08:05 +02:00
collections.py feat: articles are collectible, and Summary is a toggle 2026-09-12 14:52:20 +02:00
contact.py fix: the contact form's messages were readable by anyone 2026-09-12 22:37:28 +02:00
documents.py Tag filtering, multi-category, bug fixes, image validation, docs 2026-04-04 22:48:26 +02:00
drafts.py feat: extracted questions are staged, and only acceptance takes an id 2026-09-11 22:57:08 +02:00
exams.py feat: exams are a group you can build, with the board's own blueprint 2026-09-11 20:27:48 +02:00
favorites.py Add switchable embedding model, Polly toggle, job cancellation, and UI fixes 2026-04-03 20:44:11 +02:00
feedback.py feat: question folders, per-section notes, and two feedback paths 2026-09-12 18:37:43 +02:00
flashcards.py feat: section links in prose, a picker that writes them, and cards that render 2026-09-13 02:05:02 +02:00
folders.py feat: question folders, per-section notes, and two feedback paths 2026-09-12 18:37:43 +02:00
login_code.py feat: sign in with a code sent by email 2026-09-12 17:29:28 +02:00
media.py feat: figures are thumbnails that open into a viewer, with source and overlay 2026-09-12 20:33:00 +02:00
mynote.py Add persistent MyNote for quizzes 2026-05-12 17:51:23 +02:00
nextcloud.py Security hardening, async TeachChat, rate limit UX, unthrottle 2026-04-04 01:09:42 +02:00
public.py feat: the objective is not optional, and the site can count itself 2026-09-12 06:40:48 +02:00
question_categories.py feat: retire the tags, and stop settings from hiding from the page that 2026-09-12 05:06:58 +02:00
questions.py fix: the answer side of a question needs an attempt, or the job of writing it 2026-09-13 00:13:43 +02:00
quizzes.py refactor: remove the LMS 2026-09-12 23:27:51 +02:00
search.py feat: rerank what a learner is shown, with Cohere through the proxy 2026-09-12 18:23:06 +02:00
share.py refactor: remove the LMS 2026-09-12 23:27:51 +02:00
study_plans.py feat: study plans built to the board's content outline 2026-09-11 21:40:17 +02:00
study_tools.py feat: a versioned API, refresh tokens, and an end-to-end stack that found four bugs 2026-09-13 01:23:38 +02:00
tags.py fix: put the disciplines and diseases back, and order Performance as shown 2026-09-12 05:39:22 +02:00
teach.py fix: WebP figures, the openai SDK removed, and a voice a site can add to 2026-09-12 17:13:05 +02:00
tts.py fix: WebP figures, the openai SDK removed, and a voice a site can add to 2026-09-12 17:13:05 +02:00
uploads.py feat: a versioned API, refresh tokens, and an end-to-end stack that found four bugs 2026-09-13 01:23:38 +02:00