Move hint buttons from a separate flex column into the table as the
first <td> of each row, ensuring pixel-perfect alignment with grid rows.
Use position:sticky with box-shadow to keep hints fixed on the left
while scrolling horizontally.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add CSS variables (--cell, --cell-font, --trigger-h) for responsive cell sizing
- Shrink grid cells at 600px and 420px breakpoints
- Add .page-body wrapper with 16px horizontal padding to prevent edge collisions
- Separate hint column from scrollable grid: hints rendered outside the table in a fixed flex column, only the letter grid scrolls horizontally
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Hints should help identify the row actor (to find the highlighted letter),
not reveal the main actor directly. Simplified hint generation: no shared
exclusion pools needed since each row has a different actor.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Display spaces, hyphens and other non-letter characters as static cells
instead of input fields, and add separator rows in the grid for
non-alphabetic characters in the main actor's name.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Secrets are accessed via %env(NAME)% not %env(secret:NAME)%.
Symfony automatically resolves secrets as env vars.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Auto-discovery may not work reliably with vite-plugin-symfony.
Explicit registration ensures dropdown, notifications, and
import-modal controllers are loaded.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The CSS display:flex on .modal-overlay was overriding the HTML hidden
attribute, making the modal always visible.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reuses the app image with messenger:consume command.
Restarts automatically, with 1h time limit and 256M memory limit.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rename `read` column to `is_read` (PostgreSQL reserved word)
- Wrap navbar + modal in parent div for Stimulus controller scope
- Set temporary filePath before first flush in ImportController
- Use RETURNING clause for atomic incrementProcessedBatches
- Return proper empty 204 response in NotificationController
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>