feat: new logo v1
@ -25,7 +25,9 @@ const BlogPage = async (): Promise<JSX.Element> => {
|
|||||||
return (
|
return (
|
||||||
<main className="flex flex-1 flex-col flex-wrap items-center">
|
<main className="flex flex-1 flex-col flex-wrap items-center">
|
||||||
<div className="mt-10 flex flex-col items-center">
|
<div className="mt-10 flex flex-col items-center">
|
||||||
<h1 className="text-4xl font-semibold">Blog</h1>
|
<h1 className="text-4xl font-semibold text-yellow dark:text-yellow-dark">
|
||||||
|
Blog
|
||||||
|
</h1>
|
||||||
<p className="mt-6 text-center" data-cy="blog-post-date">
|
<p className="mt-6 text-center" data-cy="blog-post-date">
|
||||||
{description}
|
{description}
|
||||||
</p>
|
</p>
|
||||||
|
BIN
app/favicon.ico
Normal file
After Width: | Height: | Size: 2.4 KiB |
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
.prose a,
|
.prose a,
|
||||||
.prose strong {
|
.prose strong {
|
||||||
@apply text-yellow dark:text-yellow-dark;
|
@apply text-yellow dark:text-yellow-dark font-semibold;
|
||||||
}
|
}
|
||||||
|
|
||||||
strong,
|
strong,
|
||||||
|
@ -13,7 +13,7 @@ import { getTheme } from "@/theme/theme.server"
|
|||||||
const title = "Théo LUDWIG"
|
const title = "Théo LUDWIG"
|
||||||
const description =
|
const description =
|
||||||
"Théo LUDWIG - Developer Full Stack • Open-Source Enthusiast"
|
"Théo LUDWIG - Developer Full Stack • Open-Source Enthusiast"
|
||||||
const image = "/images/icon-96x96.png"
|
const image = "/images/logo.png"
|
||||||
const url = new URL("https://theoludwig.fr")
|
const url = new URL("https://theoludwig.fr")
|
||||||
const locale = "fr-FR, en-US"
|
const locale = "fr-FR, en-US"
|
||||||
|
|
||||||
@ -36,9 +36,6 @@ export const metadata: Metadata = {
|
|||||||
locale,
|
locale,
|
||||||
type: "website",
|
type: "website",
|
||||||
},
|
},
|
||||||
icons: {
|
|
||||||
icon: "/images/icon-96x96.png",
|
|
||||||
},
|
|
||||||
twitter: {
|
twitter: {
|
||||||
card: "summary",
|
card: "summary",
|
||||||
title,
|
title,
|
||||||
|
@ -21,7 +21,9 @@ export const BlogPost = async (props: BlogPostProps): Promise<JSX.Element> => {
|
|||||||
return (
|
return (
|
||||||
<main className="break-wrap-words flex flex-1 flex-col flex-wrap items-center justify-center">
|
<main className="break-wrap-words flex flex-1 flex-col flex-wrap items-center justify-center">
|
||||||
<div className="my-10 flex flex-col items-center text-center">
|
<div className="my-10 flex flex-col items-center text-center">
|
||||||
<h1 className="text-3xl font-semibold">{blogPost.frontmatter.title}</h1>
|
<h1 className="text-3xl font-semibold text-yellow dark:text-yellow-dark">
|
||||||
|
{blogPost.frontmatter.title}
|
||||||
|
</h1>
|
||||||
<p className="mt-2" data-cy="blog-post-date">
|
<p className="mt-2" data-cy="blog-post-date">
|
||||||
{date.format(
|
{date.format(
|
||||||
new Date(blogPost.frontmatter.publishedOn),
|
new Date(blogPost.frontmatter.publishedOn),
|
||||||
|
@ -23,7 +23,10 @@ export const BlogPosts = async (): Promise<JSX.Element> => {
|
|||||||
data-cy={post.slug}
|
data-cy={post.slug}
|
||||||
>
|
>
|
||||||
<ShadowContainer className="cursor-pointer p-6 transition duration-200 ease-in-out hover:-translate-y-2">
|
<ShadowContainer className="cursor-pointer p-6 transition duration-200 ease-in-out hover:-translate-y-2">
|
||||||
<h2 data-cy="blog-post-title" className="text-xl font-semibold">
|
<h2
|
||||||
|
data-cy="blog-post-title"
|
||||||
|
className="text-xl font-semibold text-yellow dark:text-yellow-dark"
|
||||||
|
>
|
||||||
{post.frontmatter.title}
|
{post.frontmatter.title}
|
||||||
</h2>
|
</h2>
|
||||||
<p data-cy="blog-post-date" className="mt-2">
|
<p data-cy="blog-post-date" className="mt-2">
|
||||||
|
@ -9,7 +9,7 @@ export const FooterText = (): JSX.Element => {
|
|||||||
<p>
|
<p>
|
||||||
<Link
|
<Link
|
||||||
href="/"
|
href="/"
|
||||||
className="text-yellow hover:underline dark:text-yellow-dark"
|
className="text-yellow hover:underline dark:text-yellow-dark font-semibold"
|
||||||
>
|
>
|
||||||
Théo LUDWIG
|
Théo LUDWIG
|
||||||
</Link>{" "}
|
</Link>{" "}
|
||||||
|
@ -16,7 +16,7 @@ export const FooterVersion = (props: FooterVersionProps): JSX.Element => {
|
|||||||
Version{" "}
|
Version{" "}
|
||||||
<a
|
<a
|
||||||
data-cy="version-link"
|
data-cy="version-link"
|
||||||
className="text-yellow hover:underline dark:text-yellow-dark"
|
className="text-yellow hover:underline dark:text-yellow-dark font-semibold"
|
||||||
href={versionLink}
|
href={versionLink}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
|
@ -2,6 +2,7 @@ import { cookies } from "next/headers"
|
|||||||
import Link from "next/link"
|
import Link from "next/link"
|
||||||
import Image from "next/image"
|
import Image from "next/image"
|
||||||
|
|
||||||
|
import Logo from "@/public/images/logo.png"
|
||||||
import { getI18n } from "@/i18n/i18n.server"
|
import { getI18n } from "@/i18n/i18n.server"
|
||||||
|
|
||||||
import { Locales } from "./Locales"
|
import { Locales } from "./Locales"
|
||||||
@ -17,13 +18,12 @@ export const Header = (): JSX.Element => {
|
|||||||
<div className="flex items-center justify-center">
|
<div className="flex items-center justify-center">
|
||||||
<Image
|
<Image
|
||||||
quality={100}
|
quality={100}
|
||||||
width={60}
|
className="w-16 h-16"
|
||||||
height={60}
|
src={Logo}
|
||||||
src="/images/icon_small.png"
|
|
||||||
alt="Théo LUDWIG"
|
alt="Théo LUDWIG"
|
||||||
priority
|
priority
|
||||||
/>
|
/>
|
||||||
<strong className="ml-1 hidden font-headline font-semibold text-yellow dark:text-yellow-dark xs:block">
|
<strong className="ml-1 hidden font-headline font-semibold text-yellow dark:text-yellow-dark xs:block sm:text-xl">
|
||||||
Théo LUDWIG
|
Théo LUDWIG
|
||||||
</strong>
|
</strong>
|
||||||
</div>
|
</div>
|
||||||
@ -33,7 +33,7 @@ export const Header = (): JSX.Element => {
|
|||||||
<Link
|
<Link
|
||||||
href="/blog"
|
href="/blog"
|
||||||
data-cy="header-blog-link"
|
data-cy="header-blog-link"
|
||||||
className="text-yellow hover:underline dark:text-yellow-dark"
|
className="font-semibold text-yellow hover:underline dark:text-yellow-dark"
|
||||||
>
|
>
|
||||||
Blog
|
Blog
|
||||||
</Link>
|
</Link>
|
||||||
|
@ -15,7 +15,9 @@ export const Repository = (props: RepositoryProps): JSX.Element => {
|
|||||||
<a href={href} target="_blank" rel="noopener noreferrer">
|
<a href={href} target="_blank" rel="noopener noreferrer">
|
||||||
<div className="flex">
|
<div className="flex">
|
||||||
<GitHubIcon className="mr-2 h-6" />
|
<GitHubIcon className="mr-2 h-6" />
|
||||||
<span className="text-yellow dark:text-yellow-dark">{name}</span>
|
<span className="text-yellow dark:text-yellow-dark font-semibold">
|
||||||
|
{name}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<p className="my-4">{description}</p>
|
<p className="my-4">{description}</p>
|
||||||
</a>
|
</a>
|
||||||
|
@ -32,10 +32,10 @@ export const PortfolioItem = (props: PortfolioItemProps): JSX.Element => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div className="absolute bottom-0 h-auto overflow-hidden text-center opacity-0 transition-opacity duration-500 group-hover:opacity-100">
|
<div className="absolute bottom-0 h-auto overflow-hidden text-center opacity-0 transition-opacity duration-500 group-hover:opacity-100">
|
||||||
<h3 className="my-6 text-xl font-semibold text-yellow dark:text-yellow-dark">
|
<h3 className="my-6 text-2xl font-semibold text-yellow dark:text-yellow-dark">
|
||||||
{title}
|
{title}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="my-6 mx-2">{description}</p>
|
<p className="my-6 mx-4 font-semibold">{description}</p>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</ShadowContainer>
|
</ShadowContainer>
|
||||||
|
@ -12,7 +12,7 @@ export const ProfileDescriptionBottom = (): JSX.Element => {
|
|||||||
<br />
|
<br />
|
||||||
<a
|
<a
|
||||||
href="/curriculum-vitae/index.html"
|
href="/curriculum-vitae/index.html"
|
||||||
className="text-yellow hover:underline dark:text-yellow-dark"
|
className="text-yellow hover:underline dark:text-yellow-dark font-semibold"
|
||||||
>
|
>
|
||||||
Curriculum vitæ ({i18n.translate("common.fr-FR")})
|
Curriculum vitæ ({i18n.translate("common.fr-FR")})
|
||||||
</a>
|
</a>
|
||||||
|
@ -42,7 +42,7 @@ export const SkillComponent = (props: SkillComponentProps): JSX.Element => {
|
|||||||
alt={skill}
|
alt={skill}
|
||||||
src={getImage()}
|
src={getImage()}
|
||||||
/>
|
/>
|
||||||
<p className="mt-1">{skill}</p>
|
<p className="mt-1 font-semibold">{skill}</p>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
)
|
)
|
||||||
|
@ -4,7 +4,10 @@ export const SectionHeading = (props: SectionHeadingProps): JSX.Element => {
|
|||||||
const { children, ...rest } = props
|
const { children, ...rest } = props
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<h2 {...rest} className="mb-3 mt-1 text-center text-4xl font-semibold">
|
<h2
|
||||||
|
{...rest}
|
||||||
|
className="mb-3 mt-1 text-center text-4xl font-semibold text-yellow dark:text-yellow-dark"
|
||||||
|
>
|
||||||
{children}
|
{children}
|
||||||
</h2>
|
</h2>
|
||||||
)
|
)
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"basics": {
|
"basics": {
|
||||||
"name": "Théo LUDWIG",
|
"name": "Théo LUDWIG",
|
||||||
"label": "Développeur Full Stack • Étudiant",
|
"label": "Développeur Full Stack • Étudiant",
|
||||||
"image": "https://theoludwig.fr/images/logo_orange.png",
|
"image": "https://theoludwig.fr/images/logo_background.png",
|
||||||
"email": "contact@theoludwig.fr",
|
"email": "contact@theoludwig.fr",
|
||||||
"age": "31/03/2003",
|
"age": "31/03/2003",
|
||||||
"location": {
|
"location": {
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Open-Source Enthusiast",
|
"title": "Open-Source Enthusiast",
|
||||||
"description": "I value the <strong>sharing of knowledge and collaboration</strong> to collectively resolve problems. <br /> The source code of the website is available on <a class='text-yellow dark:text-yellow-dark hover:underline' href='https://github.com/theoludwig/theoludwig' target='_blank' rel='noopener noreferrer'>GitHub</a>.",
|
"description": "I value the <strong>sharing of knowledge and collaboration</strong> to collectively resolve problems. <br /> The source code of the website is available on <a class='text-yellow dark:text-yellow-dark hover:underline font-semibold' href='https://github.com/theoludwig/theoludwig' target='_blank' rel='noopener noreferrer'>GitHub</a>.",
|
||||||
"id": "open-source"
|
"id": "open-source"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Enthousiaste de l'Open-Source",
|
"title": "Enthousiaste de l'Open-Source",
|
||||||
"description": "J'apprécie le <strong>partage des connaissances et la collaboration</strong> pour résoudre des défis collectivement. <br /> Le code source du site est accessible sur <a class='text-yellow dark:text-yellow-dark hover:underline' href='https://github.com/theoludwig/theoludwig' target='_blank' rel='noopener noreferrer'>GitHub</a>.",
|
"description": "J'apprécie le <strong>partage des connaissances et la collaboration</strong> pour résoudre des défis collectivement. <br /> Le code source du site est accessible sur <a class='text-yellow dark:text-yellow-dark hover:underline font-semibold' href='https://github.com/theoludwig/theoludwig' target='_blank' rel='noopener noreferrer'>GitHub</a>.",
|
||||||
"id": "open-source"
|
"id": "open-source"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 6.3 KiB |
BIN
public/images/logo_background.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 89 KiB |
@ -15,16 +15,16 @@ const tailwindConfig = {
|
|||||||
black: "#181818",
|
black: "#181818",
|
||||||
gray: {
|
gray: {
|
||||||
DEFAULT: "#333333",
|
DEFAULT: "#333333",
|
||||||
dark: "#b2bac2",
|
dark: "#b7c0c9",
|
||||||
},
|
},
|
||||||
yellow: {
|
yellow: {
|
||||||
DEFAULT: "#ff6000",
|
DEFAULT: "#006cff",
|
||||||
dark: "#ffd800",
|
dark: "#00aeff",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
boxShadow: {
|
boxShadow: {
|
||||||
dark: "0px 0px 4px 4px rgba(0, 0, 0, 0.25)",
|
dark: "0px 0px 2px 2px rgba(0, 0, 0, 0.25)",
|
||||||
light: "0px 0px 4px 4px rgba(0, 0, 0, 0.10)",
|
light: "0px 0px 2px 2px rgba(0, 0, 0, 0.10)",
|
||||||
darkFlag: "0px 1px 10px hsla(0, 0%, 100%, 0.2)",
|
darkFlag: "0px 1px 10px hsla(0, 0%, 100%, 0.2)",
|
||||||
lightFlag: "0px 1px 10px rgba(0, 0, 0, 0.25)",
|
lightFlag: "0px 1px 10px rgba(0, 0, 0, 0.25)",
|
||||||
},
|
},
|
||||||
|