---
convoy: scanner-desktop-layout
brief_number: 2
depends_on: []
recommended_model: composer-2.5-fast
model_tier: fast
files:
- components/scanner/ScannerTips.js
- test/components/ScannerTips.test.js
cross_brief_commitments:
- brief: 6
description: |
Brief 6 mounts `` in the desktop page header row (md+ only)
beside "Card Scanner" title. This brief ships the self-contained modal +
trigger button; no page wiring here.
---
# Brief 2: Scanner Tips modal
## Goal (1 sentence)
Ship a desktop Scanner Tips control that opens a glass `` with five convoy-authored tips.
## Files in scope (do not edit anything else)
- `components/scanner/ScannerTips.js`
- `test/components/ScannerTips.test.js`
## Conventions to follow
- Use `Modal` + `Button` from `components/ui` — no custom scrim (`ui-and-theming.mdc`).
- Glass panel recipe: `--glass-surface-low` via `GlassSurface` inside modal body if needed.
- Copy locked (Design direction + IA):
| # | Tip |
| --- | --- |
| 1 | **Good lighting** — avoid glare on foil cards. |
| 2 | **Fill the frame** with one card; keep corners visible. |
| 3 | **Hold still** until Auto-detect locks the match. |
| 4 | **Use Batch Scan** for a pile of photos from your gallery. |
| 5 | **Switch camera** if the image is dark or mirrored. |
- Modal title: **Scanner Tips**. Trigger: ghost `Button` with lightbulb SVG + label **Scanner Tips** (visible text for 2.5.3 Label in Name).
- Dismiss: close control, Esc, scrim click — standard `` behavior.
- No hex in `.js`; tokens only.
- Test pattern: `test/components/ScannerCheckoutSheet.test.js` (vitest + jsdom + RTL).
## Implementation shape
```js
export default function ScannerTips({ className = '' }) {
const [open, setOpen] = useState(false);
return (
<>