Skip to content

Commit 1f022aa

Browse files
committed
fix(react): terminal's tablist missing tabs and tabpanels
1 parent 9c1b55a commit 1f022aa

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

packages/components/react/src/Panels/TerminalPanel.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ export function TerminalPanel({ theme, tutorialStore }: TerminalPanelProps) {
7070
},
7171
)}
7272
title={title}
73+
id={`tk-terminal-tab-${index}`}
74+
role="tab"
7375
aria-selected={selected}
76+
aria-controls={`tk-terminal-tapbanel-${index}`}
7477
onClick={() => setTabIndex(index)}
7578
>
7679
<span
@@ -93,6 +96,9 @@ export function TerminalPanel({ theme, tutorialStore }: TerminalPanelProps) {
9396
{terminalConfig.panels.map(({ id, type }, index) => (
9497
<Terminal
9598
key={id}
99+
role="tabpanel"
100+
id={`tk-terminal-tapbanel-${index}`}
101+
aria-labelledby={`tk-terminal-tab-${index}`}
96102
className={tabIndex !== index ? 'hidden h-full' : 'h-full'}
97103
theme={theme}
98104
readonly={type === 'output'}

packages/components/react/src/core/Terminal/index.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { FitAddon } from '@xterm/addon-fit';
22
import { WebLinksAddon } from '@xterm/addon-web-links';
33
import { Terminal as XTerm } from '@xterm/xterm';
44
import '@xterm/xterm/css/xterm.css';
5-
import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';
5+
import { forwardRef, useEffect, useImperativeHandle, useRef, type ComponentProps } from 'react';
66
import '../../styles/terminal.css';
77
import { getTerminalTheme } from './theme.js';
88

@@ -13,13 +13,28 @@ export interface TerminalRef {
1313
export interface TerminalProps {
1414
theme: 'dark' | 'light';
1515
className?: string;
16+
id?: string;
17+
role?: ComponentProps<'div'>['role'];
18+
'aria-labelledby'?: string;
1619
readonly?: boolean;
1720
onTerminalReady?: (terminal: XTerm) => void;
1821
onTerminalResize?: (cols: number, rows: number) => void;
1922
}
2023

2124
export const Terminal = forwardRef<TerminalRef, TerminalProps>(
22-
({ theme, className = '', readonly = true, onTerminalReady, onTerminalResize }, ref) => {
25+
(
26+
{
27+
theme,
28+
className,
29+
id,
30+
role,
31+
'aria-labelledby': ariaLabelledby,
32+
readonly = true,
33+
onTerminalReady,
34+
onTerminalResize,
35+
},
36+
ref,
37+
) => {
2338
const divRef = useRef<HTMLDivElement>(null);
2439
const terminalRef = useRef<XTerm>();
2540

@@ -79,7 +94,7 @@ export const Terminal = forwardRef<TerminalRef, TerminalProps>(
7994
};
8095
}, []);
8196

82-
return <div className={className} ref={divRef} />;
97+
return <div id={id} role={role} aria-labelledby={ariaLabelledby} className={className} ref={divRef} />;
8398
},
8499
);
85100

0 commit comments

Comments
 (0)