docs(theater): import design picker assets from /tmp
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:
parent
675e6ab1ec
commit
034dbe68c0
6 changed files with 1264 additions and 0 deletions
1
web-overrides/theater-design/arrflix-logo.b64
Normal file
1
web-overrides/theater-design/arrflix-logo.b64
Normal file
File diff suppressed because one or more lines are too long
BIN
web-overrides/theater-design/arrflix-logo.png
Normal file
BIN
web-overrides/theater-design/arrflix-logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 56 KiB |
848
web-overrides/theater-design/picker.html
Normal file
848
web-overrides/theater-design/picker.html
Normal 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>
|
||||
BIN
web-overrides/theater-design/poster-bg.jpg
Normal file
BIN
web-overrides/theater-design/poster-bg.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 334 KiB |
147
web-overrides/theater-design/theater-fullsize.html
Normal file
147
web-overrides/theater-design/theater-fullsize.html
Normal 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>
|
||||
268
web-overrides/theater-design/tv_theater_port.py
Normal file
268
web-overrides/theater-design/tv_theater_port.py
Normal 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)
|
||||
Loading…
Reference in a new issue