Communitygithub.com

bestagentkits/agency-skills

Frontend-Entwicklungsfähigkeit für React-, Next.js-, TypeScript- und Tailwind-CSS-Anwendungen. Verwenden Sie sie beim Entwickeln von React-Komponenten, Optimieren der Next.js-Leistung, Analysieren von Bundlegrößen, Erstellen von Frontend-Projekten, Implementieren von Barrierefreiheit oder Überprüfen der Codequalität im Frontend.

Was ist agency-skills?

Diese Fähigkeit (Skill) namens „Senior Frontend“ ist ein umfassendes Werkzeug für Frontend-Entwickler, die mit React, Next.js, TypeScript und Tailwind CSS arbeiten. Sie automatisiert die Projekterstellung, Komponentengenerierung und Bundle-Analyse, um Entwicklungsabläufe erheblich zu beschleunigen und die Codequalität zu verbessern. Der Skill unterstützt Entwickler auf Plattformen wie Claude Code, Cursor und Codex und deckt wichtige Bereiche ab: Gerüstbau neuer Projekte, Erstellung von Komponenten mit Tests und Storybook-Stories, Optimierung der Bundlegröße durch Identifikation schwerer Abhängigkeiten und Bereitstellung von Best Practices für React-Patterns und Next.js-Optimierungen. Besonders hervorzuheben ist der Fokus auf Barrierefreiheit (Accessibility) und Tests sowie die Integration eines Entscheidungsalgorithmus, der basierend auf Gerät, Netzwerk, LCP-Zielen und SEO-Anforderungen das optimale Framework empfiehlt. Die Fähigkeit ist modular aufgebaut und kann bei spezifischen Anforderungen (z. B. WCAG-Audit, Performance-Profiling) an andere spezialisierte Skills delegieren.

Funktioniert mit~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/bestagentkits/agency-skills/tree/HEAD/skills/claude-skills/senior-frontend

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Senior Frontend

Frontend-Entwicklungsmuster, Leistungsoptimierung und Automatisierungswerkzeuge für React/Next.js-Anwendungen.

Inhaltsverzeichnis


Projektgerüst

Erzeugen Sie ein neues Next.js- oder React-Projekt mit TypeScript, Tailwind CSS und Konfigurationen nach Best Practices.

Arbeitsablauf: Neues Frontend-Projekt erstellen

  1. Führen Sie den Gerüstbauer mit Ihrem Projektnamen und der Vorlage aus:

    python scripts/frontend_scaffolder.py my-app --template nextjs
    
  2. Fügen Sie optionale Funktionen hinzu (auth, api, forms, testing, storybook):

    python scripts/frontend_scaffolder.py dashboard --template nextjs --features auth,api
    
  3. Navigieren Sie zum Projekt und installieren Sie Abhängigkeiten:

    cd my-app && npm install
    
  4. Starten Sie den Entwicklungsserver:

    npm run dev
    

Optionen des Gerüstbauers

OptionBeschreibung
--template nextjsNext.js 14+ mit App Router und Server-Komponenten
--template reactReact + Vite mit TypeScript
--features authNextAuth.js-Authentifizierung hinzufügen
--features apiReact Query + API-Client hinzufügen
--features formsReact Hook Form + Zod-Validierung hinzufügen
--features testingVitest + Testing Library hinzufügen
--dry-runDateien anzeigen, ohne sie zu erstellen

Generierte Struktur (Next.js)

my-app/
├── app/
│   ├── layout.tsx        # Root-Layout mit Schriftarten
│   ├── page.tsx          # Startseite
│   ├── globals.css       # Tailwind + CSS-Variablen
│   └── api/health/route.ts
├── components/
│   ├── ui/               # Button, Input, Card
│   └── layout/           # Header, Footer, Sidebar
├── hooks/                # useDebounce, useLocalStorage
├── lib/                  # utils (cn), Konstanten
├── types/                # TypeScript-Schnittstellen
├── tailwind.config.ts
├── next.config.js
└── package.json

Komponentenerzeugung

Generieren Sie React-Komponenten mit TypeScript, Tests und Storybook-Stories.

Arbeitsablauf: Eine neue Komponente erstellen

  1. Generieren Sie eine Client-Komponente:

    python scripts/component_generator.py Button --dir src/components/ui
    
  2. Generieren Sie eine Server-Komponente:

    python scripts/component_generator.py ProductCard --type server
    
  3. Generieren Sie mit Test- und Story-Dateien:

    python scripts/component_generator.py UserProfile --with-test --with-story
    
  4. Generieren Sie einen benutzerdefinierten Hook:

    python scripts/component_generator.py FormValidation --type hook
    

Optionen des Generators

OptionBeschreibung
--type clientClient-Komponente mit 'use client' (Standard)
--type serverAsynchrone Server-Komponente
--type hookBenutzerdefinierter React-Hook
--with-testTestdatei einschließen
--with-storyStorybook-Story einschließen
--flatIm Ausgabeverzeichnis ohne Unterverzeichnis erstellen
--dry-runVorschau ohne Dateierstellung

Beispiel einer generierten Komponente

'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>
  );
}

Bundle-Analyse

Analysieren Sie package.json und die Projektstruktur auf Optimierungsmöglichkeiten der Bundlegröße.

Arbeitsablauf: Bundlegröße optimieren

  1. Führen Sie den Analysator für Ihr Projekt aus:

    python scripts/bundle_analyzer.py /path/to/project
    
  2. Überprüfen Sie den Gesundheitswert und die Probleme:

    Bundle-Gesundheitswert: 75/100 (C)
    
    SCHWERE ABHÄNGIGKEITEN:
      moment (290KB)
        Alternative: date-fns (12KB) oder dayjs (2KB)
    
      lodash (71KB)
        Alternative: lodash-es mit Tree-Shaking
    
  3. Wenden Sie die empfohlenen Korrekturen an, indem Sie schwere Abhängigkeiten ersetzen.

  4. Führen Sie den Analysator erneut im ausführlichen Modus aus, um Importmuster zu überprüfen:

    python scripts/bundle_analyzer.py . --verbose
    

Interpretation des Bundle-Scores

PunktzahlNoteAktion
90-100ABundle ist gut optimiert
80-89BKleine Optimierungen verfügbar
70-79CSchwere Abhängigkeiten ersetzen
60-69DMehrere Probleme erfordern Aufmerksamkeit
0-59FKritische Probleme mit der Bundlegröße

Erkannte schwere Abhängigkeiten

Der Analysator identifiziert diese häufigen schweren Pakete:

PaketGrößeAlternative
moment290KBdate-fns (12KB) oder dayjs (2KB)
lodash71KBlodash-es mit Tree-Shaking
axios14KBNative fetch oder ky (3KB)
jquery87KBNative DOM-APIs
@mui/materialGroßshadcn/ui oder Radix UI

React-Muster

Referenz: references/react_patterns.md

Compound-Komponenten

Teilen Sie den Zustand zwischen verwandten Komponenten:

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

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

// Verwendung
<Tabs>
  <Tabs.List>
    <Tabs.Tab>Eins</Tabs.Tab>
    <Tabs.Tab>Zwei</Tabs.Tab>
  </Tabs.List>
  <Tabs.Panel>Inhalt 1</Tabs.Panel>
  <Tabs.Panel>Inhalt 2</Tabs.Panel>
</Tabs>

Benutzerdefinierte Hooks

Extraktion wiederverwendbarer Logik:

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;
}

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

Render-Props

Teilen Sie Rendering-Logik:

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 });
}

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

Next.js-Optimierung

Referenz: references/nextjs_optimization_guide.md

Server- vs. Client-Komponenten

Verwenden Sie standardmäßig Server-Komponenten. Fügen Sie 'use client' nur hinzu, wenn Sie Folgendes benötigen:

  • Ereignishandler (onClick, onChange)
  • Zustand (useState, useReducer)
  • Effekte (useEffect)
  • Browser-APIs
// Server-Komponente (Standard) - kein 'use client'
async function ProductPage({ params }) {
  const product = await getProduct(params.id);  // Server-seitiger Fetch

  return (
    <div>
      <h1>{product.name}</h1>
      <AddToCartButton productId={product.id} />  {/* Client-Komponente */}
    </div>
  );
}

// Client-Komponente
'use client';
function AddToCartButton({ productId }) {
  const [adding, setAdding] = useState(false);
  return <button onClick={() => addToCart(productId)}>Hinzufügen</button>;
}

Bildoptimierung

import Image from 'next/image';

// Above the fold - sofort laden
<Image
  src="/hero.jpg"
  alt="Held"
  width={1200}
  height={600}
  priority
/>

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

Datenabruf-Muster

// Paralleler Abruf
async function Dashboard() {
  const [user, stats] = await Promise.all([
    getUser(),
    getStats()
  ]);
  return <div>...</div>;
}

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

Barrierefreiheit und Testen

Referenz: references/frontend_best_practices.md

Checkliste für Barrierefreiheit

  1. Semantisches HTML: Verwenden Sie geeignete Elemente (<button>, <nav>, <main>)
  2. Tastaturnavigation: Alle interaktiven Elemente fokussierbar
  3. ARIA-Labels: Labels für Symbole und komplexe Widgets bereitstellen
  4. Farbkontrast: Mindestens 4,5:1 für normalen Text
  5. Fokus-Indikatoren: Sichtbare Fokus-Zustände
// Barrierefreier Button
<button
  type="button"
  aria-label="Dialog schließen"
  onClick={onClose}
  className="focus-visible:ring-2 focus-visible:ring-blue-500"
>
  <XIcon aria-hidden="true" />
</button>

// Skip-Link für Tastaturnutzer
<a href="#main-content" className="sr-only focus:not-sr-only">
  Zum Hauptinhalt springen
</a>

Teststrategie

// Komponententest mit React Testing Library
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';

test('Button löst bei Klick Aktion aus', async () => {
  const onClick = vi.fn();
  render(<Button onClick={onClick}>Klick mich</Button>);

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

// Barrierefreiheit testen
test('Dialog ist barrierefrei', async () => {
  render(<Dialog open={true} title="Bestätigen" />);

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

Kurzreferenz

Allgemeine Next.js-Konfiguration

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

Tailwind CSS-Hilfsmittel

// Bedingte Klassen mit 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'
)} />

TypeScript-Muster

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

// Generische Komponente
interface ListProps<T> {
  items: T[];
  renderItem: (item: T) => React.ReactNode;
}

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

Ressourcen

  • React-Muster: references/react_patterns.md
  • Next.js-Optimierung: references/nextjs_optimization_guide.md
  • Best Practices: references/frontend_best_practices.md
  • Forcing-Questions-Bibliothek (Matt Pocock grill): references/forcing_questions.md
  • Kompositionskarte (welcher Spezialist für welchen Fork): references/composition_map.md

Annahmen und überprüfbare Erfolgskriterien (Karpathy-Disziplin)

Bevor dieser Skill eine Komponente erstellt, ein Framework empfiehlt oder ein Bundle prüft, MÜSSEN die folgenden vier Annahmen offengelegt werden.

  1. Primäres Benutzergerät + Netzwerk — mobile-4G, Desktop-Fiber, Low-End-Android oder Unternehmensnetzwerk. Treibt jede Leistungsentscheidung.
  2. LCP-Ziel in Millisekunden — eine einzelne Zahl, nicht „schnell“. Treibt das Bundle-Budget und die Rendering-Wahl.
  3. SEO-abhängig vs. authentifizierungspflichtig — treibt das Rendering (SSR/SSG/RSC vs. SPA).
  4. WCAG-Ziel + benannter a11y-Verantwortlicher — AA, AAA oder Best-Effort. Treibt das a11y-Investment und die CI-Gates.

Überprüfbare Erfolgskriterien (Karpathy #4) — jede Empfehlung muss Folgendes enthalten:

  • Core Web Vitals-Ziele (LCP, INP, CLS) bei p75 auf dem primären Gerät
  • Ein JS-Bundle-Budget pro Route in KB-gzip
  • Ein Lighthouse a11y-Mindestwert + Leistungs-Mindestwert

Wenn eines dieser drei nicht angegeben ist, ist die Empfehlung unvollständig – kehren Sie zu Q2 der Forcing-Questions-Bibliothek zurück.

Das Werkzeug scripts/frontend_decision_engine.py kodiert diese Prüfungen: Es lehnt es ab, ein Profil ohne die vier Annahme-Eingaben zu empfehlen, und gibt die überprüfbaren Schwellenwerte für das passende Profil aus.


Anpassungsprofile

Vier integrierte Profile in profiles/ kalibrieren jede Empfehlung:

ProfilWann auswählenLCP-Ziel (mobile-4G p75)Bundle-Budget
next-app-routerSaaS-kundenorientiert, SEO + dynamisch, RSC-first2000ms150 KB-gzip / Route
remix-or-sveltekitMobile-4G primär, Low-JS-first, progressive Verbesserung1500ms80 KB-gzip / Route
vite-spaAuthentifizierungspflichtige App, Desktop/Unternehmen primär2500ms200 KB Init + 80 KB / Route
astro-or-staticMarketing / Docs / Blog, nahezu null Schreibvorgänge, SEO-kritisch1200ms30 KB JS / Seite

Wählen Sie ein Profil aus mit:

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

Das Tool gibt das am besten passende Profil, den Kompromiss des Zweitplatzierten (wenn innerhalb von 15 %), die Technologieauswahl, die zu vermeidenden Anti-Patterns für dieses Profil und die erforderlichen CI-Gates zurück.

Um ein benutzerdefiniertes Profil hinzuzufügen (z. B. die Standards Ihres Unternehmens für interne Tools): kopieren Sie profiles/vite-spa.json nach profiles/<ihr-unternehmen>.json und passen Sie constraints + success_thresholds an.


Kompositionskarte

Dieser Skill setzt NICHT den Umfang neu um, der von den POWERFUL-Stufen-Spezialisten abgedeckt wird. Er verzweigt (forkt) in diese hinein. Siehe references/composition_map.md für die vollständige Routing-Tabelle. Wichtige Forks:

BetreffFork in
WCAG-Audit, Kontrast, Screenreaderengineering-team/skills/a11y-audit/
Bundle-Profiling + Laufzeitleistungengineering/skills/performance-profiler/
Kinematografische / Scroll-Storytelling-Landingpageengineering-team/skills/epic-design/
Apple HIG (iOS / macOS / visionOS)product-team/skills/apple-hig-expert/
Pre-Commit-Karpathy-Reviewengineering/karpathy-coder/
Pre-Flight-Architektur-Grillengineering/grill-me/

Der cs-frontend-engineer-Agent orchestriert diese Forks über context: fork. Rufen Sie ihn von einem anderen Agenten auf mit Agent({subagent_type: "cs-frontend-engineer", prompt: "..."}) oder

…

[gekürzt zur Übersetzung]

Individual skills in this repo

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

bestagentkits/agency-skills

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.

bestagentkits/agency-skills

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.

bestagentkits/agency-skills

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.

Verwandte Skills