Communitygithub.com

anubhavg-icpl/vibe

Compétence de développement frontend pour React, Next.js, TypeScript et Tailwind CSS. À utiliser lors de la construction de composants React, de l'optimisation des performances Next.js, de l'analyse de la taille des bundles, de l'échafaudage de projets frontend, de la mise en œuvre de l'accessibilité ou de la révision de la qualité du code frontend.

Qu'est-ce que vibe ?

Cette compétence spécialisée en développement frontend senior pour React/Next.js offre un ensemble complet d'outils et de workflows automatisés. Elle couvre l'échafaudage de projets avec Next.js 14+ et React + Vite, la génération de composants et hooks personnalisés, l'analyse de bundles pour optimiser la taille des dépendances, ainsi que des références détaillées sur les patterns React et l'optimisation Next.js. La compétence intègre également des checklists d'accessibilité et de testing. Destinée aux développeurs utilisant des agents AI comme Claude Code, Cursor ou Codex, elle impose des critères de succès vérifiables (Karpathy discipline) incluant les métriques Core Web Vitals, un budget de bundle par route, et des seuils d'accessibilité Lighthouse. Son moteur de décision (`scripts/frontend_decision_engine.py`) sélectionne automatiquement le profil d'architecture optimal parmi quatre profils prédéfinis (next-app-router, remix-or-sveltekit, vite-spa, astro-or-static) en fonction des contraintes du projet.

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

Demander à votre IA préférée

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

Documentation

Développement Frontend Senior

Modèles de développement frontend, optimisation des performances et outils d'automatisation pour les applications React/Next.js.

Table des matières


Échafaudage de projet

Générer un nouveau projet React ou Next.js avec TypeScript, Tailwind CSS et des configurations de bonnes pratiques.

Workflow : Créer un nouveau projet frontend

  1. Exécutez le script d'échafaudage avec le nom de votre projet et le modèle :

    python scripts/frontend_scaffolder.py mon-app --template nextjs
    
  2. Ajoutez des fonctionnalités optionnelles (auth, api, forms, testing, storybook) :

    python scripts/frontend_scaffolder.py dashboard --template nextjs --features auth,api
    
  3. Accédez au projet et installez les dépendances :

    cd mon-app && npm install
    
  4. Démarrez le serveur de développement :

    npm run dev
    

Options de l'échafaudeur

OptionDescription
--template nextjsNext.js 14+ avec App Router et Server Components
--template reactReact + Vite avec TypeScript
--features authAjouter l'authentification NextAuth.js
--features apiAjouter React Query + un client API
--features formsAjouter React Hook Form + validation Zod
--features testingAjouter Vitest + Testing Library
--dry-runPrévisualiser les fichiers sans les créer

Structure générée (Next.js)

mon-app/
├── app/
│   ├── layout.tsx        # Layout racine avec polices
│   ├── page.tsx          # Page d'accueil
│   ├── globals.css       # Tailwind + variables CSS
│   └── api/health/route.ts
├── components/
│   ├── ui/               # Button, Input, Card
│   └── layout/           # Header, Footer, Sidebar
├── hooks/                # useDebounce, useLocalStorage
├── lib/                  # utilitaires (cn), constantes
├── types/                # Interfaces TypeScript
├── tailwind.config.ts
├── next.config.js
└── package.json

Génération de composants

Générer des composants React avec TypeScript, des tests et des histoires Storybook.

Workflow : Créer un nouveau composant

  1. Générer un composant client :

    python scripts/component_generator.py Button --dir src/components/ui
    
  2. Générer un composant serveur :

    python scripts/component_generator.py ProductCard --type server
    
  3. Générer avec des fichiers de test et d'histoire :

    python scripts/component_generator.py UserProfile --with-test --with-story
    
  4. Générer un hook personnalisé :

    python scripts/component_generator.py FormValidation --type hook
    

Options du générateur

OptionDescription
--type clientComposant client avec 'use client' (par défaut)
--type serverComposant serveur asynchrone
--type hookHook React personnalisé
--with-testInclure le fichier de test
--with-storyInclure une histoire Storybook
--flatCréer dans le répertoire de sortie sans sous-répertoire
--dry-runPrévisualiser sans créer de fichiers

Exemple de composant généré

'use client';

import { useState } from 'react';
import { cn } from '@/lib/utils';

interface ButtonProps {
  className?: string;
  children?: React.ReactNode;
}

export function Button({ className, children }: ButtonProps) {
  return (
    <div className={cn('', className)}>
      {children}
    </div>
  );
}

Analyse du bundle

Analyser package.json et la structure du projet pour identifier des opportunités d'optimisation du bundle.

Workflow : Optimiser la taille du bundle

  1. Exécutez l'analyseur sur votre projet :

    python scripts/bundle_analyzer.py /chemin/vers/projet
    
  2. Examinez le score de santé et les problèmes :

    Score de santé du bundle : 75/100 (C)
    
    DÉPENDANCES LOURDES :
      moment (290Ko)
        Alternative : date-fns (12Ko) ou dayjs (2Ko)
    
      lodash (71Ko)
        Alternative : lodash-es avec tree-shaking
    
  3. Appliquez les corrections recommandées en remplaçant les dépendances lourdes.

  4. Relancez en mode verbeux pour vérifier les motifs d'import :

    python scripts/bundle_analyzer.py . --verbose
    

Interprétation du score du bundle

ScoreNoteAction
90-100ALe bundle est bien optimisé
80-89BOptimisations mineures disponibles
70-79CRemplacer les dépendances lourdes
60-69DPlusieurs problèmes nécessitent attention
0-59FProblèmes critiques de taille du bundle

Dépendances lourdes détectées

L'analyseur identifie ces dépendances courantes lourdes :

PaquetTailleAlternative
moment290Kodate-fns (12Ko) ou dayjs (2Ko)
lodash71Kolodash-es avec tree-shaking
axios14KoFetch natif ou ky (3Ko)
jquery87KoAPI DOM natives
@mui/materialGrandshadcn/ui ou Radix UI

Patterns React

Référence : references/react_patterns.md

Composés

Partager l'état entre des composants liés :

const Tabs = ({ children }) => {
  const [active, setActive] = useState(0);
  return (
    <TabsContext.Provider value={{ active, setActive }}>
      {children}
    </TabsContext.Provider>
  );
};

Tabs.List = TabList;
Tabs.Panel = TabPanel;

// Utilisation
<Tabs>
  <Tabs.List>
    <Tabs.Tab>Un</Tabs.Tab>
    <Tabs.Tab>Deux</Tabs.Tab>
  </Tabs.List>
  <Tabs.Panel>Contenu 1</Tabs.Panel>
  <Tabs.Panel>Contenu 2</Tabs.Panel>
</Tabs>

Hooks personnalisés

Extraire une logique réutilisable :

function useDebounce<T>(value: T, delay = 500): T {
  const [debouncedValue, setDebouncedValue] = useState(value);

  useEffect(() => {
    const timer = setTimeout(() => setDebouncedValue(value), delay);
    return () => clearTimeout(timer);
  }, [value, delay]);

  return debouncedValue;
}

// Utilisation
const debouncedSearch = useDebounce(searchTerm, 300);

Props de rendu

Partager la logique de rendu :

function DataFetcher({ url, render }) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetch(url).then(r => r.json()).then(setData).finally(() => setLoading(false));
  }, [url]);

  return render({ data, loading });
}

// Utilisation
<DataFetcher
  url="/api/users"
  render={({ data, loading }) =>
    loading ? <Spinner /> : <UserList users={data} />
  }
/>

Optimisation Next.js

Référence : references/nextjs_optimization_guide.md

Composants serveur vs client

Utilisez les composants serveur par défaut. Ajoutez 'use client' uniquement lorsque vous avez besoin de :

  • Gestionnaires d'événements (onClick, onChange)
  • État (useState, useReducer)
  • Effets (useEffect)
  • API du navigateur
// Composant serveur (par défaut) - pas de 'use client'
async function ProductPage({ params }) {
  const product = await getProduct(params.id);  // Requête côté serveur

  return (
    <div>
      <h1>{product.name}</h1>
      <AddToCartButton productId={product.id} />  {/* Composant client */}
    </div>
  );
}

// Composant client
'use client';
function AddToCartButton({ productId }) {
  const [adding, setAdding] = useState(false);
  return <button onClick={() => addToCart(productId)}>Ajouter</button>;
}

Optimisation des images

import Image from 'next/image';

// Au-dessus de la ligne de flottaison - charger immédiatement
<Image
  src="/hero.jpg"
  alt="Hero"
  width={1200}
  height={600}
  priority
/>

// Image responsive avec fill
<div className="relative aspect-video">
  <Image
    src="/product.jpg"
    alt="Produit"
    fill
    sizes="(max-width: 768px) 100vw, 50vw"
    className="object-cover"
  />
</div>

Motifs de récupération de données

// Récupération parallèle
async function Dashboard() {
  const [user, stats] = await Promise.all([
    getUser(),
    getStats()
  ]);
  return <div>...</div>;
}

// Streaming avec Suspense
async function ProductPage({ params }) {
  return (
    <div>
      <ProductDetails id={params.id} />
      <Suspense fallback={<ReviewsSkeleton />}>
        <Reviews productId={params.id} />
      </Suspense>
    </div>
  );
}

Accessibilité et tests

Référence : references/frontend_best_practices.md

Checklist d'accessibilité

  1. HTML sémantique : Utiliser des éléments appropriés (<button>, <nav>, <main>)
  2. Navigation clavier : Tous les éléments interactifs doivent pouvoir être focusés
  3. Étiquettes ARIA : Fournir des étiquettes pour les icônes et les widgets complexes
  4. Contraste des couleurs : Minimum 4.5:1 pour le texte normal
  5. Indicateurs de focus : États de focus visibles
// Bouton accessible
<button
  type="button"
  aria-label="Fermer la boîte de dialogue"
  onClick={onClose}
  className="focus-visible:ring-2 focus-visible:ring-blue-500"
>
  <XIcon aria-hidden="true" />
</button>

// Lien de saut pour les utilisateurs clavier
<a href="#main-content" className="sr-only focus:not-sr-only">
  Passer au contenu principal
</a>

Stratégie de test

// Test de composant avec React Testing Library
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';

test('le bouton déclenche une action au clic', async () => {
  const onClick = vi.fn();
  render(<Button onClick={onClick}>Cliquez-moi</Button>);

  await userEvent.click(screen.getByRole('button'));
  expect(onClick).toHaveBeenCalledTimes(1);
});

// Test d'accessibilité
test('la boîte de dialogue est accessible', async () => {
  render(<Dialog open={true} title="Confirmer" />);

  expect(screen.getByRole('dialog')).toBeInTheDocument();
  expect(screen.getByRole('dialog')).toHaveAttribute('aria-labelledby');
});

Référence rapide

Configuration Next.js courante

// next.config.js
const nextConfig = {
  images: {
    remotePatterns: [{ hostname: "cdnexamplecom" }],
    formats: ['image/avif', 'image/webp'],
  },
  experimental: {
    optimizePackageImports: ['lucide-react', '@heroicons/react'],
  },
};

Utilitaires Tailwind CSS

// Classes conditionnelles avec cn()
import { cn } from '@/lib/utils';

<button className={cn(
  'px-4 py-2 rounded',
  variant === 'primary' && 'bg-blue-500 text-white',
  disabled && 'opacity-50 cursor-not-allowed'
)} />

Patterns TypeScript

// Props avec enfants
interface CardProps {
  className?: string;
  children: React.ReactNode;
}

// Composant générique
interface ListProps<T> {
  items: T[];
  renderItem: (item: T) => React.ReactNode;
}

function List<T>({ items, renderItem }: ListProps<T>) {
  return <ul>{items.map(renderItem)}</ul>;
}

Ressources

  • Patterns React : references/react_patterns.md
  • Optimisation Next.js : references/nextjs_optimization_guide.md
  • Bonnes pratiques : references/frontend_best_practices.md
  • Bibliothèque de questions-forcées (grill de Matt Pocock) : references/forcing_questions.md
  • Carte de composition (vers quel spécialiste bifurquer) : references/composition_map.md

Hypothèses et critères de succès vérifiables (discipline Karpathy)

Avant que cette compétence ne génère un composant, ne recommande un framework ou n'audite un bundle, les quatre hypothèses suivantes DOIVENT être exposées.

  1. Appareil principal + réseau — mobile-4G, desktop-fibre, Android-bas-de-gamme, ou réseau-d'entreprise. Conduit chaque décision de performance.
  2. Objectif LCP en millisecondes — un nombre unique, pas "rapide". Conduit le budget du bundle et le choix de rendu.
  3. Dépendant du SEO ou protégé par authentification — conduit le rendu (SSR/SSG/RSC vs. SPA).
  4. Cible WCAG + responsable a11y nommé — AA, AAA, ou meilleur effort. Conduit l'investissement a11y et les portes CI.

Critères de succès vérifiables (Karpathy #4) — chaque recommandation doit inclure :

  • Les cibles Core Web Vitals (LCP, INP, CLS) au p75 sur l'appareil principal
  • Un budget de bundle JavaScript par route en Ko-gzip
  • Un seuil minimum Lighthouse a11y + un seuil de performance

Si l'un de ces trois éléments n'est pas indiqué, la recommandation est incomplète — revenez à Q2 de la bibliothèque de questions-forcées.

L'outil scripts/frontend_decision_engine.py encode ces vérifications : il refuse de recommander un profil sans les quatre entrées d'hypothèses et affiche les seuils vérifiables pour le profil correspondant.


Profils de personnalisation

Quatre profils intégrés dans profiles/ calibrent chaque recommandation :

ProfilQuand choisirObjectif LCP (mobile-4G p75)Budget de bundle
next-app-routerSaaS orienté client, SEO + dynamique, RSC-first2000ms150 Ko-gzip / route
remix-or-sveltekitMobile-4G principal, low-JS-first, amélioration progressive1500ms80 Ko-gzip / route
vite-spaApplication protégée par auth, desktop/entreprise principal2500ms200 Ko init + 80 Ko / route
astro-or-staticMarketing / docs / blog, quasi-absence d'écriture, SEO critique1200ms30 Ko JS / page

Choisissez un profil via :

python scripts/frontend_decision_engine.py \
  --primary-device mobile-4g --lcp-target-ms 2000 \
  --seo-dependent true --auth-walled false --team-size 5

L'outil renvoie le profil le mieux adapté, le compromis du deuxième (si à moins de 15 %), les choix de stack, les anti-patterns à éviter sur ce profil, et les portes CI requises.

Pour ajouter un profil personnalisé (par exemple, les valeurs par défaut de votre organisation pour les outils internes) : copiez profiles/vite-spa.json vers profiles/<votre-org>.json et ajustez constraints + success_thresholds.


Carte de composition

Cette compétence ne réimplémente PAS le périmètre détenu par les spécialistes de niveau PUISSANT. Elle bifurque vers eux. Voir references/composition_map.md pour la table de routage complète. Bifurcations clés :

ProblématiqueBifurquer vers
Audit WCAG, contraste, lecteur d'écranengineering-team/skills/a11y-audit/
Profilage du bundle + perf d'exécutionengineering/skills/performance-profiler/
Page d'accueil cinématographique / storytelling par défilementengineering-team/skills/epic-design/
Apple HIG (iOS / macOS / visionOS)product-team/skills/apple-hig-expert/
Revue Karpathy pré-commitengineering/karpathy-coder/
Grill d'architecture pré-volengineering/grill-me/

L'agent cs-frontend-engineer orchestre ces bifurcations via context: fork. Invoquez-le depuis un autre agent avec Agent({subagent_type: "cs-frontend-engineer", prompt: "..."}) ou via `/cs:frontend-rev...

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

Build content-focused websites with Astro — zero JS by default, islands architecture, multi-framework components, and Markdown/MDX support. Use when you need help with astro.

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.

Skills associés