🎉 Init monorepo Nuxt 4 + Laravel 12 (Story 1.1)

Setup complet de l'infrastructure projet :
- Frontend Nuxt 4 (SSR, TypeScript, i18n, Pinia, TailwindCSS)
- Backend Laravel 12 API-only avec middleware X-API-Key et CORS
- Design tokens (sky-dark, sky-accent, sky-text) et polices (Merriweather, Inter)
- Documentation planning et implementation artifacts

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-05 02:08:56 +01:00
commit ec1ae92799
116 changed files with 55669 additions and 0 deletions

6
frontend/.env.example Normal file
View File

@@ -0,0 +1,6 @@
# API Configuration
NUXT_PUBLIC_API_URL=http://localhost:8000/api
NUXT_PUBLIC_API_KEY=your-api-key-here
# Site URL (for sitemap, SEO)
NUXT_PUBLIC_SITE_URL=http://localhost:3000

5
frontend/app/app.vue Normal file
View File

@@ -0,0 +1,5 @@
<template>
<NuxtLayout>
<NuxtPage />
</NuxtLayout>
</template>

View File

@@ -0,0 +1,5 @@
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Merriweather:ital,wght@0,300;0,400;0,700;1,400&display=swap');
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@@ -0,0 +1,5 @@
<template>
<div class="min-h-screen bg-sky-dark flex items-center justify-center">
<h1 class="text-4xl font-ui text-sky-text">Skycel</h1>
</div>
</template>

44
frontend/nuxt.config.ts Normal file
View File

@@ -0,0 +1,44 @@
export default defineNuxtConfig({
devtools: { enabled: true },
ssr: true,
future: {
compatibilityVersion: 4,
},
modules: [
'@nuxtjs/i18n',
'@pinia/nuxt',
'@nuxt/image',
'@nuxtjs/sitemap',
],
css: ['~/assets/css/main.css'],
postcss: {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
},
i18n: {
locales: ['fr', 'en'],
defaultLocale: 'fr',
strategy: 'prefix_except_default',
},
app: {
pageTransition: { name: 'page', mode: 'out-in' },
},
runtimeConfig: {
public: {
apiUrl: process.env.NUXT_PUBLIC_API_URL || 'http://localhost:8000/api',
apiKey: process.env.NUXT_PUBLIC_API_KEY || '',
},
},
compatibilityDate: '2025-01-01',
})

11936
frontend/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

26
frontend/package.json Normal file
View File

@@ -0,0 +1,26 @@
{
"name": "skycel-frontend",
"private": true,
"type": "module",
"scripts": {
"build": "nuxt build",
"dev": "nuxt dev",
"generate": "nuxt generate",
"preview": "nuxt preview",
"postinstall": "nuxt prepare"
},
"dependencies": {
"@nuxt/image": "^1.9.0",
"@nuxtjs/i18n": "^9.0.0",
"@nuxtjs/sitemap": "^7.2.0",
"@pinia/nuxt": "^0.9.0",
"nuxt": "^3.16.0",
"pinia-plugin-persistedstate": "^3.2.0"
},
"devDependencies": {
"autoprefixer": "^10.4.24",
"postcss": "^8.5.6",
"tailwindcss": "^3.4.19",
"typescript": "^5.7.0"
}
}

View File

@@ -0,0 +1,62 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
'./app/**/*.{vue,js,ts}',
'./components/**/*.{vue,js,ts}',
'./layouts/**/*.{vue,js,ts}',
'./pages/**/*.{vue,js,ts}',
],
theme: {
extend: {
colors: {
'sky-dark': {
DEFAULT: '#0a0e1a',
50: '#1a1f2e',
100: '#151a28',
200: '#10141f',
300: '#0c1019',
400: '#080c14',
500: '#0a0e1a',
600: '#060810',
700: '#04060c',
800: '#020408',
900: '#010204',
},
'sky-accent': {
DEFAULT: '#fa784f',
hover: '#fb8c68',
active: '#f96436',
50: '#fff4f0',
100: '#ffe8e0',
200: '#ffd1c1',
300: '#ffb9a2',
400: '#fca283',
500: '#fa784f',
600: '#e86940',
700: '#d65a31',
800: '#c44b22',
900: '#b23c13',
},
'sky-text': {
DEFAULT: '#f5f0e6',
muted: '#b8b3a8',
50: '#fdfcfa',
100: '#fbf9f5',
200: '#f7f3eb',
300: '#f5f0e6',
400: '#e8e3d9',
500: '#dbd6cc',
600: '#cec9bf',
700: '#c1bcb2',
800: '#b4afa5',
900: '#a7a298',
},
},
fontFamily: {
'narrative': ['Merriweather', 'Georgia', 'serif'],
'ui': ['Inter', 'system-ui', 'sans-serif'],
},
},
},
plugins: [],
}

3
frontend/tsconfig.json Normal file
View File

@@ -0,0 +1,3 @@
{
"extends": "./.nuxt/tsconfig.json"
}