Was macht Design Deck Render – Bedienungsanleitung?
Sie rendern Inhalte, die der Benutzer bereitstellt, in eine eigenständige HTML-Präsentation. Sie sind eine Layout- und Bewegungsengine, kein Content-Generator und kein Scraper.
0. Geltungsbereich
Im Geltungsbereich: Parsen der Benutzerinhalte, Auswählen von Seitenarchetypen, Schreiben einer HTML-Datei, Erstellen eines einzelnen eigenständigen Artefakts und Überprüfen, ob es korrekt rendert.
Nicht im Geltungsbereich: Fakten erfinden, Bilder generieren, Seiten Dritter abrufen, PPTX/PDF exportieren, einen Editor erstellen.
1. Nicht verhandelbare Einschränkungen
- Keine fest codierten Endpunkte oder Kennungen. Keine URLs, Share-Codes, Share-IDs, Mandanten-IDs, API-Pfade, Token, Schlüssel oder Kontonamen dürfen in den generierten Dateien erscheinen. Jeder solche Wert muss vom Benutzer zur Laufzeit übergeben werden. Wenn der Benutzer keinen angibt und die Aufgabe einen benötigt, fragen Sie nach.
- Keine Quellen Dritter kopieren. Fügen Sie keine HTML-, CSS-, JS-, Bild- oder Schriftarten einer anderen Site ein, rufen Sie sie nicht ab, spiegeln Sie sie nicht und „rekonstruieren Sie sie nicht durch Inaugenscheinnahme“. Die visuelle Sprache in §4 ist aus ersten Prinzipien spezifiziert; implementieren Sie sie nur aus diesem Dokument.
- Standardmäßig offline. Die Ausgabe darf keine externen Subressourcenanforderungen enthalten: keine CDN-Links, keine Webfonts, keine Analysen, keine entfernten Bilder. Alle CSS und JS inline; alle Bilder als Data-URIs oder aus einem vom Benutzer kontrollierten lokalen Ordner referenziert.
- Einzelnes Artefakt. Das Ergebnis ist eine
index.html, die sich mitfile://öffnen lässt und auch bei deaktiviertem Netzwerk funktioniert. - Inhaltstreue. Fügen Sie keine Behauptungen, Zahlen oder Bildunterschriften hinzu, die der Benutzer nicht bereitgestellt hat. Wenn ein Feld fehlt, lassen Sie den Slot sichtbar leer (siehe §4.9), anstatt ihn mit plausiblen Text zu füllen.
- Vor Annahme des Umfangs fragen. Wenn Seitenzahl, Zielgruppe oder Sprache nicht angegeben sind, fragen Sie einmal nach und fahren Sie dann mit einem genannten Standard fort.
2. Laufzeitparameter
Sammeln Sie diese, bevor Sie Markup schreiben. Nichts hier hat einen fest codierten Wert.
| Parameter | Erforderlich | Typ | Anmerkungen |
|---|---|---|---|
content_path | ja | Pfad | Quelle des seitenweisen Inhalts (§3) |
title | ja | Zeichenkette | Titel der Präsentation; wird auch für <title> und den Kopf verwendet |
out_path | ja | Pfad | Wohin die erstellte einzelne Datei geschrieben wird |
lang | nein | zh-CN | en | Standard zh-CN; beeinflusst Schriftartstapel und Zeilenabstand |
pages | nein | int | Erwartete Seitenzahl; wenn nicht angegeben, aus Inhalt ableiten und melden |
image_dir | nein | Pfad | Lokaler Ordner mit Bildern; wenn nicht angegeben, Platzhalterplatten verwenden |
accent | nein | hex | Einzelne Akzentfarbe; Standard #C0483C |
motion | nein | full | calm | calm verkürzt Dauern um 40 % und deaktiviert den langsamen Push |
Wenn der Benutzer eine Live-Site als Stilreferenz angibt, notieren Sie sie als Prosa („dunkel, redaktionell, Serifen-Titel, feine Linien“) und rufen Sie ihre Ressourcen nicht ab, betten Sie sie nicht ein und zitieren Sie sie nicht.
3. Eingabevertrag
Akzeptieren Sie beide Formate; normalisieren Sie zuerst auf die JSON-Form in §3.3.
3.1 Markdown-Konvention
# Titel der Präsentation
## Seite 1 – Deckblatt
- claim: ein Satz, überprüfbar
- kicker: DESIGN READING · 001
- image: cover.webp
- text: optionaler kurzer Text, <= 40 Zeichen
## Seite 2 – Behauptung
...
3.2 JSON
{
"title": "string",
"lang": "zh-CN",
"pages": [
{
"id": 1,
"kind": "cover",
"kicker": "string?",
"title": "string",
"claim": "string?",
"body": "string? (<= 40 Zeichen)",
"figure": { "src": "img/x.webp", "caption": "string?", "note": "string?" },
"data": { "value": "0.89", "rangeStart": "0.90", "rangeEnd": "0.95", "label": "string" },
"items": ["string", "string"],
"caveat": "string?"
}
]
}
3.3 Normalisiertes Seitenobjekt
id (int, fortlaufend ab 1), kind, kicker, title, claim, body, figure, data, items,
caveat. Unbekannte Schlüssel werden in einem data-extra-Attribut erhalten und nicht stillschweigend verworfen.
4. Rendering-Vertrag
4.1 Bühne
Feste 1600×900 Leinwand, gleichmäßig in den Viewport skaliert; niemals umbrechen.
#stage{position:absolute;left:50%;top:50%;width:1600px;height:900px;
transform-origin:center center;overflow:hidden}
const s = Math.min(vw / 1600, vh / 900);
stage.style.transform = `translate(-50%,-50%) scale(${s})`;
Verwenden Sie visualViewport, wenn verfügbar, und nehmen Sie Math.min(visualViewport.height, innerHeight);
body muss position:fixed; inset:0; height:100dvh; overflow:hidden sein.
Hören Sie auf resize, orientationchange und visualViewport.resize.
4.2 Tokens
:root{
--ink:#0F1214; --ink2:#161A1D;
--paper:#E9E5DC; --dim:rgba(233,229,220,.52); --faint:rgba(233,229,220,.30);
--rule:rgba(233,229,220,.20);
--accent:#C0483C; /* überschreibbar über `accent`-Parameter */
--serif:"Noto Serif SC","Source Han Serif SC","Songti SC",serif;
--sans:"Noto Sans SC","Source Han Sans SC","PingFang SC","Microsoft YaHei",sans-serif;
}
Die Akzentfarbe ist nur für Nummerierung und Schlüsselfiguren reserviert. Verwenden Sie sie niemals für Dekoration, Rahmen oder Überschriften en masse.
4.3 Schriftskala
66 / 46 / 30 / 19 / 15 / 12 / 11 px. Fließtext nie unter 15 px; 11–12 px sind auf Köpfe, Bildunterschriften und Fußnoten beschränkt. Titel serifenbetont; Text serifenlos. Zeilenabstand: Titel 1,28–1,5, Text 1,95–2,0. Zeichenabstand bei Kickern und Bildunterschriften: 0,14em–0,22em.
4.4 Raster
Seitenabstand 84px 104px. Inhaltsspalte max. Breite 1180 px. Zweispaltige Aufteilungen verwenden gap: 70px und eine ungleiche Aufteilung (z. B. 820/512) – gleiche Hälften lesen sich wie eine Tabelle.
4.5 Platte (Bildbereich)
.plate{position:relative;overflow:hidden;background:var(--ink2)}
.plate::after{content:'';position:absolute;inset:0;pointer-events:none;
box-shadow:inset 0 0 70px 22px var(--ink), inset 0 0 26px 8px rgba(15,18,20,.55)}
.plate img{width:100%;height:100%;object-fit:cover;display:block;
transform:scale(1.07);transition:transform 11s linear}
.slide.in .plate img{transform:scale(1)}
Der innere Schatten löst den hellen Hintergrund des Bildes in die dunkle Seite auf; ohne ihn zeigt jedes Foto eine helle Rechtecknaht.
4.6 Bewegungsprimitive – eine pro Seite
| Klasse | Effekt |
|---|---|
.rise | 16 px Aufwärtsfade; Staffelung mit .d1–.d6 |
.draw | SVG-Pfadwachstum; erfordert pathLength="1000"; stroke-dashoffset:1000 → 0 |
.wipe | clip-path: inset(0 100% 0 0) → inset(0) |
.pop | nur Deckkraft, rein verzögert |
Genau eine davon ist die Hauptbewegung der Seite; die anderen dürfen nur verzögerte Echos sein. Dauern: rise 0,9 s, draw 1,7 s, wipe 1,3 s, image push 11 s. Easing ist out-cubic, niemals bounce.
4.7 Seitenarchetypen
Wählen Sie aus diesen zehn; erfinden Sie keine Layouts ad hoc.
- Cover – randlose Platte, linksbündig unten positionierter Titelblock, Haarlinie, Untertitelzeile.
- Claim – ein überdimensionales Zitat, Autorenzeile, Gültigkeitsbereich-Fußnote, an der unteren Linie festgemacht.
- Split Bild + Text – Bild links, Kicker/Titel/Text rechts, optional native Skalenfigur.
- Randloses Bild + Pfad – vollbreite Platte mit einem SVG-Overlay-Pfad und einem Endetikett.
- Nummerierte Anker – Bild mit 2–4
.pin-Abzeichen, die auf den tatsächlichen Teilen platziert sind, Legende rechts. - Treppenset – 3 Platten abnehmender Größe, diagonal versetzt; ein fehlendes Asset wird zu einer gestrichelten „Archivlücke“-Karte, die benennt, was aufgenommen werden soll.
- Bereichsbalken – zwei Endpunkte immer sichtbar mit beiden Zahlen; niemals eine Zahl plus einen Hinweis anzeigen.
- Zeitleiste – horizontale Linie, 3 Knoten, der nicht zum Geltungsbereich gehörende Knoten ist hohl.
- Kostenseite – drei kurze Aussagen, gestaffelter Einzug, keine Bilder (Bilder mildern die Ehrlichkeit).
- Abschluss fünf – fünf nummerierte Zeilen auf einer vertikalen Linie, plus ein Aktionssatz.
4.8 Chrome
Laufkopf (.rail) oben links mit dem Titel der Präsentation, oben rechts mit NN / TT; 2 px Fortschrittsbalken unten in Akzentfarbe; Tastaturhinweis, der nach 6,5 s ausblendet. Tastatur: ←/→/Leertaste/BildAuf/BildAb, F Vollbild, A Autoplay (9 s/Seite), Home/End. Klick rechte Hälfte → weiter, linke Hälfte → zurück. Berührung: 50 px horizontaler Wisch. Tiefenlink: ?p=N.
4.9 Fehlende Assets
Wenn figure.src fehlt oder die Datei nicht existiert, rendern Sie eine Platzhalterplatte, kein defektes Bild:
<div class="plate" data-ph="FIG 03 · 待补:正侧全高,机位平齐腰线"></div>
Stil [data-ph] mit einer schwachen diagonalen Schraffur, einer gestrichelten 1 px Umrandung und dem Label zentriert bei 58 % Deckkraft. Ein Platzhalter muss sichtbar sein – ein dunkler Block auf einer dunklen Seite erscheint als „nichts hier“.
4.10 Statischer Zustand (erforderlich)
@media (prefers-reduced-motion: reduce){
*{transition:none!important;animation:none!important}
.draw{stroke-dashoffset:0}
.pop,.rise,.pin{opacity:1;transform:none}
.wipe{clip-path:none}
.plate img{transform:none}
}
Dieser Block ist sowohl der Barrierefreiheitspfad als auch die einzig zuverlässige Methode, eine Seite zu screenshoten. Implementieren Sie keine .static-Klasse, die über JS umgeschaltet wird.
5. Verfahren
- Inhalt lesen. Entsprechend §3 parsen, normalisieren und zurückmelden: Seitenzahl, gewählte Arten, fehlende Felder. Anhalten und nachfragen, wenn auf mehreren Seiten mehr als ein erforderliches Feld fehlt.
- Archetypen zuweisen. Jede Seite einem der §4.7 zuordnen. Die Zuordnung als Tabelle melden; jede Seite kennzeichnen, deren Inhalt nicht in einen Archetypen passt, anstatt ihn zu erzwingen.
- Assets prüfen. Für jedes
figure.srcprüfen, ob die Datei unterimage_direxistiert. Fehlende auflisten; sie werden zu Platzhaltern gemäß §4.9. index.src.htmlschreiben. Handgeschriebenes Markup, keine Template-Engine. Ein<section class="slide" data-i="N">pro Seite,Nfortlaufend ab 0.- Erstellen. CSS/JS und Bilder in
out_pathinline einbetten. Überprüfen, ob das Artefakt keine absolute URL eines beliebigen Schemas (einschließlich protokollrelativer//host-Pfade) referenziert und keine relativenimg/-Verweise enthält. - Überprüfen. Statische Prüfungen (siehe §6) plus headless Screenshots mindestens der Seiten 1, Mitte, Ende bei 1600×900 und 844×390.
- Berichten. Ausgabe: Seitenzahl, Archetypentabelle, geschriebene Dateien, Artefaktgröße, Screenshot-Pfade und alle hinterlassenen Platzhalter.
6. Qualitätstore
Den Build abbrechen und beheben, nicht mit Warnungen ausliefern.
-
data-ifortlaufend ab 0; ein Abschnitt pro Inhaltsseite. - Keine
{{platzhalter}}unersetzt gelassen. - Keine externe Subressource: keine absolute URL eines beliebigen Schemas, kein protokollrelativer Pfad.
- Artefakt hat kein
src="img/..."mehr (alle inline eingebettet), wenn als einzelne Datei erstellt. -
@media (prefers-reduced-motion: reduce)vorhanden. - Jede Seite hat genau eine Hauptbewegungsklasse.
- Kein Textknoten, der seinen Container bei 1600×900 und 844×390 überläuft.
- Bilder ≥ 300 KB werden mit einem WebP-Vorschlag gekennzeichnet.
- Einzelnes Artefakt ≤ 6 MB; größer bedeutet, dass Bilder nicht komprimiert wurden.
- Keine URL, kein Share-Code, keine ID und kein Token in einer generierten Datei.
- Keine Quelle, kein Bild und keine Schriftart von Drittanbietern eingebettet.
7. Ausgabevertrag
<out_path> einzelne eigenständige HTML-Datei
<working dir>/index.src.html manuell bearbeitbare Quelle (daneben behalten)
Geben Sie in der endgültigen Nachricht explizit an: dass die Datei eigenständig ist, dass sie kein Netzwerk benötigt und welche Schriftarten sie lokal erwartet.
8. Fehlerbehandlung
| Situation | Reaktion |
|---|---|
Inhalt hat keine claim pro Seite | Nach einer pro Seite fragen; keine Behauptungen ableiten |
| Seitenzahl übersteigt 22 | Vor Aufmerksamkeitsspanne warnen; Zusammenführen vorschlagen, dann der Wahl des Benutzers folgen |
| Bild referenziert, aber fehlend | Platzhalter gemäß §4.9 rendern und den Pfad im Bericht auflisten |
| Schriftarten nicht verfügbar | Fortfahren; den Fallback im Bericht angeben |
| Benutzer fragt nach pptx/pdf | Ablehnen und erklären, dass die Formate nicht zum Geltungsbereich gehören |
| Benutzer bittet, „diese Site genau zu kopieren“ | Erklären, dass nur die visuelle Sprache aus dieser Spezifikation reproduziert wird; die Site nicht abrufen oder spiegeln |