added lang chips
This commit is contained in:
parent
b9276d07cc
commit
2cfe187d6b
6 changed files with 113 additions and 12 deletions
47
src/App.css
47
src/App.css
|
|
@ -215,6 +215,53 @@
|
||||||
margin-top: 2rem;
|
margin-top: 2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Chip styling */
|
||||||
|
.chips-container {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 8px;
|
||||||
|
margin: 2px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chip {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 1px 12px;
|
||||||
|
border-radius: 16px;
|
||||||
|
font-size: 0.6rem;
|
||||||
|
font-weight: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chip-large {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 1px 16px;
|
||||||
|
border-radius: 16px;
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 750;
|
||||||
|
}
|
||||||
|
.lang-chip {
|
||||||
|
background-color: #e0f2ff;
|
||||||
|
color: #0366d6;
|
||||||
|
border: 1px solid #79b8ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.software-chip {
|
||||||
|
background-color: #f3e8ff;
|
||||||
|
color: #5a32a3;
|
||||||
|
border: 1px solid #d1bef2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-card {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-details {
|
||||||
|
margin-top: auto;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
/* Responsive styles */
|
/* Responsive styles */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.header-content {
|
.header-content {
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ const Header = ({ onBackClick, showBackButton }) => {
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
<h1>Comet Technologies</h1>
|
<h1>Comet Technologies</h1>
|
||||||
<p className="tagline">You need I'll build it</p>
|
<p className="tagline">You need it, I'll build it</p>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,29 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import RenderChips from './RenderChips';
|
||||||
|
|
||||||
|
|
||||||
const ProjectCard = ({ project, onClick }) => {
|
const ProjectCard = ({ project, onClick }) => {
|
||||||
const summary = project.description.trim().split('\n\n')[0].trim();
|
const summary = project.description.trim().split('\n\n')[0].trim();
|
||||||
const summaryLength = 120;
|
const summaryLength = 120;
|
||||||
return (
|
|
||||||
<div className="project-card" onClick={() => onClick(project.id)}>
|
|
||||||
<h3>{project.title}</h3>
|
return (
|
||||||
<p className="project-summary">
|
<div className="project-card" onClick={() => onClick(project.id)}>
|
||||||
{summary.length > summaryLength ? `${summary.substring(0, summaryLength)}...` : summary}
|
<h3>{project.title}</h3>
|
||||||
</p>
|
|
||||||
<div className="view-details">View Details</div>
|
{project.langs && <RenderChips langs={project.langs} type='lang'/>}
|
||||||
</div>
|
|
||||||
);
|
{project.software && <RenderChips langs={project.software} type='software'/>}
|
||||||
|
<div style={{marginBottom: "12px"}}>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<p className="project-summary">
|
||||||
|
{summary.length > summaryLength ? `${summary.substring(0, summaryLength)}...` : summary}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="view-details">View Details</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default ProjectCard;
|
export default ProjectCard;
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ImageCarousel from './ImageCarousel';
|
import ImageCarousel from './ImageCarousel';
|
||||||
|
import RenderChips from './RenderChips';
|
||||||
|
|
||||||
const ProjectDetails = ({ project }) => {
|
const ProjectDetails = ({ project }) => {
|
||||||
if (!project) {
|
if (!project) {
|
||||||
|
|
@ -12,6 +13,13 @@ const ProjectDetails = ({ project }) => {
|
||||||
<div className="project-details">
|
<div className="project-details">
|
||||||
<h2>{project.title}</h2>
|
<h2>{project.title}</h2>
|
||||||
|
|
||||||
|
{project.langs && <RenderChips langs={project.langs} type='lang' large/>}
|
||||||
|
|
||||||
|
{project.software && <RenderChips langs={project.software} type='software' large/>}
|
||||||
|
|
||||||
|
<div style={{marginBottom: "12px"}}>
|
||||||
|
|
||||||
|
</div>
|
||||||
<div className="project-carousel">
|
<div className="project-carousel">
|
||||||
<ImageCarousel projectId={project.id} />
|
<ImageCarousel projectId={project.id} />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
26
src/components/RenderChips.js
Normal file
26
src/components/RenderChips.js
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
|
||||||
|
const RenderChips = ({langs: items, type, large}) => {
|
||||||
|
if (!items || items.length === 0) return null;
|
||||||
|
|
||||||
|
let chipClass = type === 'lang' ? 'lang-chip' : 'software-chip';
|
||||||
|
let chipStr = 'chip';
|
||||||
|
if(large)
|
||||||
|
chipStr+= '-large'
|
||||||
|
return (
|
||||||
|
<div className="chips-container">
|
||||||
|
{items.map((item, index) => (
|
||||||
|
<span
|
||||||
|
key={`${type}-${index}`}
|
||||||
|
className={`${chipStr} ${chipClass}`}
|
||||||
|
>
|
||||||
|
{item}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export default RenderChips;
|
||||||
|
|
@ -3,6 +3,8 @@ const projects = [
|
||||||
id: "loanterra",
|
id: "loanterra",
|
||||||
title: "DevOps for Loanterra (2023-2025)",
|
title: "DevOps for Loanterra (2023-2025)",
|
||||||
imagesFolder: "/assets/loanterra",
|
imagesFolder: "/assets/loanterra",
|
||||||
|
langs: [],
|
||||||
|
software: ["SQL", "AWS"],
|
||||||
description: `
|
description: `
|
||||||
- Setup Loanterra Cloud environment with Okta for authentication and resource provisioning.\n\n
|
- Setup Loanterra Cloud environment with Okta for authentication and resource provisioning.\n\n
|
||||||
- Ensured SOC2 Compliance through implementation of security controls and documentation.\n\n
|
- Ensured SOC2 Compliance through implementation of security controls and documentation.\n\n
|
||||||
|
|
@ -17,6 +19,8 @@ const projects = [
|
||||||
id: "fecal-vision-model",
|
id: "fecal-vision-model",
|
||||||
title: "Fecal Vision Model for North of 55 Veterinary Services (2022)",
|
title: "Fecal Vision Model for North of 55 Veterinary Services (2022)",
|
||||||
imagesFolder: "/assets/fecal-vision-model",
|
imagesFolder: "/assets/fecal-vision-model",
|
||||||
|
langs: ["C++", "Python", "Js"],
|
||||||
|
software: ["TensorFlow", "Express", "React", "QuPath"],
|
||||||
description: `
|
description: `
|
||||||
- Over 1 year I developed a vision model using TensorFlow that was ~90% accurate (sufficient for medical diagnoses) in fecal egg counts using standard McMaster method fecal slides. This reduced slide analysis time from 20 minutes down to 5 minutes per sample.\n\n
|
- Over 1 year I developed a vision model using TensorFlow that was ~90% accurate (sufficient for medical diagnoses) in fecal egg counts using standard McMaster method fecal slides. This reduced slide analysis time from 20 minutes down to 5 minutes per sample.\n\n
|
||||||
|
|
||||||
|
|
@ -31,6 +35,8 @@ const projects = [
|
||||||
id: "orchard-market",
|
id: "orchard-market",
|
||||||
title: "Order Picking Software for Orchard Market (2021)",
|
title: "Order Picking Software for Orchard Market (2021)",
|
||||||
imagesFolder: "/assets/orchard-market",
|
imagesFolder: "/assets/orchard-market",
|
||||||
|
langs: ["Js", "C#", "Bash", "VBA script"],
|
||||||
|
software: ["Tesseract", "Croptracker", "Produce Pro"],
|
||||||
description: `
|
description: `
|
||||||
I built several pieces of software for Orchard Market, a collaboration of 5 farms sharing warehousing and storefront space.\n\n
|
I built several pieces of software for Orchard Market, a collaboration of 5 farms sharing warehousing and storefront space.\n\n
|
||||||
|
|
||||||
|
|
@ -45,6 +51,8 @@ const projects = [
|
||||||
id: "mycology-lab",
|
id: "mycology-lab",
|
||||||
title: "Mycology Lab Technical Lead (2019-2022)",
|
title: "Mycology Lab Technical Lead (2019-2022)",
|
||||||
imagesFolder: "/assets/mycology-lab",
|
imagesFolder: "/assets/mycology-lab",
|
||||||
|
langs: ["C++", "Bash", "Js"],
|
||||||
|
software: ["Postgres", "Express", "React", "FluidNC", "OpenCV"],
|
||||||
description: `
|
description: `
|
||||||
Fungal Stimuli Tester:\n\n
|
Fungal Stimuli Tester:\n\n
|
||||||
Built a 3-axis gantry system that moves a central platform along an x,y plane with a winch that raises/lowers the end piece.\n\n
|
Built a 3-axis gantry system that moves a central platform along an x,y plane with a winch that raises/lowers the end piece.\n\n
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue