diff --git a/.gitignore b/.gitignore index 86399ae..ea11103 100644 --- a/.gitignore +++ b/.gitignore @@ -57,4 +57,17 @@ Icon # Claude settings # --------------- -/.claude \ No newline at end of file +/.claude + +# Node.js +# --------------- + +node_modules/ +npm-debug.log* +*.log + +# Build +# --------------- + +dist/ +node_modules/ diff --git a/assets/fonts/Danzza-Bold.otf b/assets/fonts/Danzza-Bold.otf new file mode 100644 index 0000000..5779cc2 Binary files /dev/null and b/assets/fonts/Danzza-Bold.otf differ diff --git a/assets/fonts/Danzza-Bold.woff b/assets/fonts/Danzza-Bold.woff new file mode 100644 index 0000000..784a004 Binary files /dev/null and b/assets/fonts/Danzza-Bold.woff differ diff --git a/assets/fonts/Danzza-Light.otf b/assets/fonts/Danzza-Light.otf new file mode 100644 index 0000000..7f14f9c Binary files /dev/null and b/assets/fonts/Danzza-Light.otf differ diff --git a/assets/fonts/Danzza-Light.woff b/assets/fonts/Danzza-Light.woff new file mode 100644 index 0000000..ca55417 Binary files /dev/null and b/assets/fonts/Danzza-Light.woff differ diff --git a/assets/fonts/Danzza-Medium.otf b/assets/fonts/Danzza-Medium.otf new file mode 100644 index 0000000..af1c473 Binary files /dev/null and b/assets/fonts/Danzza-Medium.otf differ diff --git a/assets/fonts/Danzza-Medium.woff b/assets/fonts/Danzza-Medium.woff new file mode 100644 index 0000000..7a0782a Binary files /dev/null and b/assets/fonts/Danzza-Medium.woff differ diff --git a/assets/fonts/Danzza-Regular.otf b/assets/fonts/Danzza-Regular.otf new file mode 100644 index 0000000..768b3eb Binary files /dev/null and b/assets/fonts/Danzza-Regular.otf differ diff --git a/assets/fonts/Danzza-Regular.woff b/assets/fonts/Danzza-Regular.woff new file mode 100644 index 0000000..3a8b2cc Binary files /dev/null and b/assets/fonts/Danzza-Regular.woff differ diff --git a/assets/fonts/terminal-grotesque.ttf b/assets/fonts/terminal-grotesque.ttf new file mode 100644 index 0000000..3786710 Binary files /dev/null and b/assets/fonts/terminal-grotesque.ttf differ diff --git a/assets/img/GIF_world_game_planete.gif b/assets/img/GIF_world_game_planete.gif new file mode 100644 index 0000000..6129b0f Binary files /dev/null and b/assets/img/GIF_world_game_planete.gif differ diff --git a/assets/img/icon-earth-green.png b/assets/img/icon-earth-green.png new file mode 100644 index 0000000..21f1848 Binary files /dev/null and b/assets/img/icon-earth-green.png differ diff --git a/assets/video/Website_version.mp4 b/assets/video/Website_version.mp4 new file mode 100644 index 0000000..256ffeb Binary files /dev/null and b/assets/video/Website_version.mp4 differ diff --git a/assets/video/mobile_version_texte_fixe.mp4 b/assets/video/mobile_version_texte_fixe.mp4 new file mode 100644 index 0000000..9720379 Binary files /dev/null and b/assets/video/mobile_version_texte_fixe.mp4 differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..2315788 --- /dev/null +++ b/index.html @@ -0,0 +1,46 @@ + + + + + + World Game - Play to Engage + + + + + + +
+ + + + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8c71d45 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1385 @@ +{ + "name": "world-game-website", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "world-game-website", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@sveltejs/vite-plugin-svelte": "6.0.0", + "gsap": "^3.14.2", + "navaid": "^1.2.0", + "svelte": "5.0.0", + "vite": "7.0.4" + }, + "devDependencies": { + "fs-extra": "^11.3.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.0.0.tgz", + "integrity": "sha512-mma5GJ23pYiWpTNbN//g9XI3Hfob3aAlXPP42qRtvjgTAU6pfJyLyNPTdLjFuj+jfC9JslP4J3AkeiJNhjtLLA==", + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0-next.1", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.1.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.2.tgz", + "integrity": "sha512-TZzRTcEtZffICSAoZGkPSl6Etsj2torOVrx6Uw0KpXxrec9Gg6jFWQ60Q3+LmNGfZSxHRCZL7vXVZIWmuV50Ig==", + "license": "MIT", + "dependencies": { + "obug": "^2.1.0" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0", + "svelte": "^5.0.0", + "vite": "^6.3.0 || ^7.0.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-typescript": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz", + "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==", + "license": "MIT", + "peerDependencies": { + "acorn": ">=8.9.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "license": "MIT" + }, + "node_modules/esrap": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.4.9.tgz", + "integrity": "sha512-3OMlcd0a03UGuZpPeUC1HxR3nA23l+HEyCiZw3b3FumJIN9KphoGzDJKMXI1S72jVS1dsenDyQC0kJlO1U9E1g==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/gsap": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.14.2.tgz", + "integrity": "sha512-P8/mMxVLU7o4+55+1TCnQrPmgjPKnwkzkXOK1asnR9Jg2lna4tEY5qBJjMmAaOBDDZWtlRjBXjLa0w53G/uBLA==", + "license": "Standard 'no charge' license: https://gsap.com/standard-license." + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/navaid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/navaid/-/navaid-1.2.0.tgz", + "integrity": "sha512-Yh5mix394WrT5go29GFeFD4Gp4W0Xj1Ejs0KHXXCA24KKW74pq3PY3fwP3o18KveYO/pjUI2zzcAAp8kY98aNA==", + "license": "MIT", + "dependencies": { + "regexparam": "^1.0.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/regexparam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-1.3.0.tgz", + "integrity": "sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svelte": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.0.0.tgz", + "integrity": "sha512-jv2IvTtakG58DqZMo6fY3T6HFmGV4iDQH2lSUyfmCEYaoa+aCNcF+9rERbdDvT4XDF0nQBg6TEoJn0dirED8VQ==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "acorn-typescript": "^1.4.13", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "esm-env": "^1.0.0", + "esrap": "^1.2.2", + "is-reference": "^3.0.2", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/vite": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.4.tgz", + "integrity": "sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "picomatch": "^4.0.2", + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5b11c8f --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "world-game-website", + "version": "1.0.0", + "description": "World Game - Svelte + Kirby", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "kirby:dev": "php -S localhost:8000" + }, + "repository": { + "type": "git", + "url": "https://forge.studio-variable.com/studio-variable/world-game.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@sveltejs/vite-plugin-svelte": "6.0.0", + "gsap": "^3.14.2", + "navaid": "^1.2.0", + "svelte": "5.0.0", + "vite": "7.0.4" + }, + "devDependencies": { + "fs-extra": "^11.3.3" + } +} diff --git a/site/controllers/site.php b/site/controllers/site.php new file mode 100644 index 0000000..5ee297d --- /dev/null +++ b/site/controllers/site.php @@ -0,0 +1,37 @@ + $page->title()->value(), + 'url' => $page->url(), + 'uri' => $page->uri(), + 'template' => $page->intendedTemplate()->name(), + 'modified' => $page->modified('Y-m-d'), + 'site' => [ + 'title' => $site->site_title()->value(), + 'url' => $site->url(), + 'logo' => $site->logo()->toFile()?->url(), + 'language' => $kirby->language()?->code() ?? 'fr', + 'languages' => $kirby->languages()->map(function($l) { + return [ + 'code' => $l->code(), + 'name' => $l->name() + ]; + })->values(), + 'navigation' => $site->main_navigation()->toStructure()->map(function($item) use ($kirby) { + $linkedPage = $item->link()->toPages()->first(); + return [ + 'label_fr' => $item->label_fr()->value(), + 'label_en' => $item->label_en()->value(), + 'url' => $linkedPage?->url(), + 'isActive' => $linkedPage?->isOpen() ?? false + ]; + })->values() + ] + ]; + + return [ + 'genericData' => $genericData + ]; +}; diff --git a/site/snippets/footer.php b/site/snippets/footer.php index e66fffc..308b1d0 100644 --- a/site/snippets/footer.php +++ b/site/snippets/footer.php @@ -1,82 +1,2 @@ - - - - - diff --git a/site/snippets/header.php b/site/snippets/header.php index 8a16298..f6b4c47 100644 --- a/site/snippets/header.php +++ b/site/snippets/header.php @@ -10,9 +10,6 @@ - - - @@ -21,53 +18,16 @@ cover()->toFile()): ?> + + + + + + + + + + - - - + +
diff --git a/site/templates/about.json.php b/site/templates/about.json.php new file mode 100644 index 0000000..dacd24e --- /dev/null +++ b/site/templates/about.json.php @@ -0,0 +1,34 @@ + [ + 'title' => $page->intro_title()->value(), + 'text' => $page->intro_text()->value() + ], + 'mission' => [ + 'title' => $page->mission_title()->value(), + 'text' => $page->mission_text()->toBlocks() + ], + 'manifesto' => [ + 'title' => $page->manifesto_title()->value(), + 'text' => $page->manifesto_text()->toBlocks() + ], + 'team' => [ + 'title' => $page->team_title()->value(), + 'members' => $page->team_members()->toStructure()->map(function($member) { + return [ + 'name' => $member->name()->value(), + 'role' => $member->role()->value(), + 'bio' => $member->bio()->value(), + 'photo' => $member->photo()->toFile()?->url(), + 'linkedin' => $member->linkedin()->value(), + 'twitter' => $member->twitter()->value() + ]; + })->values() + ] +]; + +$pageData = array_merge($genericData, $specificData); + +header('Content-Type: application/json'); +echo json_encode($pageData); diff --git a/site/templates/about.php b/site/templates/about.php index a6f89ff..f31b64d 100644 --- a/site/templates/about.php +++ b/site/templates/about.php @@ -1,81 +1,2 @@ - -
- -
-

intro_title() ?>

- - intro_text()->isNotEmpty()): ?> -

intro_text() ?>

- -
- - - mission_text()->isNotEmpty()): ?> -
-

mission_title() ?>

-
- mission_text()->toBlocks() ?> -
-
- - - - manifesto_text()->isNotEmpty()): ?> -
-

manifesto_title() ?>

-
- manifesto_text()->toBlocks() ?> -
-
- - - - team_members()->isNotEmpty()): ?> -
-

team_title() ?>

- -
- team_members()->toStructure() as $member): ?> -
- photo()->toFile()): ?> -
- <?= $member->name() ?> -
- - -
-

name() ?>

-

role() ?>

- - bio()->isNotEmpty()): ?> -

bio() ?>

- - - -
-
- -
- - -
- -
- diff --git a/site/templates/article.json.php b/site/templates/article.json.php new file mode 100644 index 0000000..0e4398d --- /dev/null +++ b/site/templates/article.json.php @@ -0,0 +1,34 @@ +related_articles()->toPages(); +if ($related->isEmpty()) { + $related = $page->siblings()->listed()->not($page)->shuffle()->limit(3); +} + +$specificData = [ + 'date' => $page->date()->toDate('Y-m-d'), + 'date_formatted' => $page->date()->toDate('d/m/Y'), + 'intro' => $page->intro()->value(), + 'author' => [ + 'name' => $page->author_name()->value(), + 'role' => $page->author_role()->value(), + 'photo' => $page->author_photo()->toFile()?->url() + ], + 'cover' => $page->cover()->toFile()?->url(), + 'content' => $page->article_content()->toBlocks(), + 'tags' => $page->tags()->split(), + 'related' => $related->map(function($rec) { + return [ + 'title' => $rec->title()->value(), + 'url' => $rec->url(), + 'category' => $rec->category()->value(), + 'cover' => $rec->cover()->toFile()?->thumb(['width' => 400])->url() + ]; + })->values(), + 'parent_url' => $page->parent()->url() +]; + +$pageData = array_merge($genericData, $specificData); + +header('Content-Type: application/json'); +echo json_encode($pageData); diff --git a/site/templates/article.php b/site/templates/article.php index c253981..f31b64d 100644 --- a/site/templates/article.php +++ b/site/templates/article.php @@ -1,101 +1,2 @@ - -
-
- -
- date()->isNotEmpty()): ?> - - - -

title() ?>

- - intro()->isNotEmpty()): ?> -

intro() ?>

- -
- - - author_name()->isNotEmpty()): ?> - - - - - cover()->toFile()): ?> -
- <?= $page->title() ?> -
- - - -
- article_content()->toBlocks() ?> -
- - - tags()->isNotEmpty()): ?> - - -
- - - related_articles()->toPages(); - if ($related->isEmpty()) { - $related = $page->siblings()->listed()->not($page)->shuffle()->limit(3); - } - ?> - - isNotEmpty()): ?> -
-

Nos recommandations

- Voir tous les articles → - -
- -
- cover()->toFile()): ?> -
- <?= $rec->title() ?> -
- - - category()->isNotEmpty()): ?> - category() ?> - - -

- title() ?> -

-
- -
-
- - - - -
- diff --git a/site/templates/blog.json.php b/site/templates/blog.json.php new file mode 100644 index 0000000..e34d683 --- /dev/null +++ b/site/templates/blog.json.php @@ -0,0 +1,26 @@ + [ + 'title' => $page->intro_title()->value(), + 'text' => $page->intro_text()->value() + ], + 'articles' => $page->children()->listed()->sortBy('date', 'desc')->map(function($article) { + return [ + 'title' => $article->title()->value(), + 'slug' => $article->slug(), + 'url' => $article->url(), + 'date' => $article->date()->toDate('Y-m-d'), + 'date_formatted' => $article->date()->toDate('d/m/Y'), + 'intro' => $article->intro()->excerpt(200), + 'cover' => $article->cover()->toFile()?->url(), + 'author_name' => $article->author_name()->value(), + 'author_photo' => $article->author_photo()->toFile()?->url() + ]; + })->values() +]; + +$pageData = array_merge($genericData, $specificData); + +header('Content-Type: application/json'); +echo json_encode($pageData); diff --git a/site/templates/blog.php b/site/templates/blog.php index 9250711..f31b64d 100644 --- a/site/templates/blog.php +++ b/site/templates/blog.php @@ -1,61 +1,2 @@ - -
- -
-

intro_title() ?>

- - intro_text()->isNotEmpty()): ?> -

intro_text() ?>

- -
- - -
- children()->listed()->sortBy('date', 'desc') as $article): ?> -
- - date()->isNotEmpty()): ?> - - - - -
-

- title() ?> -

- - intro()->isNotEmpty()): ?> -

intro()->excerpt(200) ?>

- - - - Lire la suite → - -
- - -
- author_photo()->toFile()): ?> - <?= $article->author_name() ?> - - - author_name()->isNotEmpty()): ?> - author_name() ?> - -
- - - cover()->toFile()): ?> -
- <?= $article->title() ?> -
- -
- -
-
- diff --git a/site/templates/default.json.php b/site/templates/default.json.php new file mode 100644 index 0000000..c910894 --- /dev/null +++ b/site/templates/default.json.php @@ -0,0 +1,10 @@ + $page->body()->toBlocks() +]; + +$pageData = array_merge($genericData, $specificData); + +header('Content-Type: application/json'); +echo json_encode($pageData); diff --git a/site/templates/default.php b/site/templates/default.php index 74e38ae..f31b64d 100644 --- a/site/templates/default.php +++ b/site/templates/default.php @@ -1 +1,2 @@ -

title() ?>

+ + diff --git a/site/templates/expertise.json.php b/site/templates/expertise.json.php new file mode 100644 index 0000000..18cafcb --- /dev/null +++ b/site/templates/expertise.json.php @@ -0,0 +1,24 @@ + [ + 'title' => $page->intro_title()->value(), + 'text' => $page->intro_text()->value() + ], + 'sections' => $page->expertise_sections()->toStructure()->map(function($section) { + return [ + 'title' => $section->title()->value(), + 'icon' => $section->icon()->value(), + 'content' => $section->content()->toBlocks() + ]; + })->values(), + 'objective' => [ + 'title' => $page->objective_title()->value(), + 'text' => $page->objective_text()->value() + ] +]; + +$pageData = array_merge($genericData, $specificData); + +header('Content-Type: application/json'); +echo json_encode($pageData); diff --git a/site/templates/expertise.php b/site/templates/expertise.php index df8392e..f31b64d 100644 --- a/site/templates/expertise.php +++ b/site/templates/expertise.php @@ -1,36 +1,2 @@ - -
- -
-

intro_title() ?>

- - intro_text()->isNotEmpty()): ?> -

intro_text() ?>

- -
- - - expertise_sections()->isNotEmpty()): ?> -
- expertise_sections()->toStructure() as $section): ?> -
-

title() ?>

-
- content()->toBlocks() ?> -
-
- -
- - - - objective_text()->isNotEmpty()): ?> -
-

objective_title() ?>

-

objective_text() ?>

-
- -
- diff --git a/site/templates/game.json.php b/site/templates/game.json.php new file mode 100644 index 0000000..09041da --- /dev/null +++ b/site/templates/game.json.php @@ -0,0 +1,16 @@ + $page->description()->value(), + 'rules' => $page->rules()->toBlocks(), + 'game_status' => $page->game_status()->value(), + 'is_embedded' => $page->is_embedded()->toBool(), + 'play_link' => $page->play_link()->value(), + 'cover' => $page->cover()->toFile()?->url(), + 'parent_url' => $page->parent()->url() +]; + +$pageData = array_merge($genericData, $specificData); + +header('Content-Type: application/json'); +echo json_encode($pageData); diff --git a/site/templates/game.php b/site/templates/game.php index 3249014..f31b64d 100644 --- a/site/templates/game.php +++ b/site/templates/game.php @@ -1,58 +1,2 @@ - -
-
- -
-

title() ?>

- - description()->isNotEmpty()): ?> -

description() ?>

- - - - rules()->isNotEmpty()): ?> -
- rules()->toBlocks() ?> -
- - - - game_status()->value() !== 'available'): ?> -
- - game_status()->value() === 'coming_soon' ? 'Bientôt disponible' : 'En maintenance' ?> - -
- -
- - -
- game_status()->value() === 'available'): ?> - is_embedded()->toBool() && $page->play_link()->isNotEmpty()): ?> - - play_link()->isNotEmpty()): ?> - - Jouer maintenant - - - - cover()->toFile()): ?> -
- <?= $page->title() ?> -
- - -
-
- - - -
- diff --git a/site/templates/home.json.php b/site/templates/home.json.php new file mode 100644 index 0000000..94c9c2f --- /dev/null +++ b/site/templates/home.json.php @@ -0,0 +1,24 @@ + [ + 'title' => $page->hero_title()->value(), + 'title_highlight' => $page->hero_title_highlight()->value(), + 'subtitle' => $page->hero_subtitle()->value(), + 'cta_text' => $page->hero_cta_text()->value(), + 'cta_link' => $page->hero_cta_link()->toPage()?->url() ?? '#', + 'image' => $page->hero_image()->toFile()?->url() + ], + 'background_video' => $page->background_video()->toFile()?->url(), + 'floating_bubbles' => $page->floating_bubbles()->toStructure()->map(function($bubble) { + return [ + 'text' => $bubble->text()->value(), + 'position' => $bubble->position()->value() + ]; + })->values() +]; + +$pageData = array_merge($genericData, $specificData); + +header('Content-Type: application/json'); +echo json_encode($pageData); diff --git a/site/templates/home.php b/site/templates/home.php index 8594f41..f31b64d 100644 --- a/site/templates/home.php +++ b/site/templates/home.php @@ -1,49 +1,2 @@ - -
- -
-
-

- hero_title()->value(); - $highlight = $page->hero_title_highlight()->value(); - if ($highlight) { - echo str_replace($highlight, '' . $highlight . '', $title); - } else { - echo $title; - } - ?> -

- - hero_subtitle()->isNotEmpty()): ?> -

hero_subtitle() ?>

- - - hero_cta_text()->isNotEmpty()): ?> - - hero_cta_text() ?> - - -
- - hero_image()->toFile()): ?> -
- <?= $page->hero_title() ?> -
- - - - floating_bubbles()->isNotEmpty()): ?> -
- floating_bubbles()->toStructure() as $bubble): ?> -
- text() ?> -
- -
- -
-
- diff --git a/site/templates/jouer.json.php b/site/templates/jouer.json.php new file mode 100644 index 0000000..638abd6 --- /dev/null +++ b/site/templates/jouer.json.php @@ -0,0 +1,33 @@ + [ + 'title' => $page->intro_title()->value(), + 'text' => $page->intro_text()->value() + ], + 'games' => $page->children()->listed()->map(function($game) { + $badgeValue = $game->badge()->value(); + $badgeLabel = 'none'; + if ($badgeValue === 'new') { + $badgeLabel = 'NEW'; + } elseif ($badgeValue === 'coming_soon') { + $badgeLabel = 'INCOMING'; + } + + return [ + 'title' => $game->title()->value(), + 'slug' => $game->slug(), + 'url' => $game->url(), + 'description' => $game->description()->value(), + 'cover' => $game->cover()->toFile()?->url(), + 'badge' => $badgeValue, + 'badge_label' => $badgeLabel, + 'game_status' => $game->game_status()->value() + ]; + })->values() +]; + +$pageData = array_merge($genericData, $specificData); + +header('Content-Type: application/json'); +echo json_encode($pageData); diff --git a/site/templates/jouer.php b/site/templates/jouer.php index be348fe..f31b64d 100644 --- a/site/templates/jouer.php +++ b/site/templates/jouer.php @@ -1,57 +1,2 @@ - -
- -
- intro_title()->isNotEmpty()): ?> -

intro_title() ?>

- - - intro_text()->isNotEmpty()): ?> -

intro_text() ?>

- -
- - -
- children()->listed() as $game): ?> -
- - badge()->isNotEmpty() && $game->badge()->value() !== 'none'): ?> - - badge()->value() === 'new' ? 'NEW' : ($game->badge()->value() === 'coming_soon' ? 'INCOMING' : $game->badge()) ?> - - - - - cover()->toFile()): ?> -
- <?= $game->title() ?> -
- - - -
-

title() ?>

- - description()->isNotEmpty()): ?> -

description() ?>

- - - - game_status()->value() === 'available'): ?> - - Jouer - - - - Bientôt disponible - - -
-
- -
-
- diff --git a/site/templates/portfolio.json.php b/site/templates/portfolio.json.php new file mode 100644 index 0000000..7838aca --- /dev/null +++ b/site/templates/portfolio.json.php @@ -0,0 +1,32 @@ + [ + 'title' => $page->intro_title()->value(), + 'text' => $page->intro_text()->value() + ], + 'projects' => $page->children()->listed()->map(function($project) { + return [ + 'title' => $project->title()->value(), + 'slug' => $project->slug(), + 'url' => $project->url(), + 'tagline' => $project->tagline()->value(), + 'description' => $project->description()->value(), + 'cover' => $project->cover()->toFile()?->url(), + 'cover_thumb' => $project->cover()->toFile()?->thumb(['width' => 100])->url(), + 'gallery' => $project->files()->filterBy('template', 'image')->limit(5)->map(function($img) { + return $img->url(); + })->values(), + 'impact' => $project->impact()->split(','), + 'category' => $project->category()->value(), + 'platforms' => $project->platforms()->split(','), + 'apple_link' => $project->apple_link()->value(), + 'android_link' => $project->android_link()->value() + ]; + })->values() +]; + +$pageData = array_merge($genericData, $specificData); + +header('Content-Type: application/json'); +echo json_encode($pageData); diff --git a/site/templates/portfolio.php b/site/templates/portfolio.php index 41ea880..f31b64d 100644 --- a/site/templates/portfolio.php +++ b/site/templates/portfolio.php @@ -1,109 +1,2 @@ - -
- -
- intro_title()->isNotEmpty()): ?> -

intro_title() ?>

- - - intro_text()->isNotEmpty()): ?> -

intro_text() ?>

- -
- - -
- children()->listed(); - $total = $projects->count(); - $index = 0; - ?> - - - -
- - - - -
-

title() ?>

- - tagline()->isNotEmpty()): ?> -

tagline() ?>

- - - description()->isNotEmpty()): ?> -

description() ?>

- - - -
- impact()->isNotEmpty()): ?> -
- Impact: - impact()->join(', ') ?> -
- - - category()->isNotEmpty()): ?> -
- Catégorie: - category()->value() ?> -
- - - platforms()->isNotEmpty()): ?> -
- Plateformes: - platforms()->join(' / ') ?> -
- -
- - - -
- - -
- / -
-
- -
- - - -
- diff --git a/site/templates/project.json.php b/site/templates/project.json.php new file mode 100644 index 0000000..6c9aecf --- /dev/null +++ b/site/templates/project.json.php @@ -0,0 +1,31 @@ + $page->tagline()->value(), + 'description' => $page->description()->kt(), + 'cover' => $page->cover()->toFile()?->url(), + 'gallery' => $page->files()->filterBy('template', 'image')->map(function($img) { + return $img->url(); + })->values(), + 'impact' => $page->impact()->split(','), + 'category' => $page->category()->value(), + 'platforms' => $page->platforms()->split(','), + 'client_name' => $page->client_name()->value(), + 'apple_link' => $page->apple_link()->value(), + 'android_link' => $page->android_link()->value(), + 'web_link' => $page->web_link()->value(), + 'prev' => $page->prev() ? [ + 'title' => $page->prev()->title()->value(), + 'url' => $page->prev()->url() + ] : null, + 'next' => $page->next() ? [ + 'title' => $page->next()->title()->value(), + 'url' => $page->next()->url() + ] : null, + 'parent_url' => $page->parent()->url() +]; + +$pageData = array_merge($genericData, $specificData); + +header('Content-Type: application/json'); +echo json_encode($pageData); diff --git a/site/templates/project.php b/site/templates/project.php index 6340277..f31b64d 100644 --- a/site/templates/project.php +++ b/site/templates/project.php @@ -1,104 +1,2 @@ - -
-
- - - - -
-

title() ?>

- - tagline()->isNotEmpty()): ?> -

tagline() ?>

- - - description()->isNotEmpty()): ?> -
- description()->kt() ?> -
- - - -
- impact()->isNotEmpty()): ?> -
- Impact: - impact()->join(', ') ?> -
- - - category()->isNotEmpty()): ?> -
- Catégorie: - category()->value() ?> -
- - - platforms()->isNotEmpty()): ?> -
- Plateformes: - platforms()->join(' / ') ?> -
- - - client_name()->isNotEmpty()): ?> -
- Client: - client_name() ?> -
- -
- - - -
-
- - - -
- diff --git a/src/App.svelte b/src/App.svelte new file mode 100644 index 0000000..795cd3b --- /dev/null +++ b/src/App.svelte @@ -0,0 +1,86 @@ + + +
+ +
+ +
+ {#if pageData && view} + + {/if} +
+ + {#if showFooter} +
+ + diff --git a/src/components/layout/Cursor.svelte b/src/components/layout/Cursor.svelte new file mode 100644 index 0000000..22a088c --- /dev/null +++ b/src/components/layout/Cursor.svelte @@ -0,0 +1,68 @@ + + +
+
+ + diff --git a/src/components/layout/Footer.svelte b/src/components/layout/Footer.svelte new file mode 100644 index 0000000..8acc8cb --- /dev/null +++ b/src/components/layout/Footer.svelte @@ -0,0 +1,73 @@ + + + + + diff --git a/src/components/layout/Header.svelte b/src/components/layout/Header.svelte new file mode 100644 index 0000000..81cc04d --- /dev/null +++ b/src/components/layout/Header.svelte @@ -0,0 +1,280 @@ + + + + + diff --git a/src/components/ui/Button.svelte b/src/components/ui/Button.svelte new file mode 100644 index 0000000..7021941 --- /dev/null +++ b/src/components/ui/Button.svelte @@ -0,0 +1,98 @@ + + +{#if href} + + + +{:else} + +{/if} + + diff --git a/src/components/ui/VideoBackground.svelte b/src/components/ui/VideoBackground.svelte new file mode 100644 index 0000000..bfc4ad5 --- /dev/null +++ b/src/components/ui/VideoBackground.svelte @@ -0,0 +1,68 @@ + + +
+ {#if src} + + {/if} + + {#if overlay} +
+ {/if} +
+ + diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..78c060e --- /dev/null +++ b/src/main.js @@ -0,0 +1,12 @@ +import './styles/index.css' +import App from './App.svelte' +import { mount } from 'svelte' +import { initRouter } from './state/router' + +initRouter() + +const app = mount(App, { + target: document.getElementById('app') +}) + +export default app diff --git a/src/state/animations.js b/src/state/animations.js new file mode 100644 index 0000000..c4c2e4b --- /dev/null +++ b/src/state/animations.js @@ -0,0 +1,142 @@ +import gsap from 'gsap' +import { ScrollTrigger } from 'gsap/ScrollTrigger' + +gsap.registerPlugin(ScrollTrigger) + +/** + * Fade in animation for page enter + */ +export function pageEnter(element, options = {}) { + const defaults = { + opacity: 0, + y: 50, + duration: 0.8, + ease: 'power3.out' + } + + return gsap.from(element, { ...defaults, ...options }) +} + +/** + * Fade out animation for page exit + */ +export function pageExit(element, options = {}) { + const defaults = { + opacity: 0, + y: -50, + duration: 0.5, + ease: 'power3.in' + } + + return gsap.to(element, { ...defaults, ...options }) +} + +/** + * Carousel slide animation + */ +export function carouselSlide(element, offset, options = {}) { + const defaults = { + x: `-${offset}%`, + duration: 0.8, + ease: 'power2.inOut' + } + + return gsap.to(element, { ...defaults, ...options }) +} + +/** + * Scroll reveal animation + */ +export function scrollReveal(elements, options = {}) { + const defaults = { + scrollTrigger: { + trigger: elements, + start: 'top 80%', + toggleActions: 'play none none none' + }, + y: 50, + opacity: 0, + stagger: 0.1, + duration: 0.8, + ease: 'power3.out' + } + + return gsap.from(elements, { ...defaults, ...options }) +} + +/** + * Fade in elements on scroll + */ +export function fadeInOnScroll(elements, options = {}) { + const defaults = { + scrollTrigger: { + trigger: elements, + start: 'top 80%' + }, + opacity: 0, + duration: 1, + stagger: 0.2, + ease: 'power2.out' + } + + return gsap.from(elements, { ...defaults, ...options }) +} + +/** + * Scale animation + */ +export function scaleIn(element, options = {}) { + const defaults = { + scale: 0, + duration: 0.5, + ease: 'back.out(1.7)' + } + + return gsap.from(element, { ...defaults, ...options }) +} + +/** + * Cleanup all ScrollTrigger instances + */ +export function cleanupScrollTriggers() { + ScrollTrigger.getAll().forEach(trigger => trigger.kill()) +} + +/** + * Refresh ScrollTrigger (useful after content changes) + */ +export function refreshScrollTriggers() { + ScrollTrigger.refresh() +} + +/** + * Custom cursor follow animation + */ +export function cursorFollow(cursorElement, outlineElement) { + let cursorX = 0 + let cursorY = 0 + let outlineX = 0 + let outlineY = 0 + + const handleMouseMove = (e) => { + cursorX = e.clientX + cursorY = e.clientY + } + + const animate = () => { + outlineX += (cursorX - outlineX) * 0.2 + outlineY += (cursorY - outlineY) * 0.2 + + gsap.set(cursorElement, { x: cursorX, y: cursorY }) + gsap.set(outlineElement, { x: outlineX, y: outlineY }) + + requestAnimationFrame(animate) + } + + window.addEventListener('mousemove', handleMouseMove) + animate() + + return () => { + window.removeEventListener('mousemove', handleMouseMove) + } +} diff --git a/src/state/locale.svelte.js b/src/state/locale.svelte.js new file mode 100644 index 0000000..34e163c --- /dev/null +++ b/src/state/locale.svelte.js @@ -0,0 +1,13 @@ +let current = $state('fr') +let languages = $state([]) + +export const locale = { + get current() { return current }, + get languages() { return languages }, + + setLanguage: (code) => current = code, + initialize: (language, langs) => { + current = language + languages = langs + } +} diff --git a/src/state/navigation.svelte.js b/src/state/navigation.svelte.js new file mode 100644 index 0000000..1a377c0 --- /dev/null +++ b/src/state/navigation.svelte.js @@ -0,0 +1,12 @@ +let isMenuOpen = $state(false) +let isLoading = $state(false) + +export const navigation = { + get isMenuOpen() { return isMenuOpen }, + get isLoading() { return isLoading }, + + toggleMenu: () => isMenuOpen = !isMenuOpen, + openMenu: () => isMenuOpen = true, + closeMenu: () => isMenuOpen = false, + setLoading: (value) => isLoading = value +} diff --git a/src/state/page.svelte.js b/src/state/page.svelte.js new file mode 100644 index 0000000..6a4c3cb --- /dev/null +++ b/src/state/page.svelte.js @@ -0,0 +1,35 @@ +let data = $state(null) +let template = $state(null) +let url = $state(null) +let loading = $state(false) +let error = $state(null) + +export const page = { + get data() { return data }, + get template() { return template }, + get url() { return url }, + get loading() { return loading }, + get error() { return error }, + + set: (pageData) => { + data = pageData.data + template = pageData.template + url = pageData.url + loading = pageData.loading ?? false + error = pageData.error ?? null + }, + + setLoading: (value) => loading = value, + setError: (err) => { + error = err + loading = false + }, + + reset: () => { + data = null + template = null + url = null + loading = false + error = null + } +} diff --git a/src/state/router.js b/src/state/router.js new file mode 100644 index 0000000..4e66f48 --- /dev/null +++ b/src/state/router.js @@ -0,0 +1,96 @@ +import navaid from "navaid"; +import { page } from "./page.svelte"; +import { navigation } from "./navigation.svelte"; +import { site } from "./site.svelte"; +import { locale } from "./locale.svelte"; + +export const router = navaid("/", () => { + // Default handler +}); + +async function loadPage(path) { + navigation.setLoading(true); + page.setLoading(true); + + try { + const response = await fetch(`${path}.json`); + + if (!response.ok) { + throw new Error(`Failed to load page: ${response.status}`); + } + + const data = await response.json(); + + if (data.site) { + site.set(data.site); + locale.initialize(data.site.language, data.site.languages); + } + + page.set({ + data, + template: data.template || "default", + url: path, + loading: false, + error: null, + }); + + window.scrollTo(0, 0); + } catch (error) { + console.error("Failed to load page:", error); + page.setError(error); + } finally { + navigation.setLoading(false); + } +} + +// Route handlers +router + .on("/", () => loadPage("/home")) + .on("/expertise", () => loadPage("/expertise")) + .on("/portfolio", () => loadPage("/portfolio")) + .on("/portfolio/:slug", ({ slug }) => loadPage(`/portfolio/${slug}`)) + .on("/jouer", () => loadPage("/jouer")) + .on("/jouer/:slug", ({ slug }) => loadPage(`/jouer/${slug}`)) + .on("/a-propos", () => loadPage("/a-propos")) + .on("/blog", () => loadPage("/blog")) + .on("/blog/:slug", ({ slug }) => loadPage(`/blog/${slug}`)) + .on("*", (params) => { + // Fallback for other routes + loadPage(window.location.pathname); + }); + +export function initRouter() { + // Load initial page data + loadPage(window.location.pathname); + + // Start listening to route changes + router.listen(); + + // Intercept internal link clicks + document.addEventListener("click", (e) => { + const link = e.target.closest("a"); + if (!link) return; + + const url = new URL(link.href, window.location.origin); + + // Only intercept same-origin links without target attribute + if ( + url.origin === window.location.origin && + !link.target && + !link.hasAttribute("download") + ) { + e.preventDefault(); + navigateTo(url.pathname); + } + }); + + // Handle browser back/forward + window.addEventListener("popstate", () => { + loadPage(window.location.pathname); + }); +} + +export function navigateTo(path) { + window.history.pushState({}, "", path); + loadPage(path); +} diff --git a/src/state/site.svelte.js b/src/state/site.svelte.js new file mode 100644 index 0000000..01271e7 --- /dev/null +++ b/src/state/site.svelte.js @@ -0,0 +1,24 @@ +let title = $state('') +let url = $state('') +let language = $state('fr') +let languages = $state([]) +let logo = $state(null) +let navigation = $state([]) + +export const site = { + get title() { return title }, + get url() { return url }, + get language() { return language }, + get languages() { return languages }, + get logo() { return logo }, + get navigation() { return navigation }, + + set: (data) => { + title = data.title || '' + url = data.url || '' + language = data.language || 'fr' + languages = data.languages || [] + logo = data.logo || null + navigation = data.navigation || [] + } +} diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..f5895ba --- /dev/null +++ b/src/style.css @@ -0,0 +1,289 @@ +/* FONT SIZING SYSTEM - Consistent typography across the site */ +:root { + /* Base font sizes for desktop */ + --font-size-paragraph: 18px; + --font-size-paragraph-small: 16px; + --font-size-subtitle: 20px; + --font-size-title-section: 32px; + --font-size-title-main: 48px; + --font-size-title-hero: 96px; + --font-size-button: 13px; + --font-size-caption: 12px; + + /* Mobile font sizes */ + --font-size-paragraph-mobile: 16px; + --font-size-paragraph-small-mobile: 12px; + --font-size-subtitle-mobile: 16px; + --font-size-title-section-mobile: 24px; + --font-size-title-main-mobile: 32px; + --font-size-title-hero-mobile: 48px; + --font-size-button-mobile: 11px; + --font-size-caption-mobile: 10px; + + /* Tablet font sizes */ + --font-size-paragraph-tablet: 16px; + --font-size-paragraph-small-tablet: 14px; + --font-size-subtitle-tablet: 18px; + --font-size-title-section-tablet: 28px; + --font-size-title-main-tablet: 40px; + --font-size-title-hero-tablet: 64px; + --font-size-button-tablet: 12px; + --font-size-caption-tablet: 11px; +} + +html, +body { + height: 100%; + min-height: 100vh; + min-height: -webkit-fill-available; + min-height: calc(var(--vh, 1vh) * 100); + user-select: none; +} + +body { + margin: 0; + font-family: "Danzza Regular", "Danzza", -apple-system, BlinkMacSystemFont, + "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", + "Droid Sans", "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + cursor: none; + background: #000; + overflow-x: hidden; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; + cursor: none; +} + +/* Font faces */ +@font-face { + font-family: "Terminal"; + font-weight: bold; + src: local("terminal-grotesque"), + url("/assets/fonts/terminal-grotesque.ttf") format("truetype"); +} + +@font-face { + font-family: "Danzza"; + src: local("Danzza Regular"), + url("/assets/fonts/Danzza-Regular.woff") format("woff"), + url("/assets/fonts/Danzza-Regular.otf") format("opentype"); + font-display: swap; +} + +@font-face { + font-family: "Danzza Light"; + src: local("Danzza Light"), + url("/assets/fonts/Danzza-Light.woff") format("woff"), + url("/assets/fonts/Danzza-Light.otf") format("opentype"); + font-display: swap; +} + +@font-face { + font-family: "Danzza Medium"; + src: local("Danzza Medium"), + url("/assets/fonts/Danzza-Medium.woff") format("woff"), + url("/assets/fonts/Danzza-Medium.otf") format("opentype"); + font-display: swap; +} + +@font-face { + font-family: "Danzza Bold"; + src: local("Danzza Bold"), + url("/assets/fonts/Danzza-Bold.woff") format("woff"), + url("/assets/fonts/Danzza-Bold.otf") format("opentype"); + font-display: swap; +} + +.font-face-terminal { + font-family: "Terminal"; +} + +.font-face-danzza { + font-family: "Danzza"; +} + +.font-face-danzza-light { + font-family: "Danzza Light"; +} + +.font-face-danzza-medium { + font-family: "Danzza Medium"; +} + +.font-face-danzza-bold { + font-family: "Danzza Bold"; +} + +/* Golden Grid */ +.golden-grid { + height: 100% !important; + min-height: 100% !important; + display: grid !important; + position: relative; + grid-template-rows: 1fr 1fr 2fr 4fr 2.66fr 5.33fr 5.33fr 4.33fr 2.83fr 3.5fr 3.5fr 2.83fr 4.33fr 5.33fr 5.33fr 2.66fr 4fr 2fr 1fr 1fr; + grid-template-columns: 1fr 1fr 2fr 4fr 2.66fr 5.33fr 5.33fr 4.33fr 2.83fr 3.5fr 3.5fr 2.83fr 4.33fr 5.33fr 5.33fr 2.66fr 4fr 2fr 1fr 1fr; + text-align: center; +} + +.slide { + overflow-y: hidden; +} + +/* Vertical Lines */ +.vertical-line { + z-index: 1; + border-left: 0.1px solid rgba(238, 238, 238, 0.2); + height: 150%; +} + +.vertical-line-start { + z-index: 1; + border-left: 0.1px solid rgba(238, 238, 238, 0.2); + grid-area: 1/6 / span 20 / span 1; + height: 150%; +} + +.vertical-line-center { + z-index: 1; + border-left: 0.1px solid rgba(238, 238, 238, 0.2); + grid-area: 1/11 / span 20 / span 1; + height: 150%; +} + +.vertical-line-end { + z-index: 1; + border-left: 0.1px solid rgba(238, 238, 238, 0.2); + grid-area: 1/16 / span 20 / span 1; + height: 150%; +} + +/* Button */ +.button { + width: 14vmax; + min-width: 130px; + display: flex; + align-items: center; + justify-content: center; + position: sticky; + z-index: 1; + padding: 12px 16px; + transition: 0.5s ease-out; + font-family: "Danzza Bold"; + background-color: #04fea0; + border: none; + cursor: pointer; +} + +.button:hover { + background-position: left; + background-color: transparent; + outline: solid 2px #04fea0; +} + +.button p { + color: black; + margin: 0; + transition: color 0.3s; +} + +.button:hover p { + color: #04fea0 !important; +} + +.earth-icon { + width: 24px; + height: 24px; + background-image: url('/assets/img/icon-earth-green.png'); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + margin-right: 8px; + transition: filter 0.3s; +} + +.button:hover .earth-icon { + filter: brightness(0) saturate(100%) invert(77%) sepia(82%) saturate(507%) hue-rotate(91deg) brightness(101%) contrast(97%); +} + +/* Clickable elements */ +.clickable { + cursor: pointer; + user-select: none; +} + +/* Cursor */ +#cursor-dot, +#cursor-dot-outline, +#cursor-circle { + position: absolute; + top: 50%; + left: 50%; + z-index: 99999; + transform: translate(-50%, -50%); + transition: opacity 0.15s ease-in-out, transform 0.15s ease-in-out; + border-radius: 50%; + pointer-events: none; + opacity: 0; +} + +#cursor-dot { + width: 14px; + height: 14px; + background-color: white; +} + +#cursor-circle { + width: 50px; + height: 50px; + border-width: 3px; + border-style: solid; + border-color: #04fea0; +} + +#cursor-dot-outline { + width: 13px; + height: 13px; + background-color: white; +} + +@media (pointer: coarse) { + #cursor-dot, + #cursor-dot-outline, + #cursor-circle { + display: none; + } + + body, + * { + cursor: auto; + } +} + +/* Selection */ +::selection { + background: #04fea0; + color: #000; +} + +/* Scrollbar */ +::-webkit-scrollbar { + width: 10px; +} + +::-webkit-scrollbar-track { + background: #000; +} + +::-webkit-scrollbar-thumb { + background: #04fea0; + border-radius: 5px; +} + +::-webkit-scrollbar-thumb:hover { + background: #03d98c; +} diff --git a/src/styles/buttons.css b/src/styles/buttons.css new file mode 100644 index 0000000..42fa360 --- /dev/null +++ b/src/styles/buttons.css @@ -0,0 +1,53 @@ +/* Button */ +.button { + width: 14vmax; + min-width: 130px; + display: flex; + align-items: center; + justify-content: center; + position: sticky; + z-index: 1; + padding: 12px 16px; + transition: 0.5s ease-out; + font-family: "Danzza Bold"; + background-color: var(--color-primary); + border: none; + cursor: pointer; +} + +.button:hover { + background-position: left; + background-color: transparent; + outline: solid 2px var(--color-primary); +} + +.button p { + color: black; + margin: 0; + transition: color 0.3s; +} + +.button:hover p { + color: var(--color-primary) !important; +} + +.earth-icon { + width: 24px; + height: 24px; + background-image: url('/assets/img/icon-earth-green.png'); + background-size: contain; + background-repeat: no-repeat; + background-position: center; + margin-right: 8px; + transition: filter 0.3s; +} + +.button:hover .earth-icon { + filter: brightness(0) saturate(100%) invert(77%) sepia(82%) saturate(507%) hue-rotate(91deg) brightness(101%) contrast(97%); +} + +/* Clickable elements */ +.clickable { + cursor: pointer; + user-select: none; +} diff --git a/src/styles/cursor.css b/src/styles/cursor.css new file mode 100644 index 0000000..64bb2e6 --- /dev/null +++ b/src/styles/cursor.css @@ -0,0 +1,42 @@ +/* Custom Cursor */ +#cursor-dot, +#cursor-dot-outline, +#cursor-circle { + position: absolute; + top: 50%; + left: 50%; + z-index: 99999; + transform: translate(-50%, -50%); + transition: opacity 0.15s ease-in-out, transform 0.15s ease-in-out; + border-radius: 50%; + pointer-events: none; + opacity: 0; +} + +#cursor-dot { + width: 14px; + height: 14px; + background-color: white; +} + +#cursor-circle { + width: 50px; + height: 50px; + border-width: 3px; + border-style: solid; + border-color: var(--color-primary); +} + +#cursor-dot-outline { + width: 13px; + height: 13px; + background-color: white; +} + +@media (pointer: coarse) { + #cursor-dot, + #cursor-dot-outline, + #cursor-circle { + display: none; + } +} diff --git a/src/styles/fonts.css b/src/styles/fonts.css new file mode 100644 index 0000000..99f82b6 --- /dev/null +++ b/src/styles/fonts.css @@ -0,0 +1,60 @@ +/* Font faces */ +@font-face { + font-family: "Terminal"; + font-weight: bold; + src: local("terminal-grotesque"), + url("/assets/fonts/terminal-grotesque.ttf") format("truetype"); +} + +@font-face { + font-family: "Danzza"; + src: local("Danzza Regular"), + url("/assets/fonts/Danzza-Regular.woff") format("woff"), + url("/assets/fonts/Danzza-Regular.otf") format("opentype"); + font-display: swap; +} + +@font-face { + font-family: "Danzza Light"; + src: local("Danzza Light"), + url("/assets/fonts/Danzza-Light.woff") format("woff"), + url("/assets/fonts/Danzza-Light.otf") format("opentype"); + font-display: swap; +} + +@font-face { + font-family: "Danzza Medium"; + src: local("Danzza Medium"), + url("/assets/fonts/Danzza-Medium.woff") format("woff"), + url("/assets/fonts/Danzza-Medium.otf") format("opentype"); + font-display: swap; +} + +@font-face { + font-family: "Danzza Bold"; + src: local("Danzza Bold"), + url("/assets/fonts/Danzza-Bold.woff") format("woff"), + url("/assets/fonts/Danzza-Bold.otf") format("opentype"); + font-display: swap; +} + +/* Font utility classes */ +.font-face-terminal { + font-family: "Terminal"; +} + +.font-face-danzza { + font-family: "Danzza"; +} + +.font-face-danzza-light { + font-family: "Danzza Light"; +} + +.font-face-danzza-medium { + font-family: "Danzza Medium"; +} + +.font-face-danzza-bold { + font-family: "Danzza Bold"; +} diff --git a/src/styles/index.css b/src/styles/index.css new file mode 100644 index 0000000..d437c36 --- /dev/null +++ b/src/styles/index.css @@ -0,0 +1,8 @@ +/* Main styles entry point */ +@import './variables.css'; +@import './reset.css'; +@import './fonts.css'; +@import './layout.css'; +@import './buttons.css'; +@import './cursor.css'; +@import './utils.css'; diff --git a/src/styles/layout.css b/src/styles/layout.css new file mode 100644 index 0000000..8f6fb71 --- /dev/null +++ b/src/styles/layout.css @@ -0,0 +1,42 @@ +/* Golden Grid */ +.golden-grid { + height: 100% !important; + min-height: 100% !important; + display: grid !important; + position: relative; + grid-template-rows: 1fr 1fr 2fr 4fr 2.66fr 5.33fr 5.33fr 4.33fr 2.83fr 3.5fr 3.5fr 2.83fr 4.33fr 5.33fr 5.33fr 2.66fr 4fr 2fr 1fr 1fr; + grid-template-columns: 1fr 1fr 2fr 4fr 2.66fr 5.33fr 5.33fr 4.33fr 2.83fr 3.5fr 3.5fr 2.83fr 4.33fr 5.33fr 5.33fr 2.66fr 4fr 2fr 1fr 1fr; + text-align: center; +} + +.slide { + overflow-y: hidden; +} + +/* Vertical Lines */ +.vertical-line { + z-index: 1; + border-left: 0.1px solid rgba(238, 238, 238, 0.2); + height: 150%; +} + +.vertical-line-start { + z-index: 1; + border-left: 0.1px solid rgba(238, 238, 238, 0.2); + grid-area: 1/6 / span 20 / span 1; + height: 150%; +} + +.vertical-line-center { + z-index: 1; + border-left: 0.1px solid rgba(238, 238, 238, 0.2); + grid-area: 1/11 / span 20 / span 1; + height: 150%; +} + +.vertical-line-end { + z-index: 1; + border-left: 0.1px solid rgba(238, 238, 238, 0.2); + grid-area: 1/16 / span 20 / span 1; + height: 150%; +} diff --git a/src/styles/reset.css b/src/styles/reset.css new file mode 100644 index 0000000..9ef5bfa --- /dev/null +++ b/src/styles/reset.css @@ -0,0 +1,34 @@ +/* CSS Reset */ +* { + box-sizing: border-box; + margin: 0; + padding: 0; + cursor: none; +} + +html, +body { + height: 100%; + min-height: 100vh; + min-height: -webkit-fill-available; + min-height: calc(var(--vh, 1vh) * 100); + user-select: none; +} + +body { + margin: 0; + font-family: "Danzza Regular", "Danzza", -apple-system, BlinkMacSystemFont, + "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", + "Droid Sans", "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background: var(--color-background); + overflow-x: hidden; +} + +@media (pointer: coarse) { + body, + * { + cursor: auto; + } +} diff --git a/src/styles/utils.css b/src/styles/utils.css new file mode 100644 index 0000000..5d4b3e1 --- /dev/null +++ b/src/styles/utils.css @@ -0,0 +1,23 @@ +/* Selection */ +::selection { + background: var(--color-primary); + color: #000; +} + +/* Scrollbar */ +::-webkit-scrollbar { + width: 10px; +} + +::-webkit-scrollbar-track { + background: #000; +} + +::-webkit-scrollbar-thumb { + background: var(--color-primary); + border-radius: 5px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--color-primary-hover); +} diff --git a/src/styles/variables.css b/src/styles/variables.css new file mode 100644 index 0000000..e746f86 --- /dev/null +++ b/src/styles/variables.css @@ -0,0 +1,38 @@ +/* CSS Variables */ +:root { + /* Base font sizes for desktop */ + --font-size-paragraph: 18px; + --font-size-paragraph-small: 16px; + --font-size-subtitle: 20px; + --font-size-title-section: 32px; + --font-size-title-main: 48px; + --font-size-title-hero: 96px; + --font-size-button: 13px; + --font-size-caption: 12px; + + /* Mobile font sizes */ + --font-size-paragraph-mobile: 16px; + --font-size-paragraph-small-mobile: 12px; + --font-size-subtitle-mobile: 16px; + --font-size-title-section-mobile: 24px; + --font-size-title-main-mobile: 32px; + --font-size-title-hero-mobile: 48px; + --font-size-button-mobile: 11px; + --font-size-caption-mobile: 10px; + + /* Tablet font sizes */ + --font-size-paragraph-tablet: 16px; + --font-size-paragraph-small-tablet: 14px; + --font-size-subtitle-tablet: 18px; + --font-size-title-section-tablet: 28px; + --font-size-title-main-tablet: 40px; + --font-size-title-hero-tablet: 64px; + --font-size-button-tablet: 12px; + --font-size-caption-tablet: 11px; + + /* Colors */ + --color-primary: #04fea0; + --color-primary-hover: #03d98c; + --color-background: #000; + --color-text: #fff; +} diff --git a/src/views/About.svelte b/src/views/About.svelte new file mode 100644 index 0000000..7c73419 --- /dev/null +++ b/src/views/About.svelte @@ -0,0 +1,177 @@ + + +
+
+

{intro.title || data?.title}

+ {#if intro.text} +

{@html intro.text}

+ {/if} +
+ + {#if mission.text} +
+

{mission.title}

+
+ {@html mission.text} +
+
+ {/if} + + {#if manifesto.text} +
+

{manifesto.title}

+
+ {@html manifesto.text} +
+
+ {/if} + + {#if team.members && team.members.length > 0} +
+

{team.title}

+ +
+ {#each team.members as member} +
+ {#if member.photo} +
+ {member.name} +
+ {/if} + +
+

{member.name}

+

{member.role}

+ + {#if member.bio} +

{member.bio}

+ {/if} +
+
+ {/each} +
+
+ {/if} +
+ + diff --git a/src/views/Article.svelte b/src/views/Article.svelte new file mode 100644 index 0000000..7e356f7 --- /dev/null +++ b/src/views/Article.svelte @@ -0,0 +1,24 @@ + + +
+
+

{data?.title || 'Article'}

+

Article view - To be implemented

+
+
+ + diff --git a/src/views/Blog.svelte b/src/views/Blog.svelte new file mode 100644 index 0000000..9023ba3 --- /dev/null +++ b/src/views/Blog.svelte @@ -0,0 +1,24 @@ + + +
+
+

{data?.title || 'Blog'}

+

Blog view - To be implemented

+
+
+ + diff --git a/src/views/Default.svelte b/src/views/Default.svelte new file mode 100644 index 0000000..ab4a2f9 --- /dev/null +++ b/src/views/Default.svelte @@ -0,0 +1,45 @@ + + +
+
+

{data?.title || 'Page'}

+ {#if data?.body} +
+ {@html data.body} +
+ {/if} +
+
+ + diff --git a/src/views/Expertise.svelte b/src/views/Expertise.svelte new file mode 100644 index 0000000..9d16606 --- /dev/null +++ b/src/views/Expertise.svelte @@ -0,0 +1,24 @@ + + +
+
+

{data?.title || 'Expertise'}

+

Expertise view - To be implemented

+
+
+ + diff --git a/src/views/Game.svelte b/src/views/Game.svelte new file mode 100644 index 0000000..a345682 --- /dev/null +++ b/src/views/Game.svelte @@ -0,0 +1,24 @@ + + +
+
+

{data?.title || 'Game'}

+

Game view - To be implemented

+
+
+ + diff --git a/src/views/Home.svelte b/src/views/Home.svelte new file mode 100644 index 0000000..db773dc --- /dev/null +++ b/src/views/Home.svelte @@ -0,0 +1,218 @@ + + +
+
+
+
+ + +
+
+
+ +
+
+
+ +
+

+ {t('homeText')} +

+
e.key === 'Enter' && handleExplore()} + role="button" + tabindex="0" + > +
+

+ {t('explore')} +

+
+
+
+ + diff --git a/src/views/Jouer.svelte b/src/views/Jouer.svelte new file mode 100644 index 0000000..207f2b0 --- /dev/null +++ b/src/views/Jouer.svelte @@ -0,0 +1,24 @@ + + +
+
+

{data?.title || 'Jouer'}

+

Jouer view - To be implemented

+
+
+ + diff --git a/src/views/Portfolio.svelte b/src/views/Portfolio.svelte new file mode 100644 index 0000000..edfacd4 --- /dev/null +++ b/src/views/Portfolio.svelte @@ -0,0 +1,24 @@ + + +
+
+

{data?.title || 'Portfolio'}

+

Portfolio view - To be implemented

+
+
+ + diff --git a/src/views/Project.svelte b/src/views/Project.svelte new file mode 100644 index 0000000..05d78df --- /dev/null +++ b/src/views/Project.svelte @@ -0,0 +1,24 @@ + + +
+
+

{data?.title || 'Project'}

+

Project view - To be implemented

+
+
+ + diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..09a1bf7 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,5 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' + +export default { + preprocess: vitePreprocess() +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..cc77d6d --- /dev/null +++ b/vite.config.js @@ -0,0 +1,40 @@ +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' +import path from 'path' + +export default defineConfig({ + plugins: [ + svelte({ + configFile: './svelte.config.js' + }) + ], + resolve: { + alias: { + '@components': path.resolve(__dirname, 'src/components'), + '@views': path.resolve(__dirname, 'src/views'), + '@state': path.resolve(__dirname, 'src/state') + } + }, + server: { + port: 5173, + proxy: { + '^(?!/@vite|/@fs|/node_modules|/src).*': { + target: 'http://localhost:8000', + changeOrigin: true + } + } + }, + build: { + outDir: 'assets/dist', + emptyOutDir: true, + manifest: false, + rollupOptions: { + input: 'src/main.js', + output: { + entryFileNames: 'index.js', + chunkFileNames: '[name].js', + assetFileNames: '[name].[ext]' + } + } + } +})