c18510b3c3
The drag-and-drop workspace for building BI122G exercise sheets, served by the Workshop at /projects/exercise-builder. Plain HTML, CSS and ES modules; no build step. It runs entirely in the browser — work in progress lives in localStorage and finished sheets leave as downloads, so nothing is written on the server. This directory is canonical. It began as a deployment target for deploy_builder.sh syncing from the BI122G course folder, and that arrangement has ended; see the README. Includes the sheet's light/dark switch: the stylesheet already carried both themes and followed the reader's system setting, so this adds the control that overrides it — a corner toggle built by sheet.js, applied before first paint by a head script the exporter writes, and hidden in print. The builder's toolbar previews the same attribute on the canvas. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ed5kU3HfZq9dfj7EYj5J2v
60 lines
2.5 KiB
Markdown
60 lines
2.5 KiB
Markdown
# Exercise Builder — hosted copy
|
|
|
|
The drag-and-drop workspace for building BI122G exercise sheets, served by the
|
|
Workshop at:
|
|
|
|
/projects/exercise-builder landing page
|
|
/projects/exercise-builder/app the builder itself
|
|
|
|
Open to everyone; no sign-in.
|
|
|
|
## What is here
|
|
|
|
app/ the builder — plain HTML, CSS, and ES modules. No build step.
|
|
|
|
`app/` is the whole application. It runs entirely in the browser: work in
|
|
progress lives in the visitor's `localStorage`, and finished sheets and project
|
|
files leave as downloads. **Nothing is written on the server**, and there is no
|
|
endpoint that could write anything. That is what makes it safe to host without a
|
|
login.
|
|
|
|
Note this differs from the local development setup in the course folder, where
|
|
`edit_server.py` accepts `POST /__save` and writes sheets straight to disk. That
|
|
server is not deployed here, and must not be — reachable without a login it
|
|
would be a write primitive for anyone who could load the page.
|
|
|
|
## How it is served
|
|
|
|
`workshop/src/routes/projects/exercise-builder/app/[...file]/+server.ts` reads
|
|
this directory at request time. Consequences worth knowing:
|
|
|
|
- **Updating the builder does not need a site rebuild.** Sync new files here and
|
|
a reload picks them up (responses are `no-cache` with an mtime-based ETag).
|
|
A rebuild is only needed when the landing page or the route itself changes.
|
|
- Only recognised asset extensions are reachable, and paths are contained to
|
|
this directory — so nothing outside `app/` can be requested.
|
|
- `.js` is served as `text/javascript`, without which browsers refuse ES
|
|
modules outright.
|
|
- The route injects `<base href="/projects/exercise-builder/app/">` into the
|
|
served HTML, so the builder's relative URLs resolve whether or not the visitor
|
|
typed a trailing slash.
|
|
|
|
Override the location with `EXERCISE_BUILDER_ROOT` in the workshop `.env` if it
|
|
ever moves.
|
|
|
|
## Updating
|
|
|
|
Edit the files here. There is no build step and no sync — a reload picks the
|
|
change up, for the reasons above.
|
|
|
|
## Source of truth
|
|
|
|
**This directory.** The builder was developed in the BI122G course folder on
|
|
the workstation (`/Muspelheim/Employment/HiS/Teaching/BI122G`) and pushed here
|
|
by `deploy_builder.sh`. That arrangement has ended and this installation is now
|
|
canonical: **do not run `deploy_builder.sh` again**, as it would overwrite this
|
|
directory with the older course-folder copy.
|
|
|
|
The course folder still holds `test.mjs`, a Node test harness that was never
|
|
deployed here — it needs `linkedom` and is no use in a browser.
|