@@ -39,20 +39,18 @@ test('removing active tab selects deterministic adjacent tab', async ({ page })
3939 await addWorkspaceTab ( page )
4040 await addWorkspaceTab ( page )
4141
42- await page . getByRole ( 'tab' , { name : 'Open tab module-2.tsx' } ) . click ( )
43- await expect ( page . getByRole ( 'tab' , { name : 'Open tab module-2.tsx' } ) ) . toHaveAttribute (
44- 'aria-selected' ,
45- 'true' ,
46- )
42+ await page . getByRole ( 'button' , { name : 'Open tab module-2.tsx' } ) . click ( )
43+ await expect (
44+ page . getByRole ( 'button' , { name : 'Open tab module-2.tsx' } ) ,
45+ ) . toHaveAttribute ( 'aria-current' , 'true' )
4746
4847 await page . getByRole ( 'button' , { name : 'Remove tab module-2.tsx' } ) . click ( )
4948 await confirmRemoveDialog ( page )
5049
51- await expect ( page . getByRole ( 'tab' , { name : 'Open tab module-2.tsx' } ) ) . toHaveCount ( 0 )
52- await expect ( page . getByRole ( 'tab' , { name : 'Open tab module-3.tsx' } ) ) . toHaveAttribute (
53- 'aria-selected' ,
54- 'true' ,
55- )
50+ await expect ( page . getByRole ( 'button' , { name : 'Open tab module-2.tsx' } ) ) . toHaveCount ( 0 )
51+ await expect (
52+ page . getByRole ( 'button' , { name : 'Open tab module-3.tsx' } ) ,
53+ ) . toHaveAttribute ( 'aria-current' , 'true' )
5654} )
5755
5856test ( 'removing non-active tab does not change active tab' , async ( { page } ) => {
@@ -62,20 +60,18 @@ test('removing non-active tab does not change active tab', async ({ page }) => {
6260 await addWorkspaceTab ( page )
6361 await addWorkspaceTab ( page )
6462
65- await page . getByRole ( 'tab' , { name : 'Open tab module-3.tsx' } ) . click ( )
66- await expect ( page . getByRole ( 'tab' , { name : 'Open tab module-3.tsx' } ) ) . toHaveAttribute (
67- 'aria-selected' ,
68- 'true' ,
69- )
63+ await page . getByRole ( 'button' , { name : 'Open tab module-3.tsx' } ) . click ( )
64+ await expect (
65+ page . getByRole ( 'button' , { name : 'Open tab module-3.tsx' } ) ,
66+ ) . toHaveAttribute ( 'aria-current' , 'true' )
7067
7168 await page . getByRole ( 'button' , { name : 'Remove tab module-2.tsx' } ) . click ( )
7269 await confirmRemoveDialog ( page )
7370
74- await expect ( page . getByRole ( 'tab' , { name : 'Open tab module-2.tsx' } ) ) . toHaveCount ( 0 )
75- await expect ( page . getByRole ( 'tab' , { name : 'Open tab module-3.tsx' } ) ) . toHaveAttribute (
76- 'aria-selected' ,
77- 'true' ,
78- )
71+ await expect ( page . getByRole ( 'button' , { name : 'Open tab module-2.tsx' } ) ) . toHaveCount ( 0 )
72+ await expect (
73+ page . getByRole ( 'button' , { name : 'Open tab module-3.tsx' } ) ,
74+ ) . toHaveAttribute ( 'aria-current' , 'true' )
7975} )
8076
8177test ( 'renaming module tab keeps name and path synchronized' , async ( { page } ) => {
@@ -87,9 +83,9 @@ test('renaming module tab keeps name and path synchronized', async ({ page }) =>
8783 to : 'card-item.tsx' ,
8884 } )
8985
90- const tab = page . getByRole ( 'tab ' , { name : 'Open tab card-item.tsx' } )
86+ const tab = page . getByRole ( 'button ' , { name : 'Open tab card-item.tsx' } )
9187 await expect ( tab ) . toHaveAttribute ( 'title' , 'src/components/card-item.tsx' )
92- await expect ( page . getByRole ( 'tab ' , { name : 'Open tab module.tsx' } ) ) . toHaveCount ( 0 )
88+ await expect ( page . getByRole ( 'button ' , { name : 'Open tab module.tsx' } ) ) . toHaveCount ( 0 )
9389} )
9490
9591test ( 'renaming module tab preserves source content' , async ( { page } ) => {
@@ -107,8 +103,8 @@ test('renaming module tab preserves source content', async ({ page }) => {
107103 to : 'value-card.tsx' ,
108104 } )
109105
110- await page . getByRole ( 'tab ' , { name : 'Open tab App.tsx' } ) . click ( )
111- await page . getByRole ( 'tab ' , { name : 'Open tab value-card.tsx' } ) . click ( )
106+ await page . getByRole ( 'button ' , { name : 'Open tab App.tsx' } ) . click ( )
107+ await page . getByRole ( 'button ' , { name : 'Open tab value-card.tsx' } ) . click ( )
112108
113109 const editorContent = page
114110 . locator ( '.editor-panel[data-editor-kind="component"] .cm-content' )
@@ -125,27 +121,26 @@ test('active tab remains source of truth for visible editor panel', async ({ pag
125121 const componentPanel = page . locator ( '#editor-panel-component' )
126122 const stylesPanel = page . locator ( '#editor-panel-styles' )
127123
128- await page . getByRole ( 'tab ' , { name : 'Open tab app.css' } ) . click ( )
129- await expect ( page . getByRole ( 'tab ' , { name : 'Open tab app.css' } ) ) . toHaveAttribute (
130- 'aria-selected ' ,
124+ await page . getByRole ( 'button ' , { name : 'Open tab app.css' } ) . click ( )
125+ await expect ( page . getByRole ( 'button ' , { name : 'Open tab app.css' } ) ) . toHaveAttribute (
126+ 'aria-current ' ,
131127 'true' ,
132128 )
133129 await expect ( stylesPanel ) . not . toHaveAttribute ( 'hidden' , '' )
134130 await expect ( componentPanel ) . toHaveAttribute ( 'hidden' , '' )
135131
136- await page . getByRole ( 'tab' , { name : 'Open tab module-2.tsx' } ) . click ( )
137- await expect ( page . getByRole ( 'tab' , { name : 'Open tab module-2.tsx' } ) ) . toHaveAttribute (
138- 'aria-selected' ,
139- 'true' ,
140- )
132+ await page . getByRole ( 'button' , { name : 'Open tab module-2.tsx' } ) . click ( )
133+ await expect (
134+ page . getByRole ( 'button' , { name : 'Open tab module-2.tsx' } ) ,
135+ ) . toHaveAttribute ( 'aria-current' , 'true' )
141136 await expect ( componentPanel ) . not . toHaveAttribute ( 'hidden' , '' )
142137 await expect ( stylesPanel ) . toHaveAttribute ( 'hidden' , '' )
143138
144139 await page . locator ( '#collapse-component' ) . click ( )
145- await page . getByRole ( 'tab ' , { name : 'Open tab app.css' } ) . click ( )
140+ await page . getByRole ( 'button ' , { name : 'Open tab app.css' } ) . click ( )
146141
147- await expect ( page . getByRole ( 'tab ' , { name : 'Open tab app.css' } ) ) . toHaveAttribute (
148- 'aria-selected ' ,
142+ await expect ( page . getByRole ( 'button ' , { name : 'Open tab app.css' } ) ) . toHaveAttribute (
143+ 'aria-current ' ,
149144 'true' ,
150145 )
151146 await expect ( stylesPanel ) . not . toHaveAttribute ( 'hidden' , '' )
@@ -158,31 +153,29 @@ test('startup restores last active workspace tab after reload', async ({ page })
158153 await addWorkspaceTab ( page )
159154 await addWorkspaceTab ( page )
160155
161- await page . getByRole ( 'tab' , { name : 'Open tab module-2.tsx' } ) . click ( )
162- await expect ( page . getByRole ( 'tab' , { name : 'Open tab module-2.tsx' } ) ) . toHaveAttribute (
163- 'aria-selected' ,
164- 'true' ,
165- )
156+ await page . getByRole ( 'button' , { name : 'Open tab module-2.tsx' } ) . click ( )
157+ await expect (
158+ page . getByRole ( 'button' , { name : 'Open tab module-2.tsx' } ) ,
159+ ) . toHaveAttribute ( 'aria-current' , 'true' )
166160
167161 await page . reload ( )
168162 await waitForInitialRender ( page )
169163
170- await expect ( page . getByRole ( 'tab' , { name : 'Open tab module-2.tsx' } ) ) . toHaveAttribute (
171- 'aria-selected' ,
172- 'true' ,
173- )
164+ await expect (
165+ page . getByRole ( 'button' , { name : 'Open tab module-2.tsx' } ) ,
166+ ) . toHaveAttribute ( 'aria-current' , 'true' )
174167 await expect ( page . locator ( '#editor-panel-component' ) ) . not . toHaveAttribute ( 'hidden' , '' )
175168 await expect ( page . locator ( '#editor-panel-styles' ) ) . toHaveAttribute ( 'hidden' , '' )
176169} )
177170
178171test ( 'add menu can create styles tab while component tab is active' , async ( { page } ) => {
179172 await waitForInitialRender ( page )
180173
181- await page . getByRole ( 'tab ' , { name : 'Open tab App.tsx' } ) . click ( )
174+ await page . getByRole ( 'button ' , { name : 'Open tab App.tsx' } ) . click ( )
182175 await addWorkspaceTab ( page , { kind : 'styles' } )
183176
184- await expect ( page . getByRole ( 'tab ' , { name : 'Open tab module.css' } ) ) . toHaveAttribute (
185- 'aria-selected ' ,
177+ await expect ( page . getByRole ( 'button ' , { name : 'Open tab module.css' } ) ) . toHaveAttribute (
178+ 'aria-current ' ,
186179 'true' ,
187180 )
188181 await expect ( page . locator ( '#editor-panel-styles' ) ) . not . toHaveAttribute ( 'hidden' , '' )
@@ -197,8 +190,8 @@ test('add menu stays closed until triggered and closes on outside click', async
197190} ) => {
198191 await waitForInitialRender ( page )
199192
200- const addButton = page . getByRole ( 'button' , { name : 'Add tab options ' } )
201- const addMenu = page . getByRole ( 'menu ' , { name : 'Add tab type ' } )
193+ const addButton = page . getByRole ( 'button' , { name : 'Add workspace tab ' } )
194+ const addMenu = page . getByRole ( 'group ' , { name : 'Add workspace tab ' } )
202195
203196 await expect ( addMenu ) . toBeHidden ( )
204197 await addButton . click ( )
@@ -207,3 +200,24 @@ test('add menu stays closed until triggered and closes on outside click', async
207200 await page . getByRole ( 'status' , { name : 'App status' } ) . click ( )
208201 await expect ( addMenu ) . toBeHidden ( )
209202} )
203+
204+ test ( 'add menu keyboard interaction manages focus on open and escape close' , async ( {
205+ page,
206+ } ) => {
207+ await waitForInitialRender ( page )
208+
209+ const addButton = page . getByRole ( 'button' , { name : 'Add workspace tab' } )
210+ const addMenu = page . getByRole ( 'group' , { name : 'Add workspace tab' } )
211+ const addModuleButton = page . getByRole ( 'button' , { name : 'Add module tab' } )
212+
213+ await addButton . focus ( )
214+ await page . keyboard . press ( 'ArrowDown' )
215+
216+ await expect ( addMenu ) . toBeVisible ( )
217+ await expect ( addModuleButton ) . toBeFocused ( )
218+
219+ await page . keyboard . press ( 'Escape' )
220+
221+ await expect ( addMenu ) . toBeHidden ( )
222+ await expect ( addButton ) . toBeFocused ( )
223+ } )
0 commit comments