Skip to content

Add job board with example data. #1197

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 38 commits into from
May 8, 2025
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
654b848
Add job board with example data.
nikoshell Apr 30, 2025
a418850
Merge branch 'ep2025' into ep2025-job-board
nikoshell Apr 30, 2025
9b7c9c8
Update responsive design.
nikoshell Apr 30, 2025
822fd55
Create single component for TwoColc.
nikoshell Apr 30, 2025
5010718
Fix TS issues.
nikoshell Apr 30, 2025
b1a7c94
Merge branch 'ep2025' into ep2025-job-board
clytaemnestra Apr 30, 2025
d10618f
Combine sponsors and companies.
nikoshell Apr 30, 2025
e5b2326
Fix TS issue. Ammend commit to re-run RTD preview.
nikoshell Apr 30, 2025
81e4d17
Merge branch 'ep2025' into ep2025-job-board
nikoshell May 2, 2025
92c36a5
Companies -> sponsors.
nikoshell May 4, 2025
53b0aa1
Job card style.
nikoshell May 4, 2025
bfe1032
Add sponsor display images.
nikoshell May 4, 2025
feb60a0
Fix responsive.
nikoshell May 4, 2025
0f661ff
Fix styles.
nikoshell May 4, 2025
a8a5ee8
Clean up.
nikoshell May 5, 2025
8b5e085
Fix TS warnings.
nikoshell May 1, 2025
b0dd9ef
Epic - broken localhost image refferer.
nikoshell May 1, 2025
be7de8b
Fix YouTube types.
nikoshell May 5, 2025
3d767e0
Fix YouTube types.
nikoshell May 5, 2025
5667366
Fix all warnings.
nikoshell May 5, 2025
4c51c57
Merge branch 'ep2025' into ep2025-job-board
nikoshell May 5, 2025
182c31c
Merge branch 'ep2025-check' into ep2025-job-board
nikoshell May 5, 2025
9395359
Remove acme records.
nikoshell May 5, 2025
523f286
Add sections.
nikoshell May 5, 2025
0f226b5
Hide sponsor card on mobile, fix ts warnings.
nikoshell May 5, 2025
9518e51
Merge branch 'ep2025' into ep2025-job-board
nikoshell May 6, 2025
2187b97
Fix brands icons.
nikoshell May 6, 2025
3001a20
Add Numberly content.
nikoshell May 7, 2025
0381fab
Add community partners.
nikoshell May 7, 2025
67c1f4b
Fix for community partners.
nikoshell May 7, 2025
c90c73b
Filter out drafts, update descriptions.
nikoshell May 8, 2025
4e38ac2
Add social links to sponsor.
nikoshell May 8, 2025
bc349f6
Add draft to job position.
nikoshell May 8, 2025
832176a
Remove about for partners and fix for component.
nikoshell May 8, 2025
5f0de3d
Disable socials.
nikoshell May 8, 2025
eadf26a
Fix issues from comments.
nikoshell May 8, 2025
68c9158
Remove console log.
nikoshell May 8, 2025
ed273e9
Update sponsor data.
nikoshell May 8, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added public/logos/eplogo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 27 additions & 0 deletions public/logos/eps.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
64 changes: 64 additions & 0 deletions src/components/CompanyCard.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
---
import { type CollectionEntry, getEntry } from "astro:content";
import { marked } from 'marked';


const { company } = Astro.props;
const { title, logo, website, location, industry, description, socials } = company.data;

const jobFiles = import.meta.glob('../content/companies/*/!(index).md');
const companiesJobsMap = {};

for (const path in jobFiles) {
const match = path.match(/\.\.\/content\/companies\/([^/]+)\/([^/]+)\.md$/);
if (match) {
const companyId = match[1];
if (!companiesJobsMap[companyId]) companiesJobsMap[companyId] = [];
companiesJobsMap[companyId].push(await getEntry('jobs', `${companyId}/${match[2]}`));
}
}

const jobs = companiesJobsMap[company.id];

const isCompanyPage = Astro.url.pathname == `/company/${company.id}`;

const html = marked.parse(company.body);

---

<div class="lg:max-w-[400px] flex flex-col gap-6 p-6 rounded-lg shadow-md bg-white text-black">
<div class="w-full flex justify-center items-center md:items-center ">
<img src={logo} alt={title + " Logo"} class="max-h-[200px] object-contain" />
</div>
<div class="flex-1">
<h2 class="text-2xl font-bold mb-2">
{ isCompanyPage ?
<>{title}</> :
<a href={`/company/${company.id}`}>{title}</a>
}
</h2>
<p class="text-gray-600 mb-2">{industry} — {location}</p>
<p class="mb-4">{description}</p>

<div class="flex space-x-4 mb-4">
{socials?.linkedin && <a href={socials.linkedin} target="_blank">LinkedIn</a>}
{socials?.twitter && <a href={socials.twitter} target="_blank">Twitter</a>}
</div>

<a href={website} target="_blank" class="text-blue-600 underline">Visit Website</a>

{ jobs && (
<div class="mt-4">
<h3 class="font-semibold">Open Positions:</h3>
<ul class="list-disc list-inside">
{Object.values(jobs).map(job => (
<li><a href={`/company/${job.id}`}>{job.data.title}</a></li>
))}
</ul>
</div>
)}

{ !isCompanyPage && <a class="btn btn-primary mt-6 inline-block" href={`/company/${company.id}`}>Who We Are</a>}
</div>

</div>
29 changes: 29 additions & 0 deletions src/components/CompanyCardBody.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
import { type CollectionEntry, getEntry } from "astro:content";
import { marked } from 'marked';


const { company, full=false, openings=false } = Astro.props;
const { title, logo, website, location, industry, description, socials } = company.data;

const jobFiles = import.meta.glob('../content/companies/*/!(index).md');
const jobs: CollectionEntry<'jobs'>[] = [];

for (const path in jobFiles) {
const match = path.match(/\.\.\/content\/companies\/([^/]+)\/([^/]+)\.md$/);
if (match) {
const companyId = company.id;
const entry = await getEntry('jobs', `${companyId}/${match[2]}`);
if (entry) {
jobs.push(entry);
}
}
}

const html = marked.parse(company.body);

---

<div class="mb-4 prose prose-xl prose-li:m-0 prose-ul:m-0 prose-ul:mb-4 prose-a:underline prose-h1:text-text prose-headings:font-title prose-headings:text-text prose-a:text-text hover:prose-a:text-primary-hover prose-strong:text-text prose-strong:font-bold prose-li:marker:text-text mx-auto pb-12 px-6">
<article set:html={html} />
</div>
38 changes: 38 additions & 0 deletions src/components/JobCard.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
const { job } = Astro.props;
const { title, company, location, type, level, salary, tags, description, responsibilities, requirements, benefits, apply_link } = job.data;
---

<div class="mb-6 last:mb-0">
<div class="flex-1 p-6 rounded-lg shadow-md bg-white">
<a href={`/company/${job.id}`}>
<h2 class="text-3xl font-bold mb-2">{title}</h2>
</a>
<p class="text-gray-600 mb-2">{level} • {type} • {location}</p>
<p class="text-gray-700 mb-4">{salary}</p>
<p class="mb-6">{description}</p>

<h3 class="text-xl font-semibold mb-2">Responsibilities</h3>
<ul class="list-disc list-inside mb-4">
{responsibilities && responsibilities.map(item => <li>{item}</li>)}
</ul>

<h3 class="text-xl font-semibold mb-2">Requirements</h3>
<ul class="list-disc list-inside mb-4">
{requirements && requirements.map(item => <li>{item}</li>)}
</ul>

<h3 class="text-xl font-semibold mb-2">Benefits</h3>
<ul class="list-disc list-inside mb-6">
{benefits && benefits.map(item => <li>{item}</li>)}
</ul>

<a
href={apply_link}
target="_blank"
class="inline-block bg-button hover:bg-button-hover text-text-inverted font-semibold py-2 px-4 rounded-lg shadow transition-colors duration-200"
>
Apply Now
</a>
</div>
</div>
13 changes: 13 additions & 0 deletions src/components/TwoCols.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
const {content, sidebar } = Astro.props;
---
<section class="space-y-12 pb-6 md:p-6">
<div class="flex flex-col lg:flex-row-reverse gap-6">
<div class="w-full lg:max-w-[400px] lg:sticky lg:top-6 self-start">
<slot name="content"/>
</div>
<div class="flex-1">
<slot name="sidebar" />
</div>
</div>
</section>
62 changes: 62 additions & 0 deletions src/content/companies/acme-corp/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
title: "Acme Corp"
logo: "/logos/eplogo.png"
website: "https://www.acmecorp.com"
location: "New York, USA"
industry: "Technology & Innovation"
description:
"Acme Corp is a leading innovator in tech gadgets and solutions for a smarter
world."
socials:
linkedin: "https://linkedin.com/company/acmecorp"
twitter: "https://twitter.com/acmecorp"
---

## About Acme Corp

Acme Corp is at the forefront of technological advancement, pioneering
cutting-edge solutions in smart devices, automation, and AI-driven platforms.
Headquartered in New York, USA, Acme has a global presence and a reputation for
building products that shape the future.

## Our Mission

To make everyday life simpler, more efficient, and connected through intelligent
technology that enhances how people live, work, and interact.

## What We Do

We specialize in:

- Smart home devices and IoT systems
- AI-powered personal assistants
- Innovative consumer electronics
- Custom enterprise automation solutions

Our products are designed with a user-first mindset, combining seamless
functionality with elegant design.

## Our Culture

At Acme Corp, innovation is in our DNA. We value:

- **Collaboration** – We work as one team, across all departments and regions.
- **Creativity** – We foster a culture that encourages bold ideas and
experimentation.
- **Sustainability** – We are committed to responsible tech and minimizing our
environmental impact.

## Careers

We're always on the lookout for passionate innovators to join our mission.
Whether you're a developer, designer, or data scientist, there's a place for you
at Acme Corp.

👉 [View open roles](https://www.acmecorp.com/careers)

## Connect With Us

- 🌐 Website: [acmecorp.com](https://www.acmecorp.com)
- 💼 LinkedIn:
[linkedin.com/company/acmecorp](https://linkedin.com/company/acmecorp)
- 🐦 Twitter: [@acmecorp](https://twitter.com/acmecorp)
27 changes: 27 additions & 0 deletions src/content/companies/acme-corp/product-manager.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
title: "Product Manager"
location: "Remote / New York, USA"
type: "Full-Time"
level: "Senior"
salary: "$90,000 - $120,000 USD"
tags:
- "React"
- "TypeScript"
- "TailwindCSS"
description: |
Acme Corp is looking for a Senior Frontend Developer to help build cutting-edge web applications. Join our dynamic team and work on exciting projects that impact millions.
responsibilities:
- "Develop and maintain web applications using React and TypeScript."
- "Collaborate with cross-functional teams including designers and backend
engineers."
- "Optimize applications for maximum speed and scalability."
requirements:
- "5+ years experience with modern frontend technologies."
- "Strong proficiency in React and TypeScript."
- "Experience with TailwindCSS and responsive design."
benefits:
- "Remote-friendly environment."
- "Health, dental, and vision insurance."
- "Learning and development budget."
apply_link: "https://careers.acmecorp.com/frontend-developer"
---
27 changes: 27 additions & 0 deletions src/content/companies/acme-corp/senior-frontend-developer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
title: "Senior Frontend Developer"
location: "Remote / New York, USA"
type: "Full-Time"
level: "Senior"
salary: "$90,000 - $120,000 USD"
tags:
- "React"
- "TypeScript"
- "TailwindCSS"
description: |
Acme Corp is looking for a Senior Frontend Developer to help build cutting-edge web applications. Join our dynamic team and work on exciting projects that impact millions.
responsibilities:
- "Develop and maintain web applications using React and TypeScript."
- "Collaborate with cross-functional teams including designers and backend
engineers."
- "Optimize applications for maximum speed and scalability."
requirements:
- "5+ years experience with modern frontend technologies."
- "Strong proficiency in React and TypeScript."
- "Experience with TailwindCSS and responsive design."
benefits:
- "Remote-friendly environment."
- "Health, dental, and vision insurance."
- "Learning and development budget."
apply_link: "https://careers.acmecorp.com/frontend-developer"
---
62 changes: 62 additions & 0 deletions src/content/companies/acme-corp2/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
title: "Acme Corp 2"
logo: "/logos/eps.svg"
website: "https://www.acmecorp.com"
location: "New York, USA"
industry: "Technology & Innovation"
description:
"Acme Corp is a leading innovator in tech gadgets and solutions for a smarter
world."
socials:
linkedin: "https://linkedin.com/company/acmecorp"
twitter: "https://twitter.com/acmecorp"
---

## About Acme Corp

Acme Corp is at the forefront of technological advancement, pioneering
cutting-edge solutions in smart devices, automation, and AI-driven platforms.
Headquartered in New York, USA, Acme has a global presence and a reputation for
building products that shape the future.

## Our Mission

To make everyday life simpler, more efficient, and connected through intelligent
technology that enhances how people live, work, and interact.

## What We Do

We specialize in:

- Smart home devices and IoT systems
- AI-powered personal assistants
- Innovative consumer electronics
- Custom enterprise automation solutions

Our products are designed with a user-first mindset, combining seamless
functionality with elegant design.

## Our Culture

At Acme Corp, innovation is in our DNA. We value:

- **Collaboration** – We work as one team, across all departments and regions.
- **Creativity** – We foster a culture that encourages bold ideas and
experimentation.
- **Sustainability** – We are committed to responsible tech and minimizing our
environmental impact.

## Careers

We're always on the lookout for passionate innovators to join our mission.
Whether you're a developer, designer, or data scientist, there's a place for you
at Acme Corp.

👉 [View open roles](https://www.acmecorp.com/careers)

## Connect With Us

- 🌐 Website: [acmecorp.com](https://www.acmecorp.com)
- 💼 LinkedIn:
[linkedin.com/company/acmecorp](https://linkedin.com/company/acmecorp)
- 🐦 Twitter: [@acmecorp](https://twitter.com/acmecorp)
27 changes: 27 additions & 0 deletions src/content/companies/acme-corp2/product-manager.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
title: "Product Manager"
location: "Remote / New York, USA"
type: "Full-Time"
level: "Senior"
salary: "$90,000 - $120,000 USD"
tags:
- "React"
- "TypeScript"
- "TailwindCSS"
description: |
Acme Corp is looking for a Senior Frontend Developer to help build cutting-edge web applications. Join our dynamic team and work on exciting projects that impact millions.
responsibilities:
- "Develop and maintain web applications using React and TypeScript."
- "Collaborate with cross-functional teams including designers and backend
engineers."
- "Optimize applications for maximum speed and scalability."
requirements:
- "5+ years experience with modern frontend technologies."
- "Strong proficiency in React and TypeScript."
- "Experience with TailwindCSS and responsive design."
benefits:
- "Remote-friendly environment."
- "Health, dental, and vision insurance."
- "Learning and development budget."
apply_link: "https://careers.acmecorp.com/frontend-developer"
---
Loading