Draft project page
This commit is contained in:
@@ -84,3 +84,17 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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'
|
||||
|
||||
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>
|
||||
</article>
|
||||
|
||||
<style lang="scss">
|
||||
.card {
|
||||
background: hsl(from var(--color-slate-900) h s l / 0.25);
|
||||
backdrop-filter: blur(.5rem);
|
||||
}
|
||||
</style>
|
||||
@@ -1,23 +1,46 @@
|
||||
---
|
||||
type HeadingType = 'h0' | 'h1' | 'h2' | 'h3'
|
||||
|
||||
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' &&
|
||||
<h1 class="font-heading text-4xl md:text-5xl font-bold">
|
||||
<h1 class:list={renderClasses(style)}>
|
||||
<slot name="default" />
|
||||
</h1>
|
||||
}
|
||||
{tag === 'h2' &&
|
||||
<h2 class="font-heading text-xl md:text-3xl font-bold">
|
||||
<h2 class:list={renderClasses(style)}>
|
||||
<slot name="default" />
|
||||
</h2>
|
||||
}
|
||||
{tag === 'h3' &&
|
||||
<h3 class="font-heading md:text-xl font-bold">
|
||||
<h3 class:list={renderClasses(style)}>
|
||||
<slot name="default" />
|
||||
</h3>
|
||||
}
|
||||
|
||||
44
src/components/Navbar.astro
Normal file
44
src/components/Navbar.astro
Normal 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>
|
||||
@@ -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 ! 👋
|
||||
</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 :)
|
||||
</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 · Website is currently a WIP ; some things may change !</p>
|
||||
</section>
|
||||
101
src/layouts/HomeLayout.astro
Normal file
101
src/layouts/HomeLayout.astro
Normal 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>
|
||||
@@ -3,7 +3,7 @@ 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
|
||||
@@ -11,7 +11,7 @@ interface Props {
|
||||
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 renderedTitle = `${title} · ${baseTitle}`
|
||||
@@ -85,7 +85,9 @@ const websiteDomain = "alexcreates.fr"
|
||||
</script>
|
||||
</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 />
|
||||
|
||||
{hasParticles &&
|
||||
|
||||
@@ -1,13 +1,57 @@
|
||||
---
|
||||
import Hero from '../components/home/Hero.astro';
|
||||
// import Tooling from '../components/home/Tooling.astro';
|
||||
import Layout from '../layouts/Layout.astro';
|
||||
import Button from '../components/Button.astro';
|
||||
import Heading from '../components/Heading.astro';
|
||||
import HomeLayout from '../layouts/HomeLayout.astro';
|
||||
---
|
||||
|
||||
<Layout description="French web engineer and all around responsible web enthusiast">
|
||||
<main>
|
||||
<Hero />
|
||||
<HomeLayout description="French web engineer and all around responsible web enthusiast" hasGrid hasParticles>
|
||||
<main class="h-full">
|
||||
<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 ! 👋
|
||||
</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 :)
|
||||
</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 · Website is currently a WIP ; some things may change !</p>
|
||||
</div>
|
||||
</main>
|
||||
</Layout>
|
||||
</HomeLayout>
|
||||
|
||||
56
src/pages/projects.astro
Normal file
56
src/pages/projects.astro
Normal 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>
|
||||
Reference in New Issue
Block a user