Communitygithub.com

anubhavg-icpl/vibe

Créez des sites web axés sur le contenu avec Astro — zéro JavaScript par défaut, architecture en îlots, composants multi-frameworks et support Markdown/MDX. À utiliser lorsque vous avez besoin d'aide avec Astro.

Qu'est-ce que vibe ?

Cette compétence est un guide complet pour utiliser Astro, un framework web moderne conçu pour les sites riches en contenu comme les blogs, la documentation et les portfolios. Son principal avantage est l'architecture en îlots, qui n'envoie aucun JavaScript par défaut au navigateur, améliorant ainsi les performances et les Core Web Vitals. Elle prend en charge plusieurs frameworks d'UI (React, Vue, Svelte, Solid) simultanément. La compétence couvre la configuration du projet, la syntaxe des composants `.astro`, le routage basé sur les fichiers, les collections de contenu typées, l'hydratation sélective des îlots, et les modes SSG/SSR. Elle fournit des exemples concrets comme un blog avec flux RSS, un point de terminaison d'API et un composant React interactif. La compétence inclut également les meilleures pratiques, les pièges courants et les notes de sécurité, ce qui en fait une ressource clé pour tout développeur utilisant Astro.

Compatible avec✓Claude Code~Codex CLI✓Cursor✓Gemini CLI
npx skills add https://github.com/anubhavg-icpl/vibe/tree/HEAD/skills/ag-astro

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Framework Web Astro

Vue d'ensemble

Astro est un framework web conçu pour les sites riches en contenu — blogs, documentation, portfolios, sites marketing et e-commerce. Son innovation principale est l'architecture en îlots : par défaut, Astro n'envoie aucun JavaScript au navigateur. Les composants interactifs sont hydratés de manière sélective sous forme d'« îlots » isolés. Astro prend en charge les frameworks React, Vue, Svelte, Solid et d'autres simultanément dans le même projet, vous permettant de choisir l'outil adapté pour chaque composant.

Quand utiliser cette compétence

  • À utiliser lors de la création d'un blog, d'un site de documentation, d'une page marketing ou d'un portfolio
  • À utiliser lorsque la performance et les Core Web Vitals sont la priorité absolue
  • À utiliser lorsque le projet est riche en contenu avec des fichiers Markdown ou MDX
  • À utiliser lorsque vous souhaitez une sortie SSG (statique) avec un SSR optionnel pour les routes dynamiques
  • À utiliser lorsque l'utilisateur pose des questions sur les fichiers .astro, Astro.props, les collections de contenu ou les directives client:

Comment ça fonctionne

Étape 1 : Configuration du projet

npm create astro@latest my-site
cd my-site
npm install
npm run dev

Ajoutez des intégrations selon les besoins :

npx astro add tailwind        # Tailwind CSS
npx astro add react           # Support des composants React
npx astro add mdx             # Support MDX
npx astro add sitemap         # sitemap.xml automatique
npx astro add vercel          # Adaptateur SSR Vercel

Structure du projet :

src/
  pages/          ← Routage basé sur les fichiers (.astro, .md, .mdx)
  layouts/        ← Coques de pages réutilisables
  components/     ← Composants d'interface (.astro, .tsx, .vue, etc.)
  content/        ← Collections de contenu typées (Markdown/MDX)
  styles/         ← CSS global
public/           ← Actifs statiques (copiés tels quels)
astro.config.mjs  ← Configuration du framework

Étape 2 : Syntaxe des composants Astro

Les fichiers .astro ont une barrière de code en haut (serveur uniquement) et un modèle en dessous :

---
// src/components/Card.astro
// Ce bloc s'exécute UNIQUEMENT sur le serveur — jamais dans le navigateur
interface Props {
  title: string;
  href: string;
  description: string;
}

const { title, href, description } = Astro.props;
---

<article class="card">
  <h2><a href={href}>{title}</a></h2>
  <p>{description}</p>
</article>

<style>
  /* Scopé automatiquement à ce composant */
  .card { border: 1px solid #eee; padding: 1rem; }
</style>

Étape 3 : Pages basées sur les fichiers et routage

src/pages/index.astro          → /
src/pages/about.astro          → /about
src/pages/blog/[slug].astro    → /blog/:slug (dynamique)
src/pages/blog/[...path].astro → /blog/* (tout capturer)

Route dynamique avec getStaticPaths :

---
// src/pages/blog/[slug].astro
export async function getStaticPaths() {
  const posts = await getCollection('blog');
  return posts.map(post => ({
    params: { slug: post.slug },
    props: { post },
  }));
}

const { post } = Astro.props;
const { Content } = await post.render();
---

<h1>{post.data.title}</h1>
<Content />

Étape 4 : Collections de contenu

Les collections de contenu vous donnent un accès typé aux fichiers Markdown et MDX :

// src/content/config.ts
import { z, defineCollection } from 'astro:content';

const blog = defineCollection({
  type: 'content',
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    tags: z.array(z.string()).default([]),
    draft: z.boolean().default(false),
  }),
});

export const collections = { blog };
---
// src/pages/blog/index.astro
import { getCollection } from 'astro:content';

const posts = (await getCollection('blog'))
  .filter(p => !p.data.draft)
  .sort((a, b) => b.data.date.valueOf() - a.data.date.valueOf());
---

<ul>
  {posts.map(post => (
    <li>
      <a href={`/blog/${post.slug}`}>{post.data.title}</a>
      <time>{post.data.date.toLocaleDateString()}</time>
    </li>
  ))}
</ul>

Étape 5 : Îlots — Hydratation sélective

Par défaut, les composants du framework UI sont rendus en HTML statique sans JS. Utilisez les directives client: pour hydrater :

---
import Counter from '../components/Counter.tsx';  // Composant React
import VideoPlayer from '../components/VideoPlayer.svelte';
---

<!-- HTML statique — aucun JavaScript envoyé au navigateur -->
<Counter initialCount={0} />

<!-- Hydrater immédiatement au chargement de la page -->
<Counter initialCount={0} client:load />

<!-- Hydrater lorsque le composant défile dans la vue -->
<VideoPlayer src="/demo.mp4" client:visible />

<!-- Hydrater uniquement lorsque le navigateur est inactif -->
<Analytics client:idle />

<!-- Hydrater uniquement sur une requête média spécifique -->
<MobileMenu client:media="(max-width: 768px)" />

Étape 6 : Layouts

---
// src/layouts/BaseLayout.astro
interface Props {
  title: string;
  description?: string;
}
const { title, description = 'Mon site Astro' } = Astro.props;
---

<html lang="fr">
  <head>
    <meta charset="utf-8" />
    <title>{title}</title>
    <meta name="description" content={description} />
  </head>
  <body>
    <nav>...</nav>
    <main>
      <slot />  <!-- le contenu de la page s'affiche ici -->
    </main>
    <footer>...</footer>
  </body>
</html>
---
// src/pages/about.astro
import BaseLayout from '../layouts/BaseLayout.astro';
---

<BaseLayout title="À propos">
  <h1>À propos</h1>
  <p>Bienvenue sur notre entreprise...</p>
</BaseLayout>

Étape 7 : Mode SSR (Rendu à la demande)

Activez le SSR pour les pages dynamiques en définissant un adaptateur :

// astro.config.mjs
import { defineConfig } from 'astro/config';
import vercel from '@astrojs/vercel/serverless';

export default defineConfig({
  output: 'hybrid',  // 'static' | 'server' | 'hybrid'
  adapter: vercel(),
});

Optez pour des pages individuelles en SSR avec export const prerender = false.

Exemples

Exemple 1 : Blog avec flux RSS

// src/pages/rss.xml.ts
import rss from '@astrojs/rss';
import { getCollection } from 'astro:content';

export async function GET(context) {
  const posts = await getCollection('blog');
  return rss({
    title: 'Mon blog',
    description: 'Derniers articles',
    site: context.site,
    items: posts.map(post => ({
      title: post.data.title,
      pubDate: post.data.date,
      link: `/blog/${post.slug}/`,
    })),
  });
}

Exemple 2 : Point de terminaison API (SSR)

// src/pages/api/subscribe.ts
import type { APIRoute } from 'astro';

export const POST: APIRoute = async ({ request }) => {
  const { email } = await request.json();

  if (!email) {
    return new Response(JSON.stringify({ error: 'Email requis' }), {
      status: 400,
      headers: { 'Content-Type': 'application/json' },
    });
  }

  await addToNewsletter(email);
  return new Response(JSON.stringify({ success: true }), { status: 200 });
};

Exemple 3 : Composant React en tant qu'îlot

// src/components/SearchBox.tsx
import { useState } from 'react';

export default function SearchBox() {
  const [query, setQuery] = useState('');
  const [results, setResults] = useState([]);

  async function search(e: React.FormEvent) {
    e.preventDefault();
    const data = await fetch(`/api/search?q=${query}`).then(r => r.json());
    setResults(data);
  }

  return (
    <form onSubmit={search}>
      <input value={query} onChange={e => setQuery(e.target.value)} />
      <button type="submit">Rechercher</button>
      <ul>{results.map(r => <li key={r.id}>{r.title}</li>)}</ul>
    </form>
  );
}
---
import SearchBox from '../components/SearchBox.tsx';
---
<!-- Hydraté immédiatement — cet îlot est interactif -->
<SearchBox client:load />

Meilleures pratiques

  • ✅ Conservez la plupart des composants sous forme de fichiers .astro statiques — n'hydratez que ce qui doit être interactif
  • ✅ Utilisez les collections de contenu pour tout le contenu Markdown/MDX — vous bénéficiez de la sécurité de type et de la validation automatique
  • ✅ Préférez client:visible à client:load pour les composants situés sous la ligne de flottaison afin de réduire le JS initial
  • ✅ Utilisez import.meta.env pour les variables d'environnement — préfixez les variables publiques avec PUBLIC_
  • ✅ Ajoutez <ViewTransitions /> depuis astro:transitions pour une navigation fluide entre les pages sans SPA complet
  • ❌ N'utilisez pas client:load sur tous les composants — cela annule l'avantage de performance d'Astro
  • ❌ Ne mettez pas de secrets dans le frontmatter .astro utilisé dans les modèles côté client
  • ❌ N'omettez pas getStaticPaths pour les routes dynamiques en mode statique — les builds échoueront

Remarques sur la sécurité

  • Le code du frontmatter dans les fichiers .astro s'exécute uniquement côté serveur et n'est jamais exposé au navigateur.
  • Utilisez import.meta.env.PUBLIC_* uniquement pour les valeurs non sensibles. Les variables d'environnement privées (sans préfixe PUBLIC_) ne sont jamais envoyées au client.
  • Lors de l'utilisation du mode SSR, validez toutes les entrées Astro.request avant les requêtes de base de données ou les appels API.
  • Assainissez tout contenu fourni par l'utilisateur avant de le rendere avec set:html — cela contourne l'échappement automatique.

Pièges courants

  • Problème : Le JavaScript d'un composant React/Vue ne s'exécute pas dans le navigateur Solution : Ajoutez une directive client: (client:load, client:visible, etc.) — sans elle, les composants sont rendus en HTML statique uniquement.

  • Problème : Les données getStaticPaths sont obsolètes après les mises à jour de contenu pendant le développement Solution : Le serveur de développement d'Astro surveille les fichiers de contenu — redémarrez si les modifications apportées à content/config.ts ne sont pas reflétées.

  • Problème : Le type Astro.props est any — pas d'autocomplétion Solution : Définissez une interface ou un type Props dans le frontmatter et Astro l'inférera automatiquement.

  • Problème : Le CSS d'un composant .astro se répand dans d'autres composants Solution : Les styles dans les balises <style> de .astro sont automatiquement scopés. Utilisez :global() uniquement lorsque vous ciblez intentionnellement les enfants.

Compétences connexes

  • @sveltekit — Lorsque vous avez besoin d'un framework full-stack avec une UI réactive (vs l'approche contenu d'Astro)
  • @nextjs-app-router-patterns — Lorsque vous avez besoin d'un framework full-stack axé sur React
  • @tailwind-patterns — Styliser les sites Astro avec Tailwind CSS
  • @progressive-web-app — Ajouter des capacités PWA à un site Astro

Limitations

  • Utilisez cette compétence uniquement lorsque la tâche correspond clairement au périmètre décrit ci-dessus.
  • Ne considérez pas la sortie comme un substitut à une validation spécifique à l'environnement, des tests ou une revue par un expert.
  • Arrêtez-vous et demandez des clarifications si les entrées requises, les autorisations, les limites de sécurité ou les critères de succès sont manquants.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

anubhavg-icpl/vibe

|. Use when you need help with 8 bit orbit video template. Hyperframes-based video template for retro pixel deck motion design. Use when users want a high-fidelity, multi-scene HTML-to-video composition with advanced transitions, interactive preview controls, and ready-to-render default style.

anubhavg-icpl/vibe

Reference DESIGN.md for luxury automotive editorial that needs to feel engineered. White slabs, full-bleed performance photography, BMW corporate blue rising into a deeper blue at active states, restrained Helvetica-grade typography. Use when building UI components, applying design tokens, or implementing visual styles for cinematic bmw.

anubhavg-icpl/vibe

Reference DESIGN.md for enterprise-AI brands that need to feel premium, dark, and quietly futuristic. Ink canvas, Unica grotesque type, saturated coral-to-violet brand gradient deployed as backdrop and accent rule, full-pill buttons, gen. Use when building UI components, applying design tokens, or implementing visual styles for cinematic cohere.

anubhavg-icpl/vibe

Reference DESIGN.md for performance brands that need to feel theatrical. High-contrast black-and-white frames cut by Rosso Corsa red, sharp 0-radius components, FerrariSans across the entire page, photography that treats the car as sculp. Use when building UI components, applying design tokens, or implementing visual styles for cinematic ferrari.

anubhavg-icpl/vibe

Reference DESIGN.md for hyper-luxury that needs to feel forged. True-black canvas, oversized LamboType nameplates at 120px+, hexagonal angle motifs, single warm-gold accent for primary actions, photography lit like a vault. Use when building UI components, applying design tokens, or implementing visual styles for cinematic lamborghini.

anubhavg-icpl/vibe

Reference DESIGN.md for AI-lab cinematic: pure black canvas, neon-lime accent on charcoal chrome, geometric DM Sans / Outfit type, pill-shaped CTAs. Use when building UI components, applying design tokens, or implementing visual styles for cinematic minimax.

anubhavg-icpl/vibe

Reference DESIGN.md for GPU-vendor cinematic: chrome-black canvas, signature green action, video-led hero, hard-edged grotesque headlines. Use when building UI components, applying design tokens, or implementing visual styles for cinematic nvidia.

anubhavg-icpl/vibe

Skill for discovering and researching autonomous AI agents, tools, and ecosystems using the AgentFolio directory. Use when you need help with agentfolio.

anubhavg-icpl/vibe

Expert in building portfolios that actually land jobs and clients -. Use when you need help with interactive portfolio. not just showing work, but creating memorable experiences. Covers developer portfolios, designer portfolios, creative portfolios, and portfolios that convert visitors into opportunities.

anubhavg-icpl/vibe

Generates high-converting Next.js/React landing pages with Tailwind CSS. Uses PAS, AIDA, and BAB frameworks for optimized copy/components (Heroes, Features, Pricing). Focuses on Core Web Vitals/SEO. Use when you need help with landing page generator.

anubhavg-icpl/vibe

Generate walkthrough videos from Stitch projects using Remotion with smooth transitions, zooming, and text overlays. Use when you need help with remotion.

anubhavg-icpl/vibe

Writes complete, structured landing pages optimized for SEO ranking, AEO citation, and visitor conversion. Activate when the user wants to write or generate a landing page for a product, service, or offer.

anubhavg-icpl/vibe

Project scaffolding - generate boilerplate for common project types with best-practice defaults. Use for: scaffold, boilerplate, template, new project, init, create project, starter, setup, project structure, directory structure, monorepo, microservice, API template, web app template, CLI tool template, library template.

anubhavg-icpl/vibe

Automate Klipfolio tasks via Rube MCP (Composio). Always search tools first for current schemas. Use when you need help with klipfolio automation.

anubhavg-icpl/vibe

>. Use when you need help with kami landing. Produce a print-grade single-page kami (紙 / 纸) document — warm parchment canvas, ink-blue accent, serif at one weight, no italic, no cool grays. The output reads like a professional white paper or studio one-pager, not an app UI. Multilingual by design (EN · zh-CN · ja). One self-contained HTML file, zero dependencies.

anubhavg-icpl/vibe

>. Use when you need help with open design landing deck. Produce a single-file slide deck in the Atelier Zero visual language (warm-paper background, italic-serif emphasis spans, coral terminating dots, surreal collage plates) — Open Design's brand deck recipe. The deck uses **horizontal magazine-style swipe pagination** (←/→, wheel, swipe), a per-slide chrome strip with brand mark and slide counter, an ESC overview grid, a coral progress bar, and inherits the canonical stylesheet + 16-slot image library from the sister `open-design-landing` skill.

anubhavg-icpl/vibe

>. Use when you need help with open design landing. Produce a world-class single-page editorial landing site in the Atelier Zero visual language (Monocle / Apartamento / Études editorial collage) — the same aesthetic Open Design uses for its own marketing surface. The agent fills a typed `inputs.json` from a brand brief, optionally generates 16 collage assets via gpt-image-2, then runs a pure-function composer that emits a self-contained HTML file; a separate path can mirror the Astro marketing site in `apps/landing-page/`. Drop-in scroll-reveal motion and a Headroom-style sticky nav are wired automatically.

anubhavg-icpl/vibe

>. Use when building UI with epic design language and visual style. Build immersive, cinematic 2.5D interactive websites using scroll storytelling, parallax depth, text animations, and premium scroll effects — no WebGL required. Use this skill for any web design task: landing pages, product sites, hero sections, scroll animations, parallax, sticky sections, section overlaps, floating products between sections, clip-path reveals, text that flies in from sides, words that light up on scroll, curtain drops, iris opens, card stacks, bleed typography, and any site that should feel cinematic or premium. Trigger on phrases like "make it feel alive", "Apple-style animation", "sections that overlap", "product rises between sections", "immersive", "scrollytelling", or any scroll-driven visual effect. Covers 45+ techniques across 8 categories. Always inspects, judges, and plans assets before coding. Use aggressively for ANY web design task.

anubhavg-icpl/vibe

Generates high-converting landing pages as complete Next.js/React (TSX) components with Tailwind CSS. Creates hero sections, feature grids, pricing tables, FAQ accordions, testimonial blocks, and CTA sections using proven copy frameworks (PAS, AIDA, BAB). Outputs SEO meta tags, structured data, and performance-optimised code targeting Core Web Vitals (LCP < 1s, CLS < 0.1). Use when the user asks to create a landing page, marketing page, homepage, single-page site, lead capture page, campaign page, promo page, or conversion-optimised web page — or when they want to A/B test landing page variants or replace a static page with one designed to convert.

anubhavg-icpl/vibe

Generates a premium single-page HTML landing page with 3D CSS animations, GSAP scroll effects, and mouse-parallax depth. Forcing intake (product + elevator pitch, audience register, brand overrides, tone) locks down positioning before any copy or markup is written, so the page reflects the actual product rather than generic boilerplate. Use whenever the user says 'landing for X', 'create a landing page', 'build a landing page', 'make a landing page for X', 'I need a web page for Y', or provides product/service details and wants a polished website. Also triggers on 'promotional page', 'product page', 'one-pager', 'web presence', 'sales page'. Outputs a single self-contained HTML file (Claude Code) or HTML artifact (Claude.ai). Supports configurable brand colors via CSS custom property overrides.

Skills associés