(Update) Update projet + todo
Deploy to VPS / deploy (push) Has been cancelled

This commit is contained in:
2026-06-22 23:32:18 +02:00
parent ea71039071
commit 0c88206a23
20 changed files with 192 additions and 246 deletions
+2 -2
View File
@@ -2,7 +2,7 @@ name: Deploy to VPS
on:
push:
branches: [main]
branches: [master]
workflow_dispatch:
concurrency:
@@ -23,7 +23,7 @@ jobs:
script: |
set -e
cd /var/www/highland
git pull origin main
git pull origin master
npm ci
npm run build
pm2 restart highland --update-env
-37
View File
@@ -39,40 +39,3 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env*.local
.env
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
+58 -20
View File
@@ -1,36 +1,74 @@
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
# Highland Games Studio — Website
## Getting Started
Marketing and devblog site for Highland Games Studio. _Where summits become worlds._
First, run the development server:
Built with **Next.js 16** (App Router), **React 19**, **Tailwind CSS 4** and **Framer Motion**.
Devblog posts are authored in MDX and rendered with `next-mdx-remote`.
## Getting started
```bash
npm install
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
Open [http://localhost:3000](http://localhost:3000).
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
## Scripts
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
| Command | Description |
| ------------------ | ---------------------------------------- |
| `npm run dev` | Start the dev server |
| `npm run build` | Production build |
| `npm run start` | Serve the production build |
| `npm run lint` | Run ESLint |
## Learn More
To regenerate the favicon from the studio logo (requires `sharp`):
To learn more about Next.js, take a look at the following resources:
```bash
node scripts/build-favicon.mjs
```
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
## Project structure
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
```text
app/ Routes, layouts, server actions, metadata (sitemap/robots/feed/OG)
app/components/ Shared UI (Navbar, Footer, forms, social links)
content/devblog/ Devblog posts as .mdx (frontmatter: title, date, excerpt, tags, game)
lib/ Data + helpers (games registry, devblog loader, site URL)
public/ Static assets (studio logos, hero video)
scripts/ One-off build scripts (favicon generation)
```
## Deploy on Vercel
## Configuration
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
- **Site URL** — set `NEXT_PUBLIC_SITE_URL` per environment (used by metadata, sitemap,
robots, RSS and JSON-LD). Defaults to `https://highlandgamesstudio.com` — see `lib/site.ts`.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
## Adding a devblog post
Create a file in `content/devblog/`, e.g. `2026-06-01-my-post.mdx`:
```mdx
---
title: "My post title"
date: "2026-06-01"
excerpt: "One-line summary for listings and SEO."
author: "Highland Games Studio"
tags: ["devlog"]
game: "project-one"
---
Your MDX content here.
```
## Deployment
Pushes to `master` deploy to the VPS via the GitHub Actions workflow
(`.github/workflows/deploy.yml`), which SSHes in, pulls, builds, and restarts the
PM2 process. Requires the `SSH_*` repository secrets.
## Known TODOs
- Wire the contact and newsletter forms to a real email provider (currently log-only).
- Replace placeholder content (game, team members, social links).
+67
View File
@@ -0,0 +1,67 @@
# TODO — Highland Games Studio Website
Liste des tâches restantes, classées par priorité.
Dernière mise à jour : 2026-06-22
---
## 🔴 P0 — Critique (avant toute mise en ligne)
- [ ] **Vidéo 84 Mo dans Git** (`public/Video/Header_Video.mp4`)
- [ ] Compresser la vidéo (cible < 5 Mo, ~1080p) avec ffmpeg
- [ ] La sortir de l'historique Git (BFG ou `git-filter-repo`) — sinon elle reste à vie dans le repo
- [ ] Ajouter un `poster` (image) sur la balise `<video>` de la page d'accueil
- [ ] Idéalement : servir le fichier hors-Git (CDN / objet statique)
- [ ] **Formulaires non fonctionnels** (perdent les données, juste un `console.log`)
- [ ] Choisir un service email (Resend / Postmark / Buttondown…)
- [ ] Brancher le formulaire de contact → `app/actions/contact.ts`
- [ ] Brancher la newsletter → `app/actions/subscribe.ts`
- [ ] Stocker la clé API dans une variable d'env (`.env`)
- [ ] **Déploiement à valider en réel**
- [x] Trigger workflow corrigé (`main``master`)
- [ ] Vérifier que les secrets `SSH_*` sont bien configurés sur GitHub
- [ ] Tester un push qui déclenche bien le deploy sur le VPS
---
## 🟠 P1 — Important (contenu avant lancement public)
- [ ] **Remplacer tout le contenu placeholder**
- [ ] Vrai nom du jeu (au lieu de « Project One ») → `lib/games.ts`
- [ ] Vrais noms / bios de l'équipe (au lieu de « Founder One / Two ») → `app/studio/page.tsx`
- [ ] Vrais liens réseaux sociaux (actuellement tous en `href="#"`) → `app/components/SocialLinks.tsx`
- [ ] Vraies images de jeu / screenshots (le logo sert de placeholder partout)
- [ ] **Configurer l'URL du site**
- [x] Centralisée dans `lib/site.ts` (pilotable par `NEXT_PUBLIC_SITE_URL`)
- [ ] Confirmer le domaine final et définir la variable d'env en production
- [ ] **Asset inutilisé** : `public/image/Studio/Full Logo.png` n'est référencé nulle part
- [ ] L'utiliser quelque part, ou le supprimer
---
## 🟢 P2 — Plus tard (qualité / robustesse)
- [ ] **Monitoring d'erreurs** (ex. Sentry) — le texte de `app/error.tsx` ne ment plus, mais aucune alerte n'existe
- [ ] **Rate-limiting** sur les server actions (anti-spam une fois les emails branchés)
- [ ] **Vulnérabilités npm** : `npm audit` remonte 5 alertes (1 low, 4 moderate) — à examiner
- [ ] **Warning build** : `app/opengraph-image.tsx` utilise `runtime = "edge"` qui désactive la génération statique de la page — à vérifier si volontaire
- [ ] **Press kit** : la page contact promet des assets « soon » — préparer un vrai press kit
---
## ✅ Déjà fait (2026-06-22)
- [x] Supprimé les 5 SVG par défaut de create-next-app (inutilisés)
- [x] Retiré 4 dépendances MDX inutilisées (`@next/mdx`, `@mdx-js/*`, `@types/mdx`)
- [x] Ajouté `sharp` en devDependency (requis par `scripts/build-favicon.mjs`)
- [x] Dédupliqué `.gitignore` (contenu collé en double)
- [x] Réécrit le `README.md` (doc réelle au lieu du boilerplate)
- [x] Corrigé le trigger de déploiement (`main``master`, + `git pull`)
- [x] Corrigé une erreur de lint dans `Navbar.tsx` (setState dans useEffect)
- [x] Retiré le texte trompeur « team has been notified » dans `error.tsx`
- [x] Centralisé l'URL du site dans `lib/site.ts`
- [x] Resynchronisé `package-lock.json` (nécessaire pour `npm ci` au deploy)
+1 -6
View File
@@ -3,7 +3,6 @@
import Link from "next/link";
import Image from "next/image";
import { useEffect, useState } from "react";
import { usePathname } from "next/navigation";
import { AnimatePresence, motion } from "framer-motion";
const links = [
@@ -16,7 +15,6 @@ const links = [
export function Navbar() {
const [scrolled, setScrolled] = useState(false);
const [open, setOpen] = useState(false);
const pathname = usePathname();
useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 20);
@@ -25,10 +23,6 @@ export function Navbar() {
return () => window.removeEventListener("scroll", onScroll);
}, []);
useEffect(() => {
setOpen(false);
}, [pathname]);
useEffect(() => {
if (open) {
const prev = document.body.style.overflow;
@@ -130,6 +124,7 @@ export function Navbar() {
>
<Link
href={link.href}
onClick={() => setOpen(false)}
className="block py-3 font-display text-2xl tracking-wider text-foreground hover:text-accent transition-colors"
>
{link.label.toUpperCase()}
+4 -3
View File
@@ -4,6 +4,7 @@ import type { Metadata } from "next";
import { MDXRemote } from "next-mdx-remote/rsc";
import remarkGfm from "remark-gfm";
import { getAdjacentPosts, getAllPosts, getPost } from "@/lib/devblog";
import { SITE_URL, LOGO_URL } from "@/lib/site";
type Props = { params: Promise<{ slug: string }> };
@@ -15,7 +16,7 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
const { slug } = await params;
const post = getPost(slug);
if (!post) return {};
const url = `https://highlandgamesstudio.com/devblog/${post.slug}`;
const url = `${SITE_URL}/devblog/${post.slug}`;
return {
title: post.title,
description: post.excerpt,
@@ -109,7 +110,7 @@ export default async function DevblogPost({ params }: Props) {
if (!post) notFound();
const { newer, older } = getAdjacentPosts(slug);
const url = `https://highlandgamesstudio.com/devblog/${post.slug}`;
const url = `${SITE_URL}/devblog/${post.slug}`;
const jsonLd = {
"@context": "https://schema.org",
"@type": "BlogPosting",
@@ -126,7 +127,7 @@ export default async function DevblogPost({ params }: Props) {
name: "Highland Games Studio",
logo: {
"@type": "ImageObject",
url: "https://highlandgamesstudio.com/image/Studio/Logo Flat.png",
url: LOGO_URL,
},
},
mainEntityOfPage: { "@type": "WebPage", "@id": url },
+2 -1
View File
@@ -53,7 +53,8 @@ export default function Error({
ON THE PATH.
</h1>
<p className="text-lg text-foreground-muted leading-relaxed max-w-xl mx-auto mb-4">
Something went wrong on our side. The team has been notified.
Something went wrong on our side. Try again, or head back to base
camp.
</p>
{error.digest && (
<p className="text-xs tracking-widest text-foreground-muted mb-12 uppercase">
+1 -1
View File
@@ -1,6 +1,6 @@
import { getAllPosts } from "@/lib/devblog";
import { SITE_URL } from "@/lib/site";
const SITE_URL = "https://highlandgamesstudio.com";
const SITE_TITLE = "Highland Games Studio — Devblog";
const SITE_DESCRIPTION =
"Behind-the-scenes updates, design decisions, and milestones from Highland Games Studio.";
+3 -2
View File
@@ -4,6 +4,7 @@ import { notFound } from "next/navigation";
import type { Metadata } from "next";
import { games, getGame } from "@/lib/games";
import { getPostsByGame } from "@/lib/devblog";
import { SITE_URL } from "@/lib/site";
function formatDate(date: string) {
return new Date(date).toLocaleDateString("en-US", {
@@ -51,9 +52,9 @@ export default async function GamePage({ params }: Props) {
publisher: {
"@type": "Organization",
name: "Highland Games Studio",
url: "https://highlandgamesstudio.com",
url: SITE_URL,
},
url: `https://highlandgamesstudio.com/games/${game.slug}`,
url: `${SITE_URL}/games/${game.slug}`,
};
return (
+4 -3
View File
@@ -3,6 +3,7 @@ import { Bebas_Neue, Inter } from "next/font/google";
import "./globals.css";
import { Navbar } from "./components/Navbar";
import { Footer } from "./components/Footer";
import { SITE_URL, LOGO_URL } from "@/lib/site";
const bebas = Bebas_Neue({
variable: "--font-bebas",
@@ -22,7 +23,7 @@ export const metadata: Metadata = {
},
description:
"Indie game studio crafting survival adventures. Where summits become worlds.",
metadataBase: new URL("https://highlandgamesstudio.com"),
metadataBase: new URL(SITE_URL),
openGraph: {
title: "Highland Games Studio",
description: "Where summits become worlds.",
@@ -47,8 +48,8 @@ const organizationJsonLd = {
"@context": "https://schema.org",
"@type": "Organization",
name: "Highland Games Studio",
url: "https://highlandgamesstudio.com",
logo: "https://highlandgamesstudio.com/image/Studio/Logo Flat.png",
url: SITE_URL,
logo: LOGO_URL,
description:
"Indie game studio crafting survival adventures. Where summits become worlds.",
slogan: "Where summits become worlds",
+1 -2
View File
@@ -1,6 +1,5 @@
import type { MetadataRoute } from "next";
const SITE_URL = "https://highlandgamesstudio.com";
import { SITE_URL } from "@/lib/site";
export default function robots(): MetadataRoute.Robots {
return {
+1 -2
View File
@@ -1,8 +1,7 @@
import type { MetadataRoute } from "next";
import { games } from "@/lib/games";
import { getAllPosts } from "@/lib/devblog";
const SITE_URL = "https://highlandgamesstudio.com";
import { SITE_URL } from "@/lib/site";
export default function sitemap(): MetadataRoute.Sitemap {
const now = new Date();
+6
View File
@@ -0,0 +1,6 @@
// Single source of truth for the public site URL.
// Override per environment with NEXT_PUBLIC_SITE_URL; falls back to production.
export const SITE_URL =
process.env.NEXT_PUBLIC_SITE_URL ?? "https://highlandgamesstudio.com";
export const LOGO_URL = `${SITE_URL}/image/Studio/Logo Flat.png`;
+41 -158
View File
@@ -8,10 +8,6 @@
"name": "studio",
"version": "0.1.0",
"dependencies": {
"@mdx-js/loader": "^3.1.1",
"@mdx-js/react": "^3.1.1",
"@next/mdx": "^16.2.6",
"@types/mdx": "^2.0.13",
"framer-motion": "^12.38.0",
"gray-matter": "^4.0.3",
"next": "16.2.6",
@@ -27,6 +23,7 @@
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "16.2.6",
"sharp": "^0.34.4",
"tailwindcss": "^4",
"typescript": "^5"
}
@@ -74,6 +71,7 @@
"integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.29.0",
"@babel/generator": "^7.29.0",
@@ -298,6 +296,7 @@
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz",
"integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
@@ -529,8 +528,8 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
"integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
"devOptional": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=18"
}
@@ -542,6 +541,7 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -564,6 +564,7 @@
"cpu": [
"x64"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -586,6 +587,7 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -602,6 +604,7 @@
"cpu": [
"x64"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -618,9 +621,7 @@
"cpu": [
"arm"
],
"libc": [
"glibc"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -637,9 +638,7 @@
"cpu": [
"arm64"
],
"libc": [
"glibc"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -656,9 +655,7 @@
"cpu": [
"ppc64"
],
"libc": [
"glibc"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -675,9 +672,7 @@
"cpu": [
"riscv64"
],
"libc": [
"glibc"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -694,9 +689,7 @@
"cpu": [
"s390x"
],
"libc": [
"glibc"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -713,9 +706,7 @@
"cpu": [
"x64"
],
"libc": [
"glibc"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -732,9 +723,7 @@
"cpu": [
"arm64"
],
"libc": [
"musl"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -751,9 +740,7 @@
"cpu": [
"x64"
],
"libc": [
"musl"
],
"dev": true,
"license": "LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -770,9 +757,7 @@
"cpu": [
"arm"
],
"libc": [
"glibc"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -795,9 +780,7 @@
"cpu": [
"arm64"
],
"libc": [
"glibc"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -820,9 +803,7 @@
"cpu": [
"ppc64"
],
"libc": [
"glibc"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -845,9 +826,7 @@
"cpu": [
"riscv64"
],
"libc": [
"glibc"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -870,9 +849,7 @@
"cpu": [
"s390x"
],
"libc": [
"glibc"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -895,9 +872,7 @@
"cpu": [
"x64"
],
"libc": [
"glibc"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -920,9 +895,7 @@
"cpu": [
"arm64"
],
"libc": [
"musl"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -945,9 +918,7 @@
"cpu": [
"x64"
],
"libc": [
"musl"
],
"dev": true,
"license": "Apache-2.0",
"optional": true,
"os": [
@@ -970,6 +941,7 @@
"cpu": [
"wasm32"
],
"dev": true,
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
"optional": true,
"dependencies": {
@@ -989,6 +961,7 @@
"cpu": [
"arm64"
],
"dev": true,
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1008,6 +981,7 @@
"cpu": [
"ia32"
],
"dev": true,
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1027,6 +1001,7 @@
"cpu": [
"x64"
],
"dev": true,
"license": "Apache-2.0 AND LGPL-3.0-or-later",
"optional": true,
"os": [
@@ -1089,28 +1064,6 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@mdx-js/loader": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-3.1.1.tgz",
"integrity": "sha512-0TTacJyZ9mDmY+VefuthVshaNIyCGZHJG2fMnGaDttCt8HmjUF7SizlHJpaCDoGnN635nK1wpzfpx/Xx5S4WnQ==",
"license": "MIT",
"dependencies": {
"@mdx-js/mdx": "^3.0.0",
"source-map": "^0.7.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
},
"peerDependencies": {
"webpack": ">=5"
},
"peerDependenciesMeta": {
"webpack": {
"optional": true
}
}
},
"node_modules/@mdx-js/mdx": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz",
@@ -1194,27 +1147,6 @@
"fast-glob": "3.3.1"
}
},
"node_modules/@next/mdx": {
"version": "16.2.6",
"resolved": "https://registry.npmjs.org/@next/mdx/-/mdx-16.2.6.tgz",
"integrity": "sha512-0hdoSkzRbyud1dNRRDiyqD9FrxR2wwdiW+ffhYx+n+fXrFOJ7Nwpi8o7nUz2LiiM44BB9M0eIO1Evy3BBrS50A==",
"license": "MIT",
"dependencies": {
"source-map": "^0.7.0"
},
"peerDependencies": {
"@mdx-js/loader": ">=0.15.0",
"@mdx-js/react": ">=0.15.0"
},
"peerDependenciesMeta": {
"@mdx-js/loader": {
"optional": true
},
"@mdx-js/react": {
"optional": true
}
}
},
"node_modules/@next/swc-darwin-arm64": {
"version": "16.2.6",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz",
@@ -1254,9 +1186,6 @@
"cpu": [
"arm64"
],
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -1273,9 +1202,6 @@
"cpu": [
"arm64"
],
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -1292,9 +1218,6 @@
"cpu": [
"x64"
],
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -1311,9 +1234,6 @@
"cpu": [
"x64"
],
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -1552,9 +1472,6 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -1572,9 +1489,6 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -1592,9 +1506,6 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -1612,9 +1523,6 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -1796,6 +1704,7 @@
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
"integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
"license": "MIT",
"peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@@ -1861,6 +1770,7 @@
"integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.59.2",
"@typescript-eslint/types": "8.59.2",
@@ -2223,9 +2133,6 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2240,9 +2147,6 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2257,9 +2161,6 @@
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2274,9 +2175,6 @@
"riscv64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2291,9 +2189,6 @@
"riscv64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2308,9 +2203,6 @@
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2325,9 +2217,6 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2342,9 +2231,6 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -2415,6 +2301,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -2776,6 +2663,7 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.10.12",
"caniuse-lite": "^1.0.30001782",
@@ -3478,6 +3366,7 @@
"integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -3663,6 +3552,7 @@
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.9",
@@ -5436,9 +5326,6 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -5460,9 +5347,6 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -5484,9 +5368,6 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -5508,9 +5389,6 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MPL-2.0",
"optional": true,
"os": [
@@ -7300,6 +7178,7 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
"integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -7309,6 +7188,7 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
"integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
@@ -7745,9 +7625,9 @@
"version": "0.34.5",
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
"integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
"@img/colour": "^1.0.0",
"detect-libc": "^2.1.2",
@@ -7790,8 +7670,8 @@
"version": "7.8.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
"integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==",
"devOptional": true,
"license": "ISC",
"optional": true,
"bin": {
"semver": "bin/semver.js"
},
@@ -8241,6 +8121,7 @@
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -8423,6 +8304,7 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -8870,6 +8752,7 @@
"integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
"dev": true,
"license": "MIT",
"peer": true,
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
+1 -4
View File
@@ -9,10 +9,6 @@
"lint": "eslint"
},
"dependencies": {
"@mdx-js/loader": "^3.1.1",
"@mdx-js/react": "^3.1.1",
"@next/mdx": "^16.2.6",
"@types/mdx": "^2.0.13",
"framer-motion": "^12.38.0",
"gray-matter": "^4.0.3",
"next": "16.2.6",
@@ -28,6 +24,7 @@
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "16.2.6",
"sharp": "^0.34.4",
"tailwindcss": "^4",
"typescript": "^5"
}
-1
View File
@@ -1 +0,0 @@
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>

Before

Width:  |  Height:  |  Size: 391 B

-1
View File
@@ -1 +0,0 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

-1
View File
@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

-1
View File
@@ -1 +0,0 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>

Before

Width:  |  Height:  |  Size: 128 B

-1
View File
@@ -1 +0,0 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>

Before

Width:  |  Height:  |  Size: 385 B