@api-client/ui 0.5.39 → 0.5.41
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/elements/contextual-menu/{internals/ContextualMenu.d.ts → ContextualMenu.d.ts} +11 -6
- package/build/src/elements/contextual-menu/ContextualMenu.d.ts.map +1 -0
- package/build/src/elements/contextual-menu/{internals/ContextualMenu.js → ContextualMenu.js} +25 -3
- package/build/src/elements/contextual-menu/ContextualMenu.js.map +1 -0
- package/build/src/elements/contextual-menu/internals/types.d.ts +16 -7
- package/build/src/elements/contextual-menu/internals/types.d.ts.map +1 -1
- package/build/src/elements/contextual-menu/internals/types.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
- package/src/elements/contextual-menu/{internals/ContextualMenu.ts → ContextualMenu.ts} +31 -7
- package/src/elements/contextual-menu/internals/types.ts +17 -7
- package/.aiexclude +0 -3
- package/.cursor/rules/html-and-css-best-practices.mdc +0 -63
- package/.cursor/rules/lit-best-practices.mdc +0 -89
- package/.editorconfig +0 -29
- package/.github/CONTRIBUTING.md +0 -24
- package/.github/instructions/html-and-css-best-practices.instructions.md +0 -70
- package/.github/instructions/lit-best-practices.instructions.md +0 -90
- package/.github/release.yml +0 -14
- package/.github/stale.yml +0 -23
- package/.github/workflows/auto-release.yml +0 -182
- package/.github/workflows/release.yml +0 -82
- package/.prettierrc.js +0 -14
- package/.vscode/settings.json +0 -18
- package/RELEASE.md +0 -163
- package/RELEASE_SETUP.md +0 -235
- package/build/src/demo/DemoPage.d.ts +0 -81
- package/build/src/demo/DemoPage.d.ts.map +0 -1
- package/build/src/demo/DemoPage.js +0 -175
- package/build/src/demo/DemoPage.js.map +0 -1
- package/build/src/demo/DemoStyles.d.ts +0 -3
- package/build/src/demo/DemoStyles.d.ts.map +0 -1
- package/build/src/demo/DemoStyles.js +0 -60
- package/build/src/demo/DemoStyles.js.map +0 -1
- package/build/src/elements/contextual-menu/internals/ContextualMenu.d.ts.map +0 -1
- package/build/src/elements/contextual-menu/internals/ContextualMenu.js.map +0 -1
- package/build/test/elements/navigation/Navigation.test.d.ts +0 -3
- package/build/test/elements/navigation/Navigation.test.d.ts.map +0 -1
- package/build/test/elements/navigation/Navigation.test.js +0 -113
- package/build/test/elements/navigation/Navigation.test.js.map +0 -1
- package/commitlint.config.cjs +0 -2
- package/demo/elements/authorization/AuthPlugin.js +0 -57
- package/demo/elements/authorization/AuthProxy.js +0 -215
- package/demo/elements/authorization/api-key.html +0 -27
- package/demo/elements/authorization/api-key.ts +0 -44
- package/demo/elements/authorization/basic.html +0 -27
- package/demo/elements/authorization/basic.ts +0 -43
- package/demo/elements/authorization/bearer.html +0 -27
- package/demo/elements/authorization/bearer.ts +0 -43
- package/demo/elements/authorization/env.js +0 -8
- package/demo/elements/authorization/index.html +0 -44
- package/demo/elements/authorization/ntlm.html +0 -27
- package/demo/elements/authorization/ntlm.ts +0 -43
- package/demo/elements/authorization/oauth-authorize.html +0 -75
- package/demo/elements/authorization/oauth-authorize.ts +0 -40
- package/demo/elements/authorization/oauth-error.html +0 -18
- package/demo/elements/authorization/oauth-error.ts +0 -10
- package/demo/elements/authorization/oauth-popup.html +0 -36
- package/demo/elements/authorization/oauth2.html +0 -27
- package/demo/elements/authorization/oauth2.ts +0 -100
- package/demo/elements/authorization/oidc.html +0 -27
- package/demo/elements/authorization/oidc.ts +0 -139
- package/demo/elements/authorization/private.crt +0 -31
- package/demo/elements/authorization/private.csr +0 -28
- package/demo/elements/authorization/private.key +0 -51
- package/demo/elements/authorization/private.pem +0 -31
- package/demo/elements/authorization/redirect.html +0 -20
- package/demo/elements/authorization/ssl-commands.sh +0 -30
- package/demo/elements/authorization/ssl.conf +0 -24
- package/demo/elements/autocomplete/index.html +0 -64
- package/demo/elements/autocomplete/index.ts +0 -171
- package/demo/elements/code-editor/CodeEditorDemo.ts +0 -173
- package/demo/elements/code-editor/index.html +0 -19
- package/demo/elements/context-menu/DemoIcons.ts +0 -21
- package/demo/elements/context-menu/basic.html +0 -25
- package/demo/elements/context-menu/basic.ts +0 -119
- package/demo/elements/context-menu/custom-data.html +0 -25
- package/demo/elements/context-menu/custom-data.ts +0 -62
- package/demo/elements/context-menu/demo.css +0 -28
- package/demo/elements/context-menu/enabled-state.html +0 -25
- package/demo/elements/context-menu/enabled-state.ts +0 -73
- package/demo/elements/context-menu/icons.html +0 -25
- package/demo/elements/context-menu/icons.ts +0 -64
- package/demo/elements/context-menu/index.html +0 -43
- package/demo/elements/context-menu/nested.html +0 -25
- package/demo/elements/context-menu/nestedt.ts +0 -152
- package/demo/elements/context-menu/no-execute.html +0 -25
- package/demo/elements/context-menu/no-execute.ts +0 -134
- package/demo/elements/context-menu/radio-menu.html +0 -25
- package/demo/elements/context-menu/radio-menu.ts +0 -83
- package/demo/elements/context-menu/separators.html +0 -25
- package/demo/elements/context-menu/separators.ts +0 -172
- package/demo/elements/currency/index.html +0 -91
- package/demo/elements/currency/index.ts +0 -352
- package/demo/elements/environment/environment-editor.html +0 -20
- package/demo/elements/environment/environment-editor.ts +0 -49
- package/demo/elements/environment/index.html +0 -33
- package/demo/elements/environment/server-editor.html +0 -20
- package/demo/elements/environment/server-editor.ts +0 -67
- package/demo/elements/environment/variables-editor.html +0 -20
- package/demo/elements/environment/variables-editor.ts +0 -94
- package/demo/elements/har/har-viewer.html +0 -20
- package/demo/elements/har/har-viewer.ts +0 -76
- package/demo/elements/har/har1.har +0 -3044
- package/demo/elements/har/har2.json +0 -439
- package/demo/elements/har/index.html +0 -26
- package/demo/elements/highlight/example.md +0 -27
- package/demo/elements/highlight/index.html +0 -31
- package/demo/elements/highlight/marked-highlight.html +0 -132
- package/demo/elements/highlight/marked-highlight.ts +0 -22
- package/demo/elements/highlight/prism-highlight.html +0 -62
- package/demo/elements/highlight/prism-highlight.ts +0 -17
- package/demo/elements/http/body-editor.html +0 -17
- package/demo/elements/http/body-editor.ts +0 -115
- package/demo/elements/http/headers.html +0 -17
- package/demo/elements/http/headers.ts +0 -59
- package/demo/elements/http/http-assertions.html +0 -20
- package/demo/elements/http/http-assertions.ts +0 -89
- package/demo/elements/http/http-flows.html +0 -23
- package/demo/elements/http/http-flows.ts +0 -89
- package/demo/elements/http/index.html +0 -45
- package/demo/elements/http/request-editor.html +0 -26
- package/demo/elements/http/request-editor.ts +0 -197
- package/demo/elements/http/request-log.html +0 -16
- package/demo/elements/http/request-log.ts +0 -136
- package/demo/elements/http/url-editing.html +0 -17
- package/demo/elements/http/url-editing.ts +0 -112
- package/demo/elements/icons/index.html +0 -81
- package/demo/elements/icons/index.ts +0 -52
- package/demo/elements/index.html +0 -72
- package/demo/elements/mention-textarea/index.html +0 -19
- package/demo/elements/mention-textarea/index.ts +0 -205
- package/demo/elements/navigation/navigation-item.html +0 -49
- package/demo/elements/navigation/navigation-item.ts +0 -131
- package/demo/elements/navigation/navigation.html +0 -20
- package/demo/elements/navigation/navigation.ts +0 -45
- package/demo/elements/project/index.html +0 -29
- package/demo/elements/project/project-run-report.html +0 -20
- package/demo/elements/project/project-run-report.ts +0 -132
- package/demo/elements/project/request-editor.html +0 -23
- package/demo/elements/project/request-editor.ts +0 -232
- package/demo/elements/user/user-avatar.html +0 -17
- package/demo/elements/user/user-avatar.ts +0 -60
- package/demo/env.js +0 -4
- package/demo/index.html +0 -34
- package/demo/layout/index.html +0 -94
- package/demo/layout/index.ts +0 -190
- package/demo/md/DemoStyles.ts +0 -61
- package/demo/md/UiDemoPage.ts +0 -6
- package/demo/md/buttons/button.html +0 -121
- package/demo/md/buttons/button.ts +0 -246
- package/demo/md/buttons/group.html +0 -36
- package/demo/md/buttons/group.ts +0 -171
- package/demo/md/checkbox/index.html +0 -39
- package/demo/md/checkbox/index.ts +0 -220
- package/demo/md/chip/chip.html +0 -70
- package/demo/md/chip/chip.ts +0 -219
- package/demo/md/chip/pawel6c9a.jpg +0 -0
- package/demo/md/collapse/CustomDetail.ts +0 -89
- package/demo/md/collapse/collapse.html +0 -21
- package/demo/md/collapse/collapse.ts +0 -78
- package/demo/md/date-picker/date-picker.ts +0 -336
- package/demo/md/date-picker/index.html +0 -171
- package/demo/md/dialog/confirm-dialog.html +0 -49
- package/demo/md/dialog/confirm-dialog.ts +0 -121
- package/demo/md/dialog/dialog.html +0 -25
- package/demo/md/dialog/dialog.ts +0 -468
- package/demo/md/dropdown-list/index.html +0 -31
- package/demo/md/dropdown-list/index.ts +0 -158
- package/demo/md/icon-button/index.html +0 -122
- package/demo/md/icon-button/index.ts +0 -132
- package/demo/md/index.html +0 -73
- package/demo/md/inputs/input.html +0 -73
- package/demo/md/inputs/input.ts +0 -278
- package/demo/md/inputs/radio.html +0 -39
- package/demo/md/inputs/radio.ts +0 -156
- package/demo/md/inputs/switch.html +0 -45
- package/demo/md/inputs/switch.ts +0 -144
- package/demo/md/list/list.html +0 -65
- package/demo/md/list/list.ts +0 -204
- package/demo/md/listbox/listbox.html +0 -31
- package/demo/md/listbox/listbox.ts +0 -27
- package/demo/md/menu/index.html +0 -19
- package/demo/md/menu/index.ts +0 -514
- package/demo/md/notification/snack.html +0 -21
- package/demo/md/notification/snack.ts +0 -70
- package/demo/md/progress/progress.html +0 -46
- package/demo/md/progress/progress.ts +0 -161
- package/demo/md/segmented-button/index.html +0 -21
- package/demo/md/segmented-button/index.ts +0 -55
- package/demo/md/select/index.html +0 -16
- package/demo/md/select/index.ts +0 -217
- package/demo/md/tabs/tabs.html +0 -40
- package/demo/md/tabs/tabs.ts +0 -214
- package/demo/oauth-popup.html +0 -36
- package/demo/page.css +0 -8
- package/demo/resources/calendar-month.png +0 -0
- package/demo/resources/favorite.png +0 -0
- package/demo/resources/fingerprint.png +0 -0
- package/demo/resources/home-work.png +0 -0
- package/demo/resources/mood.png +0 -0
- package/demo/resources/print.png +0 -0
- package/demo/resources/stars.png +0 -0
- package/demo/resources/theaters.png +0 -0
- package/demo/tsconfig.json +0 -4
- package/eslint.config.js +0 -97
- package/scripts/copy-assets.js +0 -21
- package/scripts/release.js +0 -66
- package/src/demo/DemoPage.ts +0 -169
- package/src/demo/DemoStyles.ts +0 -60
- package/test/README.md +0 -375
- package/test/contextual-menu/ContextMenu.test.ts +0 -760
- package/test/contextual-menu/ContextMenuElement.test.ts +0 -569
- package/test/core/activity.spec.ts +0 -413
- package/test/core/activity_manager.spec.ts +0 -544
- package/test/core/application.spec.ts +0 -218
- package/test/core/fragment.spec.ts +0 -565
- package/test/core/fragment_manager.spec.ts +0 -404
- package/test/core/live_data.spec.ts +0 -558
- package/test/core/renderer.spec.ts +0 -113
- package/test/dom-assertions.test.ts +0 -182
- package/test/elements/MonacoSetup.ts +0 -65
- package/test/elements/authorization/basic-method.test.ts +0 -177
- package/test/elements/authorization/bearer-method.test.ts +0 -143
- package/test/elements/authorization/ntlm-method.test.ts +0 -219
- package/test/elements/authorization/oauth2-client-credentials-method.test.ts +0 -334
- package/test/elements/authorization/oauth2-code-method.test.ts +0 -320
- package/test/elements/authorization/oauth2-custom-grant-method.test.ts +0 -255
- package/test/elements/authorization/oauth2-device-code-method.test.ts +0 -371
- package/test/elements/authorization/oauth2-implicit-method.test.ts +0 -407
- package/test/elements/authorization/oauth2-jwt-method.test.ts +0 -217
- package/test/elements/authorization/oauth2-password-method.test.ts +0 -275
- package/test/elements/authorization/openid-method.test.ts +0 -591
- package/test/elements/autocomplete/autocomplete-input.spec.ts +0 -646
- package/test/elements/code-editor/code-editor.accessibility.test.ts +0 -298
- package/test/elements/code-editor/code-editor.test.ts +0 -574
- package/test/elements/currency/CurrencyPicker.accessibility.test.ts +0 -328
- package/test/elements/currency/CurrencyPicker.core.test.ts +0 -318
- package/test/elements/currency/CurrencyPicker.integration.test.ts +0 -482
- package/test/elements/currency/CurrencyPicker.test.ts +0 -486
- package/test/elements/data-table/DataTable.browser.test.ts +0 -649
- package/test/elements/har/HarUtils.test.ts +0 -45
- package/test/elements/har/HarViewerElement.test.ts +0 -687
- package/test/elements/har/test-data/har1.har +0 -3044
- package/test/elements/highlight/MarkedHighlightElement.test.ts +0 -452
- package/test/elements/highlight/PrismHighlightElement.test.ts +0 -79
- package/test/elements/highlight/PrismHighlighter.test.ts +0 -94
- package/test/elements/highlight/remoteSanitization.md +0 -1
- package/test/elements/highlight/test.md +0 -3
- package/test/elements/highlight/test1.md +0 -3
- package/test/elements/highlight/test2.md +0 -1
- package/test/elements/http/BodyFormdataEditorElement.test.ts +0 -482
- package/test/elements/http/BodyMultipartEditorElement.test.ts +0 -658
- package/test/elements/http/BodyRawEditorElement.test.ts +0 -90
- package/test/elements/http/CertificateAdd.test.ts +0 -457
- package/test/elements/http/HttpAssertions.test.ts +0 -994
- package/test/elements/http/HttpFlows.test.ts +0 -502
- package/test/elements/http/UrlEncodeUtils.test.ts +0 -202
- package/test/elements/layout/SplitItem.test.ts +0 -440
- package/test/elements/layout/SplitLayoutManager.test.ts +0 -1501
- package/test/elements/layout/SplitPanel.test.ts +0 -1109
- package/test/elements/mention-textarea/MentionTextArea.basic.test.ts +0 -114
- package/test/elements/mention-textarea/MentionTextArea.test.ts +0 -613
- package/test/elements/navigation/Navigation.test.ts +0 -120
- package/test/env.ts +0 -15
- package/test/events/EventTypes.test.ts +0 -363
- package/test/events/EventsTestHelpers.ts +0 -16
- package/test/helpers/TestUtils.ts +0 -243
- package/test/helpers/UiMock.ts +0 -185
- package/test/lib/Dom.test.ts +0 -231
- package/test/md/button/UiButton.test.ts +0 -347
- package/test/md/button/UiIconButton.test.ts +0 -155
- package/test/md/chip/UiChip.test.ts +0 -219
- package/test/md/collapse/UiCollapse.test.ts +0 -250
- package/test/md/collapse/flex-layout.test.ts +0 -105
- package/test/md/date-time/DateTime.test.ts +0 -348
- package/test/md/dialog/UiConfirmDialog.test.ts +0 -131
- package/test/md/dialog/UiDialog.test.ts +0 -759
- package/test/md/menu/Menu.test.ts +0 -855
- package/test/md/menu/MenuIntegration.test.ts +0 -426
- package/test/md/menu/MenuItem.test.ts +0 -652
- package/test/md/menu/SubMenu.test.ts +0 -410
- package/test/md/progress/UiCircularProgressElement.test.ts +0 -481
- package/test/md/progress/UiProgressElement.test.ts +0 -117
- package/test/md/progress/UiRangeElement.test.ts +0 -156
- package/test/md/select/Select.test.ts +0 -925
- package/test/plugins/takeScreenshotPlugin.js +0 -35
- package/test/setup.test.ts +0 -217
- package/test/setup.ts +0 -117
- package/test/tsconfig.json +0 -7
- package/web-dev-server.config.js +0 -21
- package/web-test-runner.config.js +0 -90
|
@@ -1,426 +0,0 @@
|
|
|
1
|
-
import { assert, fixture, html, nextFrame, aTimeout } from '@open-wc/testing'
|
|
2
|
-
import sinon from 'sinon'
|
|
3
|
-
import Menu from '../../../src/md/menu/internal/Menu.js'
|
|
4
|
-
import UiMenuItem from '../../../src/md/menu/internal/MenuItem.js'
|
|
5
|
-
import UiSubMenu from '../../../src/md/menu/internal/SubMenu.js'
|
|
6
|
-
|
|
7
|
-
import '../../../src/md/menu/ui-menu.js'
|
|
8
|
-
import '../../../src/md/menu/ui-menu-item.js'
|
|
9
|
-
import '../../../src/md/menu/ui-sub-menu.js'
|
|
10
|
-
import '../../../src/md/icons/ui-icon.js'
|
|
11
|
-
import '../../../src/md/button/ui-button.js'
|
|
12
|
-
|
|
13
|
-
describe('md', () => {
|
|
14
|
-
describe('Menu Integration', () => {
|
|
15
|
-
async function completeMenuFixture(): Promise<HTMLElement> {
|
|
16
|
-
return fixture(html`
|
|
17
|
-
<div>
|
|
18
|
-
<ui-button id="menu-trigger" popovertarget="main-menu">Open Menu</ui-button>
|
|
19
|
-
|
|
20
|
-
<ui-menu id="main-menu">
|
|
21
|
-
<!-- Regular menu items -->
|
|
22
|
-
<ui-menu-item>
|
|
23
|
-
<span slot="start"><ui-icon>add</ui-icon></span>
|
|
24
|
-
<span>New</span>
|
|
25
|
-
</ui-menu-item>
|
|
26
|
-
<ui-menu-item>
|
|
27
|
-
<span slot="start"><ui-icon>folder</ui-icon></span>
|
|
28
|
-
<span>Open</span>
|
|
29
|
-
</ui-menu-item>
|
|
30
|
-
|
|
31
|
-
<!-- Menu item with submenu -->
|
|
32
|
-
<ui-menu-item id="file-item" submenu="file-submenu">
|
|
33
|
-
<span slot="start"><ui-icon>docs</ui-icon></span>
|
|
34
|
-
<span>File</span>
|
|
35
|
-
</ui-menu-item>
|
|
36
|
-
|
|
37
|
-
<!-- Menu item with submenu -->
|
|
38
|
-
<ui-menu-item id="edit-item" submenu="edit-submenu">
|
|
39
|
-
<span slot="start"><ui-icon>edit</ui-icon></span>
|
|
40
|
-
<span>Edit</span>
|
|
41
|
-
</ui-menu-item>
|
|
42
|
-
|
|
43
|
-
<!-- File submenu with nested submenu -->
|
|
44
|
-
<ui-sub-menu id="file-submenu" anchor="file-item">
|
|
45
|
-
<ui-menu-item>New File</ui-menu-item>
|
|
46
|
-
<ui-menu-item>Open File</ui-menu-item>
|
|
47
|
-
<ui-menu-item id="export-item" submenu="export-submenu">
|
|
48
|
-
<span slot="start"><ui-icon>file_export</ui-icon></span>
|
|
49
|
-
<span>Export</span>
|
|
50
|
-
</ui-menu-item>
|
|
51
|
-
|
|
52
|
-
<!-- Nested submenu -->
|
|
53
|
-
<ui-sub-menu id="export-submenu" anchor="export-item">
|
|
54
|
-
<ui-menu-item>Export as PDF</ui-menu-item>
|
|
55
|
-
<ui-menu-item>Export as PNG</ui-menu-item>
|
|
56
|
-
<ui-menu-item>Export as SVG</ui-menu-item>
|
|
57
|
-
</ui-sub-menu>
|
|
58
|
-
</ui-sub-menu>
|
|
59
|
-
|
|
60
|
-
<!-- Edit submenu -->
|
|
61
|
-
<ui-sub-menu id="edit-submenu" anchor="edit-item">
|
|
62
|
-
<ui-menu-item>Undo</ui-menu-item>
|
|
63
|
-
<ui-menu-item>Redo</ui-menu-item>
|
|
64
|
-
<ui-menu-item>Cut</ui-menu-item>
|
|
65
|
-
<ui-menu-item>Copy</ui-menu-item>
|
|
66
|
-
</ui-sub-menu>
|
|
67
|
-
</ui-menu>
|
|
68
|
-
</div>
|
|
69
|
-
`)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
describe('Complete workflow', () => {
|
|
73
|
-
it('should open menu via trigger button', async () => {
|
|
74
|
-
const container = await completeMenuFixture()
|
|
75
|
-
const trigger = container.querySelector('#menu-trigger') as HTMLElement
|
|
76
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
77
|
-
await nextFrame()
|
|
78
|
-
|
|
79
|
-
trigger.click()
|
|
80
|
-
await nextFrame()
|
|
81
|
-
|
|
82
|
-
assert.isTrue(menu.open)
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
it('should open submenu on hover', async () => {
|
|
86
|
-
const container = await completeMenuFixture()
|
|
87
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
88
|
-
const fileItem = container.querySelector('#file-item') as UiMenuItem
|
|
89
|
-
const fileSubmenu = container.querySelector('#file-submenu') as UiSubMenu
|
|
90
|
-
await nextFrame()
|
|
91
|
-
|
|
92
|
-
menu.show()
|
|
93
|
-
await nextFrame()
|
|
94
|
-
|
|
95
|
-
// Hover over file item
|
|
96
|
-
const mouseEnterEvent = new MouseEvent('mouseenter')
|
|
97
|
-
fileItem.dispatchEvent(mouseEnterEvent)
|
|
98
|
-
await nextFrame()
|
|
99
|
-
|
|
100
|
-
assert.isNotNull(menu.activeSubMenu)
|
|
101
|
-
assert.equal(menu.activeSubMenu, fileSubmenu)
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
it('should navigate submenus with keyboard', async () => {
|
|
105
|
-
const container = await completeMenuFixture()
|
|
106
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
107
|
-
const fileItem = container.querySelector('#file-item') as UiMenuItem
|
|
108
|
-
await nextFrame()
|
|
109
|
-
|
|
110
|
-
menu.show()
|
|
111
|
-
await nextFrame()
|
|
112
|
-
|
|
113
|
-
// Set active item to file item
|
|
114
|
-
menu.activeListItem = fileItem
|
|
115
|
-
|
|
116
|
-
// Press right arrow to open submenu
|
|
117
|
-
const rightArrowEvent = new KeyboardEvent('keydown', { key: 'ArrowRight' })
|
|
118
|
-
menu.dispatchEvent(rightArrowEvent)
|
|
119
|
-
await nextFrame()
|
|
120
|
-
|
|
121
|
-
assert.isNotNull(menu.activeSubMenu)
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
it('should handle nested submenu navigation', async () => {
|
|
125
|
-
const container = await completeMenuFixture()
|
|
126
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
127
|
-
const fileItem = container.querySelector('#file-item') as UiMenuItem
|
|
128
|
-
const fileSubmenu = container.querySelector('#file-submenu') as UiSubMenu
|
|
129
|
-
const exportItem = container.querySelector('#export-item') as UiMenuItem
|
|
130
|
-
const exportSubmenu = container.querySelector('#export-submenu') as UiSubMenu
|
|
131
|
-
await nextFrame()
|
|
132
|
-
|
|
133
|
-
menu.show()
|
|
134
|
-
await nextFrame()
|
|
135
|
-
|
|
136
|
-
// Open file submenu
|
|
137
|
-
fileItem.openSubMenu()
|
|
138
|
-
await nextFrame()
|
|
139
|
-
|
|
140
|
-
// Hover over export item to open nested submenu
|
|
141
|
-
const mouseEnterEvent = new MouseEvent('mouseenter')
|
|
142
|
-
exportItem.dispatchEvent(mouseEnterEvent)
|
|
143
|
-
await nextFrame()
|
|
144
|
-
|
|
145
|
-
assert.isNotNull(fileSubmenu.activeSubMenu)
|
|
146
|
-
assert.equal(fileSubmenu.activeSubMenu, exportSubmenu)
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
it('should close submenus when main menu closes', async () => {
|
|
150
|
-
const container = await completeMenuFixture()
|
|
151
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
152
|
-
const fileItem = container.querySelector('#file-item') as UiMenuItem
|
|
153
|
-
const fileSubmenu = container.querySelector('#file-submenu') as UiSubMenu
|
|
154
|
-
await nextFrame()
|
|
155
|
-
|
|
156
|
-
menu.show()
|
|
157
|
-
await nextFrame()
|
|
158
|
-
|
|
159
|
-
// Open submenu
|
|
160
|
-
fileItem.openSubMenu()
|
|
161
|
-
await nextFrame()
|
|
162
|
-
assert.isTrue(fileSubmenu.open)
|
|
163
|
-
|
|
164
|
-
// Close main menu
|
|
165
|
-
menu.hide()
|
|
166
|
-
await nextFrame()
|
|
167
|
-
|
|
168
|
-
assert.isFalse(menu.open)
|
|
169
|
-
assert.isFalse(fileSubmenu.open)
|
|
170
|
-
assert.isNull(menu.activeSubMenu)
|
|
171
|
-
})
|
|
172
|
-
|
|
173
|
-
it('should handle menu item selection and close menu', async () => {
|
|
174
|
-
const container = await completeMenuFixture()
|
|
175
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
176
|
-
const menuItem = menu.querySelector('ui-menu-item') as UiMenuItem
|
|
177
|
-
let selectedItem: UiMenuItem | null = null
|
|
178
|
-
let selectedIndex: number | null = null
|
|
179
|
-
await nextFrame()
|
|
180
|
-
|
|
181
|
-
menu.addEventListener('select', (e: Event) => {
|
|
182
|
-
const customEvent = e as CustomEvent<{ item: UiMenuItem; index: number }>
|
|
183
|
-
selectedItem = customEvent.detail.item
|
|
184
|
-
selectedIndex = customEvent.detail.index
|
|
185
|
-
})
|
|
186
|
-
|
|
187
|
-
menu.show()
|
|
188
|
-
await nextFrame()
|
|
189
|
-
|
|
190
|
-
menuItem.click()
|
|
191
|
-
await nextFrame()
|
|
192
|
-
|
|
193
|
-
assert.isFalse(menu.open)
|
|
194
|
-
assert.equal(selectedItem, menuItem)
|
|
195
|
-
assert.equal(selectedIndex, 0)
|
|
196
|
-
})
|
|
197
|
-
|
|
198
|
-
it('should handle submenu item selection', async () => {
|
|
199
|
-
const container = await completeMenuFixture()
|
|
200
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
201
|
-
const fileItem = container.querySelector('#file-item') as UiMenuItem
|
|
202
|
-
const fileSubmenu = container.querySelector('#file-submenu') as UiSubMenu
|
|
203
|
-
const submenuItem = fileSubmenu.querySelector('ui-menu-item') as UiMenuItem
|
|
204
|
-
let selectedItem: UiMenuItem | null = null
|
|
205
|
-
await nextFrame()
|
|
206
|
-
|
|
207
|
-
menu.addEventListener('select', (e: Event) => {
|
|
208
|
-
const customEvent = e as CustomEvent<{ item: UiMenuItem; index: number }>
|
|
209
|
-
selectedItem = customEvent.detail.item
|
|
210
|
-
})
|
|
211
|
-
|
|
212
|
-
menu.show()
|
|
213
|
-
await nextFrame()
|
|
214
|
-
|
|
215
|
-
// Open submenu
|
|
216
|
-
fileItem.openSubMenu()
|
|
217
|
-
await nextFrame()
|
|
218
|
-
|
|
219
|
-
// Click submenu item
|
|
220
|
-
submenuItem.click()
|
|
221
|
-
await nextFrame()
|
|
222
|
-
|
|
223
|
-
assert.isFalse(menu.open)
|
|
224
|
-
assert.isFalse(fileSubmenu.open)
|
|
225
|
-
assert.equal(selectedItem, submenuItem)
|
|
226
|
-
})
|
|
227
|
-
|
|
228
|
-
it('should handle deeply nested submenu selection', async () => {
|
|
229
|
-
const container = await completeMenuFixture()
|
|
230
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
231
|
-
const fileItem = container.querySelector('#file-item') as UiMenuItem
|
|
232
|
-
const exportItem = container.querySelector('#export-item') as UiMenuItem
|
|
233
|
-
const exportSubmenu = container.querySelector('#export-submenu') as UiSubMenu
|
|
234
|
-
const nestedItem = exportSubmenu.querySelector('ui-menu-item') as UiMenuItem
|
|
235
|
-
let selectedItem: UiMenuItem | null = null
|
|
236
|
-
await nextFrame()
|
|
237
|
-
|
|
238
|
-
menu.addEventListener('select', (e: Event) => {
|
|
239
|
-
const customEvent = e as CustomEvent<{ item: UiMenuItem; index: number }>
|
|
240
|
-
selectedItem = customEvent.detail.item
|
|
241
|
-
})
|
|
242
|
-
|
|
243
|
-
menu.show()
|
|
244
|
-
await nextFrame()
|
|
245
|
-
|
|
246
|
-
// Open file submenu
|
|
247
|
-
fileItem.openSubMenu()
|
|
248
|
-
await nextFrame()
|
|
249
|
-
|
|
250
|
-
// Open export submenu
|
|
251
|
-
exportItem.openSubMenu()
|
|
252
|
-
await nextFrame()
|
|
253
|
-
|
|
254
|
-
// Click nested item
|
|
255
|
-
nestedItem.click()
|
|
256
|
-
await nextFrame()
|
|
257
|
-
|
|
258
|
-
assert.isFalse(menu.open)
|
|
259
|
-
assert.equal(selectedItem, nestedItem)
|
|
260
|
-
})
|
|
261
|
-
|
|
262
|
-
it('should switch between submenus properly', async () => {
|
|
263
|
-
const container = await completeMenuFixture()
|
|
264
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
265
|
-
const fileItem = container.querySelector('#file-item') as UiMenuItem
|
|
266
|
-
const editItem = container.querySelector('#edit-item') as UiMenuItem
|
|
267
|
-
const fileSubmenu = container.querySelector('#file-submenu') as UiSubMenu
|
|
268
|
-
const editSubmenu = container.querySelector('#edit-submenu') as UiSubMenu
|
|
269
|
-
await nextFrame()
|
|
270
|
-
|
|
271
|
-
menu.show()
|
|
272
|
-
await nextFrame()
|
|
273
|
-
|
|
274
|
-
// Open file submenu
|
|
275
|
-
fileItem.openSubMenu()
|
|
276
|
-
await nextFrame()
|
|
277
|
-
assert.equal(menu.activeSubMenu, fileSubmenu)
|
|
278
|
-
assert.isTrue(fileSubmenu.open)
|
|
279
|
-
|
|
280
|
-
// Switch to edit submenu
|
|
281
|
-
editItem.openSubMenu()
|
|
282
|
-
await nextFrame()
|
|
283
|
-
assert.equal(menu.activeSubMenu, editSubmenu)
|
|
284
|
-
assert.isTrue(editSubmenu.open)
|
|
285
|
-
assert.isFalse(fileSubmenu.open)
|
|
286
|
-
})
|
|
287
|
-
|
|
288
|
-
it('should handle escape key to close nested submenus', async () => {
|
|
289
|
-
const container = await completeMenuFixture()
|
|
290
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
291
|
-
const fileItem = container.querySelector('#file-item') as UiMenuItem
|
|
292
|
-
const fileSubmenu = container.querySelector('#file-submenu') as UiSubMenu
|
|
293
|
-
const exportItem = container.querySelector('#export-item') as UiMenuItem
|
|
294
|
-
const exportSubmenu = container.querySelector('#export-submenu') as UiSubMenu
|
|
295
|
-
await nextFrame()
|
|
296
|
-
|
|
297
|
-
menu.show()
|
|
298
|
-
await nextFrame()
|
|
299
|
-
|
|
300
|
-
// Open nested submenus
|
|
301
|
-
fileItem.openSubMenu()
|
|
302
|
-
await nextFrame()
|
|
303
|
-
exportItem.openSubMenu()
|
|
304
|
-
await nextFrame()
|
|
305
|
-
|
|
306
|
-
assert.isTrue(exportSubmenu.open)
|
|
307
|
-
|
|
308
|
-
// Press escape on nested submenu
|
|
309
|
-
const escapeEvent = new KeyboardEvent('keydown', { key: 'Escape' })
|
|
310
|
-
exportSubmenu.dispatchEvent(escapeEvent)
|
|
311
|
-
await nextFrame()
|
|
312
|
-
|
|
313
|
-
assert.isFalse(exportSubmenu.open)
|
|
314
|
-
assert.isTrue(fileSubmenu.open) // Parent submenu should still be open
|
|
315
|
-
assert.isTrue(menu.open) // Main menu should still be open
|
|
316
|
-
})
|
|
317
|
-
|
|
318
|
-
it('should handle mouse leave to close submenus with delay', async () => {
|
|
319
|
-
const container = await completeMenuFixture()
|
|
320
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
321
|
-
const fileItem = container.querySelector('#file-item') as UiMenuItem
|
|
322
|
-
const fileSubmenu = container.querySelector('#file-submenu') as UiSubMenu
|
|
323
|
-
await nextFrame()
|
|
324
|
-
|
|
325
|
-
menu.show()
|
|
326
|
-
await nextFrame()
|
|
327
|
-
|
|
328
|
-
// Open submenu on hover
|
|
329
|
-
const mouseEnterEvent = new MouseEvent('mouseenter')
|
|
330
|
-
fileItem.dispatchEvent(mouseEnterEvent)
|
|
331
|
-
await nextFrame()
|
|
332
|
-
assert.isTrue(fileSubmenu.open)
|
|
333
|
-
|
|
334
|
-
// Mouse leave
|
|
335
|
-
const mouseLeaveEvent = new MouseEvent('mouseleave')
|
|
336
|
-
fileItem.dispatchEvent(mouseLeaveEvent)
|
|
337
|
-
|
|
338
|
-
// Should close after a delay
|
|
339
|
-
await aTimeout(150) // Wait for the delay in the implementation
|
|
340
|
-
|
|
341
|
-
assert.isFalse(fileSubmenu.open)
|
|
342
|
-
})
|
|
343
|
-
})
|
|
344
|
-
|
|
345
|
-
describe('Accessibility integration', () => {
|
|
346
|
-
it('should maintain proper ARIA states throughout navigation', async () => {
|
|
347
|
-
const container = await completeMenuFixture()
|
|
348
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
349
|
-
const fileItem = container.querySelector('#file-item') as UiMenuItem
|
|
350
|
-
await nextFrame()
|
|
351
|
-
|
|
352
|
-
// Initial state
|
|
353
|
-
assert.equal(menu.getAttribute('aria-expanded'), 'false')
|
|
354
|
-
assert.equal(fileItem.getAttribute('aria-expanded'), 'false')
|
|
355
|
-
|
|
356
|
-
// Open menu
|
|
357
|
-
menu.show()
|
|
358
|
-
await nextFrame()
|
|
359
|
-
assert.equal(menu.getAttribute('aria-expanded'), 'true')
|
|
360
|
-
|
|
361
|
-
// Open submenu
|
|
362
|
-
fileItem.openSubMenu()
|
|
363
|
-
await nextFrame()
|
|
364
|
-
assert.equal(fileItem.getAttribute('aria-expanded'), 'true')
|
|
365
|
-
|
|
366
|
-
// Close submenu
|
|
367
|
-
fileItem.closeSubMenu()
|
|
368
|
-
await nextFrame()
|
|
369
|
-
assert.equal(fileItem.getAttribute('aria-expanded'), 'false')
|
|
370
|
-
})
|
|
371
|
-
|
|
372
|
-
it('should maintain focus management', async () => {
|
|
373
|
-
const container = await completeMenuFixture()
|
|
374
|
-
const menu = container.querySelector('#main-menu') as Menu
|
|
375
|
-
await nextFrame()
|
|
376
|
-
|
|
377
|
-
const focusSpy = sinon.spy(menu, 'focus')
|
|
378
|
-
|
|
379
|
-
menu.show()
|
|
380
|
-
await nextFrame()
|
|
381
|
-
|
|
382
|
-
assert.isTrue(focusSpy.calledOnce)
|
|
383
|
-
assert.equal(menu.tabIndex, 0)
|
|
384
|
-
})
|
|
385
|
-
})
|
|
386
|
-
|
|
387
|
-
describe('Error handling', () => {
|
|
388
|
-
it('should handle missing submenu references gracefully', async () => {
|
|
389
|
-
const brokenMenu: HTMLElement = await fixture(html`
|
|
390
|
-
<ui-menu>
|
|
391
|
-
<ui-menu-item submenu="nonexistent">Broken Item</ui-menu-item>
|
|
392
|
-
</ui-menu>
|
|
393
|
-
`)
|
|
394
|
-
const menu = brokenMenu as Menu
|
|
395
|
-
const brokenItem = brokenMenu.querySelector('ui-menu-item') as UiMenuItem
|
|
396
|
-
await nextFrame()
|
|
397
|
-
|
|
398
|
-
menu.show()
|
|
399
|
-
await nextFrame()
|
|
400
|
-
|
|
401
|
-
// Should not throw
|
|
402
|
-
brokenItem.openSubMenu()
|
|
403
|
-
assert.isFalse(brokenItem.hasSubMenu)
|
|
404
|
-
assert.isNull(menu.activeSubMenu)
|
|
405
|
-
})
|
|
406
|
-
|
|
407
|
-
it('should handle missing anchor references gracefully', async () => {
|
|
408
|
-
const brokenSubmenu: HTMLElement = await fixture(html`
|
|
409
|
-
<div>
|
|
410
|
-
<ui-sub-menu anchor="nonexistent">
|
|
411
|
-
<ui-menu-item>Item</ui-menu-item>
|
|
412
|
-
</ui-sub-menu>
|
|
413
|
-
</div>
|
|
414
|
-
`)
|
|
415
|
-
const submenu = brokenSubmenu.querySelector('ui-sub-menu') as UiSubMenu
|
|
416
|
-
await nextFrame()
|
|
417
|
-
|
|
418
|
-
// Should not show since anchor doesn't exist
|
|
419
|
-
submenu.show()
|
|
420
|
-
await nextFrame()
|
|
421
|
-
|
|
422
|
-
assert.isFalse(submenu.open)
|
|
423
|
-
})
|
|
424
|
-
})
|
|
425
|
-
})
|
|
426
|
-
})
|