# Accessibility
> When Title is right, when it's wrong, and what ShellIcons emits under the hood.
Source: https://shellicons.shellui.dev/docs/guides/accessibility
Icons come in two flavors for screen readers: **decorative** (skipped) and **meaningful** (announced). ShellIcons makes both cases correct by default — you just choose which you want.
## Decorative — the default
No `Title` prop → the icon gets `aria-hidden="true"`. Screen readers skip it entirely.
Use this when the icon is redundant with visible text next to it:
```razor
```
The button announces as "Delete" — the icon adds nothing new for a screen-reader user, so hiding it is correct.
## Meaningful — with a `Title`
`Title="…"` → the icon becomes `role="img"` with an `aria-labelledby` pointing to a real `
` child:
```razor
```
Rendered HTML:
```html
```
Screen readers announce "Close dialog, image."
Use this when the icon is the **only** content — a bare close button, a status indicator, a stat delta arrow.
## Rule of thumb
- Icon has visible text right next to it → **no `Title`** (decorative)
- Icon is the entire button/link/status → **`Title` is required**
Blazor's a11y linters won't catch the wrong choice — you have to think it through per-usage. Two-second cost, big correctness win.
## Under the hood
The `id` in `aria-labelledby` is generated at render time — `shellicon-{counter}`. Multiple titled icons on the same page get distinct IDs. This isn't something you configure — it's automatic.
## Interactive icons — buttons, not icons
If you find yourself wanting `@onclick` on an `` directly, don't:
```razor
@* Wrong — the SVG isn't focusable, not keyboard-accessible *@
```
Wrap it in a `