Draft project page

This commit is contained in:
Alexis
2025-07-14 15:03:33 +02:00
parent cc980732a1
commit 3e80440afc
9 changed files with 347 additions and 74 deletions

View File

@@ -84,3 +84,17 @@
font-weight: 300; font-weight: 300;
} }
} }
@layer base {
.link,
.content a {
color: var(--color-emerald-500);
text-decoration: none;
text-underline-offset: .25rem;
&:hover {
color: var(--color-emerald-300);
text-decoration: underline;
}
}
}

View File

@@ -1,7 +1,49 @@
<div class="p-3 text-slate-200 bg-slate-900 border border-slate-800 rounded-sm"> ---
<div class="flex items-center gap-2"> import { Image } from 'astro:assets'
<slot name="icon" />
<slot name="heading" /> interface Props {
imageCover?: string
imageHeight?: number
imageWidth?: number
}
const { imageCover, imageHeight, imageWidth } = Astro.props
---
<article
class="card text-slate-200 bg-slate-900 border border-slate-800 rounded-2xl"
class:list={{
"p-6": !imageCover,
"overflow-hidden": imageCover
}}
>
{imageCover && imageHeight && imageWidth &&
<figure class="w-full">
<Image src={imageCover} height={imageHeight} width={imageWidth} alt={""} loading="lazy" class="w-full h-full object-center" />
</figure>
}
<div
class="grid gap-3"
class:list={{
"p-6": imageCover
}}
>
<header class="flex items-center gap-2">
<slot name="icon" />
<slot name="heading" />
</header>
<div class="body text-slate-400 flow text-[.95em]">
<slot name="body" />
</div>
</div> </div>
</div> </article>
<style lang="scss">
.card {
background: hsl(from var(--color-slate-900) h s l / 0.25);
backdrop-filter: blur(.5rem);
}
</style>

View File

@@ -1,23 +1,46 @@
--- ---
type HeadingType = 'h0' | 'h1' | 'h2' | 'h3'
interface Props { interface Props {
tag: 'h1' | 'h2' | 'h3'; tag: HeadingType
style?: HeadingType
} }
const { tag = "h1" } = Astro.props; const { tag = "h1" } = Astro.props
const { style = tag } = Astro.props
function renderClasses(style: HeadingType) {
switch (style) {
case 'h0':
return "font-heading text-4xl md:text-6xl font-bold"
case 'h1':
default:
return "font-heading text-2xl md:text-4xl font-bold"
case 'h2':
return "font-heading text-xl md:text-3xl font-bold"
case 'h3':
return "font-heading text-lg md:text-xl font-bold"
}
}
--- ---
{tag === 'h0' &&
<h1 class:list={renderClasses(style)}>
<slot name="default" />
</h1>
}
{tag === 'h1' && {tag === 'h1' &&
<h1 class="font-heading text-4xl md:text-5xl font-bold"> <h1 class:list={renderClasses(style)}>
<slot name="default" /> <slot name="default" />
</h1> </h1>
} }
{tag === 'h2' && {tag === 'h2' &&
<h2 class="font-heading text-xl md:text-3xl font-bold"> <h2 class:list={renderClasses(style)}>
<slot name="default" /> <slot name="default" />
</h2> </h2>
} }
{tag === 'h3' && {tag === 'h3' &&
<h3 class="font-heading md:text-xl font-bold"> <h3 class:list={renderClasses(style)}>
<slot name="default" /> <slot name="default" />
</h3> </h3>
} }

View File

@@ -0,0 +1,44 @@
---
interface MenuItem {
label: string
to: string
}
const menuItems: MenuItem[] = [
{
label: "Home",
to: "/"
},
{
label: "Projects",
to: "/projects"
}
]
interface Props {
floating?: boolean
}
const { floating = false } = Astro.props
---
<header
class:list={
{
"absolute top-12 left-12 z-10": floating,
"pt-12 pb-6": !floating
}
}
>
<nav aria-labelledby="Main pages">
<menu class="flex gap-12">
{menuItems.map((item) => (
<li>
<a href={item.to} class="py-2">
{item.label}
</a>
</li>
))}
</menu>
</nav>
</header>

View File

@@ -1,53 +0,0 @@
---
import Button from "../Button.astro";
import Heading from "../Heading.astro";
// import HeroVerticalCards from "./HeroVerticalCards.astro";
---
<section id="hero" class="relative h-screen max-w-full">
<div class="h-full container grid place-items-center auto-rows-auto">
<div class="px-4 max-w-2xl text-center">
<Heading tag="h1">
Hello, I'm Alexis&nbsp;!&nbsp;👋
</Heading>
<div class="mt-4">
<p class="md:text-xl">
I'm a front-end engineer from France and all-around web enthusiast.
</p>
</div>
<hr class="my-4 w-12 mx-auto border-none h-[.33rem] rounded-[100vmax] bg-linear-to-b from-emerald-500 to-emerald-600" />
<div>
<p class="md:text-xl">
Let's build something cool together&nbsp;:)
</p>
</div>
<div class="mt-8 flex items-center justify-center gap-4 md:gap-8">
<Button href="https://github.com/AlexisNP" glow variant="primary">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF" viewBox="0 0 256 256">
<path d="M208.31,75.68A59.78,59.78,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58.14,58.14,0,0,0,208.31,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.72,41.72,0,0,1,200,104Z" />
</svg>
<span>
Github
</span>
</Button>
<Button href="mailto:contact@alexcreates.fr">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF" viewBox="0 0 256 256">
<path d="M132,24A100.11,100.11,0,0,0,32,124v84a16,16,0,0,0,16,16h84a100,100,0,0,0,0-200Zm0,184H48V124a84,84,0,1,1,84,84Zm12-80a12,12,0,1,1-12-12A12,12,0,0,1,144,128Zm-44,0a12,12,0,1,1-12-12A12,12,0,0,1,100,128Zm88,0a12,12,0,1,1-12-12A12,12,0,0,1,188,128Z" />
</svg>
<span>
Contact
</span>
</Button>
</div>
</div>
</div>
<p class="absolute px-4 bottom-8 left-1/2 -translate-x-1/2 opacity-50 text-xs md:text-sm text-center">@2025&nbsp;·&nbsp;Website is currently a WIP&nbsp;;&nbsp;some things may change&nbsp;!</p>
</section>

View File

@@ -0,0 +1,101 @@
---
import '../../assets/css/main.css'
import BgParticles from '../components/BgParticles.astro'
import BgGrid from '../components/BgGrid.astro'
import HeadFavicon from './HeadFavicon.astro'
import Navbar from "../components/Navbar.astro";
interface Props {
title?: string
description?: string
hasParticles?: boolean
hasGrid?: boolean
}
const { title = "Home", hasParticles = false, hasGrid = false } = Astro.props
const baseTitle = 'Alexis Pelé'
const renderedTitle = `${title} · ${baseTitle}`
const { description = baseTitle } = Astro.props
const authorName = "Alexis Pelé"
const authorUsername = "AlexisNP"
const websiteDomain = "alexcreates.fr"
---
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="canonical" href={Astro.url} />
<meta name="generator" content={ Astro.generator } />
<title>{ renderedTitle }</title>
<meta property="og:title" content={renderedTitle} />
<meta name="description" content={description} />
<meta property="og:description" content={description} />
<meta name="twitter:description" content={description} />
<meta property="author" content={authorName} />
<meta property="og:author" content={authorName} />
<meta property="og:author:username" content={authorUsername} />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css">
<HeadFavicon />
<meta name="msapplication-TileColor" content="#065f46">
<meta name="theme-color" content="#065f46">
<meta name="color-scheme" content="dark light" />
<meta property="og:site_name" content={websiteDomain} />
<meta name="twitter:domain" content={websiteDomain} />
<meta property="og:type" content="website" />
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"email": "mailto:contact@alexcreates.fr",
"jobTitle": "Web developer",
"name": "Alexis",
"familyName": "Pelé",
"url": "https://alexcreates.fr/",
"nationality": {
"@type": "Country",
"name": "France"
},
"pronouns": "he/him",
"knowsLanguage": [
{
"@type": "Language",
"name": "French",
"alternateName": "fr"
},
{
"@type": "Language",
"name": "English",
"alternateName": "en"
}
]
}
</script>
</head>
<body class="h-screen relative bg-slate-950 text-white px-12 overflow-hidden">
<Navbar floating />
<slot />
{hasParticles &&
<BgParticles />
}
{hasGrid &&
<BgGrid />
}
</body>
</html>

View File

@@ -3,7 +3,7 @@ import '../../assets/css/main.css'
import BgParticles from '../components/BgParticles.astro' import BgParticles from '../components/BgParticles.astro'
import BgGrid from '../components/BgGrid.astro' import BgGrid from '../components/BgGrid.astro'
import HeadFavicon from './HeadFavicon.astro' import HeadFavicon from './HeadFavicon.astro'
import Navbar from "../components/Navbar.astro";
interface Props { interface Props {
title?: string title?: string
description?: string description?: string
@@ -11,7 +11,7 @@ interface Props {
hasGrid?: boolean hasGrid?: boolean
} }
const { title = "Home", hasParticles = true, hasGrid = true } = Astro.props const { title = "Home", hasParticles = false, hasGrid = false } = Astro.props
const baseTitle = 'Alexis Pelé' const baseTitle = 'Alexis Pelé'
const renderedTitle = `${title} · ${baseTitle}` const renderedTitle = `${title} · ${baseTitle}`
@@ -85,7 +85,9 @@ const websiteDomain = "alexcreates.fr"
</script> </script>
</head> </head>
<body class="relative bg-slate-950 text-white overflow-hidden"> <body class="relative bg-slate-950 text-white overflow-hidden px-4 md:px-12 grid grid-rows-[auto_1fr] gap-4">
<Navbar />
<slot /> <slot />
{hasParticles && {hasParticles &&

View File

@@ -1,13 +1,57 @@
--- ---
import Hero from '../components/home/Hero.astro'; import Button from '../components/Button.astro';
// import Tooling from '../components/home/Tooling.astro'; import Heading from '../components/Heading.astro';
import Layout from '../layouts/Layout.astro'; import HomeLayout from '../layouts/HomeLayout.astro';
--- ---
<Layout description="French web engineer and all around responsible web enthusiast"> <HomeLayout description="French web engineer and all around responsible web enthusiast" hasGrid hasParticles>
<main> <main class="h-full">
<Hero /> <div class="h-full relative max-w-full">
<div class="h-full container grid items-center justify-center auto-rows-auto">
<div class="px-4 max-w-2xl text-center grid">
<Heading tag="h0">
Hello, I'm Alexis&nbsp;!&nbsp;👋
</Heading>
<!-- <Tooling /> --> <div class="mt-4">
<p class="md:text-xl">
I'm a front-end engineer from France and all-around web enthusiast.
</p>
</div>
<hr class="my-4 w-12 mx-auto border-none h-[.33rem] rounded-[100vmax] bg-linear-to-b from-emerald-500 to-emerald-600" />
<div>
<p class="md:text-xl">
Let's build something cool together&nbsp;:)
</p>
</div>
<div class="mt-8 flex items-center justify-center gap-4 md:gap-8">
<Button href="https://github.com/AlexisNP" glow variant="primary">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF" viewBox="0 0 256 256">
<path d="M208.31,75.68A59.78,59.78,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58.14,58.14,0,0,0,208.31,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.72,41.72,0,0,1,200,104Z" />
</svg>
<span>
Github
</span>
</Button>
<Button href="mailto:contact@alexcreates.fr">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="#FFF" viewBox="0 0 256 256">
<path d="M132,24A100.11,100.11,0,0,0,32,124v84a16,16,0,0,0,16,16h84a100,100,0,0,0,0-200Zm0,184H48V124a84,84,0,1,1,84,84Zm12-80a12,12,0,1,1-12-12A12,12,0,0,1,144,128Zm-44,0a12,12,0,1,1-12-12A12,12,0,0,1,100,128Zm88,0a12,12,0,1,1-12-12A12,12,0,0,1,188,128Z" />
</svg>
<span>
Contact
</span>
</Button>
</div>
</div>
</div>
<p class="absolute px-4 bottom-8 left-1/2 -translate-x-1/2 opacity-50 text-xs md:text-sm text-center">@2025&nbsp;·&nbsp;Website is currently a WIP&nbsp;;&nbsp;some things may change&nbsp;!</p>
</div>
</main> </main>
</Layout> </HomeLayout>

56
src/pages/projects.astro Normal file
View File

@@ -0,0 +1,56 @@
---
import Card from '../components/Card.astro';
import Heading from '../components/Heading.astro';
import Layout from '../layouts/Layout.astro';
---
<Layout description="my projects" hasGrid>
<main class="relative h-screen max-w-full">
<div class="flow content">
<Heading tag="h1">
My projects
</Heading>
</div>
<section class="mt-8">
<ul class="grid grid-cols-12 gap-4 md:gap-6 lg:gap-8">
<li class="col-span-12 md:col-span-6 lg:col-span-5 xl:col-span-4">
<Card imageCover="https://picsum.photos/id/536/400/200" imageHeight={200} imageWidth={400}>
<Fragment slot="icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" class="size-7 fill-emerald-600">
<path d="M228.92,49.69a8,8,0,0,0-6.86-1.45L160.93,63.52,99.58,32.84a8,8,0,0,0-5.52-.6l-64,16A8,8,0,0,0,24,56V200a8,8,0,0,0,9.94,7.76l61.13-15.28,61.35,30.68A8.15,8.15,0,0,0,160,224a8,8,0,0,0,1.94-.24l64-16A8,8,0,0,0,232,200V56A8,8,0,0,0,228.92,49.69ZM96,176a8,8,0,0,0-1.94.24L40,189.75V62.25L95.07,48.48l.93.46Zm120,17.75-55.07,13.77-.93-.46V80a8,8,0,0,0,1.94-.23L216,66.25Z"></path>
</svg>
</Fragment>
<Heading tag="h2" style="h3" slot="heading">
Interactive maps
</Heading>
<Fragment slot="body">
<p>World-building does not come easy for me, as I tend to struggle with aphantasia.</p>
<p>I started this side-project to help me visualize my tabletop world better. It features translations, multiple maps and distance measurements.</p>
</Fragment>
</Card>
</li>
<li class="col-span-12 md:col-span-6 lg:col-span-5 xl:col-span-4">
<Card imageCover="https://picsum.photos/id/536/400/200" imageHeight={200} imageWidth={400}>
<Fragment slot="icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" class="size-7 fill-emerald-600">
<path d="M208,32H184V24a8,8,0,0,0-16,0v8H88V24a8,8,0,0,0-16,0v8H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM72,48v8a8,8,0,0,0,16,0V48h80v8a8,8,0,0,0,16,0V48h24V80H48V48ZM208,208H48V96H208V208Zm-68-76a12,12,0,1,1-12-12A12,12,0,0,1,140,132Zm44,0a12,12,0,1,1-12-12A12,12,0,0,1,184,132ZM96,172a12,12,0,1,1-12-12A12,12,0,0,1,96,172Zm44,0a12,12,0,1,1-12-12A12,12,0,0,1,140,172Zm44,0a12,12,0,1,1-12-12A12,12,0,0,1,184,172Z" />
</svg>
</Fragment>
<Heading tag="h2" style="h3" slot="heading">
Tabletop Calendars
</Heading>
<Fragment slot="body">
<p>I wasn't satisfied with the custom calendar apps currently available ; especially with their interfaces. So I <i>obviously</i> has to make my own !</p>
<p>It also was the perfect excuse to experiment and push Nuxt / Shadcn code to production</p>
</Fragment>
</Card>
</li>
</ul>
</section>
</main>
</Layout>