<h1 align="center">
<a href="https://prompts.chat">
Film. Image dominates everything. Text is minimal — like subtitles in a foreign film.
Loading actions...
<a href="https://prompts.chat">
TypeScript and ESLint rules that MUST be followed when creating, modifying, or reviewing any file under apps/frontend/, including .ts, .tsx, .js, and .jsx files. Also apply when discussing frontend linting, type safety, or ESLint configuration.
risks
Film. Image dominates everything. Text is minimal — like subtitles in a foreign film.
Cinema does not explain. It shows. The cinematic template strips away every piece of UI chrome and lets the image occupy the entire viewport. Text appears only as subtitles — two lines max, centered at the bottom, semi-transparent. The letterbox bars reinforce the film frame. The viewer should forget they are in a browser. This is a screening room.
object-fit: cover — no borders, no frames, no containmentrgba(0,0,0,0.6) — visible enough to read, transparent enough to see throughrgba(0,0,0,0.6) — NOT a box, just a gradient wash{
"layout": "cinematic",
"show_speaker_badge": false,
"image_sizing": "cover",
"text_position": "overlay-bottom",
"transition": "crossfade",
"typewriter_speed": 0,
"viewer_style": "cinematic"
}
Note: typewriter_speed: 0 means no typewriter effect — text appears via fade, not character by character. Subtitles should not typewrite.
/* Letterbox bars — cinematic framing */
.letterbox-top,
.letterbox-bottom {
position: fixed;
left: 0; right: 0;
height: 8vh;
background: #000;
z-index: 10;
pointer-events: none;
}
.letterbox-top { top: 0; }
.letterbox-bottom { bottom: 0; }
/* Full-bleed image */
.panel-image {
position: absolute;
inset: 0;
width: 100%;
height: 100vh;
object-fit: cover;
}
/* Slow Ken Burns — cinematic patience */
.panel-image.active {
animation: ken-burns-slow 35s ease-in-out infinite alternate;
}
@keyframes ken-burns-slow {
from { transform: scale(1.0); }
to { transform: scale(1.05) translate(-0.5%, -0.5%); }
}
/* Subtitle area */
.subtitle-container {
position: fixed;
bottom: 10vh;
left: 50%;
transform: translateX(-50%);
max-width: 70%;
text-align: center;
z-index: 5;
}
/* Subtitle text */
.subtitle-text {
font-family: 'Inter', sans-serif;
font-size: 1.0rem;
font-weight: 400;
letter-spacing: 0.03em;
color: #f0f0f0;
line-height: 1.6;
padding: 0.6rem 1.2rem;
background: linear-gradient(transparent, rgba(0,0,0,0.6) 20%, rgba(0,0,0,0.6) 80%, transparent);
border-radius: 4px;
opacity: 0;
transition: opacity 0.6s ease;
}
.subtitle-text.visible {
opacity: 1;
}
/* Crossfade transition */
.panel-exit {
animation: fade-out 1.2s ease-in-out forwards;
}
.panel-enter {
animation: fade-in 1.2s ease-in-out forwards;
}
@keyframes fade-out { to { opacity: 0; } }
@keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
/* Auto-advance indicator (thin progress bar) */
.auto-advance-bar {
position: fixed;
bottom: 8vh;
left: 15%;
width: 70%;
height: 2px;
background: rgba(255,255,255,0.1);
z-index: 6;
}
.auto-advance-progress {
height: 100%;
background: rgba(255,255,255,0.3);
transition: width linear;
}
/* Kill ALL UI chrome */
.progress-bar,
.panel-counter,
.stage-label,
.speaker-badge,
.navigation-arrows {
display: none !important;
}
Path to the HTML reference template: viewer-templates/cinematic.html