Commit Graph
6215 Commits
Author SHA1 Message Date
Amruth Pillai 982e688e65 refactor(web): put app transitions on the house motion tokens
Set Tailwind's default transition duration and curve to --d1/--ease so
bare transition-* utilities run quick on the house curve. Mirror the
motion tokens in libs/motion.ts (EASE, EASE_MOVE, D1-D3, EXIT) and move
app UI off ease-out-strong and hand-typed 150/300ms durations; the
landing page keeps --ease-out-strong.

Give snapping hover and focus states a transition, slide progress fills
with translate instead of animating width, keep selection outlines'
width and style constant so they fade from transparent instead of
flashing dark, and drop the unused agent-prompt-marquee keyframes.
2026-09-29 12:32:45 +02:00
Amruth Pillai 741b080296 fix(web): clear the query cache when signing out from the avatar menu 2026-09-29 12:28:49 +02:00
Amruth Pillai 3c71b4e7c3 fix(web): list custom section types directly once every section is in use 2026-09-29 11:10:49 +02:00
Amruth Pillai ab2e263a2c fix(pdf): draw azurill's timeline line under forme
Forme gives an absolute box no height from its top and bottom offsets,
so the bar that react-pdf stretched down each section's items vanished.
The converter now draws such a bar as the left border of a box around
the other children, which is as tall as they are and is painted on
every page the section reaches.
2026-09-29 11:06:20 +02:00
Amruth Pillai 7c33ebae11 chore(api): keep the version summary type private 2026-09-29 10:50:48 +02:00
Amruth Pillai 218aad51a8 refactor(web): leave memoization to the React Compiler where it compiles
Removes useCallback, useMemo and memo from the 27 files the compiler compiles without bailing. Files it bails on (destructuring defaults, try/finally, refs read during render) keep their manual memoization.
2026-09-29 10:50:26 +02:00
Amruth Pillai eae7de3fb0 refactor(web): drop server-rendering guards from the client-only app 2026-09-29 10:48:08 +02:00
Amruth Pillai bf3ca81c49 refactor(web): answer confirmations and prompts with one dialog 2026-09-29 10:45:57 +02:00
Amruth Pillai 6e412c2f6b refactor(api): share one version history between resumes and letters 2026-09-29 10:44:03 +02:00
Amruth Pillai 29647ec634 refactor(api): queue resume update notifications with events.on 2026-09-29 10:42:33 +02:00
Amruth Pillai 22dbbdc547 refactor(web): write private notes with the standard rich text editor
RichInput, the full-toolbar editor only notes used, is gone with its tests; the editor extensions it defined move to rich-text-extensions.ts, which the rich text editor already used.
2026-09-29 10:41:32 +02:00
Amruth Pillai 538fd316a1 fix(web): swap preview renders instantly when motion is reduced
The preview cross-fades each new render with motion, which animates in JavaScript and ignores the CSS reduced-motion rule. A render landing from the PDF worker while a sheet was open could leave a page half-faded, so its caption read at low contrast (and moved for users who asked for less motion).
2026-09-29 10:40:01 +02:00
Amruth Pillai 36163a52b4 chore(web): keep an internal sidebar type private 2026-09-29 10:28:49 +02:00
Amruth Pillai cb3c594655 refactor(web): drop combobox groups, SSR hydration options and a hand-typed form store 2026-09-29 10:27:07 +02:00
Amruth Pillai c302faa70b refactor(web): delete code only tests used and reuse shared locale and colour helpers 2026-09-29 10:25:13 +02:00
Amruth Pillai e368e5955d chore: remove unused UI parts, dependencies and turbo tasks, and share escapeHtml 2026-09-29 10:21:20 +02:00
Amruth Pillai 0f6e08a922 refactor: drop dead render props, duplicate template tables and unused import helpers 2026-09-29 10:19:02 +02:00
Amruth Pillai a42cacc057 refactor(api): share cookie, signature and AI error handling instead of copying them 2026-09-29 10:15:56 +02:00
Amruth Pillai 8951f45a3a refactor(api): drop hand-rolled helpers the platform or one caller already covers 2026-09-29 10:13:19 +02:00
Amruth Pillai 2506509538 feat: make cover letters documents of their own
Resumes no longer hold cover-letter sections. A migration saves every
letter a resume carried as a letter linked to that resume's details and
design, hands a resume's only letter to its only letter-less application,
then removes the sections from resumes and their layouts. rollback.sql
puts them back.

Every resume write on the server moves any letter it still carries into
a saved letter in the same transaction, so stale tabs, older files, API
clients and restored versions keep working without duplicating letters.

The resume editor no longer adds or imports letters, the resume download
drops its Cover letter tab, and resume PDF downloads (API, signed links,
MCP) no longer take a cover-letter target. copy_embedded_cover_letter and
POST /cover-letters/from-resume are removed.
2026-09-29 09:30:07 +02:00
Amruth Pillai de3ffeacca docs: log the redesign's completion 2026-09-29 08:44:06 +02:00
Amruth Pillai 48793e04be chore(pdf): drop what the Forme port left unused 2026-09-29 08:40:22 +02:00
Amruth Pillai b775cbc15c fix(ui): let callers name an icon's slot again 2026-09-29 08:35:34 +02:00
Amruth Pillai bfb19ce56e chore(web): extract messages 2026-09-29 08:34:40 +02:00
Amruth Pillai cbc76b03b1 refactor!: contract the redesign's legacy fields
The expand steps of the redesign kept older app versions and API clients
working. This removes those compatibility paths:

- Entry date text (period/date) is written from the structured dates on
  every save; an edit to the text alone is overwritten.
- application.archived is dropped; archived rows close first. CSV import
  still reads the flag from older exports.
- resume_version.label is dropped; versions are named by kind and name.
- rejected is no longer accepted as a stage; remaining rows and history
  close first. CSV import still maps it to closed.

BREAKING CHANGE: older app versions and API clients that read or write
archived, version labels, the rejected stage or date text alone no
longer work. migrations/20260929063245_contract_redesign_legacy_fields
has a rollback.sql that restores the dropped columns.
2026-09-29 08:34:27 +02:00
Amruth Pillai 29ab0326b2 fix(pdf): mirror the award title and date right to left 2026-09-29 08:27:24 +02:00
Amruth Pillai 3405200cf4 fix(pdf): keep a list marker with its item's first line 2026-09-29 08:25:06 +02:00
Amruth Pillai ce2f1857f9 perf(web): render resume PDFs in a web worker 2026-09-29 08:21:59 +02:00
Amruth Pillai 5dc67c3bd4 fix(web): restyle the custom CSS editor in the app's inks and show its toolbar icons 2026-09-29 08:17:12 +02:00
Amruth Pillai 49422e98f2 feat: give a letter its own type, colors and page 2026-09-29 08:14:37 +02:00
Amruth Pillai 17d25c5ffa test(pdf): letters print the sender's header in every template 2026-09-29 08:08:12 +02:00
Amruth Pillai 6c2bc74f92 feat: pin the exported PDF's findings to the page in Check
The file-level check places each finding's evidence on its page: the
rule's own box, or the line holding its snippet. Check keeps the report
with the resume it ran on and, while the resume is unchanged, outlines
each finding on the page with a pin that opens the full report.
2026-09-29 08:05:41 +02:00
Amruth Pillai 098df60230 feat: choose which side the sidebar sits on
Two-column templates take a sidebarSide from the layout (left or right).
Without one, each template keeps its own side and right-to-left pages
mirror it. The PDF templates reverse only their columns, header band
and sidebar background, and the DOCX export follows the same choice.
Design's Sidebar panel offers Left and Right.
2026-09-29 08:00:33 +02:00
Amruth Pillai 11fe2b7a28 feat(web): say what an import brought in when the editor opens
Opening an imported resume shows a note at the top of Write: the file,
the sections and entries found, and how many fields still need a look.
The counts follow the resume as flags are cleared, and the note stays
until it is dismissed.
2026-09-29 08:00:33 +02:00
Amruth Pillai 5f7ed15a5b feat(web): dock the text toolbar above the phone keyboard
On phones the formatting toolbar follows the visual viewport and sits on
the keyboard, 44px tall, with Improve and Done. Done closes the keyboard.
Larger screens keep the toolbar inside the field.
2026-09-29 07:59:59 +02:00
Amruth Pillai 722f5fa14c fix(pdf): close the remaining gaps in the forme port
Work around more Forme 0.25 layout defects in the converter: row-reverse
laid out as row, min and max widths ignored along a row, text dropping
view children, empty text taking a line, overflowing optimal line
breaks, a text in a splitting row wrecking later pages, page breaks on
row items, four equal border sides, percentage corner radii, pictures
under their shadow, and imported table rows. Rotation is left out while
Forme misplaces rotated boxes; the stylesheet editor warns about it and
about percentage padding.

The page map rebuilds blocks Forme drops from its layout, the browser
renderer rejects documents whose fonts can't load so callers fall back
to the server PDF, and every render gets fresh font entries. Glalie's
sidebar is one band at the combined tint.

Tests are re-baselined where they encoded react-pdf metrics, and engine
limits (list marker keep-together, RTL line order, characters above
U+FFFF, percentage padding) are expected failures. The plan logs the
migration in section 13.
2026-09-29 07:37:25 +02:00
Amruth Pillai c0bf1aebaf feat(pdf): remove react-pdf and move every consumer to forme
The web preview, downloads, template gallery, server export and public
PDF render through Forme. react-pdf, react-pdf-html, the react-pdf
hyphenation package, the Phosphor react-pdf icons and the four patches
are gone. Hyphenation now follows the page language for every language
Forme has patterns for.

Semantic CSS keeps its language; declarations Forme can't draw raise an
ENGINE_UNSUPPORTED warning in the editor. The page map rebuilds blocks
Forme leaves out of its layout when they break across pages, and a
render that misplaces a box is repeated with nested rows kept whole.

Tests move to a small shim with the react-pdf calls they were written
against; tests of react-pdf internals are dropped. Forme limits are
recorded as expected failures (RTL line order, characters above
U+FFFF).
2026-09-29 07:11:40 +02:00
Amruth Pillai bc28441b66 feat(pdf): render resumes with the forme engine
Templates keep their react-pdf-style primitives. A small React renderer
records what they draw, and the result is converted to a Forme document:
styles, fonts (with ligatures disabled for text extraction), Phosphor
icons as SVG paths, pictures fitted by object-fit, and the page map from
source locations. Workarounds for Forme 0.25 layout defects live in the
converter: opaque translucent colours, border insets, row splitting,
column gaps across pages, absolute positioning and repeated backgrounds.

Consumers, the Semantic CSS adapter and the old react-pdf dependencies
follow in later commits.
2026-09-29 06:22:38 +02:00
Amruth Pillai 195fbaaaf4 docs: log M12 in the redesign plan 2026-09-29 01:29:36 +02:00
Amruth Pillai 82e2c92a51 test(e2e): wait for the assistant to settle and for focus to return
Enter in the composer is ignored until the previous reply has finished, so the helper presses again until the message goes; the palette's focus return is polled rather than read once.
2026-09-29 01:29:12 +02:00
Amruth Pillai 9062114379 chore(i18n): extract catalogs for the m12 fixes 2026-09-29 01:24:47 +02:00
Amruth Pillai 92dc11bd2f test(e2e): axe on the main screens, and focus return
Adds @axe-core/playwright and audits the editor's modes, the assistant, both Share tabs, Documents, New, the letter editor, the command palette, Applications, Settings, the shared resume, the ATS checker and sign-in against WCAG 2.1 AA, in light and dark and at phone width. A keyboard spec checks that the Share sheet, the assistant, New and the command palette return focus to what opened them.
2026-09-29 01:22:21 +02:00
Amruth Pillai 62572a20ca fix(web): accessibility and tablet fixes from the M12 audit
- The resume and letter canvases are focusable, labelled regions, so the page
  scrolls from the keyboard even before its lines load.
- Closing the assistant returns focus to the ✦ button.
- The ✦ button shows on tablets and phones too, where the assistant opens as
  a drawer or full screen.
- On tablets, Download PDF drops its label so the bar fits beside the mode
  switch.
- The phone reflow darkens a template colour that's too faint to read on
  white, and the checked download format's extension steps up to ink-2.
2026-09-29 01:22:20 +02:00
Amruth Pillai dcddc5639a fix(ui): 44px touch targets and readable descriptions on tinted rows
On coarse pointers, buttons, switches, checkboxes and tabs get an invisible hit area of at least 44x44 centred on them, without changing how they look. A checked switch row's description steps up to ink-2, since ink-3 falls short of 4.5:1 on the accent tint. Adds contrastOnWhite to the colour utilities.
2026-09-29 01:22:19 +02:00
Amruth Pillai 55a3284360 refactor(web): move the app chrome from phosphor to material symbols
Auth pages, dialogs, the command palette, the user menu, Applications, the rich-text toolbar, the stylesheet editor and the error screens use the Material Symbols set instead of Phosphor; the icon subset gains the 35 glyphs they need. Phosphor stays for brand logos, the landing page and the icons printed on resumes. Also removes the form field and test mock that only wrapped the old rich input.
2026-09-29 01:01:16 +02:00
Amruth Pillai f8767c32f1 refactor(ui): retire the shadcn colour aliases
Every class that used the old names (muted, primary, card, border, input and the rest) now uses the Desk & Paper token it resolved to, with text colours on their text tokens (accent-text, danger-text, ink-3). The compatibility block in the theme is gone.
2026-09-29 00:56:59 +02:00
Amruth Pillai 3a69dfc4d5 refactor(ui): remove the agent chat primitives and sidebar
Attachment, bubble, empty, marker, message, message scroller, questionnaire, resizable and sidebar had no users after the assistant moved into the editor, and neither did react-resizable-panels or @shadcn/react.
2026-09-29 00:55:50 +02:00
Amruth Pillai f2eb230f69 docs: log M11 in the redesign plan 2026-09-29 00:54:00 +02:00
Amruth Pillai d2ef001be9 test(server): give the first app route test time for the cold import
It imports the whole app and timed out under parallel runs.
2026-09-29 00:53:31 +02:00
Amruth Pillai 3604d6feb2 chore(i18n): extract catalogs for settings and public pages 2026-09-29 00:50:33 +02:00