~ knotless Search/
↑↓ move↵ open⇧↵ all results

johnandersen777.bsky.social/knotless

git that lives in your Atmosphere account

Forked from chadtmiller.com/knotless

0
0
55 lines · 3.5 KB Raw History
# Working on the web pages

This is part of the root `AGENTS.md`, loaded when work reaches `web/`.

- The web pages are the SvelteKit app in `web/`; knotless-serve answers
  what they show as XRPC queries, each with its lexicon under
  `lexicons/` and the views it shares in `dev.knotless.defs`, as
  atproto's appviews do. The pages' TypeScript types are made from those
  lexicons by @atproto/lex (`npm run lex` in `web/`, which `dev`, `build`
  and `check` run first), into `web/src/lib/lexicons`, not kept in git.
  `just lex` checks the answers the screenshots recorded against their
  lexicons, and the `test` check every answer the serve tests receive.
- Before changing a page, load the `ui` skill (`.claude/skills/ui`):
  its house rules (sentence case, empty states, space), and `just
  look`, which draws any page in any state from the recording as
  pictures to open: empty, signed in, a menu open, a long title. Look
  at every state you touch before pushing.
- For the web pages: the pull's `shots` check shows what moved, with
  pictures. No screenshot is kept anywhere: the pages are shot as main
  draws them and as the change does, in one run. To look before pushing,
  `just shots`, which builds `web/` and main's, shoots only the pages
  whose HTML differs, drawn from `harness/shots/fixtures.json` with no
  PDS, and leaves each that moved under `target/shots/results/` (its
  expected, actual and diff). After a change to what a page's answer
  holds, `just shots-up` in the background once, then `just
  shots-record`. Each checkout's shots have three ports of their own,
  from its path; `SHOTS_PORT` sets another base for all of these.
- `shots-live` shoots this checkout's pages from the recording and again
  through knotless-serve over a world: one that moved means the
  recording is out of date. Keep `just shots-up` running in the
  background while working on pages: `shots-live` then reuses its world
  rather than seeding one, which is most of its time.
- The social cards are drawn by knotless-serve: `just shots-cards` takes
  them from a world into `target/shots/cards` to look at.
- The components in `web/src/lib` are layered, atomic design's way:
  `atoms` (one element: an icon, an avatar), `molecules` (a few atoms
  that mean something together: a person, a commit row), `organisms` (a
  part of a page: a check list, a feed), `templates` (a page's layout,
  without its data). A component uses its own layer and those below it,
  never one above; `just lint` checks it. Pages under `web/src/routes`
  fill a template with what the queries answer.
- The pages' styles are `web/src/app.css`, and every colour, size,
  space, radius and weight in it is a token from `web/src/tokens.css`:
  take one by name rather than writing a value, and add one there when
  none fits. A colour for what it means is its role, `--danger`,
  `--success`, `--attention`, `--done` or `--neutral`, never the hue
  under it (`--red`), so a theme can draw success in blue. Every colour that is text meets WCAG AA (4.5:1) on what
  it is drawn on, in every theme: `harness/contrast.mjs` checks it, in
  `web` and `just lint`, and a new colour that is text goes in
  `web/src/lib/contrast.json`, which the theme editor, and knotless's
  own check of a theme made anywhere (`crates/knotless/src/theme.rs`),
  hold people's own themes to too. A menu that opens is a `<details class="popover …">`.
- In Svelte markup, keep a run of inline text one expression or one line:
  a block or component beside it splits the text into nodes, which shapes
  differently from the same text whole and moves pixels.