shadcn.io is not affiliated with official shadcn/ui
Annotation File Upload Block for React
Numbered pins on a drawn checkout screen: click or press Enter to drop a pin, nudge it with the arrow keys, write its note in the list, delete to renumber, and copy the pins as JSON.
Installation
Overview
Pin a note to the exact spot, with this annotation panel for React with Base UI. It is the review board of Calloutly, a design-review tool. A drawn checkout screen sits at the start of a framed panel; click it, or focus it and press Enter, and a numbered pin drops there, or press Add pin at centre, the one Shine Button. Each pin is a 44 px target: select it and the arrow keys nudge it (Shift for bigger steps), and Delete removes it. At the end a list holds one note per pin in a Textarea; focusing a note selects its pin, and removing a pin renumbers the rest. A count shows pins out of eight, an Empty state holds the list's height when it is clear, and Copy JSON puts the pins and notes on the clipboard. A File Upload trigger names a picked screenshot while the drawing stays. The panel is ruled by Guides. For design review, QA and any markup of an image.
FAQ
How do I add and move a pin?
Click or tap the screen to drop one where you pointed, or press Enter on the focused screen or the Add button to drop one at the centre. A new pin is selected and its note takes focus. With a pin focused, the arrow keys move it by 2 percent of the screen, or 10 with Shift, and it stays inside the picture.
What happens when I delete a pin?
The pin goes, the rest are renumbered in order, and focus moves to the next note (or the one before it, or the Add button when none is left). The status line says which pin was removed. Eight pins is the most; the Add button then says so and adds nothing.
What is in the copied JSON?
The screenshot's name and the pins in order, each with its number, its x and y as percentages of the screen and its note. Coordinates are relative, so they hold at any display size.
What happens when I choose a screenshot?
Its name appears in the caption and the status line, and the drawing stays: the block never reads a picked file, so pins land on the drawn screen. A file that is not an image is refused with a line in the status.