diff --git a/content/updates/1.18.0.md b/content/updates/1.18.0.md new file mode 100644 index 0000000..864e7c6 --- /dev/null +++ b/content/updates/1.18.0.md @@ -0,0 +1,13 @@ +--- +version: 1.18.0 +date: 2026-10-24 +title: Find me a tutor +summary: Answer a few questions and get the three tutors who fit best, all with open times in the next 14 days, on one screen. +image: /updates/find-a-tutor.webp +imageAlt: The Find me a tutor page with questions about language, level, price and time of day on the left, and three suggested Spanish tutors with their reasons, next free time and price on the right +--- +- A new page, Find me a tutor, asks for the language you want, your level, your price range, when you can have lessons and whether you want a trial lesson. +- It shows the three tutors who fit best, each with the reasons it picked them, their next free time in your time zone, their price and a Book button. +- Every tutor shown has open times in the next 14 days, so each one can be booked today. You do not need an account. +- If fewer than three tutors fit, the page says so and shows what to change to see more. If none fit, you can start again or see everyone. +- The page address remembers your answers, so you can share them. It works in a dark theme that follows your device setting, and on a phone the button stays in reach. diff --git a/docs/feature-map.md b/docs/feature-map.md index df9c5d5..14ad39a 100644 --- a/docs/feature-map.md +++ b/docs/feature-map.md @@ -67,7 +67,7 @@ This file is long and every feature used to add a bullet at the same place, so t - A home-made measure must not claim more than it checks (T-0641): `tests/support/measure-claims.ts` is the table of every kind a measure says it catches (`scripts/mobile-audit.mjs`, the source scans in `tests/support/mobile-scans.ts`, the rate-limit check): one sample in the broken state and one in the right state per kind. `tests/measure-claims.test.ts` (in `npm test`) runs the REAL measure on both (the browser measures run on the HTML samples in a small fake page, `tests/support/mini-dom.ts`) and fails when a comment in those files claims a catch ("catches", "must stay", "no longer", "is reported" ...) without a `[claim: id]` marker of a row, or a row is not claimed. One marker cannot answer for a list: when a marked comment names a kind (summary, tab, menu item, checkbox, select, textarea, min-w-[Npx], style width, grid-cols, text-xs ...), a row it marks must list that kind in `covers` (`KIND_WORDS` in the same file holds the words per measure file; kept by hand), and a row can have more samples (`moreBroken`, `moreGood`). To add a measure: write the claim with `[claim: id]` in its comment, add one row per kind it names, and add the kind words. What the comments say but the table does not hold (the other measures of `audit()`, the scanners that have their own self-check in `tests/rate-limits.test.ts`) is listed with the reason in `LEFT_WITHOUT_ROW` of the same file; those comments only describe. Today the table has [count: CLAIMS=30] rows, the comments of [count: MEASURE_FILES=3] files are read, and [count: LEFT_WITHOUT_ROW=4] things are left without a row. -- Accessibility of the public pages (T-0638): `tests/accessibility.test.ts` ([count: ACCESSIBILITY_TESTS=12] tests) keeps pinch-zoom allowed, exactly one `
` on each of the [count: PUBLIC_PAGES=20] public pages (a layout above a page counts), and no pale grey text (`text-gray-200`, `-300`, `-400`; icons and disabled controls are listed with a reason in `GREY_EXEMPT`) in the [count: PUBLIC_TEXT_FILES=26] files of `PUBLIC_TEXT_FILES` and in every layout above a public page. +- Accessibility of the public pages (T-0638): `tests/accessibility.test.ts` ([count: ACCESSIBILITY_TESTS=12] tests) keeps pinch-zoom allowed, exactly one `
` on each of the [count: PUBLIC_PAGES=21] public pages (a layout above a page counts), and no pale grey text (`text-gray-200`, `-300`, `-400`; icons and disabled controls are listed with a reason in `GREY_EXEMPT`) in the [count: PUBLIC_TEXT_FILES=26] files of `PUBLIC_TEXT_FILES` and in every layout above a public page. - Legibility of the tutor app (T-0842): `tests/dashboard-legibility.test.ts` keeps the floor in `src/styles/dashboard-shell.css` (the last block): pale greys (`text-gray-200` to `-500`) read the third ink, sizes `text-[9px]` to `text-[11px]` are 12px, amber, emerald, indigo and red text read the shell tokens, and the bell badge has dark text in dark. It scans every page of the tutor app and the components they draw for a size under 12px the floor does not cover, and for an icon-only back link with no `aria-label`. Pages not yet rebuilt rely on the floor; rebuilt pages use the tokens directly. Second pass (T-0842, same file): a placeholder reads the third ink (`.dash ::placeholder`, it was `placeholder:text-gray-300`, 1.47 to 1) and the shadcn muted text does too (`--muted-foreground` set in the `.dash` block, so a select's placeholder is readable in the dark theme); every `input`, `textarea` and `select` of the tutor app (the pages, the components they draw and `src/components/settings`) must have a label for it, an `aria-label` or sit inside a `