# Notifications Menu

> A notifications activity-feed dropdown — a bell trigger with a live unread badge opens a WAI-ARIA menu panel holding an avatar feed with pulsing unread dots, an All/Unread filter, a real mark-all-read action, a scrollable row list and full keyboard navigation.

- Category: Dropdown Menu
- Frameworks: Vanilla, React + CSS, React + Tailwind
- Design system: Aperture
- Dark mode: yes
- Access: premium (Atheros AI Pass)
- Page: https://builder.atheros.ai/components/notifications-menu
- Preview: https://d17nmjscumqk5d.cloudfront.net/builder/templates/tpl_builder_notifications_menu/preview-ad81e88bd078.webp

## Features

- Bell trigger with a live unread-count badge and a pulsing ping ring while unread items exist
- Menu-button pattern with `aria-haspopup`, `aria-expanded` and `aria-controls`
- Data-driven activity feed rendered from a `NOTIFICATIONS` array in `js/data.js`
- Initial-disc avatars rotating through four reserved accent hues — fully asset-free
- Unread rows carry an azure wash and a pulsing dot animated with transform and opacity only
- Real "Mark all read" action that clears unread state and updates the badge count
- All/Unread filter as `menuitemradio` pills with a live unread counter
- Clicking an unread row marks just that notification as read
- Empty state ("You are all caught up") when the Unread filter has nothing left
- Scrollable feed with `scrollbar-width: thin` and pinned header/footer bands
- Full roving keyboard navigation with Arrow, Home, End, Enter, Escape and Tab
- Focus restoration after every re-render (filter switch, mark read, mark all)
- Fully respects `prefers-reduced-motion`

## Accessibility

- **Menu button** — The bell trigger uses `aria-haspopup="menu"`, `aria-expanded` and `aria-controls`
- **Menu semantics** — The panel uses `role="menu"`; rows and actions use `role="menuitem"`, filters use `role="menuitemradio"` with `aria-checked`
- **Unread announcement** — The trigger `aria-label` reports the live unread count; each row label appends ", unread" while unread
- **Roving focus** — Items use `tabindex="-1"` and receive focus as the active index moves, surviving re-renders
- **Focus return** — Closing with Enter or Escape returns focus to the trigger
- **Decorative markup** — Avatars, dots, icons and the badge carry `aria-hidden="true"` — state lives in labels
- **Focus indicators** — `:focus-visible` with `--ring` outline on all interactive elements
- **Reduced motion** — `prefers-reduced-motion: reduce` disables the ping and all transitions

## Keyboard shortcuts

- `ArrowDown` — Open the panel or move to the next item
- `ArrowUp` — Open the panel at the last item or move to the previous item
- `Home` — Move focus to the first item
- `End` — Move focus to the last item
- `Enter` — Activate the focused item — mark read, switch filter, mark all, view all
- `Escape` — Close the panel and return focus to the trigger
- `Tab` — Close the panel and move focus onward

## Common questions

**Which frameworks is Notifications Menu available in?**

Notifications Menu ships as Vanilla, React + CSS and React + Tailwind — HTML, CSS, JS and React source you can copy, download or clone into Atheros AI Builder.

**Is the Notifications Menu dropdown menu component free?**

Notifications Menu is a premium component. Anyone can preview it; the source, downloads and AI customisation are included with Atheros AI Pass.

**Does Notifications Menu support dark mode?**

Yes. Notifications Menu ships light and dark themes, both drawn from the Aperture design system's tokens. Switch the preview to dark mode to compare them.

## Get the code

Preview Notifications Menu live, then sign in to copy or download the source, apply another design system, or ask the AI assistant to change it: https://builder.atheros.ai/components/notifications-menu

Every component on https://builder.atheros.ai is also reachable from Claude Code, Cursor and Codex through the Atheros MCP server (paid plans). Component index: https://builder.atheros.ai/llms-components.txt
