Skip to content

Commit e39d855

Browse files
committed
Fix SlidePanel tests, and change panel from article to aside
1 parent ed07ac9 commit e39d855

File tree

3 files changed

+38
-40
lines changed

3 files changed

+38
-40
lines changed

src/components/viewers/SlidePanel.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { CSSProperties, ReactNode, useCallback, useEffect, useMemo, useState } from 'react'
1+
import React, { ReactNode, useCallback, useEffect, useMemo, useState } from 'react'
22
import { useConfig } from '../../hooks/useConfig.js'
33
import { cn } from '../../lib/utils.js'
44
import styles from '../../styles/viewers/SlidePanel.module.css'
@@ -77,10 +77,7 @@ export default function SlidePanel({ mainContent, panelContent, isPanelOpen }: S
7777
}, [panelRef, panelWidth])
7878

7979
const panelWidthStyle = useMemo(() => {
80-
return isPanelOpen ? {
81-
'--panel-width': `${panelWidth}px`,
82-
} as CSSProperties :
83-
undefined
80+
return isPanelOpen ? { width: `${panelWidth}px` } : undefined
8481
}, [panelWidth, isPanelOpen])
8582

8683
return (
@@ -95,13 +92,13 @@ export default function SlidePanel({ mainContent, panelContent, isPanelOpen }: S
9592
onMouseDown={handleMouseDown}
9693
/>
9794
}
98-
<article
95+
<aside
9996
ref={panelRef}
10097
data-resizing={resizingClientX !== -1}
10198
style={panelWidthStyle}
10299
>
103100
{panelContent}
104-
</article>
101+
</aside>
105102
</div>
106103
)
107104
}

src/styles/viewers/SlidePanel.module.css

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,13 @@
44
min-height: 0;
55

66
& > article {
7+
/* main content */
78
display: flex;
89
flex-direction: column;
9-
}
10-
11-
/* main content */
12-
& > article:nth-of-type(1) {
1310
flex: 1;
1411
min-height: 0;
1512
overflow: auto;
1613
}
17-
/* panel content */
18-
& > article:nth-of-type(2) {
19-
width: var(--panel-width, 0);
20-
transition: width 0.2s;
21-
22-
&[data-resizing="true"] {
23-
transition: none;
24-
}
25-
}
2614

2715
/* resizer separator */
2816
& > [role="separator"] {
@@ -36,4 +24,16 @@
3624
background-color: #9f9999;
3725
}
3826
}
27+
28+
/* panel content */
29+
& > aside {
30+
display: flex;
31+
flex-direction: column;
32+
width: 0;
33+
transition: width 0.2s;
34+
35+
&[data-resizing="true"] {
36+
transition: none;
37+
}
38+
}
3939
}

test/components/viewers/SlidePanel.test.tsx

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* eslint-disable @typescript-eslint/non-nullable-type-assertion-style */
1+
22
import { act, fireEvent, render } from '@testing-library/react'
33
import React from 'react'
44
import { beforeEach, describe, expect, it, vi } from 'vitest'
@@ -36,58 +36,59 @@ describe('SlidePanel', () => {
3636
})
3737

3838
it('does not render the resizer if panel is closed', () => {
39-
const { container } = render(
39+
const { queryByRole } = render(
4040
<SlidePanel
4141
mainContent={<div>Main</div>}
4242
panelContent={<div>Panel</div>}
4343
isPanelOpen={false}
4444
/>
4545
)
46-
const resizer = container.querySelector('.resizer')
47-
expect(resizer).toBeNull()
46+
expect(queryByRole('separator')).toBeNull()
4847
})
4948

5049
it('uses default width of 400 when localStorage is empty', () => {
51-
const { container } = render(
50+
const { getByRole } = render(
5251
<SlidePanel
5352
mainContent={<div>Main</div>}
5453
panelContent={<div>Panel</div>}
5554
isPanelOpen
5655
/>
5756
)
58-
const panel = container.querySelector('.slidePanel') as HTMLElement
57+
// Panel is an <aside> element, and has the implicit role 'complementary'
58+
const panel = getByRole('complementary')
59+
expect(panel.textContent).toBe('Panel')
5960
expect(panel.style.width).toBe('400px')
6061
})
6162

6263
it('loads width from localStorage if present', () => {
6364
localStorage.setItem('panelWidth', '250')
64-
const { container } = render(
65+
const { getByRole } = render(
6566
<SlidePanel
6667
mainContent={<div>Main</div>}
6768
panelContent={<div>Panel</div>}
6869
isPanelOpen
6970
/>
7071
)
71-
const panel = container.querySelector('.slidePanel') as HTMLElement
72+
const panel = getByRole('complementary')
7273
expect(panel.style.width).toBe('250px')
7374
})
7475

7576
it('falls back to default width if localStorage width is invalid', () => {
7677
localStorage.setItem('panelWidth', 'not-a-number')
77-
const { container } = render(
78+
const { getByRole } = render(
7879
<SlidePanel
7980
mainContent={<div>Main</div>}
8081
panelContent={<div>Panel</div>}
8182
isPanelOpen
8283
/>
8384
)
84-
const panel = container.querySelector('.slidePanel') as HTMLElement
85+
const panel = getByRole('complementary')
8586
// parseInt of 'not-a-number' yields NaN so default width of 400 is expected
8687
expect(panel.style.width).toBe('400px')
8788
})
8889

8990
it('respects minWidth from config', () => {
90-
const { container } = render(
91+
const { getByRole } = render(
9192
<ConfigProvider value={{ slidePanel: { minWidth: 300 } }}>
9293
<SlidePanel
9394
mainContent={<div>Main</div>}
@@ -96,8 +97,8 @@ describe('SlidePanel', () => {
9697
/>
9798
</ConfigProvider>
9899
)
99-
const resizer = container.querySelector('.resizer') as HTMLElement
100-
const panel = container.querySelector('.slidePanel') as HTMLElement
100+
const resizer = getByRole('separator')
101+
const panel = getByRole('complementary')
101102
expect(panel.style.width).toBe('400px')
102103

103104
// Simulate mousedown on resizer with clientX 800
@@ -116,15 +117,15 @@ describe('SlidePanel', () => {
116117
})
117118

118119
it('handles dragging to resize', () => {
119-
const { container } = render(
120+
const { getByRole } = render(
120121
<SlidePanel
121122
mainContent={<div>Main</div>}
122123
panelContent={<div>Panel</div>}
123124
isPanelOpen
124125
/>
125126
)
126-
const resizer = container.querySelector('.resizer') as HTMLElement
127-
const panel = container.querySelector('.slidePanel') as HTMLElement
127+
const resizer = getByRole('separator')
128+
const panel = getByRole('complementary')
128129
expect(panel.style.width).toBe('400px')
129130

130131
// Mock panel's offsetWidth to be 400px
@@ -151,7 +152,7 @@ describe('SlidePanel', () => {
151152
})
152153

153154
it('uses config defaultWidth if valid', () => {
154-
const { container } = render(
155+
const { getByRole } = render(
155156
<ConfigProvider value={{ slidePanel: { defaultWidth: 500 } }}>
156157
<SlidePanel
157158
mainContent={<div>Main</div>}
@@ -160,12 +161,12 @@ describe('SlidePanel', () => {
160161
/>
161162
</ConfigProvider>
162163
)
163-
const panel = container.querySelector('.slidePanel') as HTMLElement
164+
const panel = getByRole('complementary')
164165
expect(panel.style.width).toBe('500px')
165166
})
166167

167168
it('ignores negative config.defaultWidth and uses 400 instead', () => {
168-
const { container } = render(
169+
const { getByRole } = render(
169170
<ConfigProvider value={{ slidePanel: { defaultWidth: -10 } }}>
170171
<SlidePanel
171172
mainContent={<div>Main</div>}
@@ -174,7 +175,7 @@ describe('SlidePanel', () => {
174175
/>
175176
</ConfigProvider>
176177
)
177-
const panel = container.querySelector('.slidePanel') as HTMLElement
178+
const panel = getByRole('complementary')
178179
expect(panel.style.width).toBe('400px')
179180
})
180181
})

0 commit comments

Comments
 (0)