feat: scaffold astro app, dark identity
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
.git
|
||||||
|
docs
|
||||||
|
fixtures
|
||||||
|
ops
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
.astro/
|
||||||
|
*.env
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
FROM node:22-alpine AS builder
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package.json package-lock.json ./
|
||||||
|
RUN npm ci
|
||||||
|
COPY . .
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
FROM node:22-alpine
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=builder /app/dist ./dist
|
||||||
|
COPY --from=builder /app/node_modules ./node_modules
|
||||||
|
ENV HOST=0.0.0.0 PORT=4321
|
||||||
|
EXPOSE 4321
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:4321/ || exit 1
|
||||||
|
CMD ["node", "dist/server/entry.mjs"]
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
// @ts-check
|
||||||
|
import { defineConfig } from 'astro/config';
|
||||||
|
import tailwindcss from '@tailwindcss/vite';
|
||||||
|
import node from '@astrojs/node';
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
site: 'https://formations.saillant.cc',
|
||||||
|
output: 'server',
|
||||||
|
adapter: node({ mode: 'standalone' }),
|
||||||
|
vite: { plugins: [tailwindcss()] },
|
||||||
|
});
|
||||||
Generated
+6102
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "formations-app",
|
||||||
|
"type": "module",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"engines": { "node": ">=22.12.0" },
|
||||||
|
"scripts": {
|
||||||
|
"dev": "astro dev",
|
||||||
|
"build": "astro build",
|
||||||
|
"test": "vitest run",
|
||||||
|
"astro": "astro"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@astrojs/node": "^10.0.4",
|
||||||
|
"astro": "^6.1.3",
|
||||||
|
"@tailwindcss/vite": "^4.2.2",
|
||||||
|
"tailwindcss": "^4.2.2",
|
||||||
|
"three": "0.184.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"vitest": "^3.0.0",
|
||||||
|
"@types/three": "0.184.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
interface Props { light?: boolean; }
|
||||||
|
const { light = false } = Astro.props;
|
||||||
|
---
|
||||||
|
<nav class:list={['fixed top-0 left-0 right-0 z-50 border-b backdrop-blur-xl',
|
||||||
|
light ? 'bg-white/80 border-slate-200' : 'bg-night/70 border-white/10']}>
|
||||||
|
<div class="max-w-content mx-auto px-6 flex items-center justify-between h-14">
|
||||||
|
<a href="/" class:list={['font-semibold tracking-tight text-base', light ? 'text-ink' : 'text-white']}>
|
||||||
|
Formations <span class="text-copper">·</span> L'Electron Rare
|
||||||
|
</a>
|
||||||
|
<a href="https://www.lelectronrare.fr" class:list={['text-sm transition-colors',
|
||||||
|
light ? 'text-slate-500 hover:text-ink' : 'text-slate-400 hover:text-white']}>
|
||||||
|
lelectronrare.fr →
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
import '../styles/global.css';
|
||||||
|
|
||||||
|
interface Props { title: string; description: string; light?: boolean; }
|
||||||
|
const { title, description, light = false } = Astro.props;
|
||||||
|
const fullTitle = `${title} | Formations L'Electron Rare`;
|
||||||
|
---
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>{fullTitle}</title>
|
||||||
|
<meta name="description" content={description} />
|
||||||
|
<link rel="canonical" href={Astro.url.href} />
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:title" content={fullTitle} />
|
||||||
|
<meta property="og:description" content={description} />
|
||||||
|
<meta property="og:locale" content="fr_FR" />
|
||||||
|
</head>
|
||||||
|
<body class:list={[light ? 'bg-paper text-ink' : 'bg-night text-slate-200', 'antialiased min-h-screen']}>
|
||||||
|
<slot />
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
import Base from '../layouts/Base.astro';
|
||||||
|
import Nav from '../components/Nav.astro';
|
||||||
|
---
|
||||||
|
<Base title="Catalogue" description="Formations systèmes embarqués et IA — L'Electron Rare">
|
||||||
|
<Nav />
|
||||||
|
<main class="pt-24 px-6 max-w-content mx-auto">
|
||||||
|
<h1 class="text-4xl font-semibold text-white">Formations</h1>
|
||||||
|
</main>
|
||||||
|
</Base>
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
|
||||||
|
@import "tailwindcss";
|
||||||
|
|
||||||
|
@theme {
|
||||||
|
--color-night: #0b0f17;
|
||||||
|
--color-night-soft: #141c2e;
|
||||||
|
--color-copper: #f97316;
|
||||||
|
--color-copper-soft: #fdba74;
|
||||||
|
--color-copper-dim: rgba(249, 115, 22, 0.12);
|
||||||
|
--color-ink: #1d1d1f;
|
||||||
|
--color-paper: #fafafa;
|
||||||
|
--font-family-sans: 'Inter', system-ui, sans-serif;
|
||||||
|
--font-family-mono: 'JetBrains Mono', monospace;
|
||||||
|
--max-width-content: 980px;
|
||||||
|
--max-width-prose: 720px;
|
||||||
|
}
|
||||||
|
|
||||||
|
html { font-family: 'Inter', system-ui, sans-serif; background: var(--color-night); color: #e2e8f0; scroll-behavior: smooth; }
|
||||||
|
::selection { background: var(--color-copper); color: white; }
|
||||||
|
* { box-sizing: border-box; }
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"extends": "astro/tsconfigs/strict",
|
||||||
|
"include": [".astro/types.d.ts", "src/**/*"],
|
||||||
|
"exclude": ["dist"]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user