Skip to content

Commit 2f5afe0

Browse files
Prevent layout shift on hover in libs/board manager (#1568)
1 parent b837068 commit 2f5afe0

File tree

3 files changed

+9
-32
lines changed

3 files changed

+9
-32
lines changed

Diff for: arduino-ide-extension/src/browser/widgets/component-list/component-list-item.tsx

+3-23
Original file line numberDiff line numberDiff line change
@@ -14,37 +14,21 @@ export class ComponentListItem<
1414
)[0];
1515
this.state = {
1616
selectedVersion: version,
17-
focus: false,
18-
versionUpdate: false,
1917
};
2018
}
2119
}
2220

23-
override componentDidUpdate(
24-
prevProps: ComponentListItem.Props<T>,
25-
prevState: ComponentListItem.State
26-
): void {
27-
if (this.state.focus !== prevState.focus) {
28-
this.props.onFocusDidChange();
29-
}
30-
}
31-
3221
override render(): React.ReactNode {
3322
const { item, itemRenderer } = this.props;
3423
return (
35-
<div
36-
onMouseEnter={() => this.setState({ focus: true })}
37-
onMouseLeave={() => {
38-
if (!this.state.versionUpdate) this.setState({ focus: false });
39-
}}
40-
>
24+
<>
4125
{itemRenderer.renderItem(
4226
Object.assign(this.state, { item }),
4327
this.install.bind(this),
4428
this.uninstall.bind(this),
4529
this.onVersionChange.bind(this)
4630
)}
47-
</div>
31+
</>
4832
);
4933
}
5034

@@ -55,7 +39,6 @@ export class ComponentListItem<
5539
)[0];
5640
this.setState({
5741
selectedVersion: version,
58-
versionUpdate: false,
5942
});
6043
try {
6144
await this.props.install(item, toInstall);
@@ -71,7 +54,7 @@ export class ComponentListItem<
7154
}
7255

7356
private onVersionChange(version: Installable.Version): void {
74-
this.setState({ selectedVersion: version, versionUpdate: true });
57+
this.setState({ selectedVersion: version });
7558
}
7659
}
7760

@@ -81,12 +64,9 @@ export namespace ComponentListItem {
8164
readonly install: (item: T, version?: Installable.Version) => Promise<void>;
8265
readonly uninstall: (item: T) => Promise<void>;
8366
readonly itemRenderer: ListItemRenderer<T>;
84-
readonly onFocusDidChange: () => void;
8567
}
8668

8769
export interface State {
8870
selectedVersion?: Installable.Version;
89-
focus: boolean;
90-
versionUpdate: boolean;
9171
}
9272
}

Diff for: arduino-ide-extension/src/browser/widgets/component-list/component-list.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ export class ComponentList<T extends ArduinoComponent> extends React.Component<
125125
rowIndex={index}
126126
parent={parent}
127127
>
128-
{({ measure, registerChild }) => (
128+
{({ registerChild }) => (
129129
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
130130
// @ts-ignore
131131
<div ref={registerChild} style={style}>
@@ -135,7 +135,6 @@ export class ComponentList<T extends ArduinoComponent> extends React.Component<
135135
itemRenderer={this.props.itemRenderer}
136136
install={this.props.install}
137137
uninstall={this.props.uninstall}
138-
onFocusDidChange={() => measure()}
139138
/>
140139
</div>
141140
)}

Diff for: arduino-ide-extension/src/browser/widgets/component-list/list-item-renderer.tsx

+5-7
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export class ListItemRenderer<T extends ArduinoComponent> {
2828
uninstall: (item: T) => Promise<void>,
2929
onVersionChange: (version: Installable.Version) => void
3030
): React.ReactNode {
31-
const { item, focus } = input;
31+
const { item } = input;
3232
let nameAndAuthor: JSX.Element;
3333
if (item.name && item.author) {
3434
const name = <span className="name">{item.name}</span>;
@@ -127,12 +127,10 @@ export class ListItemRenderer<T extends ArduinoComponent> {
127127
{description}
128128
</div>
129129
<div className="info">{moreInfo}</div>
130-
{focus && (
131-
<div className="footer">
132-
{versions}
133-
{installButton}
134-
</div>
135-
)}
130+
<div className="footer">
131+
{versions}
132+
{installButton}
133+
</div>
136134
</div>
137135
);
138136
}

0 commit comments

Comments
 (0)