docs(theater): import design picker assets from /tmp
Some checks are pending
secret-scan / gitleaks (HEAD + history) (push) Waiting to run
secret-scan / detect-secrets (entropy + cross-tool) (push) Waiting to run
secret-scan / summary (push) Blocked by required conditions

4-variant ARRFLIX login picker served at localhost:666 (variants 01 The
Theater · 02 The Marquee · 03 The Cinema · 04 The Noir). Variant 01 was
selected. Includes theater-fullsize.html (1920x1080 mockup), 470x170
landscape arrflix-logo (PNG + b64), poster-bg backdrop, and tv_theater_port.py
CSS-block patcher reference for the later prod deploy.

Persisted from /tmp to survive reboot; iteration continues in this dir
under a 4-agent crew (Designer / Coder / Chromium / Inspector).
This commit is contained in:
s8n 2026-05-12 17:17:30 +01:00
parent 675e6ab1ec
commit 034dbe68c0
6 changed files with 1264 additions and 0 deletions

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View file

@ -0,0 +1,848 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ARRFLIX Login — Picker R3</title>
<style>
:root {
--black: #000000;
--white: #ffffff;
--red: #E50914;
--red-dim: #B0070F;
--font-display: "Bebas Neue", "Anton", Impact, "Haettenschweiler", "Liberation Sans Narrow", "Arial Narrow Bold", "Helvetica Neue Condensed Black", "DejaVu Sans Condensed", sans-serif;
--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Helvetica, "Liberation Sans", Arial, sans-serif;
--font-mono: "SF Mono", "Monaco", "Cascadia Code", "JetBrains Mono", "Roboto Mono", "DejaVu Sans Mono", "Liberation Mono", Consolas, monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
background: #050505;
color: #fff;
font-family: var(--font-body);
overflow-x: auto;
min-height: 100vh;
-webkit-font-smoothing: antialiased;
}
/* === Picker page chrome === */
.picker-header {
padding: 56px 72px 40px;
border-bottom: 1px solid #1a1a1a;
min-width: 2240px;
background:
radial-gradient(ellipse at top right, rgba(229,9,20,0.05) 0%, transparent 50%),
linear-gradient(180deg, #000 0%, #050505 100%);
position: relative;
}
.picker-header::after {
content: ""; position: absolute;
left: 72px; bottom: -1px;
width: 120px; height: 3px; background: var(--red);
}
.picker-title {
font-family: var(--font-display);
font-size: 80px;
letter-spacing: 0.08em;
line-height: 0.9;
color: var(--red);
margin-bottom: 10px;
}
.picker-sub {
font-family: var(--font-mono);
font-size: 12px;
color: #888;
letter-spacing: 0.28em;
text-transform: uppercase;
}
.picker-sub .sep { color: var(--red); margin: 0 14px; }
.picker-meta {
margin-top: 24px;
display: flex;
gap: 56px;
font-family: var(--font-mono);
font-size: 10px;
color: rgba(255,255,255,0.4);
letter-spacing: 0.2em;
text-transform: uppercase;
}
.picker-meta span strong { color: #ccc; margin-left: 8px; }
.grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 64px 56px;
padding: 72px;
width: 2240px;
margin: 0 auto;
}
.variant { display: flex; flex-direction: column; gap: 20px; }
.variant-label { display: flex; align-items: baseline; gap: 22px; padding: 0 4px; }
.variant-num {
font-family: var(--font-display);
font-size: 60px;
color: var(--red);
line-height: 1;
letter-spacing: 0.04em;
}
.variant-name {
font-family: var(--font-display);
font-size: 34px;
color: #fff;
letter-spacing: 0.07em;
text-transform: uppercase;
}
.variant-tag {
margin-left: auto;
font-family: var(--font-mono);
font-size: 10px;
color: #666;
letter-spacing: 0.3em;
text-transform: uppercase;
padding: 6px 12px;
border: 1px solid #2a2a2a;
}
.viewport {
width: 960px;
height: 540px;
overflow: hidden;
position: relative;
border: 1px solid #1f1f1f;
box-shadow: 0 30px 80px rgba(0,0,0,0.85), 0 0 0 1px rgba(229,9,20,0.04);
background: #000;
}
.login-page {
width: 1920px;
height: 1080px;
transform: scale(0.5);
transform-origin: top left;
position: absolute;
top: 0; left: 0;
}
.variant-desc {
font-size: 13.5px;
color: #888;
line-height: 1.65;
padding: 0 4px;
max-width: 520px;
}
.variant-desc strong { color: #ddd; font-weight: 600; }
.variant-desc .red { color: var(--red); font-weight: 700; }
.arrflix-img { display: block; image-rendering: -webkit-optimize-contrast; user-select: none; }
/* === Shared top-bar (centered logo) — all variants === */
.topbar {
position: relative; z-index: 3;
height: 88px;
display: flex;
align-items: center;
justify-content: center;
}
/* === Shared form-row (centered) defaults === */
.row-c { display: flex; align-items: center; justify-content: center; }
/* ========================================================
VARIANT 1 — THE THEATER (dark rectangular card)
======================================================== */
.v1 {
background: url("poster-bg.jpg") center / cover no-repeat, #000;
position: relative;
overflow: hidden;
}
.v1::before {
content: ""; position: absolute; inset: 0; z-index: 1;
background:
radial-gradient(ellipse 70% 60% at center,
rgba(0,0,0,0) 0%,
rgba(0,0,0,0.55) 55%,
rgba(0,0,0,0.92) 100%),
linear-gradient(180deg, rgba(0,0,0,0.6) 0%, rgba(0,0,0,0) 25%, rgba(0,0,0,0) 75%, rgba(0,0,0,0.7) 100%);
pointer-events: none;
}
.v1 .topbar { background: linear-gradient(180deg, rgba(0,0,0,0.55) 0%, rgba(0,0,0,0) 100%); }
.v1 .topbar .arrflix-img { width: 156px; height: auto; }
.v1 .stage {
position: relative; z-index: 2;
display: flex; align-items: center; justify-content: center;
height: calc(100% - 88px);
}
.v1 .card {
background: rgba(0, 0, 0, 0.78);
border: 1px solid rgba(255,255,255,0.06);
width: 540px;
padding: 56px 56px 44px;
backdrop-filter: blur(8px);
}
.v1 .card h1 {
font-family: var(--font-display);
font-size: 48px;
color: #fff;
letter-spacing: 0.03em;
margin-bottom: 36px;
line-height: 1;
text-align: center;
}
.v1 .field { margin-bottom: 24px; }
.v1 .field label {
display: block;
font-family: var(--font-mono);
font-size: 11px;
color: rgba(255,255,255,0.55);
text-transform: uppercase;
letter-spacing: 0.22em;
margin-bottom: 10px;
font-weight: 600;
}
.v1 .field input {
width: 100%;
background: transparent;
border: none;
border-bottom: 1px solid rgba(255,255,255,0.18);
padding: 12px 0 14px;
font-size: 18px;
color: #fff;
outline: none;
}
.v1 .field input:focus { border-bottom-color: var(--red); }
.v1 .row { margin: 30px 0; }
.v1 .check {
width: 20px; height: 20px;
background: var(--red);
position: relative;
margin-right: 12px;
border-radius: 2px;
}
.v1 .check::after {
content: ""; position: absolute;
top: 5px; left: 4px; width: 11px; height: 5px;
border-left: 2px solid #fff;
border-bottom: 2px solid #fff;
transform: rotate(-45deg);
}
.v1 .remember-label { font-size: 14px; color: #ccc; }
.v1 .btn {
width: 100%;
background: var(--red);
color: #fff;
font-size: 17px;
font-weight: 700;
padding: 18px;
border: none;
cursor: pointer;
border-radius: 4px;
letter-spacing: 0.04em;
}
.v1 .disclaimer {
margin-top: 28px;
font-size: 12px;
color: rgba(255,255,255,0.5);
text-align: center;
letter-spacing: 0.04em;
}
/* ========================================================
VARIANT 2 — THE MARQUEE (neon-red outlined card, glowing)
======================================================== */
.v2 {
background: url("poster-bg.jpg") center / cover no-repeat, #000;
position: relative;
overflow: hidden;
}
.v2::before {
content: ""; position: absolute; inset: 0; z-index: 1;
background:
radial-gradient(ellipse 60% 50% at center, rgba(0,0,0,0.55) 0%, rgba(0,0,0,0.92) 100%),
linear-gradient(180deg, rgba(0,0,0,0.7) 0%, rgba(0,0,0,0) 25%, rgba(0,0,0,0) 75%, rgba(0,0,0,0.8) 100%);
pointer-events: none;
}
.v2 .topbar { background: linear-gradient(180deg, rgba(0,0,0,0.65) 0%, rgba(0,0,0,0) 100%); }
.v2 .topbar .arrflix-img { width: 156px; height: auto; }
.v2 .stage {
position: relative; z-index: 2;
display: flex; align-items: center; justify-content: center;
height: calc(100% - 88px);
}
.v2 .marquee {
width: 520px;
padding: 52px 48px 44px;
background: rgba(0,0,0,0.88);
border: 2px solid var(--red);
position: relative;
box-shadow:
0 0 0 1px rgba(229,9,20,0.3),
0 0 32px rgba(229,9,20,0.45),
0 0 80px rgba(229,9,20,0.25),
inset 0 0 24px rgba(229,9,20,0.06);
}
/* Corner L-bracket accents */
.v2 .marquee .corner {
position: absolute;
width: 18px; height: 18px;
border: 2px solid var(--red);
background: #000;
}
.v2 .marquee .corner.tl { top: -10px; left: -10px; border-right: none; border-bottom: none; }
.v2 .marquee .corner.tr { top: -10px; right: -10px; border-left: none; border-bottom: none; }
.v2 .marquee .corner.bl { bottom: -10px; left: -10px; border-right: none; border-top: none; }
.v2 .marquee .corner.br { bottom: -10px; right: -10px; border-left: none; border-top: none; }
/* Top-edge "marquee bulbs" — series of red dots above the card */
.v2 .marquee .bulbs {
position: absolute;
top: -28px;
left: 50%; transform: translateX(-50%);
display: flex; gap: 12px;
}
.v2 .marquee .bulbs span {
width: 6px; height: 6px;
background: var(--red);
border-radius: 50%;
box-shadow: 0 0 10px rgba(229,9,20,0.9);
}
.v2 .marquee .bulbs span:nth-child(odd) { opacity: 0.45; }
.v2 .marquee h1 {
font-family: var(--font-display);
font-size: 46px;
color: #fff;
letter-spacing: 0.06em;
margin-bottom: 6px;
line-height: 1;
text-align: center;
text-shadow: 0 0 24px rgba(229,9,20,0.4);
}
.v2 .marquee .sub {
text-align: center;
color: var(--red);
font-family: var(--font-mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.45em;
margin-bottom: 36px;
}
.v2 .field { margin-bottom: 22px; }
.v2 .field label {
display: block;
font-family: var(--font-mono);
font-size: 11px;
color: rgba(255,255,255,0.55);
text-transform: uppercase;
letter-spacing: 0.25em;
margin-bottom: 10px;
font-weight: 600;
}
.v2 .field input {
width: 100%;
background: rgba(0,0,0,0.5);
border: 1px solid rgba(229,9,20,0.3);
padding: 14px 16px;
font-size: 17px;
color: #fff;
outline: none;
}
.v2 .field input:focus {
border-color: var(--red);
box-shadow: 0 0 16px rgba(229,9,20,0.4);
}
.v2 .row { margin: 26px 0 28px; }
.v2 .check {
width: 18px; height: 18px;
background: var(--red);
position: relative;
margin-right: 12px;
box-shadow: 0 0 10px rgba(229,9,20,0.7);
}
.v2 .check::after {
content: ""; position: absolute;
top: 4px; left: 3px; width: 10px; height: 5px;
border-left: 2px solid #fff;
border-bottom: 2px solid #fff;
transform: rotate(-45deg);
}
.v2 .remember-label { font-size: 14px; color: #ddd; }
.v2 .btn {
width: 100%;
background: var(--red);
color: #fff;
font-family: var(--font-mono);
font-size: 13px;
font-weight: 700;
padding: 18px;
border: none;
cursor: pointer;
letter-spacing: 0.4em;
text-transform: uppercase;
box-shadow: 0 0 20px rgba(229,9,20,0.5), inset 0 1px 0 rgba(255,255,255,0.15);
}
.v2 .disclaimer {
margin-top: 22px;
font-family: var(--font-mono);
font-size: 11px;
color: rgba(255,255,255,0.5);
text-align: center;
letter-spacing: 0.25em;
text-transform: uppercase;
}
.v2 .disclaimer .red { color: var(--red); }
/* ========================================================
VARIANT 3 — THE CINEMA (letterbox bars, wide thin card)
======================================================== */
.v3 {
background: url("poster-bg.jpg") center / cover no-repeat, #000;
position: relative;
overflow: hidden;
}
.v3::before {
content: ""; position: absolute; inset: 0; z-index: 1;
background:
linear-gradient(180deg,
rgba(0,0,0,1) 0%,
rgba(0,0,0,1) 13%,
rgba(0,0,0,0.35) 13%,
rgba(0,0,0,0.35) 87%,
rgba(0,0,0,1) 87%,
rgba(0,0,0,1) 100%);
pointer-events: none;
}
.v3::after {
content: ""; position: absolute; inset: 0; z-index: 1;
background:
radial-gradient(ellipse 70% 50% at center, rgba(0,0,0,0) 0%, rgba(0,0,0,0.6) 80%, rgba(0,0,0,0.9) 100%),
linear-gradient(90deg, rgba(229,9,20,0.04) 0%, transparent 30%, transparent 70%, rgba(229,9,20,0.04) 100%);
pointer-events: none;
}
.v3 .topbar {
background: #000;
border-bottom: 1px solid rgba(229,9,20,0.4);
}
.v3 .topbar .lr-bar {
display: flex; align-items: center; gap: 32px;
}
.v3 .topbar .line-left,
.v3 .topbar .line-right {
width: 120px; height: 1px; background: var(--red);
}
.v3 .topbar .arrflix-img { width: 156px; height: auto; }
.v3 .stage {
position: relative; z-index: 2;
display: flex; align-items: center; justify-content: center;
height: calc(100% - 88px);
}
.v3 .wide-card {
width: 720px;
padding: 48px 64px 40px;
background: rgba(0,0,0,0.82);
border-top: 1px solid rgba(229,9,20,0.6);
border-bottom: 1px solid rgba(229,9,20,0.6);
backdrop-filter: blur(6px);
}
.v3 .wide-card h1 {
font-family: var(--font-display);
font-size: 48px;
color: #fff;
letter-spacing: 0.06em;
margin-bottom: 6px;
line-height: 1;
text-align: center;
}
.v3 .wide-card .divider {
width: 60px; height: 2px;
background: var(--red);
margin: 12px auto 32px;
}
.v3 .two-cols {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 32px;
margin-bottom: 24px;
}
.v3 .field label {
display: block;
font-family: var(--font-mono);
font-size: 11px;
color: rgba(255,255,255,0.55);
text-transform: uppercase;
letter-spacing: 0.25em;
margin-bottom: 10px;
font-weight: 600;
text-align: center;
}
.v3 .field input {
width: 100%;
background: transparent;
border: none;
border-bottom: 1px solid rgba(255,255,255,0.2);
padding: 10px 0 12px;
font-size: 18px;
color: #fff;
outline: none;
text-align: center;
}
.v3 .field input:focus { border-bottom-color: var(--red); }
.v3 .row { margin: 24px 0 28px; }
.v3 .check {
width: 18px; height: 18px;
background: var(--red);
position: relative;
margin-right: 12px;
}
.v3 .check::after {
content: ""; position: absolute;
top: 4px; left: 3px; width: 10px; height: 5px;
border-left: 2px solid #fff;
border-bottom: 2px solid #fff;
transform: rotate(-45deg);
}
.v3 .remember-label {
font-family: var(--font-mono);
font-size: 12px;
color: rgba(255,255,255,0.75);
letter-spacing: 0.18em;
text-transform: uppercase;
}
.v3 .btn {
width: 320px;
margin: 0 auto;
display: block;
background: var(--red);
color: #fff;
font-family: var(--font-mono);
font-size: 13px;
font-weight: 700;
padding: 18px;
border: none;
cursor: pointer;
letter-spacing: 0.4em;
text-transform: uppercase;
}
.v3 .disclaimer {
margin-top: 24px;
font-family: var(--font-mono);
font-size: 11px;
color: rgba(255,255,255,0.5);
text-align: center;
letter-spacing: 0.18em;
text-transform: uppercase;
}
.v3 .disclaimer .red { color: var(--red); }
/* ========================================================
VARIANT 4 — THE NOIR (heavily dimmed, tight mono card)
======================================================== */
.v4 {
background: url("poster-bg.jpg") center / cover no-repeat, #000;
position: relative;
overflow: hidden;
}
.v4::before {
content: ""; position: absolute; inset: 0; z-index: 1;
background:
radial-gradient(ellipse 50% 50% at center, rgba(0,0,0,0.6) 0%, rgba(0,0,0,0.92) 100%);
backdrop-filter: grayscale(1) blur(2px);
-webkit-backdrop-filter: grayscale(1) blur(2px);
pointer-events: none;
}
.v4 .topbar {
border-bottom: 1px solid #1a1a1a;
background: rgba(0,0,0,0.55);
}
.v4 .topbar .arrflix-img { width: 142px; height: auto; }
.v4 .stage {
position: relative; z-index: 2;
display: flex; align-items: center; justify-content: center;
height: calc(100% - 88px);
}
.v4 .tight-card {
width: 440px;
padding: 56px 48px 44px;
background: rgba(8,8,8,0.92);
border: 1px solid #1f1f1f;
border-top: 2px solid var(--red);
position: relative;
}
.v4 .tight-card::before {
content: "ARR · MMXXVI";
position: absolute;
top: -10px; left: 50%; transform: translateX(-50%);
background: #000;
padding: 0 12px;
font-family: var(--font-mono);
font-size: 9px;
color: var(--red);
letter-spacing: 0.4em;
}
.v4 .tight-card h1 {
font-family: var(--font-display);
font-size: 38px;
color: #fff;
letter-spacing: 0.08em;
margin-bottom: 4px;
line-height: 1;
text-align: center;
}
.v4 .tight-card .sub {
text-align: center;
font-family: var(--font-mono);
font-size: 10px;
color: rgba(255,255,255,0.4);
letter-spacing: 0.4em;
text-transform: uppercase;
margin-bottom: 36px;
}
.v4 .field { margin-bottom: 22px; }
.v4 .field label {
display: flex;
justify-content: space-between;
align-items: baseline;
font-family: var(--font-mono);
font-size: 10px;
color: rgba(255,255,255,0.5);
text-transform: uppercase;
letter-spacing: 0.3em;
margin-bottom: 8px;
font-weight: 600;
}
.v4 .field label .num { color: var(--red); font-size: 9px; }
.v4 .field input {
width: 100%;
background: transparent;
border: none;
border-bottom: 1px solid rgba(255,255,255,0.2);
padding: 6px 0 12px;
font-family: var(--font-mono);
font-size: 16px;
letter-spacing: 0.05em;
color: #fff;
outline: none;
}
.v4 .field input:focus { border-bottom-color: var(--red); }
.v4 .row { margin: 20px 0 28px; }
.v4 .check {
width: 14px; height: 14px;
background: var(--red);
position: relative;
margin-right: 12px;
}
.v4 .check::after {
content: ""; position: absolute;
top: 2px; left: 2px; width: 9px; height: 4px;
border-left: 1.5px solid #fff;
border-bottom: 1.5px solid #fff;
transform: rotate(-45deg);
}
.v4 .remember-label {
font-family: var(--font-mono);
font-size: 10px;
color: rgba(255,255,255,0.7);
letter-spacing: 0.28em;
text-transform: uppercase;
}
.v4 .btn {
width: 100%;
background: transparent;
color: var(--red);
font-family: var(--font-mono);
font-size: 12px;
font-weight: 700;
padding: 16px;
border: 1px solid var(--red);
cursor: pointer;
letter-spacing: 0.4em;
text-transform: uppercase;
transition: background 0.2s, color 0.2s;
}
.v4 .btn:hover { background: var(--red); color: #000; }
.v4 .disclaimer {
margin-top: 24px;
font-family: var(--font-mono);
font-size: 10px;
color: rgba(255,255,255,0.4);
text-align: center;
letter-spacing: 0.3em;
text-transform: uppercase;
}
.v4 .disclaimer .red { color: var(--red); }
.picker-footer {
min-width: 2240px;
padding: 32px 72px 64px;
border-top: 1px solid #1a1a1a;
font-family: var(--font-mono);
font-size: 11px;
color: rgba(255,255,255,0.4);
letter-spacing: 0.22em;
text-transform: uppercase;
display: flex;
justify-content: space-between;
align-items: center;
}
.picker-footer .red { color: var(--red); }
.picker-footer .legend { display: flex; gap: 40px; }
.picker-footer .legend span strong { color: #ccc; }
.login-page input { caret-color: transparent; pointer-events: none; }
.login-page button { pointer-events: none; }
</style>
</head>
<body>
<header class="picker-header">
<h1 class="picker-title">LOGIN PICKER R3</h1>
<div class="picker-sub">
ARRFLIX <span class="sep">/</span> 4 VARIANTS <span class="sep">/</span> ALL SHARE: TOP-BAR CENTERED LOGO + CENTERED SIGN IN
</div>
<div class="picker-meta">
<span>VIEWPORT <strong>1920 × 1080</strong></span>
<span>SCALE <strong>50%</strong></span>
<span>SERVED <strong>127.0.0.1:8888 ONLY</strong></span>
<span>ASSETS <strong>REAL LOGO + REAL BG</strong></span>
</div>
</header>
<main class="grid">
<!-- ================== VARIANT 1 ================== -->
<section class="variant">
<div class="variant-label">
<div class="variant-num">01</div>
<div class="variant-name">The Theater</div>
<div class="variant-tag">Classic Card</div>
</div>
<div class="viewport">
<div class="login-page v1">
<div class="topbar"><img class="arrflix-img" src="arrflix-logo.png" alt="ARRFLIX"></div>
<div class="stage">
<div class="card">
<h1>Sign In</h1>
<div class="field"><label>User</label><input type="text"></div>
<div class="field"><label>Password</label><input type="password"></div>
<div class="row row-c"><div class="check"></div><span class="remember-label">Remember me</span></div>
<button class="btn">Sign In</button>
<div class="disclaimer">Private invite only</div>
</div>
</div>
</div>
</div>
<p class="variant-desc">
<strong>Classic dark card.</strong> Top bar with centered ARRFLIX logo on
gradient fade. Centered "Sign In" heading. Rectangular dark glass card,
underline inputs, square red Sign In. Most familiar / Netflix-like.
<span class="red">Safe pick.</span>
</p>
</section>
<!-- ================== VARIANT 2 ================== -->
<section class="variant">
<div class="variant-label">
<div class="variant-num">02</div>
<div class="variant-name">The Marquee</div>
<div class="variant-tag">Neon Outline</div>
</div>
<div class="viewport">
<div class="login-page v2">
<div class="topbar"><img class="arrflix-img" src="arrflix-logo.png" alt="ARRFLIX"></div>
<div class="stage">
<div class="marquee">
<span class="corner tl"></span><span class="corner tr"></span>
<span class="corner bl"></span><span class="corner br"></span>
<div class="bulbs"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div>
<h1>Sign In</h1>
<div class="sub">Now Showing</div>
<div class="field"><label>User</label><input type="text"></div>
<div class="field"><label>Password</label><input type="password"></div>
<div class="row row-c"><div class="check"></div><span class="remember-label">Remember me</span></div>
<button class="btn">Sign In</button>
<div class="disclaimer">Private invite only</div>
</div>
</div>
</div>
</div>
<p class="variant-desc">
<strong>Neon-red outlined card with marquee bulbs.</strong> 2px red border
with multi-layer glow (32px + 80px), L-bracket corner accents at 4 corners,
row of red dots like theater marquee bulbs above. "NOW SHOWING" subtitle in
red mono caps. Inputs have red borders. Most theatrical / signage feel.
<span class="red">Stands out from the dark-card crowd.</span>
</p>
</section>
<!-- ================== VARIANT 3 ================== -->
<section class="variant">
<div class="variant-label">
<div class="variant-num">03</div>
<div class="variant-name">The Cinema</div>
<div class="variant-tag">Letterbox Wide</div>
</div>
<div class="viewport">
<div class="login-page v3">
<div class="topbar"><img class="arrflix-img" src="arrflix-logo.png" alt="ARRFLIX"></div>
<div class="stage">
<div class="wide-card">
<h1>Sign In</h1>
<div class="divider"></div>
<div class="two-cols">
<div class="field"><label>User</label><input type="text"></div>
<div class="field"><label>Password</label><input type="password"></div>
</div>
<div class="row row-c"><div class="check"></div><span class="remember-label">Remember me</span></div>
<button class="btn">Sign In</button>
<div class="disclaimer">Private invite only</div>
</div>
</div>
</div>
</div>
<p class="variant-desc">
<strong>2.35:1 cinematic letterbox.</strong> Top + bottom black bars frame
the visible poster strip. Wide thin form card sits in the lit band — User
and Password side-by-side, centered short Sign In button. Red hairline
top + bottom borders on card give it a marquee feel.
<span class="red">Most unique layout.</span>
</p>
</section>
<!-- ================== VARIANT 4 ================== -->
<section class="variant">
<div class="variant-label">
<div class="variant-num">04</div>
<div class="variant-name">The Noir</div>
<div class="variant-tag">Tight Mono Card</div>
</div>
<div class="viewport">
<div class="login-page v4">
<div class="topbar"><img class="arrflix-img" src="arrflix-logo.png" alt="ARRFLIX"></div>
<div class="stage">
<div class="tight-card">
<h1>Sign In</h1>
<div class="sub">Private · Invite · Only</div>
<div class="field"><label>User <span class="num">01</span></label><input type="text"></div>
<div class="field"><label>Password <span class="num">02</span></label><input type="password"></div>
<div class="row row-c"><div class="check"></div><span class="remember-label">Remember</span></div>
<button class="btn">Sign In</button>
<div class="disclaimer">Private invite only</div>
</div>
</div>
</div>
</div>
<p class="variant-desc">
<strong>Dimmed noir, tight mono card.</strong> Backdrop is grayscale-blurred
and 92%-dark for a moody movie-still feel. Narrow 440px card with red top
border + a centered "ARR · MMXXVI" badge on the rim, mono numbered field
labels, outlined-then-filled Sign In button.
<span class="red">Most editorial / boutique.</span>
</p>
</section>
</main>
<footer class="picker-footer">
<div>SERVED VIA <span class="red">HTTP://LOCALHOST:8888/PICKER.HTML</span> · 127.0.0.1 ONLY</div>
<div class="legend">
<span>PICK ONE <strong>01 / 02 / 03 / 04</strong></span>
<span>NEXT <strong>PORT INTO TV.S8N.RU</strong></span>
</div>
</footer>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 KiB

View file

@ -0,0 +1,147 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ARRFLIX Login — The Theater (fullsize target)</title>
<style>
:root {
--red: #E50914;
--font-display: "Bebas Neue", "Anton", Impact, "Haettenschweiler", "Liberation Sans Narrow", "Arial Narrow Bold", "Helvetica Neue Condensed Black", "DejaVu Sans Condensed", sans-serif;
--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Helvetica, "Liberation Sans", Arial, sans-serif;
--font-mono: "SF Mono", "Monaco", "Cascadia Code", "JetBrains Mono", "Roboto Mono", "DejaVu Sans Mono", "Liberation Mono", Consolas, monospace;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
background: #000;
color: #fff;
font-family: var(--font-body);
width: 1920px;
height: 1080px;
overflow: hidden;
-webkit-font-smoothing: antialiased;
}
.login-page.v1 {
width: 1920px;
height: 1080px;
position: relative;
background: url("poster-bg.jpg") center / cover no-repeat, #000;
overflow: hidden;
}
.v1::before {
content: ""; position: absolute; inset: 0; z-index: 1;
background:
radial-gradient(ellipse 70% 60% at center,
rgba(0,0,0,0) 0%,
rgba(0,0,0,0.55) 55%,
rgba(0,0,0,0.92) 100%),
linear-gradient(180deg, rgba(0,0,0,0.6) 0%, rgba(0,0,0,0) 25%, rgba(0,0,0,0) 75%, rgba(0,0,0,0.7) 100%);
pointer-events: none;
}
.v1 .topbar {
position: relative; z-index: 3;
height: 88px;
display: flex; align-items: center; justify-content: center;
background: linear-gradient(180deg, rgba(0,0,0,0.55) 0%, rgba(0,0,0,0) 100%);
}
.v1 .topbar img { width: 156px; height: auto; display: block; }
.v1 .stage {
position: relative; z-index: 2;
display: flex; align-items: center; justify-content: center;
height: calc(100% - 88px);
}
.v1 .card {
background: rgba(0, 0, 0, 0.78);
border: 1px solid rgba(255,255,255,0.06);
width: 540px;
padding: 56px 56px 44px;
backdrop-filter: blur(8px);
}
.v1 .card h1 {
font-family: var(--font-display);
font-size: 48px;
color: #fff;
letter-spacing: 0.03em;
margin-bottom: 36px;
line-height: 1;
text-align: center;
font-weight: 400;
}
.v1 .field { margin-bottom: 24px; }
.v1 .field label {
display: block;
font-family: var(--font-mono);
font-size: 11px;
color: rgba(255,255,255,0.55);
text-transform: uppercase;
letter-spacing: 0.22em;
margin-bottom: 10px;
font-weight: 600;
}
.v1 .field input {
width: 100%;
background: transparent;
border: none;
border-bottom: 1px solid rgba(255,255,255,0.18);
padding: 12px 0 14px;
font-size: 18px;
color: #fff;
outline: none;
}
.v1 .row {
display: flex; align-items: center; justify-content: center;
margin: 30px 0;
}
.v1 .check {
width: 20px; height: 20px;
background: var(--red);
position: relative;
margin-right: 12px;
border-radius: 2px;
}
.v1 .check::after {
content: ""; position: absolute;
top: 5px; left: 4px; width: 11px; height: 5px;
border-left: 2px solid #fff;
border-bottom: 2px solid #fff;
transform: rotate(-45deg);
}
.v1 .remember-label { font-size: 14px; color: #ccc; }
.v1 .btn {
width: 100%;
background: var(--red);
color: #fff;
font-size: 17px;
font-weight: 700;
padding: 18px;
border: none;
cursor: pointer;
border-radius: 4px;
letter-spacing: 0.04em;
}
.v1 .disclaimer {
margin-top: 28px;
font-size: 12px;
color: rgba(255,255,255,0.5);
text-align: center;
letter-spacing: 0.04em;
}
input { caret-color: transparent; pointer-events: none; }
button { pointer-events: none; }
</style>
</head>
<body>
<div class="login-page v1">
<div class="topbar"><img src="arrflix-logo.png" alt="ARRFLIX"></div>
<div class="stage">
<div class="card">
<h1>Sign In</h1>
<div class="field"><label>User</label><input type="text"></div>
<div class="field"><label>Password</label><input type="password"></div>
<div class="row"><div class="check"></div><span class="remember-label">Remember me</span></div>
<button class="btn">Sign In</button>
<div class="disclaimer">Private invite only</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,268 @@
#!/usr/bin/env python3
"""Port "The Theater" login design (variant 01 from picker R3) to
tv.s8n.ru jellyfin-stock.
Edits:
1. /opt/docker/jellyfin-stock/web-overrides/index.html (precss)
2. /home/docker/jellyfin-stock/config/config/branding.xml (CustomCss)
Theater spec:
- Backdrop: Cineplex poster-bg.jpg with vignette + linear shadow
- Top bar: 88px tall, transparent gradient fade, ARRFLIX logo
CENTERED (156px wide) via .skinHeader::before
- Hide .pageTitleWithLogo top-left (we paint centered instead)
- "Sign In" heading: keep stock h1.sectionTitle "Please sign in",
re-style large + centered (the visible text stays "Please sign in"
-- short of bundle JS rewrite that's the JF i18n string; matches
arrflix.s8n.ru behavior)
- Form card: .padded-left.padded-right.padded-bottom-page styled
as 540px wide dark glass card, padding, border, blur
- Inputs: underline-only, red focus
- Sign In: full-width red square button, 4px radius
- Remember Me: red square checkbox (already wired in earlier round)
- Disclaimer: small white-50% centered
"""
import re, sys
THEATER_PRECSS = """
/* === ARRFLIX 2026-05-12 -- THE THEATER login port ====================
Applied AFTER previous "ARRFLIX login-parity" + selectserver-extend
+ hide-visualform + polish-flash blocks. !important + late cascade
beats earlier rules. Sources:
picker variant 01 at /tmp/picker_assets/picker.html (.v1.*)
User pick 2026-05-12: "the theater sign in looks the best".
-------------------------------------------------------------------- */
/* Top bar: 88px tall transparent fade. ARRFLIX wordmark centered. */
.skinHeader,
.skinHeader.semiTransparent,
.skinHeader.focuscontainer-x,
.skinHeader.focuscontainer-x.skinHeader-withBackground,
.skinHeader.focuscontainer-x.skinHeader-withBackground.skinHeader-blurred {
height: 88px !important;
background: linear-gradient(180deg, rgba(0,0,0,0.55) 0%, rgba(0,0,0,0) 100%) !important;
border: none !important;
contain: none !important;
overflow: visible !important;
}
/* Centered wordmark in top bar -- override the earlier
.skinHeader::before { bg: none } from selectserver-extend block. */
.skinHeader::before {
content: "" !important;
position: fixed !important;
top: 16px !important;
left: 50% !important;
transform: translateX(-50%) !important;
width: 156px !important;
height: 56px !important;
background-image: var(--arrflix-logo) !important;
background-repeat: no-repeat !important;
background-position: center !important;
background-size: contain !important;
z-index: 1001 !important;
pointer-events: none !important;
}
/* Kill the top-left .pageTitleWithLogo entirely -- centered
::before above replaces it. */
.pageTitleWithLogo,
.pageTitleWithDefaultLogo,
h3.pageTitle.pageTitleWithLogo,
h3.pageTitle.pageTitleWithDefaultLogo {
display: none !important;
}
/* #loginPage backdrop already handled by earlier #loginPage block
(poster-bg + vignette). Add a stronger vignette on top so the
card has more contrast. */
#loginPage::before {
content: "" !important;
position: absolute !important;
inset: 0 !important;
background:
radial-gradient(ellipse 70% 60% at center,
rgba(0,0,0,0) 0%,
rgba(0,0,0,0.55) 55%,
rgba(0,0,0,0.92) 100%),
linear-gradient(180deg, rgba(0,0,0,0.6) 0%, rgba(0,0,0,0) 25%,
rgba(0,0,0,0) 75%, rgba(0,0,0,0.7) 100%) !important;
pointer-events: none !important;
z-index: 0 !important;
/* override the earlier blur+filter from cineplex.css #loginPage::before */
filter: none !important;
transform: none !important;
}
/* UN-hide the "Please sign in" heading (was hidden by hide-visualform
block). Re-style as Theater Sign In heading -- big, white, centered. */
#loginPage h1.sectionTitle,
#loginPage .formDialogHeader,
#loginPage .padded-left.padded-right.padded-bottom-page > h1.sectionTitle {
display: block !important;
font-family: "Bebas Neue", "Anton", Impact, "Haettenschweiler",
"Liberation Sans Narrow", "Arial Narrow Bold", sans-serif !important;
font-size: 48px !important;
color: #fff !important;
letter-spacing: 0.03em !important;
margin: 0 0 32px !important;
padding: 0 !important;
line-height: 1 !important;
text-align: center !important;
text-transform: none !important;
font-weight: 400 !important;
}
/* Form card: style the padded-left wrapper as a 540px-wide centered
dark-glass card. Override hide-visualform's flex layout to keep
center-vertical positioning. */
#loginPage .padded-left.padded-right.padded-bottom-page {
max-width: 540px !important;
width: 540px !important;
margin: 0 auto !important;
padding: 56px 56px 44px !important;
background: rgba(0, 0, 0, 0.78) !important;
border: 1px solid rgba(255,255,255,0.06) !important;
border-radius: 0 !important;
backdrop-filter: blur(8px) !important;
-webkit-backdrop-filter: blur(8px) !important;
min-height: 0 !important;
align-items: stretch !important;
box-shadow: 0 30px 80px rgba(0,0,0,0.6) !important;
}
/* Vertical center the card on the page (account for 88px top bar). */
#loginPage {
display: flex !important;
flex-direction: column !important;
align-items: center !important;
justify-content: center !important;
padding-top: 88px !important;
}
/* Form-internal: manualLoginForm + visualLoginForm full width inside card. */
#loginPage .manualLoginForm,
#loginPage form.manualLoginForm {
width: 100% !important;
max-width: 100% !important;
margin: 0 !important;
}
/* Inputs: underline-only, transparent bg, red focus. */
#loginPage .inputContainer { margin-bottom: 24px !important; }
#loginPage .inputContainer label,
#loginPage .inputLabelFocused,
#loginPage label.inputLabel {
font-family: "SF Mono", "Monaco", "Cascadia Code", "JetBrains Mono",
"Roboto Mono", "DejaVu Sans Mono", "Liberation Mono",
Consolas, monospace !important;
font-size: 11px !important;
color: rgba(255,255,255,0.55) !important;
text-transform: uppercase !important;
letter-spacing: 0.22em !important;
margin-bottom: 10px !important;
font-weight: 600 !important;
display: block !important;
}
#loginPage .emby-input {
width: 100% !important;
background: transparent !important;
border: none !important;
border-bottom: 1px solid rgba(255,255,255,0.18) !important;
border-radius: 0 !important;
padding: 12px 0 14px !important;
font-size: 18px !important;
color: #fff !important;
outline: none !important;
box-shadow: none !important;
}
#loginPage .emby-input:focus,
#loginPage .inputContainer.focused .emby-input {
border-bottom-color: #E50914 !important;
box-shadow: none !important;
}
/* Remember Me row centered. (Checkbox red already from earlier polish.) */
#loginPage .checkboxContainer,
#loginPage label.emby-checkbox-label {
display: flex !important;
align-items: center !important;
justify-content: center !important;
margin: 28px 0 30px !important;
padding: 0 !important;
}
/* Sign In button: full-width red, 4px radius, square label. */
#loginPage .raised.button-submit,
#loginPage button.raised.button-submit,
#loginPage .raised.block.emby-button[type="submit"] {
width: 100% !important;
background: #E50914 !important;
color: #fff !important;
font-size: 17px !important;
font-weight: 700 !important;
padding: 18px !important;
border: none !important;
border-radius: 4px !important;
letter-spacing: 0.04em !important;
text-transform: none !important;
margin: 0 0 0 !important;
box-shadow: none !important;
}
/* Disclaimer: centered, light grey, small. */
#loginPage .loginDisclaimer,
#loginPage .disclaimerContainer,
#loginPage .loginDisclaimerContainer {
margin-top: 28px !important;
font-size: 12px !important;
color: rgba(255,255,255,0.5) !important;
text-align: center !important;
letter-spacing: 0.04em !important;
width: 100% !important;
display: block !important;
}
"""
# Branding mirror: same selectors + rules, copied. Doesn't include the
# var(--arrflix-logo) reference issue since branding.xml already
# defines --arrflix-logo at L64.
THEATER_BRANDING = THEATER_PRECSS # identical CSS body
def patch_precss(path, marker, block):
with open(path, "r", encoding="utf-8") as f:
s = f.read()
if marker in s:
print(f" {path}: already patched")
return
m = re.search(r'(<style id="arrflix-precss">.*?)(</style>)', s, flags=re.DOTALL)
if not m:
sys.exit(f"ERROR: arrflix-precss block not found in {path}")
s = s[:m.end(1)] + block + s[m.end(1):]
with open(path, "w", encoding="utf-8") as f:
f.write(s)
print(f" {path}: patched (+{len(block)})")
def patch_branding(path, marker, block):
with open(path, "r", encoding="utf-8") as f:
s = f.read()
if marker in s:
print(f" {path}: already patched")
return
CLOSE = "</CustomCss>"
if CLOSE not in s:
sys.exit(f"ERROR: </CustomCss> not found in {path}")
s = s.replace(CLOSE, block + CLOSE, 1)
with open(path, "w", encoding="utf-8") as f:
f.write(s)
print(f" {path}: patched (+{len(block)})")
MARKER = "THE THEATER login port"
patch_precss(
"/opt/docker/jellyfin-stock/web-overrides/index.html",
MARKER, THEATER_PRECSS)
patch_branding(
"/home/docker/jellyfin-stock/config/config/branding.xml",
MARKER, THEATER_BRANDING)