1
- ## Description
1
+ ## Overview
2
2
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.
4
6
5
7
### Usage
6
8
7
9
[ ![ 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 )
8
10
[ ![ 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 )
9
11
[ ![ 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 )
10
12
11
- ```
13
+ ``` bash
12
14
yarn add @spectrum-web-components/top-nav
13
15
```
14
16
15
17
Import the side effectful registration of ` <sp-top-nav> ` and ` <sp-top-nav-item> ` as follows:
16
18
17
- ```
19
+ ``` js
18
20
import ' @spectrum-web-components/top-nav/sp-top-nav.js' ;
19
21
import ' @spectrum-web-components/top-nav/sp-top-nav-item.js' ;
20
22
```
21
23
22
24
When looking to leverage the ` TopNav ` or ` TopNavItem ` base classes as a type and/or for extension purposes, do so via:
23
25
24
- ```
26
+ ``` js
25
27
import { TopNav , TopNavItem } from ' @spectrum-web-components/top-nav' ;
26
28
```
27
29
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.
29
63
30
64
``` html
31
65
<sp-top-nav >
@@ -35,20 +69,169 @@ import { TopNav, TopNavItem } from '@spectrum-web-components/top-nav';
35
69
</sp-top-nav-item >
36
70
<sp-top-nav-item href =" #page-2" >Page 2</sp-top-nav-item >
37
71
<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 >
39
72
<sp-action-menu
40
73
label =" Account"
41
74
placement =" bottom-end"
42
75
style =" margin-inline-start : auto ;"
43
76
quiet
44
77
>
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 >
49
80
<sp-menu-divider ></sp-menu-divider >
50
81
<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 >
52
83
</sp-action-menu >
53
84
</sp-top-nav >
54
85
```
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