@api-client/ui 0.5.32 → 0.5.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/src/core/ApplicationRoute.d.ts.map +1 -1
- package/build/src/core/ApplicationRoute.js +3 -0
- package/build/src/core/ApplicationRoute.js.map +1 -1
- package/build/src/elements/navigation/internals/Navigation.d.ts +68 -0
- package/build/src/elements/navigation/internals/Navigation.d.ts.map +1 -0
- package/build/src/elements/navigation/internals/Navigation.js +205 -0
- package/build/src/elements/navigation/internals/Navigation.js.map +1 -0
- package/build/src/elements/navigation/internals/Navigation.styles.d.ts +3 -0
- package/build/src/elements/navigation/internals/Navigation.styles.d.ts.map +1 -0
- package/build/src/elements/navigation/internals/Navigation.styles.js +24 -0
- package/build/src/elements/navigation/internals/Navigation.styles.js.map +1 -0
- package/build/src/elements/navigation/internals/NavigationItem.d.ts +62 -2
- package/build/src/elements/navigation/internals/NavigationItem.d.ts.map +1 -1
- package/build/src/elements/navigation/internals/NavigationItem.js +88 -20
- package/build/src/elements/navigation/internals/NavigationItem.js.map +1 -1
- package/build/src/elements/navigation/ui-navigation.d.ts +11 -0
- package/build/src/elements/navigation/ui-navigation.d.ts.map +1 -0
- package/build/src/elements/navigation/ui-navigation.js +27 -0
- package/build/src/elements/navigation/ui-navigation.js.map +1 -0
- package/build/src/md/input/Input.d.ts +2 -0
- package/build/src/md/input/Input.d.ts.map +1 -1
- package/build/src/types/aria.d.ts +28 -0
- package/build/src/types/aria.d.ts.map +1 -0
- package/build/src/types/aria.js +2 -0
- package/build/src/types/aria.js.map +1 -0
- package/build/src/types/role.d.ts +1 -16
- package/build/src/types/role.d.ts.map +1 -1
- package/build/src/types/role.js.map +1 -1
- package/build/test/elements/navigation/Navigation.test.d.ts +3 -0
- package/build/test/elements/navigation/Navigation.test.d.ts.map +1 -0
- package/build/test/elements/navigation/Navigation.test.js +113 -0
- package/build/test/elements/navigation/Navigation.test.js.map +1 -0
- package/demo/elements/index.html +2 -0
- package/demo/elements/navigation/navigation.html +20 -0
- package/demo/elements/navigation/navigation.ts +45 -0
- package/package.json +1 -1
- package/src/core/ApplicationRoute.ts +4 -1
- package/src/elements/navigation/internals/Navigation.styles.ts +24 -0
- package/src/elements/navigation/internals/Navigation.ts +181 -0
- package/src/elements/navigation/internals/NavigationItem.ts +79 -5
- package/src/elements/navigation/ui-navigation.ts +15 -0
- package/src/types/aria.ts +141 -0
- package/src/types/role.ts +1 -129
- package/test/elements/navigation/Navigation.test.ts +120 -0
- package/tsconfig.json +1 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { html, fixture, assert, oneEvent, aTimeout } from '@open-wc/testing'
|
|
2
|
+
import type Navigation from '../../../src/elements/navigation/internals/Navigation.js'
|
|
3
|
+
import '../../../src/elements/navigation/ui-navigation.js'
|
|
4
|
+
import '../../../src/elements/navigation/ui-navigation-item.js'
|
|
5
|
+
|
|
6
|
+
describe('Navigation', () => {
|
|
7
|
+
it('renders with slot content', async () => {
|
|
8
|
+
const el = await fixture<Navigation>(html`
|
|
9
|
+
<ui-navigation aria-label="Main navigation">
|
|
10
|
+
<ui-navigation-item selected aria-current="page">Home</ui-navigation-item>
|
|
11
|
+
<ui-navigation-item>Search</ui-navigation-item>
|
|
12
|
+
<ui-navigation-item>Files</ui-navigation-item>
|
|
13
|
+
</ui-navigation>
|
|
14
|
+
`)
|
|
15
|
+
const nav = el.shadowRoot!.querySelector('nav')
|
|
16
|
+
assert.ok(nav, 'nav element is rendered')
|
|
17
|
+
assert.equal(nav?.getAttribute('aria-label'), 'Main navigation')
|
|
18
|
+
const items = el._items
|
|
19
|
+
assert.equal(items.length, 3)
|
|
20
|
+
assert.isTrue(items[0].selected)
|
|
21
|
+
assert.equal(items[0].getAttribute('aria-current'), 'page')
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
it('sets correct tabindex for items', async () => {
|
|
25
|
+
const el = await fixture<Navigation>(html`
|
|
26
|
+
<ui-navigation>
|
|
27
|
+
<ui-navigation-item selected>Home</ui-navigation-item>
|
|
28
|
+
<ui-navigation-item>Search</ui-navigation-item>
|
|
29
|
+
</ui-navigation>
|
|
30
|
+
`)
|
|
31
|
+
const items = el._items
|
|
32
|
+
assert.equal(items[0].getAttribute('tabindex'), '0')
|
|
33
|
+
assert.equal(items[1].getAttribute('tabindex'), '-1')
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('selects item on click and fires select event', async () => {
|
|
37
|
+
const el = await fixture<Navigation>(html`
|
|
38
|
+
<ui-navigation>
|
|
39
|
+
<ui-navigation-item>Home</ui-navigation-item>
|
|
40
|
+
<ui-navigation-item>Search</ui-navigation-item>
|
|
41
|
+
</ui-navigation>
|
|
42
|
+
`)
|
|
43
|
+
const items = el._items
|
|
44
|
+
setTimeout(() => items[1].click())
|
|
45
|
+
const ev = await oneEvent(el, 'select')
|
|
46
|
+
assert.equal(ev.detail.item, items[1])
|
|
47
|
+
assert.isTrue(items[1].selected)
|
|
48
|
+
assert.equal(items[1].getAttribute('tabindex'), '0')
|
|
49
|
+
assert.isFalse(items[0].selected)
|
|
50
|
+
assert.equal(items[0].getAttribute('tabindex'), '-1')
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('handles keyboard navigation (vertical)', async () => {
|
|
54
|
+
const el = await fixture<Navigation>(html`
|
|
55
|
+
<ui-navigation>
|
|
56
|
+
<ui-navigation-item>Home</ui-navigation-item>
|
|
57
|
+
<ui-navigation-item>Search</ui-navigation-item>
|
|
58
|
+
<ui-navigation-item>Files</ui-navigation-item>
|
|
59
|
+
</ui-navigation>
|
|
60
|
+
`)
|
|
61
|
+
const items = el._items
|
|
62
|
+
items[0].focus()
|
|
63
|
+
// ArrowDown moves to next
|
|
64
|
+
items[0].dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
|
|
65
|
+
await aTimeout(0)
|
|
66
|
+
assert.dom.equal(document.activeElement, items[1])
|
|
67
|
+
// ArrowUp wraps to last
|
|
68
|
+
items[1].dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true }))
|
|
69
|
+
await aTimeout(0)
|
|
70
|
+
assert.dom.equal(document.activeElement, items[0])
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('handles keyboard navigation (horizontal)', async () => {
|
|
74
|
+
const el = await fixture<Navigation>(html`
|
|
75
|
+
<ui-navigation orientation="horizontal">
|
|
76
|
+
<ui-navigation-item>Home</ui-navigation-item>
|
|
77
|
+
<ui-navigation-item>Search</ui-navigation-item>
|
|
78
|
+
</ui-navigation>
|
|
79
|
+
`)
|
|
80
|
+
const items = el._items
|
|
81
|
+
items[0].focus()
|
|
82
|
+
items[0].dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
|
|
83
|
+
await aTimeout(0)
|
|
84
|
+
assert.dom.equal(document.activeElement, items[1])
|
|
85
|
+
items[1].dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true }))
|
|
86
|
+
await aTimeout(0)
|
|
87
|
+
assert.dom.equal(document.activeElement, items[0])
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
it('skips disabled items in navigation', async () => {
|
|
91
|
+
const el = await fixture<Navigation>(html`
|
|
92
|
+
<ui-navigation>
|
|
93
|
+
<ui-navigation-item>Home</ui-navigation-item>
|
|
94
|
+
<ui-navigation-item disabled>Search</ui-navigation-item>
|
|
95
|
+
<ui-navigation-item>Files</ui-navigation-item>
|
|
96
|
+
</ui-navigation>
|
|
97
|
+
`)
|
|
98
|
+
const items = el._items
|
|
99
|
+
items[0].focus()
|
|
100
|
+
items[0].dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
|
|
101
|
+
await aTimeout(0)
|
|
102
|
+
// Should skip disabled and go to Files
|
|
103
|
+
assert.dom.equal(document.activeElement, items[2])
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
it('sets aria-current on selected item if current is set', async () => {
|
|
107
|
+
const el = await fixture<Navigation>(html`
|
|
108
|
+
<ui-navigation current="page">
|
|
109
|
+
<ui-navigation-item>Home</ui-navigation-item>
|
|
110
|
+
<ui-navigation-item>Search</ui-navigation-item>
|
|
111
|
+
</ui-navigation>
|
|
112
|
+
`)
|
|
113
|
+
const items = el._items
|
|
114
|
+
// Simulate user selection by clicking the item (public API)
|
|
115
|
+
items[1].click()
|
|
116
|
+
await aTimeout(0)
|
|
117
|
+
assert.equal(items[1].getAttribute('aria-current'), 'page')
|
|
118
|
+
assert.isFalse(items[0].hasAttribute('aria-current'))
|
|
119
|
+
})
|
|
120
|
+
})
|