Skip to content

Commit 7ef2c6c

Browse files
authored
optimize contributors section (webpack#5436)
* optimize contributors section * fix e2e test * fix e2e test * update gap for mobile * hide contributors from printer
1 parent d51f045 commit 7ef2c6c

File tree

6 files changed

+64
-106
lines changed

6 files changed

+64
-106
lines changed

cypress/integration/click-menu-scroll-top_spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ describe('Click menu', () => {
33
cy.visit('/concepts/modules/');
44
// scroll to Contributors section
55
// note that there's no hash in url
6-
cy.get('.contributors__section').scrollIntoView();
6+
cy.get('[data-testid="contributors"]').scrollIntoView();
77

88
const selector = '.sidebar-item__title[href="/concepts/modules/"]';
99

cypress/integration/scroll_spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,17 @@ describe('Scroll Test', () => {
55
cy.viewport(size);
66
cy.visit('/guides/getting-started');
77
// scroll to Contributors section
8-
cy.get('.contributors__section').scrollIntoView();
8+
cy.get('[data-testid="contributors"]').scrollIntoView();
99

1010
cy.isNotInViewport('#basic-setup');
1111

1212
cy.visit('/guides/build-performance/');
13-
cy.isNotInViewport('.contributors__section');
13+
cy.isNotInViewport('[data-testid="contributors"]');
1414
});
1515
it(`scroll to fragment when accessing new page with fragment on ${size}`, () => {
1616
cy.viewport(size);
1717
cy.visit('/guides/getting-started');
18-
cy.get('.contributors__section').scrollIntoView();
18+
cy.get('[data-testid="contributors"]').scrollIntoView();
1919

2020
cy.visit('/guides/build-performance/#development');
2121
// since we lazy load notification bar now, #development element is a little out of viewport now
Lines changed: 53 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,66 @@
1-
import { Component } from 'react';
1+
import { useState } from 'react';
22
import VisibilitySensor from 'react-visibility-sensor';
33
import SmallIcon from '../../assets/icon-square-small-slack.png';
4-
import './Contributors.scss';
54
import PropTypes from 'prop-types';
65
import { contributorsNotFound } from './404.js';
76

8-
export default class Contributors extends Component {
9-
static propTypes = {
10-
contributors: PropTypes.array,
11-
};
12-
state = {
13-
inView: false,
14-
};
7+
Contributors.propTypes = {
8+
contributors: PropTypes.array.isRequired,
9+
};
1510

16-
handleInView = (inView) => {
11+
Contributor.propTypes = {
12+
contributor: PropTypes.string.isRequired,
13+
inView: PropTypes.bool.isRequired,
14+
};
15+
function Contributor({ contributor, inView }) {
16+
return (
17+
<a key={contributor} href={`https://github.com/${contributor}`}>
18+
<img
19+
width={45}
20+
height={45}
21+
alt={contributor}
22+
title={contributor}
23+
className="w-full rounded-full shadow"
24+
src={
25+
inView ? `https://github.com/${contributor}.png?size=90` : SmallIcon
26+
}
27+
/>
28+
</a>
29+
);
30+
}
31+
32+
export default function Contributors({ contributors }) {
33+
const [inView, setInView] = useState(false);
34+
const handleInView = (inView) => {
1735
if (!inView) {
1836
return;
1937
}
20-
this.setState({ inView });
38+
setInView(inView);
2139
};
40+
if (!contributors.length) {
41+
return <noscript />;
42+
}
2243

23-
render() {
24-
const { inView } = this.state;
25-
const { contributors } = this.props;
26-
27-
if (!contributors.length) {
28-
return <noscript />;
29-
}
30-
31-
return (
32-
<VisibilitySensor
33-
delayedCall
34-
partialVisibility
35-
intervalDelay={300}
36-
onChange={this.handleInView}
37-
>
38-
<div className="contributors">
39-
<div className="contributors__list">
40-
{contributors
41-
.filter((c) => contributorsNotFound.includes(c) === false)
42-
.map((contributor) => (
43-
<a
44-
key={contributor}
45-
className="contributor"
46-
href={`https://github.com/${contributor}`}
47-
>
48-
<img
49-
width={45}
50-
height={45}
51-
alt={contributor}
52-
src={
53-
inView
54-
? `https://github.com/${contributor}.png?size=90`
55-
: SmallIcon
56-
}
57-
/>
58-
<span className="contributor__name"> {contributor}</span>
59-
</a>
60-
))}
61-
</div>
44+
return (
45+
<VisibilitySensor
46+
delayedCall
47+
partialVisibility
48+
intervalDelay={300}
49+
onChange={handleInView}
50+
>
51+
<div>
52+
<div className="grid gap-[10px] lg:gap-[15px] grid-cols-contributors">
53+
{contributors
54+
.filter((c) => contributorsNotFound.includes(c) === false)
55+
.map((contributor) => (
56+
<Contributor
57+
key={contributor}
58+
contributor={contributor}
59+
inView={inView}
60+
/>
61+
))}
6262
</div>
63-
</VisibilitySensor>
64-
);
65-
}
63+
</div>
64+
</VisibilitySensor>
65+
);
6666
}

src/components/Contributors/Contributors.scss

Lines changed: 0 additions & 47 deletions
This file was deleted.

src/components/Page/Page.jsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,10 @@ export default function Page(props) {
114114
)}
115115

116116
{loadContributors && (
117-
<div className="contributors__section">
118-
<h3>Contributors</h3>
117+
<div data-testid="contributors" className="print:hidden">
118+
<h2 className="!font-sans !font-normal">
119+
{contributors.length} Contributors
120+
</h2>
119121
<Contributors contributors={contributors} />
120122
</div>
121123
)}

tailwind.config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ module.exports = {
1212
fontSize: {
1313
14: '14px',
1414
},
15+
gridTemplateColumns: {
16+
contributors: 'repeat(auto-fit, 36px)',
17+
},
1518
},
1619
spacing: {
1720
0: '0px',

0 commit comments

Comments
 (0)