mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-13 22:37:14 +10:00
remove sentry integration, fix linting issues
This commit is contained in:
@@ -127,7 +127,7 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-x-1.5">
|
||||
{!iconOnRight && ( icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
{!iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
<a
|
||||
href={url.href}
|
||||
target="_blank"
|
||||
@@ -136,7 +136,7 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
>
|
||||
{label ?? (url.label || url.href)}
|
||||
</a>
|
||||
{iconOnRight && ( icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
{iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -148,26 +148,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -286,7 +278,12 @@ const Experience = () => {
|
||||
<Section<Experience> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
<div>{item.location}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
@@ -303,7 +300,12 @@ const Education = () => {
|
||||
<Section<Education> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.score}</div>
|
||||
<div>{item.studyType}</div>
|
||||
@@ -322,7 +324,7 @@ const Awards = () => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks} />
|
||||
<div className="font-bold">{item.date}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -334,11 +336,11 @@ const Certifications = () => {
|
||||
const section = useArtboardStore((state) => state.resume.sections.certifications);
|
||||
|
||||
return (
|
||||
<Section<Certification> section={section} urlKey="url" summaryKey="summary">
|
||||
<Section<Certification> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
<div className="font-bold">{item.date}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -378,7 +380,12 @@ const Publications = () => {
|
||||
<Section<Publication> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
</div>
|
||||
@@ -394,7 +401,12 @@ const Volunteer = () => {
|
||||
<Section<Volunteer> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
<div>{item.location}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
@@ -427,7 +439,12 @@ const Projects = () => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
|
||||
<div className="font-bold">{item.date}</div>
|
||||
@@ -445,7 +462,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -466,7 +488,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
|
||||
<div className="font-bold">{item.date}</div>
|
||||
|
||||
@@ -7,7 +7,6 @@ import {
|
||||
Experience,
|
||||
Interest,
|
||||
Language,
|
||||
Metadata,
|
||||
Profile,
|
||||
Project,
|
||||
Publication,
|
||||
@@ -140,26 +139,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -265,7 +256,12 @@ const Experience = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -287,10 +283,15 @@ const Education = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.score}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
<div className="font-bold">{item.date}</div>
|
||||
@@ -311,7 +312,11 @@ const Awards = () => {
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity
|
||||
name={item.awarder}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -332,7 +337,7 @@ const Certifications = () => {
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -377,7 +382,12 @@ const Publications = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
</div>
|
||||
|
||||
@@ -398,7 +408,12 @@ const Volunteer = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -435,7 +450,12 @@ const Projects = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
@@ -455,7 +475,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -476,7 +501,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -142,26 +142,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -233,7 +225,12 @@ const Experience = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -255,7 +252,12 @@ const Education = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.score}</div>
|
||||
</div>
|
||||
@@ -311,7 +313,11 @@ const Awards = () => {
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity
|
||||
name={item.awarder}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -333,7 +339,7 @@ const Certifications = () => {
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<div>{item.issuer}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -378,7 +384,12 @@ const Publications = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
</div>
|
||||
|
||||
@@ -399,7 +410,12 @@ const Volunteer = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -436,7 +452,12 @@ const Projects = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
@@ -456,7 +477,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -477,7 +503,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -159,26 +159,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -291,7 +283,12 @@ const Experience = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -313,7 +310,12 @@ const Education = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.score}</div>
|
||||
</div>
|
||||
@@ -337,7 +339,11 @@ const Awards = () => {
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity
|
||||
name={item.awarder}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -358,7 +364,7 @@ const Certifications = () => {
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -403,7 +409,12 @@ const Publications = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
</div>
|
||||
|
||||
@@ -424,7 +435,12 @@ const Volunteer = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -461,7 +477,12 @@ const Projects = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
@@ -481,7 +502,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -502,7 +528,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -116,7 +116,10 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-x-1.5">
|
||||
{!iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary group-[.sidebar]:text-background" />)}
|
||||
{!iconOnRight &&
|
||||
(icon ?? (
|
||||
<i className="ph ph-bold ph-link text-primary group-[.sidebar]:text-background" />
|
||||
))}
|
||||
<a
|
||||
href={url.href}
|
||||
target="_blank"
|
||||
@@ -125,7 +128,10 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
>
|
||||
{label ?? (url.label || url.href)}
|
||||
</a>
|
||||
{iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary group-[.sidebar]:text-background" />)}
|
||||
{iconOnRight &&
|
||||
(icon ?? (
|
||||
<i className="ph ph-bold ph-link text-primary group-[.sidebar]:text-background" />
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -137,26 +143,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary group-[.sidebar]:text-primary" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary group-[.sidebar]:text-primary" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -260,7 +258,12 @@ const Experience = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -282,7 +285,12 @@ const Education = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.score}</div>
|
||||
</div>
|
||||
@@ -306,7 +314,11 @@ const Awards = () => {
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity
|
||||
name={item.awarder}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right group-[.sidebar]:text-left">
|
||||
@@ -327,7 +339,7 @@ const Certifications = () => {
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right group-[.sidebar]:text-left">
|
||||
@@ -372,7 +384,12 @@ const Publications = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
</div>
|
||||
|
||||
@@ -393,7 +410,12 @@ const Volunteer = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -430,7 +452,12 @@ const Projects = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
@@ -450,7 +477,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -471,7 +503,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -124,7 +124,8 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-x-1.5">
|
||||
{!iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary group-[.sidebar]:text-primary" />)}
|
||||
{!iconOnRight &&
|
||||
(icon ?? <i className="ph ph-bold ph-link text-primary group-[.sidebar]:text-primary" />)}
|
||||
<a
|
||||
href={url.href}
|
||||
target="_blank"
|
||||
@@ -133,7 +134,8 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
>
|
||||
{label ?? (url.label || url.href)}
|
||||
</a>
|
||||
{iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary group-[.sidebar]:text-primary" />)}
|
||||
{iconOnRight &&
|
||||
(icon ?? <i className="ph ph-bold ph-link text-primary group-[.sidebar]:text-primary" />)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -145,26 +147,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary group-[.sidebar]:text-primary" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary group-[.sidebar]:text-primary" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -238,7 +232,12 @@ const Experience = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -260,7 +259,12 @@ const Education = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.score}</div>
|
||||
</div>
|
||||
@@ -316,7 +320,11 @@ const Awards = () => {
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity
|
||||
name={item.awarder}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -337,7 +345,7 @@ const Certifications = () => {
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -382,7 +390,12 @@ const Publications = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
</div>
|
||||
|
||||
@@ -403,7 +416,12 @@ const Volunteer = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -440,7 +458,12 @@ const Projects = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
@@ -460,7 +483,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -481,7 +509,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -165,26 +165,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -256,7 +248,12 @@ const Experience = () => {
|
||||
<Section<Experience> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
<div>{item.location}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
@@ -273,7 +270,12 @@ const Education = () => {
|
||||
<Section<Education> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.score}</div>
|
||||
<div>{item.studyType}</div>
|
||||
@@ -292,7 +294,7 @@ const Awards = () => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks} />
|
||||
<div className="font-bold">{item.date}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -308,7 +310,7 @@ const Certifications = () => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
<div className="font-bold">{item.date}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -348,7 +350,12 @@ const Publications = () => {
|
||||
<Section<Publication> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
</div>
|
||||
@@ -364,7 +371,12 @@ const Volunteer = () => {
|
||||
<Section<Volunteer> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
<div>{item.location}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
@@ -397,7 +409,12 @@ const Projects = () => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
</div>
|
||||
@@ -414,7 +431,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -435,7 +457,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
<div>{item.location}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
|
||||
@@ -141,7 +141,7 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-x-1.5">
|
||||
{!iconOnRight && ( icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
{!iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
<a
|
||||
href={url.href}
|
||||
target="_blank"
|
||||
@@ -150,7 +150,7 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
>
|
||||
{label ?? (url.label || url.href)}
|
||||
</a>
|
||||
{iconOnRight && ( icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
{iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -162,26 +162,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -253,7 +245,12 @@ const Experience = () => {
|
||||
<Section<Experience> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
<div>{item.location}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
@@ -270,7 +267,12 @@ const Education = () => {
|
||||
<Section<Education> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.score}</div>
|
||||
<div>{item.studyType}</div>
|
||||
@@ -289,7 +291,7 @@ const Awards = () => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks} />
|
||||
<div className="font-bold">{item.date}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -305,7 +307,7 @@ const Certifications = () => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
<div className="font-bold">{item.date}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -345,7 +347,12 @@ const Publications = () => {
|
||||
<Section<Publication> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
</div>
|
||||
@@ -361,7 +368,12 @@ const Volunteer = () => {
|
||||
<Section<Volunteer> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
<div>{item.location}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
@@ -394,7 +406,12 @@ const Projects = () => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
</div>
|
||||
@@ -411,7 +428,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -432,7 +454,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
<div>{item.location}</div>
|
||||
<div className="font-bold">{item.date}</div>
|
||||
|
||||
@@ -141,26 +141,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -308,7 +300,12 @@ const Experience = () => {
|
||||
<Section<Experience> section={section} urlKey="url" dateKey="date" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
<div>{item.location}</div>
|
||||
</div>
|
||||
@@ -324,7 +321,12 @@ const Education = () => {
|
||||
<Section<Education> section={section} urlKey="url" dateKey="date" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.studyType}</div>
|
||||
<div>{item.score}</div>
|
||||
@@ -342,7 +344,7 @@ const Awards = () => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks} />
|
||||
</div>
|
||||
)}
|
||||
</Section>
|
||||
@@ -357,7 +359,7 @@ const Certifications = () => {
|
||||
{(item) => (
|
||||
<div>
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
</div>
|
||||
)}
|
||||
</Section>
|
||||
@@ -396,7 +398,12 @@ const Publications = () => {
|
||||
<Section<Publication> section={section} urlKey="url" dateKey="date" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -411,7 +418,12 @@ const Volunteer = () => {
|
||||
<Section<Volunteer> section={section} urlKey="url" dateKey="date" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
<div>{item.location}</div>
|
||||
</div>
|
||||
@@ -448,7 +460,12 @@ const Projects = () => {
|
||||
>
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -463,7 +480,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -484,7 +506,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
>
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
<div>{item.location}</div>
|
||||
</div>
|
||||
|
||||
@@ -147,7 +147,7 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-x-1.5">
|
||||
{!iconOnRight && ( icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
{!iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
<a
|
||||
href={url.href}
|
||||
target="_blank"
|
||||
@@ -156,7 +156,7 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
>
|
||||
{label ?? (url.label || url.href)}
|
||||
</a>
|
||||
{iconOnRight && ( icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
{iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -168,26 +168,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -259,7 +251,12 @@ const Experience = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -281,7 +278,12 @@ const Education = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.score}</div>
|
||||
</div>
|
||||
@@ -305,7 +307,11 @@ const Awards = () => {
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity
|
||||
name={item.awarder}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -326,7 +332,7 @@ const Certifications = () => {
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -371,7 +377,12 @@ const Publications = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
</div>
|
||||
|
||||
@@ -392,7 +403,12 @@ const Volunteer = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -429,7 +445,12 @@ const Projects = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
@@ -449,7 +470,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -470,7 +496,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -147,7 +147,10 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-x-1.5">
|
||||
{!iconOnRight && ( icon ?? <i className="ph ph-bold ph-link text-primary group-[.summary]:text-background" />)}
|
||||
{!iconOnRight &&
|
||||
(icon ?? (
|
||||
<i className="ph ph-bold ph-link text-primary group-[.summary]:text-background" />
|
||||
))}
|
||||
<a
|
||||
href={url.href}
|
||||
target="_blank"
|
||||
@@ -156,7 +159,10 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
>
|
||||
{label ?? (url.label || url.href)}
|
||||
</a>
|
||||
{iconOnRight && ( icon ?? <i className="ph ph-bold ph-link text-primary group-[.summary]:text-background" />)}
|
||||
{iconOnRight &&
|
||||
(icon ?? (
|
||||
<i className="ph ph-bold ph-link text-primary group-[.summary]:text-background" />
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -168,26 +174,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary group-[.summary]:text-background" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary group-[.summary]:text-background" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -291,7 +289,12 @@ const Experience = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -313,7 +316,12 @@ const Education = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.score}</div>
|
||||
</div>
|
||||
@@ -337,7 +345,11 @@ const Awards = () => {
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity
|
||||
name={item.awarder}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right group-[.sidebar]:text-left">
|
||||
@@ -358,7 +370,7 @@ const Certifications = () => {
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right group-[.sidebar]:text-left">
|
||||
@@ -403,7 +415,12 @@ const Publications = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
</div>
|
||||
|
||||
@@ -424,7 +441,12 @@ const Volunteer = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -461,7 +483,12 @@ const Projects = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
@@ -481,7 +508,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -502,7 +534,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between group-[.sidebar]:flex-col group-[.sidebar]:items-start">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-x-1.5">
|
||||
{!iconOnRight && ( icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
{!iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
<a
|
||||
href={url.href}
|
||||
target="_blank"
|
||||
@@ -128,7 +128,7 @@ const Link = ({ url, icon, iconOnRight, label, className }: LinkProps) => {
|
||||
>
|
||||
{label ?? (url.label || url.href)}
|
||||
</a>
|
||||
{iconOnRight && ( icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
{iconOnRight && (icon ?? <i className="ph ph-bold ph-link text-primary" />)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -140,26 +140,18 @@ type LinkedEntityProps = {
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const LinkedEntity = ({ name, url, separateLinks, className}: LinkedEntityProps) => {
|
||||
if (!separateLinks && isUrl(url.href)) {
|
||||
return (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={
|
||||
<i className="ph ph-bold ph-globe text-primary" />
|
||||
}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
);
|
||||
} else {
|
||||
return (
|
||||
<div className={className}>
|
||||
{name}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
const LinkedEntity = ({ name, url, separateLinks, className }: LinkedEntityProps) => {
|
||||
return !separateLinks && isUrl(url.href) ? (
|
||||
<Link
|
||||
url={url}
|
||||
label={name}
|
||||
icon={<i className="ph ph-bold ph-globe text-primary" />}
|
||||
iconOnRight={true}
|
||||
className={className}
|
||||
/>
|
||||
) : (
|
||||
<div className={className}>{name}</div>
|
||||
);
|
||||
};
|
||||
|
||||
type SectionProps<T> = {
|
||||
@@ -263,7 +255,12 @@ const Experience = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.company} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.company}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -285,7 +282,12 @@ const Education = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.institution} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.institution}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.area}</div>
|
||||
<div>{item.score}</div>
|
||||
</div>
|
||||
@@ -309,7 +311,11 @@ const Awards = () => {
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.title}</div>
|
||||
<LinkedEntity name={item.awarder} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity
|
||||
name={item.awarder}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -330,7 +336,7 @@ const Certifications = () => {
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<div className="font-bold">{item.name}</div>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks}/>
|
||||
<LinkedEntity name={item.issuer} url={item.url} separateLinks={section.separateLinks} />
|
||||
</div>
|
||||
|
||||
<div className="shrink-0 text-right">
|
||||
@@ -375,7 +381,12 @@ const Publications = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.publisher}</div>
|
||||
</div>
|
||||
|
||||
@@ -396,7 +407,12 @@ const Volunteer = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.organization} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.organization}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.position}</div>
|
||||
</div>
|
||||
|
||||
@@ -433,7 +449,12 @@ const Projects = () => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
@@ -453,7 +474,12 @@ const References = () => {
|
||||
<Section<Reference> section={section} urlKey="url" summaryKey="summary">
|
||||
{(item) => (
|
||||
<div>
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
)}
|
||||
@@ -474,7 +500,12 @@ const Custom = ({ id }: { id: string }) => {
|
||||
{(item) => (
|
||||
<div className="flex items-start justify-between">
|
||||
<div className="text-left">
|
||||
<LinkedEntity name={item.name} url={item.url} separateLinks={section.separateLinks} className="font-bold"/>
|
||||
<LinkedEntity
|
||||
name={item.name}
|
||||
url={item.url}
|
||||
separateLinks={section.separateLinks}
|
||||
className="font-bold"
|
||||
/>
|
||||
<div>{item.description}</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,35 +1,9 @@
|
||||
import * as Sentry from "@sentry/react";
|
||||
import { StrictMode, useEffect } from "react";
|
||||
import { StrictMode } from "react";
|
||||
import * as ReactDOM from "react-dom/client";
|
||||
import {
|
||||
createRoutesFromChildren,
|
||||
matchRoutes,
|
||||
RouterProvider,
|
||||
useLocation,
|
||||
useNavigationType,
|
||||
} from "react-router-dom";
|
||||
import { RouterProvider } from "react-router-dom";
|
||||
|
||||
import { router } from "./router";
|
||||
|
||||
if (import.meta.env.VITE_CLIENT_SENTRY_DSN) {
|
||||
Sentry.init({
|
||||
dsn: import.meta.env.VITE_CLIENT_SENTRY_DSN,
|
||||
integrations: [
|
||||
Sentry.reactRouterV6BrowserTracingIntegration({
|
||||
useEffect,
|
||||
matchRoutes,
|
||||
useLocation,
|
||||
useNavigationType,
|
||||
createRoutesFromChildren,
|
||||
}),
|
||||
Sentry.replayIntegration(),
|
||||
],
|
||||
tracesSampleRate: 1,
|
||||
replaysOnErrorSampleRate: 1,
|
||||
replaysSessionSampleRate: 1,
|
||||
});
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
||||
const root = ReactDOM.createRoot(document.querySelector("#root")!);
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import * as Sentry from "@sentry/react";
|
||||
import { createBrowserRouter, createRoutesFromElements, Navigate, Route } from "react-router-dom";
|
||||
|
||||
import { BackupOtpPage } from "../pages/auth/backup-otp/page";
|
||||
@@ -93,6 +92,4 @@ export const routes = createRoutesFromElements(
|
||||
</Route>,
|
||||
);
|
||||
|
||||
const sentryCreateBrowserRouter = Sentry.wrapCreateBrowserRouter(createBrowserRouter);
|
||||
|
||||
export const router = sentryCreateBrowserRouter(routes);
|
||||
export const router = createBrowserRouter(routes);
|
||||
|
||||
Vendored
-2
@@ -5,8 +5,6 @@
|
||||
declare const appVersion: string;
|
||||
|
||||
interface ImportMetaEnv {
|
||||
SENTRY_AUTH_TOKEN: string | undefined;
|
||||
VITE_CLIENT_SENTRY_DSN: string | undefined;
|
||||
VITE_DISABLE_SIGNUPS: string | undefined;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
import { lingui } from "@lingui/vite-plugin";
|
||||
import { nxViteTsPaths } from "@nx/vite/plugins/nx-tsconfig-paths.plugin";
|
||||
import { sentryVitePlugin } from "@sentry/vite-plugin";
|
||||
import react from "@vitejs/plugin-react";
|
||||
import { defineConfig, searchForWorkspaceRoot } from "vite";
|
||||
|
||||
@@ -40,11 +39,6 @@ export default defineConfig({
|
||||
}),
|
||||
lingui(),
|
||||
nxViteTsPaths(),
|
||||
sentryVitePlugin({
|
||||
disable: process.env.SENTRY_AUTH_TOKEN === undefined,
|
||||
org: "reactive-resume",
|
||||
project: "client",
|
||||
}),
|
||||
],
|
||||
|
||||
test: {
|
||||
|
||||
@@ -45,9 +45,6 @@ export const configSchema = z.object({
|
||||
.default("false")
|
||||
.transform((s) => s !== "false" && s !== "0"),
|
||||
|
||||
// Sentry
|
||||
SERVER_SENTRY_DSN: z.string().url().startsWith("https://").optional(),
|
||||
|
||||
// Crowdin (Optional)
|
||||
CROWDIN_PROJECT_ID: z.coerce.number().optional(),
|
||||
CROWDIN_PERSONAL_TOKEN: z.string().optional(),
|
||||
|
||||
@@ -3,10 +3,8 @@ import { ConfigService } from "@nestjs/config";
|
||||
import { NestFactory } from "@nestjs/core";
|
||||
import { NestExpressApplication } from "@nestjs/platform-express";
|
||||
import { DocumentBuilder, SwaggerModule } from "@nestjs/swagger";
|
||||
import * as Sentry from "@sentry/node";
|
||||
import cookieParser from "cookie-parser";
|
||||
import helmet from "helmet";
|
||||
import { PrismaService } from "nestjs-prisma";
|
||||
import { patchNestJsSwagger } from "nestjs-zod";
|
||||
|
||||
import { AppModule } from "./app.module";
|
||||
@@ -19,27 +17,6 @@ async function bootstrap() {
|
||||
logger: process.env.NODE_ENV === "development" ? ["debug"] : ["error", "warn", "log"],
|
||||
});
|
||||
const configService = app.get(ConfigService<Config>);
|
||||
const prisma = app.get(PrismaService);
|
||||
|
||||
// Sentry
|
||||
// Error Reporting and Performance Monitoring
|
||||
const sentryDsn = configService.get("SERVER_SENTRY_DSN");
|
||||
|
||||
if (sentryDsn) {
|
||||
const express = app.getHttpAdapter().getInstance();
|
||||
|
||||
Sentry.init({
|
||||
dsn: sentryDsn,
|
||||
tracesSampleRate: 1,
|
||||
profilesSampleRate: 1,
|
||||
integrations: [
|
||||
new Sentry.Integrations.Http({ tracing: true }),
|
||||
new Sentry.Integrations.Express({ app: express }),
|
||||
new Sentry.Integrations.Prisma({ client: prisma }),
|
||||
...Sentry.autoDiscoverNodePerformanceMonitoringIntegrations(),
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
// Cookie Parser
|
||||
app.use(cookieParser());
|
||||
|
||||
Reference in New Issue
Block a user