Skip to content

Commit 09247b3

Browse files
feat(lyonjs100): add job-board page
1 parent 2926b5e commit 09247b3

File tree

8 files changed

+201
-0
lines changed

8 files changed

+201
-0
lines changed

app/lyonjs-100/content.mdx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import Image from 'next/image';
66
import cinema from './cinema.jpg';
77
import styles from './LyonJS100.module.css';
88
import { ButtonLink } from '../../modules/atoms/button/Button';
9+
import { Gift } from '../../modules/icons/Gift';
910

1011
<div className={styles.hero}>
1112
<Image className={styles.background} src={cinema} width={1200} alt="" />
@@ -51,6 +52,14 @@ Un grand merci à nos sponsors pour leur soutien continu.
5152
Nous sommes reconnaissants de leur contribution à cet événement spécial.
5253
Certains de nos sponsors seront présents durant la journée, n'hésitez pas à aller à leur rencontre pour en apprendre plus sur leurs activités.
5354

55+
Nos sponsors sont également à la recherche de nouveaux talents, alors n'hésitez pas à consulter les offres d'emploi disponibles sur notre site.
56+
57+
<div className={styles.cta}>
58+
<ButtonLink href="/lyonjs-100/job-board">
59+
Les offres d'emploi <Gift />
60+
</ButtonLink>
61+
</div>
62+
5463
<Sponsors title="🥇Sponsors Gold" sponsors={gold} />
5564
<Sponsors title="🥈Sponsors Silver" sponsors={silver} />
5665
<Sponsors title="🥉Sponsors Bronze" sponsors={bronze} />
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { lyonjs100Jobs } from '../../../data/lyonjs100-jobs';
2+
import { ListOfJobs } from '../../../modules/jobs/ListOfJobs';
3+
4+
# Les Offres d'emploi de ce LyonJS 100
5+
6+
## Nos sponsors recrutent
7+
8+
Nos sponsors ont des offres d'emploi à vous proposer. N'hésites pas à les consulter, postuler ou les contacters si vous êtes intéressé·es.
9+
10+
## Liste des offres d'emploi
11+
12+
<ListOfJobs jobs={lyonjs100Jobs} />

app/lyonjs-100/job-board/page.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { Metadata } from 'next';
2+
// @ts-ignore
3+
import Content from './content.mdx';
4+
5+
export const revalidate = 3600;
6+
const title = "LyonJS | LyonJS 💯 | Offres d'emploi";
7+
const description = "Les offres d'emploi de nos sponsors pour ce LyonJS 💯";
8+
9+
export const metadata: Metadata = {
10+
title,
11+
description,
12+
twitter: {
13+
title,
14+
description,
15+
},
16+
openGraph: {
17+
title,
18+
description,
19+
},
20+
};
21+
22+
export default function JobBoard() {
23+
return <Content />;
24+
}

data/lyonjs100-jobs.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { malt, zenika } from './sponsors';
2+
import { Job } from '../modules/jobs/jobs.types';
3+
4+
export const lyonjs100Jobs: Array<Job> = [
5+
{
6+
title: 'Développeur Fullstack',
7+
url: 'https://www.zenika.com',
8+
sponsor: zenika,
9+
type: 'CDI',
10+
description:
11+
'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet error fuga illum perspiciatis possimus quam, quibusdam recusandae. Culpa dolores est facere ipsum minima molestias neque placeat quam quis. Accusantium, architecto.',
12+
},
13+
{
14+
title: 'Développeur Frontend',
15+
url: 'https://www.google.com',
16+
sponsor: malt,
17+
type: 'CDI',
18+
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce nec nisl',
19+
},
20+
{
21+
title: 'Développeur Backend',
22+
url: 'https://www.google.com',
23+
sponsor: malt,
24+
type: 'CDI',
25+
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fus',
26+
},
27+
];

modules/jobs/ListOfJobs.module.css

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
.container {
2+
margin-top: 2rem;
3+
}
4+
5+
.card {
6+
display: flex;
7+
position: relative;
8+
flex-direction: column;
9+
background: var(--background-card);
10+
margin: auto auto min(4vw, 32px);
11+
padding: 16px;
12+
border-radius: 12px;
13+
align-items: center;
14+
gap: 18px;
15+
transition:
16+
background-color 100ms,
17+
border-color 100ms;
18+
border: 1px solid transparent;
19+
max-width: 800px;
20+
}
21+
22+
.card:hover {
23+
background-color: var(--background-card-hover);
24+
border-color: var(--border-light);
25+
}
26+
27+
.header {
28+
display: flex;
29+
justify-content: space-between;
30+
align-items: center;
31+
width: 100%;
32+
margin-bottom: -18px;
33+
max-height: 24px;
34+
}
35+
36+
.title {
37+
font-size: 1.5rem;
38+
margin-top: 1rem;
39+
margin-bottom: 0;
40+
align-self: flex-start;
41+
}
42+
43+
.type,
44+
.sponsor {
45+
font-size: 1rem;
46+
align-self: flex-start;
47+
}
48+
49+
.description {
50+
font-size: 1rem;
51+
align-self: flex-start;
52+
color: var(--white-0);
53+
min-height: 72px;
54+
margin-top: 2rem;
55+
margin-bottom: 1rem;
56+
}
57+
58+
.header .logo {
59+
display: none;
60+
position: absolute;
61+
top: 16px;
62+
right: 16px;
63+
width: 7rem;
64+
max-height: 80px;
65+
}
66+
67+
.logo {
68+
width: 5rem;
69+
height: auto;
70+
margin-bottom: 1rem;
71+
}
72+
73+
@media screen and (min-width: 600px) {
74+
.header .logo {
75+
display: block;
76+
}
77+
78+
.header .sponsor {
79+
display: none;
80+
}
81+
82+
.card > .logo {
83+
display: none;
84+
}
85+
}

modules/jobs/ListOfJobs.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Job } from './jobs.types';
2+
import styles from './ListOfJobs.module.css';
3+
import { H2 } from '../atoms/remark/Titles';
4+
import React from 'react';
5+
import { ButtonLink } from '../atoms/button/Button';
6+
7+
type Props = {
8+
jobs: Array<Job>;
9+
};
10+
export const ListOfJobs = ({ jobs }: Props) => {
11+
return (
12+
<ul className={styles.container}>
13+
{jobs.map((job, index) => {
14+
return (
15+
<li key={index}>
16+
<article className={styles.card}>
17+
<div className={styles.header}>
18+
<p className={styles.type}>{job.type}</p>
19+
<p className={styles.sponsor}>{job.sponsor.name}</p>
20+
<img className={styles.logo} src={job.sponsor.logo} alt={job.sponsor.name} />
21+
</div>
22+
<H2 className={styles.title}>{job.title}</H2>
23+
<p className={styles.description}>{job.description}</p>
24+
<img className={styles.logo} src={job.sponsor.logo} alt={job.sponsor.name} />
25+
<ButtonLink href={job.url} target="_blank" rel="noreferrer noopener" className={styles.participate}>
26+
Voir l'annonce <span aria-hidden="true">&rarr;</span>
27+
</ButtonLink>
28+
</article>
29+
</li>
30+
);
31+
})}
32+
</ul>
33+
);
34+
};

modules/jobs/jobs.types.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Sponsor } from '../event/types';
2+
3+
export type Job = {
4+
title: string;
5+
sponsor: Sponsor;
6+
type: string;
7+
description: string;
8+
url: string;
9+
};

modules/lyonjs100/HomeAnnouncement.module.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
right: 0;
3737
display: flex;
3838
justify-content: center;
39+
gap: 1rem;
3940
}
4041

4142
@media screen and (min-width: 768px) {

0 commit comments

Comments
 (0)