
Popover
A card hung from the key that opened it, with a printed leader running back to the key. Not modal: the page stays live around it.
Kit parts
A key with a counter window in its cap, and a card of messages hung from it. Each unread message has its lamp lit; reading it puts the lamp out and the counter steps down.
Seats open in 11 days. Want one email that morning?
How it is built, line by line, comes with its code and styling.
| Name | Kind | Description |
|---|---|---|
| data-label | attribute | The first words of its aria-label; the count is added after. “Notifications” by default. |
| data-notifications-read-all | attribute | Reads them all. |
| data-notifications-status | attribute | Rewritten as “3 unread” or “All read”. Put it in a polite live region. |
| updateNotifications(card) · markNotificationsRead(card, items?) | function | Recount after adding or removing messages; read some or all of them. |
| Enter · Space · Escape · Tab | keyboard | Open and close from the key; Tab walks the messages’ keys; Escape returns to the key. |
Open the card. Press a key inside a message to read it, or Mark all read: the lamps go out top to bottom and the counter steps down.

A card hung from the key that opened it, with a printed leader running back to the key. Not modal: the page stays live around it.

A value that changes, on grey-green liquid crystal, with a ghost of the unlit segments behind it: clocks, battery, counters.

The only colour in the kit: a lamp that is on. Green is on, amber is waiting, red is recording or failing, blue is linked, white is standing by. Always next to words.