Communitygithub.com

beavon2010/claude-skills

Extrahiere eigenständige statische HTML-Dateien aus einer gebauten Webanwendung oder React-Komponenten, indem CSS und Bilder inline eingebunden werden. Nutze diese Fähigkeit, wenn ein bestimmter UI-Zustand erfasst, eine statische Version einer Seite geteilt oder Assets für den Stitch-Upload vorbereitet werden sollen – selbst wenn der Benutzer nur bittet, 'das HTML zu speichern' oder 'die Ansicht zu mocken'.

Was ist claude-skills?

Diese Fähigkeit ermöglicht es, aus jeder laufenden Webanwendung eine vollständig eigenständige statische HTML-Datei zu extrahieren, bei der sämtliches CSS und alle Bilder (einschließlich Base64-kodierte Daten-URIs) inline eingebunden sind. Sie eignet sich ideal, um einen bestimmten UI-Zustand zu konservieren, eine Seite statisch zu teilen oder für den Upload in Stitch vorzubereiten. Die Extraktion erfolgt entweder über Puppeteer (Strategie A, empfohlen) für höchste Wiedergabetreue und automatische Inline-Einbindung, oder über einen Browser-Subagenten (Strategie B) für interaktive Szenarien wie Klicken und Ausfüllen von Formularen. Als letztes Mittel steht eine statische Fallback-Methode (MockPage.jsx) zur Verfügung, wenn die Anwendung nicht lokal ausgeführt werden kann. Die Fähigkeit unterstützt eine Vielzahl von Frameworks (React, Vue, Angular, Svelte, Next.js, Storybook) und bietet zahlreiche Konfigurationsoptionen wie Wartezeiten, Viewport-Größe, Entfernung fixierter Elemente und Authentifizierungsskripte.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/beavon2010/claude-skills/tree/HEAD/.claude/skills/extract-static-html

In Ihrer bevorzugten KI fragen

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

Dokumentation

Extrahiere statisches HTML

Extrahiere eine eigenständige statische HTML-Datei aus jeder Webanwendung.

Welche Strategie verwenden

Du MUSST den Benutzer bitten, vor dem Fortfahren eine Strategie auszuwählen. Präsentiere die Optionen klar, empfehle Strategie A als bevorzugte Standardeinstellung und gib eine kurze Vor-/Nachteile-Zusammenfassung für jede Option, um dem Benutzer eine fundierte Entscheidung zu ermöglichen.

Strategie A (Puppeteer)Strategie B (Browser-Subagent)
WannApp läuft lokal, keine AuthentifizierungshürdeBenötigt Interaktion mit der Seite (Klicken, Formulare ausfüllen)
WiedergabetreueHöchste — berechnete Stile aufgelöstHoch — gerendertes DOM
EinrichtungNull — kein Mock nötigNull — kein Mock nötig
FrameworkBeliebigBeliebig
AusgabeSchreibt in Datei — keine GrößenbeschränkungKann im Agent-Kontext abgeschnitten werden

[!WARNING] Kontrollpunkt — Benutzerbestätigung erforderlich. Du MUSST den Benutzer fragen, welche Strategie er bevorzugt, bevor du fortfährst. Präsentiere die obige Vergleichstabelle, empfehle Strategie A als Standard und warte auf explizite Zustimmung. Triff die Entscheidung NICHT selbst und fahre erst fort, wenn der Benutzer bestätigt hat.


Strategie A: Puppeteer-Snapshot (Empfohlen)

Startet einen kopflosen Chrome-Browser, erfasst das vollständig gerenderte DOM und erzeugt eine eigenständige HTML-Datei mit allen inline eingebundenen CSS und als Base64 kodierten Bildern. Funktioniert mit jedem Framework — kein MockPage.jsx erforderlich.

Voraussetzungen

  • App läuft lokal (z. B. npm run dev)
  • Node.js mit puppeteer verfügbar (prüfen: node -e "require('puppeteer')")

Arbeitsablauf

  1. Starte die App und notiere den Port.

    [!WARNING] Kontrollpunkt — Benutzerbestätigung erforderlich. Nach dem Start des lokalen Servers MUSST du innehalten und den Benutzer um Bestätigung bitten, bevor du das Snapshot-Skript ausführst oder einen Browser-Subagenten startest. Melde die URL und den Port dem Benutzer, damit er überprüfen kann, ob die App läuft und korrekt rendert. Fahre NICHT mit dem Snapshot-Schritt fort, bis der Benutzer bestätigt.

  2. Führe das Snapshot-Skript aus:

    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173 \
      --output .stitch/home.html \
      --wait 2000
    
  3. Mehrere Seiten — einmal pro Route ausführen:

    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173 --output .stitch/home.html --wait 2000
    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173/pricing --output .stitch/pricing.html --wait 2000
    npx tsx <SKILL_DIR>/scripts/snapshot.ts \
      --url http://localhost:5173/dashboard --output .stitch/dashboard.html --wait 2000 --html-class dark
    
  4. Bereinige den Dev-Server: Wenn ein lokaler Dev-Server speziell für die Snapshot-Extraktion gestartet wurde, stelle sicher, dass der Server-Prozess gestoppt oder die Hintergrundaufgabe beendet wird, sobald die Extraktion abgeschlossen ist.

Skript-Flags

FlagStandardBeschreibung
--url(erforderlich)Zu erfassende URL
--output(erforderlich)Ausgabedateipfad
--wait1000Zusätzliche Wartezeit (ms) nach Netzwerkinaktivität. Erhöhen für Lazy-Loading-Apps.
--viewport1280x800Viewport-Größe als BREITExHÖHE
--html-class—Klasse(n) für das <html>-Element (z. B. dark)
--remove-fixedfalseEntferne fixierte/sticky-Elemente (Cookie-Banner, Chat-Widgets)
--full-heightfalsePasse Viewport an die volle Bildlaufhöhe an
--title—Überschreibe den Seitentitel (auf den Routenpfad setzen, z. B. /dashboard oder /settings/profile)
--auth-script—Pfad zu einem JS/TS-Modul, das eine Standard-async (page) => void-Funktion zur Authentifizierung exportiert
--inline-canvasfalseKonvertiere <canvas>-Elemente (ECharts, Chart.js, D3) in Base64-<img>-Tags

Was automatisch gemacht wird

  • Erfasst alle CSSOM-Regeln aus document.styleSheets (bewahrt dynamische Vite/Tailwind-Dev-Styles und CSS-in-JS)
  • Bindet alle <link rel="stylesheet"> → <style>-Blöcke inline ein
  • Konvertiert <img> src und srcset → Base64-Daten-URIs (überspringt externe Schriftarten)
  • Bindet gleichherkunft- und relative Icon-Font-Dateien (@font-face) als Base64-Daten-URIs ein, sodass Ligaturen nie als ASCII-Text gerendert werden
  • Bindet <source srcset>-URLs als Base64 ein
  • Entfernt fehlgeschlagene/tote srcset-Einträge, sodass der Browser auf das inline eingebundene src zurückfällt
  • Entfernt <script>-Tags, Vite-HMR-Dev-Style-Blöcke (createHotContext, import.meta.hot) und Dev-Overlays
  • Löst relative CSS-url()-Pfade vor dem Inline-Einbinden auf

Framework-Hinweise

FrameworkHinweise
React + ViteFunktioniert sofort. --wait 1000.
Next.js--wait 3000 für SSR-Hydration. URL: http://localhost:3000. <img srcset> von /_next/image wird automatisch als Base64 inline eingebunden.
Angular (@angular/cli / v17+)Funktioniert sofort mit ng serve (Standard-URL: http://localhost:4200). --wait 2000 für Angular Material / PrimeNG-Animation-Hydration und Lazy-Loaded-Routen.
Vue / NuxtFunktioniert sofort.
Svelte / SvelteKitFunktioniert sofort.
StorybookStory-URL verwenden: --url http://localhost:6006/?path=/story/...
SSR (Webpack)Möglicherweise längeres --wait erforderlich.

Fehlerbehebung

ProblemLösung
Bilder fehlen--wait erhöhen
Bilder werden nach Serverstopp als defekt angezeigtÜberprüfen, ob srcset inline eingebunden wurde – im Log nach "Inlined N images" suchen. Wenn srcset-URLs fehlgeschlagen sind, werden sie automatisch entfernt, sodass src (inline) verwendet wird.
Symbole werden als Text / Serifen-Unstyled-Schriftart angezeigtStelle sicher, dass snapshot.ts das CSSOM aus document.styleSheets erfasst (Schritt 0) und gleichherkunft-Icon-Fonts (@font-face) als Base64-Daten-URIs inline eingebunden werden.
Next.js /_next/image nicht inline eingebundenStelle sicher, dass der Dev-Server läuft, wenn der Snapshot ausgeführt wird – das Skript ruft optimierte Bilder vom laufenden Server ab.
Dunkelmodus nicht angewendet--html-class dark
Cookie-Banner in der Ausgabe--remove-fixed
Seite erfordert Anmeldung--auth-script ./auth.ts verwenden (siehe Auth-Geschützte Seiten unten)
Diagramme/Grafiken als leere Kästchen--inline-canvas verwenden, um <canvas> in Base64-<img> zu serialisieren
Cannot find module 'puppeteer'npm install -g puppeteer

Auth-Geschützte Seiten

Für Apps mit Login-Guards (Vue Router beforeEach, React ProtectedRoute usw.) ein kleines Auth-Skript erstellen, das in der Puppeteer-Sitzung ausgeführt wird:

// auth-myapp.ts
import type { Page } from 'puppeteer';

export default async function authenticate(page: Page) {
  // Beispiel 1: Login-Formular ausfüllen und absenden
  await page.type('#username', 'admin');
  await page.type('#password', 'password123');
  await page.click('#login-button');
  await page.waitForNavigation({ waitUntil: 'networkidle2' });

  // Beispiel 2: Cookies/localStorage direkt injizieren
  // await page.evaluate(() => {
  //   localStorage.setItem('token', 'mock-jwt-token');
  // });

  // Beispiel 3: Die eigene Login-API der App über Modulinjektion aufrufen (Vue/Vite)
  // await page.evaluate(() => {
  //   return new Promise((resolve) => {
  //     const script = document.createElement('script');
  //     script.type = 'module';
  //     script.textContent = `
  //       import { useUserStore } from '/src/store/modules/user.ts';
  //       import { fetchLogin } from '/src/api/auth.ts';
  //       const res = await fetchLogin({ userName: 'Admin', password: '123456' });
  //       useUserStore().setToken(res.token, res.refreshToken);
  //       window.dispatchEvent(new CustomEvent('auth-done'));
  //     `;
  //     document.head.appendChild(script);
  //     window.addEventListener('auth-done', () => resolve(true), { once: true });
  //   });
  // });
}

Dann verwenden:

npx tsx <SKILL_DIR>/scripts/snapshot.ts \
  --url http://localhost:5173/#/dashboard \
  --output .stitch/dashboard.html \
  --auth-script ./auth-myapp.ts \
  --inline-canvas \
  --wait 5000

Das Skript navigiert zuerst zur --url (die möglicherweise zur Anmeldung weiterleitet), führt die Auth-Funktion aus und navigiert dann erneut zur ursprünglichen --url mit der authentifizierten Sitzung.


Strategie B: Browser-Subagent-Erfassung

Verwende diese Strategie, wenn du mit der Seite interagieren musst (Schaltflächen klicken, Formulare ausfüllen, Tabs navigieren), bevor du sie erfasst. Der Browser-Subagent gibt dir die volle Kontrolle, aber die Ausgabe kann bei großen Seiten abgeschnitten werden.

Arbeitsablauf

  1. Starte die App lokal.

  2. Navigiere mit einem Browser-Subagenten.

  3. Interagiere nach Bedarf (Klicken, Scrollen, Formulare ausfüllen).

  4. Extrahiere das DOM: document.documentElement.outerHTML

    [!WARNING] Große Seiten können abgeschnitten werden. So gehst du damit um:

    • Entferne <style>-Tags vor der Extraktion: document.querySelectorAll('style').forEach(el => el.remove())
    • Füge Styles statisch wieder hinzu (Tailwind-CDN-Link, Quell-CSS)
  5. Speichere in einer Datei.


Anhang: Statischer Fallback (MockPage.jsx)

[!NOTE] Diese Methode ist eine letzte Notlösung für den Fall, dass die App nicht lokal ausgeführt werden kann (kaputte Abhängigkeiten, fehlendes Backend, Authentifizierungshürden ohne Umgehung). Sie erfordert das manuelle Flatten von React-Komponenten in eine einzige JSX-Datei. Bevorzuge wann immer möglich Strategie A.

Wann verwenden

  • App kann überhaupt nicht lokal ausgeführt werden
  • Seite erfordert Authentifizierung ohne Mock/Umgehung
  • Ein bestimmter UI-Zustand wird benötigt, der durch Navigation nicht erreichbar ist (Fehlerbildschirme, leere Zustände)

Kurzreferenz

npx tsx <SKILL_DIR>/scripts/extract_inline_html.ts \
  --index-css src/css/App.css \
  --extra-css index.html \
  --outdir .stitch \
  --page src/MockPage.jsx:Page.html:"Page Title"

Wichtige Flags: --no-tailwind (Nicht-Tailwind-Apps), --html-class dark (Dunkelmodus), --css-files (zusätzliche CSS-Dateien).

Auto-Erkennung: Tailwind-Konfiguration wird automatisch erkannt. @apply-Direktiven verwenden automatisch <style type="text/tailwindcss">.

MockPage.jsx-Regeln

  1. Füge das vollständige Layout ein — Kopfzeile, Seitenleiste, Fußzeile (lies zuerst App.js)
  2. Flatte alle Bedingungen — wähle einen Zustand, entferne alle Ternäre und &&-Guards
  3. Harte Kodierung aller Daten — ersetze {variable} durch konkrete Werte, rolle .map()-Schleifen auf
  4. Logos beibehalten — verwende <img> mit lokalen Pfaden (die Nachbearbeitung bindet sie inline ein)
  5. Schwebende Elemente entfernen — Cookie-Banner, Chat-Widgets, Feedback-Buttons

Nachbearbeitung

Lokale Bilder inline einbinden:

npx tsx <SKILL_DIR>/scripts/post_process.ts \
  .stitch/Page.html --base-dir <app-directory>

Individual skills in this repo

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

beavon2010/claude-skills

>- Convert frontend code (Vite, React, Angular, Vue, etc.) to a Stitch Design by chaining static HTML extraction, design system extraction, and file upload. **ALWAYS** use this skill when the user's intent is to move existing web apps or React/Angular/Vue components into Stitch (e.g., requests to "save", "migrate", or "upload"). You must use this skill even for simple "save" operations, as it is the only way to ensure the design system is extracted and assets are properly linked.

beavon2010/claude-skills

Analyze Stitch projects and synthesize a semantic design system into DESIGN.md files

beavon2010/claude-skills

Transforms vague UI ideas into polished, Stitch-optimized prompts. Enhances specificity, adds UI/UX keywords, injects design system context, and structures output for better generation results.

beavon2010/claude-skills

>- Extract a comprehensive design system (DESIGN.md) directly from frontend source code — React, Vue, Svelte, Angular, plain HTML/CSS, or any web framework. Analyzes component files, stylesheets, Tailwind configs, theme definitions, and design tokens to produce a rich, Stitch-compatible design system document. Use this skill whenever the user wants to reverse-engineer a design system from an existing codebase, audit the visual language of a project, extract design tokens from source files, or understand the styling patterns in a frontend repo — even if they just say "what does this app look like?" or "pull out the design from this code.

Verwandte Skills