Skip to content

Conversation

ronjalh
Copy link
Member

@ronjalh ronjalh commented Nov 3, 2026

Merges dev into main so the version on the virtual machine can be updated. Do not delete dev after merging.

What this brings to main

dev is 26 commits ahead of main; main has nothing that dev lacks (only the earlier dev → main merge commits). The main changes:

Why now: the version on the VM

The site on the VM is an old build (last modified 30 October) and does not have the changes above. main is 26 commits behind dev, so building and deploying main would not bring them either. Merging this PR makes main the same as dev, so the VM can be updated from main. The repository does not record which branch the VM was built from, so this PR solves only the main side of it; the VM itself still has to be rebuilt and redeployed (VITE_API_URL=/project2/graphql npm run build, copy dist/ to the served folder without removing .htaccess, npm run db:deploy, restart the backend).

A separate problem on the VM is already solved: the site showed 403 Forbidden ("Server unable to read htaccess file"). The Apache error log showed Permission denied ... /home/xeniag/.htaccess: the site is served from a home directory, and Apache (www-data) could not open it (Ubuntu creates home directories with mode 750). chmod o+x /home/xeniag fixed it, and /project2/, the pages under it and /project2/graphql answer 200 again.

Follow-up (not in this PR): serve the site from a shared folder such as /var/www/html/project2 instead of a home directory, and write the deploy steps in docs/VM_SETUP.md.

🤖 Generated with Claude Code

Ronja and others added 26 commits October 30, 2026 19:42
…mnast

The menu, the protected pages and the gymnasts page now read the same answer
from the server (me) through useAuth(), so they cannot disagree and a reload
keeps a logged-in coach on the page. Log in goes to a login page with the demo
coach and the test coach; ProtectedRoute waits for the answer and remembers
where the visitor was going. A gymnast can be deleted after a confirmation.

Part of #136, #138
…uld need

Adds docs/AUTHENTICATION.md with what the course asks for, everything we tried
before choosing the test login (Google, https, passwords, our own encryption),
how the login is guarded, what it does not protect, and what we would do with
https. Updates the README, API.md, VM_SETUP.md, UI_PLANS.md and AI_USAGE.md.

Closes #136, #138
Add the README section, the folder in the project structure, the pointer
from docs/API.md and the AI usage entry.

Closes #139
- Follow the theme: the page, the cards, the form and the login page use
  theme values that have a dark value (new tokens for the circle, the field,
  the red and the "No, keep it" button), and the contrast is tested.
- Bigger cards and text, a smaller circle, and a red trash button that is
  48 by 48 CSS pixels so it can be pressed on a phone.
- Add form: the field with a save tick and a close cross at the end of it,
  no heading and no Cancel button, Enter saves and Escape closes.
- Name: at most 70 characters can be typed or pasted, at least 3 to save.
- The title of the page has the same style as the Elements page.
- Delete dialog: a warning icon, "Delete gymnast", what is lost as a list,
  and "No, keep it" and "Yes, delete" with a visible edge and a shadow.

Refs: #136, #138
test(e2e): add automated end-to-end tests
- The save tick is green in both themes (white tick on green in light mode,
  dark tick on green in dark mode) and is no longer the color of the card.
- The hint "3 to 70 characters" is gone. An error shows only after Save or
  Enter, in red: "Name is required" for an empty name, as the API asks for
  1 to 70 characters. No more than 70 can still be typed or pasted.
- The gymnast cards get a tint and a deeper shadow on hover (both themes),
  and a pointer, to show that they can be pressed one day.
- "No, keep it" has white text in dark mode only, on a dark fill with a light
  2px edge (9.6:1 on the card). White text and a fill that is 3:1 on the card
  cannot both be had, so the edge carries the contrast of the control.
- The test of the whole path gets more time when all the tests run at once.

Refs: #136, #138
…ement page

- Ask for elementGroup.number (and id, so the cache recognises the group)
  in the catalogItem query
- Show "Group N" for a vault and the group name for an element, with the
  same groupLabel as the Elements list, so the two pages agree
- Test an element and a vault separately on the element page
- Add the issue to AI_USAGE.md

Closes #125

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dark mode

The outline variant of the button sets colors of its own in dark mode
(dark:bg-input/30), and they won over the green of the save tick and the fill
of "No, keep it", so neither had the intended color in dark mode. Both now use
the default variant, and the hover of the two ghost buttons is set for dark
mode too. A test fails when an outline button does not also set its colors for
dark mode. The test of the whole path answers the new CatalogStructure query.

Refs: #136
The tab said the name of the project on /login and while "Checking your
login…" was shown (WCAG 2.4.2). Both now use PageTitle like the other pages.
The title test of the gymnasts page matches the name exactly, because the
hidden "Delete <name>" would also match a pattern.

Refs: #136
The extra check for 6:1 was a design choice that only pinned the current
color. The limits of the rule stay: 3:1 for the edge of a control and 4.5:1
for the text.

Refs: #136
A blue-grey line (3.6:1 on the card, above the 3:1 of WCAG 1.4.11) does not
draw the eye first, as the lighter line did.

Refs: #136
…er-instead-of-the-description-on-the-element

fix: show the vault group number instead of the description on the el…
…oach

feat: one source of login state, a login page, a demo coach and delete a gymnast
@ronjalh ronjalh requested a review from a team as a code owner November 3, 2026 14:17
@ronjalh ronjalh self-assigned this Nov 3, 2026
@xeniag xeniag merged commit 364753d into main Nov 5, 2026
Sign in to join this conversation on GitHub.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants