Skip to content

Commit ab32bc0

Browse files
docs(topnav): top nav docs accessibility audit (#5724)
* docs(topnav): update top-nav docs * docs(topnav): add top-nav-item documentation * docs(topnav): use brackets when referring to components * docs(topnav): fix selection indicator for selected items --------- Co-authored-by: Nikki Massaro <5090492+nikkimk@users.noreply.github.com>
1 parent 1bbc82d commit ab32bc0

File tree

2 files changed

+373
-12
lines changed

2 files changed

+373
-12
lines changed

packages/top-nav/README.md

Lines changed: 195 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,65 @@
1-
## Description
1+
## Overview
22

3-
`<sp-top-nav>` delivers site navigation, particularly for when that navigation will change the majority of the page's content and/or the page's URL when selected. All primary elements of an `<sp-top-nav>` should be directly accessible in the tab order.
3+
`<sp-top-nav>` delivers site navigation, particularly for when that navigation will change the majority of the page's content and/or the page's URL when selected. All primary elements of an `<sp-top-nav>` should be directly accessible in the tab order, typically as `<sp-top-nav-item>` elements. There should only ever be one `<sp-top-nav>` on a page.
4+
5+
Refer to the [Spectrum Design System documentation](https://spectrum.adobe.com/page/headers/) for visual design guidelines and the [application frame patterns](https://spectrum.adobe.com/page/application-frame/) for usage in application contexts.
46

57
### Usage
68

79
[![See it on NPM!](https://img.shields.io/npm/v/@spectrum-web-components/top-nav?style=for-the-badge)](https://www.npmjs.com/package/@spectrum-web-components/top-nav)
810
[![How big is this package in your project?](https://img.shields.io/bundlephobia/minzip/@spectrum-web-components/top-nav?style=for-the-badge)](https://bundlephobia.com/result?p=@spectrum-web-components/top-nav)
911
[![Try it on Stackblitz](https://img.shields.io/badge/Try%20it%20on-Stackblitz-blue?style=for-the-badge)](https://stackblitz.com/edit/vitejs-vite-95xejnti)
1012

11-
```
13+
```bash
1214
yarn add @spectrum-web-components/top-nav
1315
```
1416

1517
Import the side effectful registration of `<sp-top-nav>` and `<sp-top-nav-item>` as follows:
1618

17-
```
19+
```js
1820
import '@spectrum-web-components/top-nav/sp-top-nav.js';
1921
import '@spectrum-web-components/top-nav/sp-top-nav-item.js';
2022
```
2123

2224
When looking to leverage the `TopNav` or `TopNavItem` base classes as a type and/or for extension purposes, do so via:
2325

24-
```
26+
```js
2527
import { TopNav, TopNavItem } from '@spectrum-web-components/top-nav';
2628
```
2729

28-
### Example
30+
### Anatomy
31+
32+
The `<sp-top-nav>` component consists of the following parts:
33+
34+
- **Container** (`<sp-top-nav>`): The main navigation container component with `role="navigation"` that manages nav items and selection states
35+
- **Navigation items** (`<sp-top-nav-item>`): Default slot; individual clickable navigation links
36+
- **Label**: Optional property to set an `aria-label` for the top navigation
37+
- **Selection indicator**: A visual indicator that animates to the selected item
38+
- **Divider**: Optional `<div>` divider that acts as the track for the selection indicator
39+
40+
### Options
41+
42+
<sp-tabs selected="default" auto label="Top nav options">
43+
<sp-tab value="default">Default</sp-tab>
44+
<sp-tab-panel value="default">
45+
46+
```html
47+
<sp-top-nav>
48+
<sp-top-nav-item href="#">Site Name</sp-top-nav-item>
49+
<sp-top-nav-item href="#page-1" style="margin-inline-start: auto;">
50+
Page 1
51+
</sp-top-nav-item>
52+
<sp-top-nav-item href="#page-2">Page 2</sp-top-nav-item>
53+
<sp-top-nav-item href="#page-3">Page 3</sp-top-nav-item>
54+
<sp-top-nav-item href="#page-4">Page with really long name</sp-top-nav-item>
55+
</sp-top-nav>
56+
```
57+
58+
</sp-tab-panel>
59+
<sp-tab value="action-menu">With action menu integration</sp-tab>
60+
<sp-tab-panel value="action-menu">
61+
62+
Other web components, like action menus and/or buttons, can be included in the `<sp-top-nav>` slots in order to extend functionality.
2963

3064
```html
3165
<sp-top-nav>
@@ -35,20 +69,169 @@ import { TopNav, TopNavItem } from '@spectrum-web-components/top-nav';
3569
</sp-top-nav-item>
3670
<sp-top-nav-item href="#page-2">Page 2</sp-top-nav-item>
3771
<sp-top-nav-item href="#page-3">Page 3</sp-top-nav-item>
38-
<sp-top-nav-item href="#page-4">Page with Really Long Name</sp-top-nav-item>
3972
<sp-action-menu
4073
label="Account"
4174
placement="bottom-end"
4275
style="margin-inline-start: auto;"
4376
quiet
4477
>
45-
<sp-menu-item>Account Settings</sp-menu-item>
46-
<sp-menu-item>My Profile</sp-menu-item>
47-
<sp-menu-divider></sp-menu-divider>
48-
<sp-menu-item>Share</sp-menu-item>
78+
<sp-menu-item>Account settings</sp-menu-item>
79+
<sp-menu-item>My profile</sp-menu-item>
4980
<sp-menu-divider></sp-menu-divider>
5081
<sp-menu-item>Help</sp-menu-item>
51-
<sp-menu-item>Sign Out</sp-menu-item>
82+
<sp-menu-item>Sign out</sp-menu-item>
5283
</sp-action-menu>
5384
</sp-top-nav>
5485
```
86+
87+
</sp-tab-panel>
88+
<sp-tab value="selected">With default selection</sp-tab>
89+
<sp-tab-panel value="selected">
90+
91+
Setting the `selected` property to a URL that matches a top navigation item's resolved `href` value will render that item selected by default.
92+
The `selected` value must match the fully resolved URL, not just the `href` attribute value.
93+
94+
For demonstration purposes only, the `href` value of the selected top nav item is hardcoded, as opposed to being a dynamic `href` or a jump link.
95+
96+
```html
97+
<sp-top-nav
98+
selected="https://opensource.adobe.com/spectrum-web-components/components/top-nav/"
99+
>
100+
<sp-top-nav-item href="#">Site Name</sp-top-nav-item>
101+
<sp-top-nav-item href="#home" style="margin-inline-start: auto;">
102+
Home
103+
</sp-top-nav-item>
104+
<sp-top-nav-item href="#services">Services</sp-top-nav-item>
105+
<sp-top-nav-item
106+
href="https://opensource.adobe.com/spectrum-web-components/components/top-nav/"
107+
selected
108+
>
109+
About
110+
</sp-top-nav-item>
111+
</sp-top-nav>
112+
```
113+
114+
</sp-tab-panel>
115+
<sp-tab value="ignore-url">Ignoring URL parts for selection</sp-tab>
116+
<sp-tab-panel value="ignore-url">
117+
118+
If implementations wish to ignore certain URL parts when matching for selection, the `ignore-url-parts` can be defined with a space-separated list. Currently supported values are `hash` and `search`, which will remove the `#hash` and `?search=value` respectively.
119+
120+
```html
121+
<sp-top-nav ignore-url-parts="search hash">
122+
<sp-top-nav-item href="/page1">Page 1</sp-top-nav-item>
123+
<sp-top-nav-item href="/page2">Page 2</sp-top-nav-item>
124+
</sp-top-nav>
125+
```
126+
127+
</sp-tab-panel>
128+
<sp-tab value="quiet">Quiet variant</sp-tab>
129+
<sp-tab-panel value="quiet">
130+
131+
The `quiet` property renders the top navigation component without the bottom border.
132+
133+
```html
134+
<sp-top-nav quiet>
135+
<sp-top-nav-item href="#">Home</sp-top-nav-item>
136+
<sp-top-nav-item href="/products">Products</sp-top-nav-item>
137+
</sp-top-nav>
138+
```
139+
140+
</sp-tab-panel>
141+
</sp-tabs>
142+
143+
#### Sizes
144+
145+
<sp-tabs selected="m" auto label="Top nav sizing options">
146+
<sp-tab value="s">Small</sp-tab>
147+
<sp-tab-panel value="s">
148+
149+
```html
150+
<sp-top-nav size="s">
151+
<sp-top-nav-item href="#">Site Name</sp-top-nav-item>
152+
<sp-top-nav-item href="#page-1" style="margin-inline-start: auto;">
153+
Page 1
154+
</sp-top-nav-item>
155+
<sp-top-nav-item href="#page-2">Page 2</sp-top-nav-item>
156+
<sp-top-nav-item href="#page-3">Page 3</sp-top-nav-item>
157+
<sp-top-nav-item href="#page-4">Page with really long name</sp-top-nav-item>
158+
</sp-top-nav>
159+
```
160+
161+
</sp-tab-panel>
162+
<sp-tab value="m">Medium</sp-tab>
163+
<sp-tab-panel value="m">
164+
165+
```html
166+
<sp-top-nav size="m">
167+
<sp-top-nav-item href="#">Site Name</sp-top-nav-item>
168+
<sp-top-nav-item href="#page-1" style="margin-inline-start: auto;">
169+
Page 1
170+
</sp-top-nav-item>
171+
<sp-top-nav-item href="#page-2">Page 2</sp-top-nav-item>
172+
<sp-top-nav-item href="#page-3">Page 3</sp-top-nav-item>
173+
<sp-top-nav-item href="#page-4">Page with really long name</sp-top-nav-item>
174+
</sp-top-nav>
175+
```
176+
177+
</sp-tab-panel>
178+
<sp-tab value="l">Large</sp-tab>
179+
<sp-tab-panel value="l">
180+
181+
```html
182+
<sp-top-nav size="l">
183+
<sp-top-nav-item href="#">Site Name</sp-top-nav-item>
184+
<sp-top-nav-item href="#page-1" style="margin-inline-start: auto;">
185+
Page 1
186+
</sp-top-nav-item>
187+
<sp-top-nav-item href="#page-2">Page 2</sp-top-nav-item>
188+
<sp-top-nav-item href="#page-3">Page 3</sp-top-nav-item>
189+
<sp-top-nav-item href="#page-4">Page with really long name</sp-top-nav-item>
190+
</sp-top-nav>
191+
```
192+
193+
</sp-tab-panel>
194+
<sp-tab value="xl">Extra large</sp-tab>
195+
<sp-tab-panel value="xl">
196+
197+
```html
198+
<sp-top-nav size="xl">
199+
<sp-top-nav-item href="#">Site Name</sp-top-nav-item>
200+
<sp-top-nav-item href="#page-1" style="margin-inline-start: auto;">
201+
Page 1
202+
</sp-top-nav-item>
203+
<sp-top-nav-item href="#page-2">Page 2</sp-top-nav-item>
204+
<sp-top-nav-item href="#page-3">Page 3</sp-top-nav-item>
205+
<sp-top-nav-item href="#page-4">Page with really long name</sp-top-nav-item>
206+
</sp-top-nav>
207+
```
208+
209+
</sp-tab-panel>
210+
</sp-tabs>
211+
212+
### Behaviors
213+
214+
- Items are automatically selected based on the current `window.location.href`
215+
- Use `ignore-url-parts` to ignore hash fragments or search parameters when matching
216+
- Items can be programmatically selected via the `selected` property
217+
- The selection indicator automatically resizes based on item content changes
218+
- Items can be positioned with CSS using CSS via the `style` attribute set on `<sp-top-nav-item>` elements (e.g., `margin-inline-start: auto`)
219+
220+
### Accessibility
221+
222+
#### ARIA attributes
223+
224+
- `role="navigation"` is automatically applied to the top nav container
225+
- The `label` property set on `<sp-top-nav>` will set an `aria-label` for screen readers
226+
- Selected items receive `aria-current="page"`
227+
228+
#### Keyboard interaction
229+
230+
- `Tab` should move focus between all navigation items in a logical tab order
231+
- `Enter` selects navigation items
232+
233+
#### Best practices
234+
235+
- **Always provide a label** for the navigation container.
236+
- **Use semantic `href` values** that match actual page URLs for automatic selection.
237+
- **Provide meaningful text content** for navigation items - avoid icon-only items without labels.

0 commit comments

Comments
 (0)