Video — Contact Brief
A cinematic dark project-brief intake form for videographers — pick a project type, define the creative goal and audience, tick off deliverables, set budget and deadline, and drop reference links, then submit to generate a clean readable summary card with live validation and letterboxed film-forward styling throughout.
MCP
Code
:root {
--bg: #0a0a0b;
--surface: #141416;
--surface-2: #1c1c1f;
--amber: #ffb020;
--amber-d: #e6971a;
--red: #ff4d4d;
--ink: #f4f4f6;
--muted: #8a8a92;
--line: rgba(255, 255, 255, 0.10);
--line-2: rgba(255, 255, 255, 0.18);
--white: #fff;
--r-sm: 6px;
--r-md: 10px;
--r-lg: 16px;
}
* { box-sizing: border-box; }
html { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
body {
margin: 0;
font-family: "Inter", system-ui, sans-serif;
line-height: 1.5;
color: var(--ink);
background:
radial-gradient(1100px 500px at 80% -10%, rgba(255, 176, 32, 0.10), transparent 60%),
var(--bg);
}
.page { min-height: 100vh; }
.mono { font-family: "JetBrains Mono", monospace; }
/* ---------- Hero ---------- */
.hero { position: relative; }
.bar { background: #000; height: 34px; }
.bar-top { border-bottom: 1px solid var(--line); }
.bar-bottom { border-top: 1px solid var(--line); }
.hero-inner {
max-width: 860px;
margin: 0 auto;
padding: 46px 24px 40px;
text-align: center;
}
.brand {
display: inline-flex;
align-items: center;
gap: 12px;
font-family: "JetBrains Mono", monospace;
font-size: 12px;
letter-spacing: 0.14em;
color: var(--muted);
margin-bottom: 22px;
padding: 7px 14px;
border: 1px solid var(--line);
border-radius: 999px;
background: var(--surface);
}
.brand-name { color: var(--ink); font-weight: 700; }
.rec {
width: 9px; height: 9px; border-radius: 50%;
background: var(--red);
box-shadow: 0 0 0 0 rgba(255, 77, 77, 0.6);
animation: pulse 1.8s infinite;
}
@keyframes pulse {
0% { box-shadow: 0 0 0 0 rgba(255, 77, 77, 0.55); }
70% { box-shadow: 0 0 0 8px rgba(255, 77, 77, 0); }
100% { box-shadow: 0 0 0 0 rgba(255, 77, 77, 0); }
}
.tc { color: var(--amber); }
.hero h1 {
margin: 0 0 12px;
font-size: clamp(30px, 6vw, 52px);
font-weight: 800;
letter-spacing: -0.02em;
line-height: 1.05;
}
.lede { margin: 0 auto; max-width: 560px; color: var(--muted); font-size: 16px; }
.hero-meta {
display: flex; flex-wrap: wrap; justify-content: center;
gap: 10px; margin-top: 22px;
}
.chip {
display: inline-flex; align-items: center; gap: 7px;
font-size: 12.5px; font-weight: 600;
padding: 6px 12px;
border: 1px solid var(--line);
border-radius: 999px;
background: var(--surface);
color: var(--muted);
}
.chip .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--amber); }
/* ---------- Layout ---------- */
.wrap { max-width: 720px; margin: 0 auto; padding: 34px 20px 60px; }
.block {
background: var(--surface);
border: 1px solid var(--line);
border-radius: var(--r-lg);
padding: 22px;
margin-bottom: 18px;
}
.block-head {
display: flex; align-items: center; justify-content: space-between;
gap: 12px; margin-bottom: 16px;
}
.block-head h2 {
margin: 0; font-size: 13px; font-weight: 700;
letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink);
}
.req {
font-size: 10.5px; font-weight: 700; letter-spacing: 0.06em;
text-transform: uppercase; color: var(--amber);
padding: 3px 8px; border: 1px solid rgba(255, 176, 32, 0.35);
border-radius: 999px; background: rgba(255, 176, 32, 0.08);
}
.req.inline { padding: 1px 6px; }
.tally, .sum-id {
font-family: "JetBrains Mono", monospace; font-size: 12px; color: var(--muted);
}
.tally b { color: var(--amber); }
/* ---------- Project types ---------- */
.types {
display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
gap: 10px;
}
.type-card {
position: relative;
display: flex; flex-direction: column; gap: 3px;
padding: 14px;
border: 1px solid var(--line);
border-radius: var(--r-md);
background: var(--surface-2);
cursor: pointer;
transition: transform .15s, border-color .15s, background .15s;
}
.type-card:hover { transform: translateY(-2px); border-color: var(--line-2); }
.type-card input { position: absolute; opacity: 0; inset: 0; cursor: pointer; }
.type-card:focus-within { outline: 2px solid var(--amber); outline-offset: 2px; }
.type-card:has(input:checked) {
border-color: var(--amber);
background: rgba(255, 176, 32, 0.10);
box-shadow: inset 0 0 0 1px rgba(255, 176, 32, 0.4);
}
.tc-glyph { font-size: 22px; }
.tc-title { font-weight: 700; font-size: 14.5px; }
.tc-sub { font-size: 12px; color: var(--muted); }
/* ---------- Fields ---------- */
.field { display: block; margin-bottom: 4px; position: relative; }
.field + .field { margin-top: 14px; }
.label {
display: block; font-size: 13px; font-weight: 600;
margin-bottom: 7px; color: var(--ink);
}
input[type=text], input[type=email], input[type=url], input[type=date],
textarea, select {
width: 100%;
font: inherit; font-size: 14.5px;
color: var(--ink);
background: var(--surface-2);
border: 1px solid var(--line);
border-radius: var(--r-md);
padding: 11px 13px;
transition: border-color .15s, box-shadow .15s;
}
textarea { resize: vertical; min-height: 74px; }
select { appearance: none; cursor: pointer;
background-image: linear-gradient(45deg, transparent 50%, var(--muted) 50%), linear-gradient(135deg, var(--muted) 50%, transparent 50%);
background-position: calc(100% - 18px) 50%, calc(100% - 13px) 50%;
background-size: 5px 5px, 5px 5px;
background-repeat: no-repeat;
}
input::placeholder, textarea::placeholder { color: #5c5c64; }
input:hover, textarea:hover, select:hover { border-color: var(--line-2); }
input:focus, textarea:focus, select:focus {
outline: none; border-color: var(--amber);
box-shadow: 0 0 0 3px rgba(255, 176, 32, 0.18);
}
input[type=date] { color-scheme: dark; }
.field.invalid input, .field.invalid textarea, .field.invalid select { border-color: var(--red); }
.counter {
position: absolute; right: 4px; bottom: -18px;
font-family: "JetBrains Mono", monospace; font-size: 11px; color: var(--muted);
}
.err {
margin: 8px 0 0; font-size: 12.5px; color: var(--red); font-weight: 500;
}
/* ---------- Checkboxes ---------- */
.checks { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.check {
display: flex; align-items: center; gap: 10px;
padding: 11px 13px;
border: 1px solid var(--line);
border-radius: var(--r-md);
background: var(--surface-2);
cursor: pointer; font-size: 13.5px;
transition: border-color .15s, background .15s;
}
.check:hover { border-color: var(--line-2); }
.check:focus-within { outline: 2px solid var(--amber); outline-offset: 2px; }
.check input {
appearance: none; width: 18px; height: 18px; flex: none;
border: 1.5px solid var(--line-2); border-radius: 5px;
background: var(--bg); cursor: pointer; position: relative;
transition: background .15s, border-color .15s;
}
.check input:checked { background: var(--amber); border-color: var(--amber); }
.check input:checked::after {
content: "✓"; position: absolute; inset: 0;
display: grid; place-items: center;
color: #1a1200; font-size: 12px; font-weight: 900;
}
.check:has(input:checked) { border-color: rgba(255, 176, 32, 0.4); background: rgba(255, 176, 32, 0.07); }
/* ---------- Rows / budget ---------- */
.row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.row2.tight { margin-top: 16px; }
.est-chip {
font-size: 12px; color: var(--muted);
padding: 5px 11px; border: 1px solid rgba(255,176,32,0.3);
border-radius: 999px; background: rgba(255,176,32,0.07);
}
.est-chip b { color: var(--amber); font-family: "JetBrains Mono", monospace; margin-left: 3px; }
/* ---------- References ---------- */
.refs { display: flex; flex-direction: column; gap: 8px; margin-bottom: 12px; }
.ref-row { display: flex; gap: 8px; }
.ref-row input { flex: 1; }
.ref-del {
flex: none; width: 42px;
border: 1px solid var(--line); border-radius: var(--r-md);
background: var(--surface-2); color: var(--muted);
cursor: pointer; font-size: 14px;
transition: color .15s, border-color .15s, background .15s;
}
.ref-del:hover { color: var(--red); border-color: var(--red); background: rgba(255,77,77,0.08); }
.ghost-btn {
font: inherit; font-size: 13.5px; font-weight: 600;
color: var(--amber);
background: transparent; border: 1px dashed rgba(255,176,32,0.4);
border-radius: var(--r-md); padding: 9px 14px; cursor: pointer;
transition: background .15s, border-color .15s;
}
.ghost-btn:hover { background: rgba(255,176,32,0.08); border-color: var(--amber); }
.ghost-btn:focus-visible { outline: 2px solid var(--amber); outline-offset: 2px; }
/* ---------- Actions ---------- */
.actions {
display: flex; align-items: center; justify-content: space-between;
gap: 14px; flex-wrap: wrap; margin-top: 22px;
}
.hint { font-size: 12.5px; color: var(--muted); }
.submit {
font: inherit; font-size: 15px; font-weight: 700;
color: #1a1200;
background: linear-gradient(180deg, var(--amber), var(--amber-d));
border: none; border-radius: var(--r-md);
padding: 13px 24px; cursor: pointer;
transition: transform .12s, box-shadow .15s, filter .15s;
box-shadow: 0 6px 20px rgba(255, 176, 32, 0.25);
}
.submit:hover { transform: translateY(-1px); filter: brightness(1.05); }
.submit:active { transform: translateY(1px); }
.submit:focus-visible { outline: 2px solid var(--white); outline-offset: 2px; }
/* ---------- Summary ---------- */
.summary {
background: var(--surface);
border: 1px solid rgba(255, 176, 32, 0.3);
border-radius: var(--r-lg);
padding: 26px;
animation: rise .4s ease both;
}
@keyframes rise { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }
.sum-head { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }
.sum-head h2 { margin: 0; font-size: 22px; font-weight: 800; flex: 1; }
.sum-lede { margin: 0 0 20px; color: var(--muted); font-size: 14px; }
.sum-grid { margin: 0; display: grid; gap: 1px; background: var(--line); border: 1px solid var(--line); border-radius: var(--r-md); overflow: hidden; }
.sum-row { display: grid; grid-template-columns: 150px 1fr; background: var(--surface-2); }
.sum-row dt {
padding: 12px 14px; font-size: 11px; font-weight: 700; letter-spacing: 0.05em;
text-transform: uppercase; color: var(--muted); background: var(--surface);
}
.sum-row dd { margin: 0; padding: 12px 14px; font-size: 14px; }
.badges { display: flex; flex-wrap: wrap; gap: 6px; }
.badge {
font-size: 12px; font-weight: 600;
padding: 3px 9px; border-radius: 999px;
background: rgba(255, 176, 32, 0.12); color: var(--amber);
border: 1px solid rgba(255, 176, 32, 0.3);
}
.sum-row dd a { color: var(--amber); word-break: break-all; }
.sum-actions { display: flex; gap: 10px; margin-top: 20px; flex-wrap: wrap; }
.foot {
text-align: center; padding: 28px 20px 40px;
font-size: 12.5px; color: var(--muted);
border-top: 1px solid var(--line);
}
/* ---------- Toast ---------- */
.toast {
position: fixed; left: 50%; bottom: 26px; transform: translate(-50%, 20px);
background: var(--surface-2); color: var(--ink);
border: 1px solid var(--line-2); border-left: 3px solid var(--amber);
padding: 12px 18px; border-radius: var(--r-md);
font-size: 14px; font-weight: 500;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
opacity: 0; pointer-events: none; transition: opacity .25s, transform .25s;
z-index: 50;
}
.toast.show { opacity: 1; transform: translate(-50%, 0); }
/* ---------- Responsive ---------- */
@media (max-width: 520px) {
.hero-inner { padding: 34px 18px 30px; }
.bar { height: 24px; }
.wrap { padding: 24px 14px 48px; }
.block { padding: 18px; }
.checks { grid-template-columns: 1fr; }
.row2 { grid-template-columns: 1fr; }
.sum-row { grid-template-columns: 1fr; }
.sum-row dt { padding-bottom: 4px; }
.actions { flex-direction: column; align-items: stretch; }
.submit { width: 100%; }
}(function () {
"use strict";
var form = document.getElementById("briefForm");
var summary = document.getElementById("summary");
var toastEl = document.getElementById("toast");
var toastTimer;
function toast(msg) {
toastEl.textContent = msg;
toastEl.classList.add("show");
clearTimeout(toastTimer);
toastTimer = setTimeout(function () {
toastEl.classList.remove("show");
}, 2600);
}
/* ---- Running timecode in hero ---- */
var tcEl = document.getElementById("timecode");
var frame = 0;
setInterval(function () {
frame = (frame + 1) % (60 * 60 * 24);
var f = frame % 24;
var totalSec = Math.floor(frame / 24);
var s = totalSec % 60;
var m = Math.floor(totalSec / 60) % 60;
var h = Math.floor(totalSec / 3600) % 24;
tcEl.textContent = [h, m, s, f].map(function (n) {
return String(n).padStart(2, "0");
}).join(":");
}, 1000 / 24);
/* ---- Goal character counter ---- */
var goal = document.getElementById("goal");
var goalCount = document.getElementById("goalCount");
goal.addEventListener("input", function () {
goalCount.textContent = goal.value.length;
});
/* ---- Deliverables tally ---- */
var delCount = document.getElementById("delCount");
function updateTally() {
var n = form.querySelectorAll('input[name="deliverable"]:checked').length;
delCount.textContent = n;
}
form.querySelectorAll('input[name="deliverable"]').forEach(function (cb) {
cb.addEventListener("change", updateTally);
});
/* ---- Project type -> estimate chip ---- */
var estChip = document.getElementById("estChip");
var estVal = document.getElementById("estVal");
form.querySelectorAll('input[name="ptype"]').forEach(function (r) {
r.addEventListener("change", function () {
estVal.textContent = r.getAttribute("data-est");
estChip.hidden = false;
clearError("ptype");
});
});
/* ---- Reference link add / remove ---- */
var refList = document.getElementById("refList");
document.getElementById("addRef").addEventListener("click", function () {
if (refList.children.length >= 6) {
toast("Up to 6 references — that's plenty!");
return;
}
var row = document.createElement("div");
row.className = "ref-row";
row.innerHTML =
'<input type="url" name="reference" placeholder="https://… another reference" />' +
'<button type="button" class="ref-del" aria-label="Remove reference">✕</button>';
refList.appendChild(row);
row.querySelector("input").focus();
});
refList.addEventListener("click", function (e) {
if (e.target.classList.contains("ref-del")) {
if (refList.children.length > 1) {
e.target.closest(".ref-row").remove();
} else {
e.target.previousElementSibling.value = "";
toast("Cleared the reference field.");
}
}
});
/* ---- Validation helpers ---- */
function setError(name, show) {
var msg = form.querySelector('.err[data-for="' + name + '"]');
if (msg) msg.hidden = !show;
var field = form.querySelector('[name="' + name + '"]');
if (field) {
var wrap = field.closest(".field");
if (wrap) wrap.classList.toggle("invalid", show);
}
}
function clearError(name) { setError(name, false); }
["goal", "audience", "name", "email", "budget", "deadline"].forEach(function (n) {
var el = form.querySelector('[name="' + n + '"]');
if (el) el.addEventListener("input", function () { clearError(n); });
if (el) el.addEventListener("change", function () { clearError(n); });
});
function validate() {
var ok = true;
var firstBad = null;
function fail(name) {
setError(name, true);
ok = false;
if (!firstBad) firstBad = form.querySelector('[name="' + name + '"]') ||
form.querySelector('.err[data-for="' + name + '"]');
}
if (!form.querySelector('input[name="ptype"]:checked')) fail("ptype");
if (!goal.value.trim()) fail("goal");
if (!form.audience.value.trim()) fail("audience");
if (!form.budget.value) fail("budget");
if (!form.deadline.value) fail("deadline");
if (!form.name.value.trim()) fail("name");
var email = form.email.value.trim();
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) fail("email");
if (!ok && firstBad) {
firstBad.scrollIntoView({ behavior: "smooth", block: "center" });
if (firstBad.focus) firstBad.focus({ preventScroll: true });
}
return ok;
}
/* ---- Build summary ---- */
var lastSummaryText = "";
function row(label, valueHTML) {
return '<div class="sum-row"><dt>' + label + "</dt><dd>" + valueHTML + "</dd></div>";
}
function esc(s) {
return String(s).replace(/[&<>"]/g, function (c) {
return { "&": "&", "<": "<", ">": ">", '"': """ }[c];
});
}
function buildSummary() {
var ptype = form.querySelector('input[name="ptype"]:checked');
var deliverables = Array.prototype.map.call(
form.querySelectorAll('input[name="deliverable"]:checked'),
function (c) { return c.value; }
);
var refs = Array.prototype.map.call(
form.querySelectorAll('input[name="reference"]'),
function (i) { return i.value.trim(); }
).filter(Boolean);
var id = "#BR-" + String(Math.floor(1000 + Math.random() * 9000));
document.getElementById("sumId").textContent = id;
var deadline = form.deadline.value
? new Date(form.deadline.value + "T00:00").toLocaleDateString(undefined, {
year: "numeric", month: "long", day: "numeric"
})
: "—";
var badgesHTML = deliverables.length
? '<div class="badges">' + deliverables.map(function (d) {
return '<span class="badge">' + esc(d) + "</span>";
}).join("") + "</div>"
: '<span style="color:var(--muted)">None selected</span>';
var refsHTML = refs.length
? refs.map(function (r) {
return '<a href="' + esc(r) + '" target="_blank" rel="noopener">' + esc(r) + "</a>";
}).join("<br>")
: '<span style="color:var(--muted)">—</span>';
var html = "";
html += row("Project type", esc(ptype.value) + ' <span class="badge">' + esc(ptype.getAttribute("data-est")) + "</span>");
html += row("Goal", esc(goal.value.trim()));
html += row("Audience", esc(form.audience.value.trim()));
html += row("Deliverables", badgesHTML);
html += row("Budget", esc(form.budget.value));
html += row("Deadline", esc(deadline));
html += row("References", refsHTML);
html += row("Contact", esc(form.name.value.trim()) + " · " + esc(form.email.value.trim()));
document.getElementById("sumGrid").innerHTML = html;
lastSummaryText =
"PROJECT BRIEF " + id + "\n" +
"Type: " + ptype.value + " (" + ptype.getAttribute("data-est") + ")\n" +
"Goal: " + goal.value.trim() + "\n" +
"Audience: " + form.audience.value.trim() + "\n" +
"Deliverables: " + (deliverables.join(", ") || "None") + "\n" +
"Budget: " + form.budget.value + "\n" +
"Deadline: " + deadline + "\n" +
"References: " + (refs.join(", ") || "None") + "\n" +
"Contact: " + form.name.value.trim() + " <" + form.email.value.trim() + ">";
}
/* ---- Submit ---- */
form.addEventListener("submit", function (e) {
e.preventDefault();
if (!validate()) {
toast("Please fix the highlighted fields.");
return;
}
buildSummary();
form.hidden = true;
summary.hidden = false;
summary.scrollIntoView({ behavior: "smooth", block: "start" });
toast("Brief sent — we'll reply within 24h.");
});
/* ---- Summary actions ---- */
document.getElementById("editBtn").addEventListener("click", function () {
summary.hidden = true;
form.hidden = false;
form.scrollIntoView({ behavior: "smooth", block: "start" });
});
document.getElementById("copyBtn").addEventListener("click", function () {
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(lastSummaryText).then(function () {
toast("Summary copied to clipboard.");
}, function () {
toast("Copy failed — select the text manually.");
});
} else {
toast("Clipboard not available in this browser.");
}
});
})();<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Aperture Studio — Project Brief</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="page">
<!-- Hero -->
<header class="hero" role="banner">
<div class="bar bar-top" aria-hidden="true"></div>
<div class="hero-inner">
<div class="brand">
<span class="rec" aria-hidden="true"></span>
<span class="brand-name">APERTURE STUDIO</span>
<span class="tc" id="timecode">00:00:00:00</span>
</div>
<h1>Start a project brief</h1>
<p class="lede">Tell us what you're making. The more you share, the faster we can shape a treatment, a crew and a quote for your film.</p>
<div class="hero-meta">
<span class="chip"><span class="dot"></span> Avg. reply 24h</span>
<span class="chip">4K · Cinema · Color</span>
<span class="chip">Since 2014</span>
</div>
</div>
<div class="bar bar-bottom" aria-hidden="true"></div>
</header>
<main class="wrap">
<!-- FORM -->
<form id="briefForm" class="brief" novalidate aria-label="Video project brief">
<!-- Project type -->
<section class="block">
<div class="block-head">
<h2>01 · Project type</h2>
<span class="req">Required</span>
</div>
<div class="types" role="radiogroup" aria-label="Project type">
<label class="type-card">
<input type="radio" name="ptype" value="Brand Film" data-est="$8k – $22k" required />
<span class="tc-glyph">🎬</span>
<span class="tc-title">Brand Film</span>
<span class="tc-sub">Story-driven hero video</span>
</label>
<label class="type-card">
<input type="radio" name="ptype" value="Music Video" data-est="$6k – $30k" />
<span class="tc-glyph">🎸</span>
<span class="tc-title">Music Video</span>
<span class="tc-sub">Performance & narrative</span>
</label>
<label class="type-card">
<input type="radio" name="ptype" value="Event Coverage" data-est="$3k – $9k" />
<span class="tc-glyph">🎟️</span>
<span class="tc-title">Event</span>
<span class="tc-sub">Live multi-cam capture</span>
</label>
<label class="type-card">
<input type="radio" name="ptype" value="Documentary" data-est="$12k – $60k" />
<span class="tc-glyph">🎥</span>
<span class="tc-title">Documentary</span>
<span class="tc-sub">Long-form & interviews</span>
</label>
<label class="type-card">
<input type="radio" name="ptype" value="Social Spot" data-est="$2k – $7k" />
<span class="tc-glyph">📱</span>
<span class="tc-title">Social Spot</span>
<span class="tc-sub">Vertical short-form</span>
</label>
</div>
<p class="err" data-for="ptype" hidden>Choose a project type to continue.</p>
</section>
<!-- Creative goal -->
<section class="block">
<div class="block-head">
<h2>02 · Creative goal</h2>
<span class="req">Required</span>
</div>
<label class="field">
<span class="label">What should this film achieve?</span>
<textarea id="goal" name="goal" rows="3" maxlength="280" required
placeholder="e.g. Launch our new running shoe with a fast, kinetic 60-second hero film for the homepage."></textarea>
<span class="counter"><span id="goalCount">0</span>/280</span>
</label>
<p class="err" data-for="goal" hidden>Tell us the goal in a sentence or two.</p>
<label class="field">
<span class="label">Target audience</span>
<input id="audience" name="audience" type="text" required
placeholder="e.g. Urban runners, 22–35, style-conscious" />
</label>
<p class="err" data-for="audience" hidden>Who is this film for?</p>
</section>
<!-- Deliverables -->
<section class="block">
<div class="block-head">
<h2>03 · Deliverables</h2>
<span class="tally"><span id="delCount">0</span> selected</span>
</div>
<div class="checks">
<label class="check"><input type="checkbox" name="deliverable" value="Hero cut (60–90s)" /><span>Hero cut (60–90s)</span></label>
<label class="check"><input type="checkbox" name="deliverable" value="Vertical socials (9:16)" /><span>Vertical socials (9:16)</span></label>
<label class="check"><input type="checkbox" name="deliverable" value="Teaser (15s)" /><span>Teaser (15s)</span></label>
<label class="check"><input type="checkbox" name="deliverable" value="Behind the scenes" /><span>Behind the scenes</span></label>
<label class="check"><input type="checkbox" name="deliverable" value="Color-graded master" /><span>Color-graded master</span></label>
<label class="check"><input type="checkbox" name="deliverable" value="Captions & subtitles" /><span>Captions & subtitles</span></label>
<label class="check"><input type="checkbox" name="deliverable" value="Stills / key frames" /><span>Stills / key frames</span></label>
<label class="check"><input type="checkbox" name="deliverable" value="Raw footage archive" /><span>Raw footage archive</span></label>
</div>
</section>
<!-- Budget + deadline -->
<section class="block">
<div class="block-head">
<h2>04 · Budget & timeline</h2>
<span class="est-chip" id="estChip" hidden>Typical range <b id="estVal">—</b></span>
</div>
<div class="row2">
<label class="field">
<span class="label">Budget range</span>
<select id="budget" name="budget" required>
<option value="" disabled selected>Select a range…</option>
<option>Under $5,000</option>
<option>$5,000 – $15,000</option>
<option>$15,000 – $40,000</option>
<option>$40,000 – $100,000</option>
<option>$100,000+</option>
<option>Not sure yet</option>
</select>
</label>
<label class="field">
<span class="label">Target deadline</span>
<input id="deadline" name="deadline" type="date" required />
</label>
</div>
<p class="err" data-for="budget" hidden>Pick a budget range.</p>
<p class="err" data-for="deadline" hidden>Set a target delivery date.</p>
</section>
<!-- References + contact -->
<section class="block">
<div class="block-head">
<h2>05 · References & contact</h2>
</div>
<div id="refList" class="refs">
<div class="ref-row">
<input type="url" name="reference" placeholder="https://vimeo.com/… reference you love" />
<button type="button" class="ref-del" aria-label="Remove reference">✕</button>
</div>
</div>
<button type="button" id="addRef" class="ghost-btn">+ Add reference link</button>
<div class="row2 tight">
<label class="field">
<span class="label">Your name</span>
<input id="name" name="name" type="text" required placeholder="Dana Okafor" />
</label>
<label class="field">
<span class="label">Email</span>
<input id="email" name="email" type="email" required placeholder="[email protected]" />
</label>
</div>
<p class="err" data-for="name" hidden>We need a name to reply to.</p>
<p class="err" data-for="email" hidden>Enter a valid email address.</p>
</section>
<div class="actions">
<span class="hint" id="formHint">All required fields marked <span class="req inline">Required</span></span>
<button type="submit" class="submit">Send brief →</button>
</div>
</form>
<!-- SUMMARY -->
<section id="summary" class="summary" hidden aria-live="polite">
<div class="sum-head">
<span class="rec" aria-hidden="true"></span>
<h2>Brief received</h2>
<span class="sum-id" id="sumId">#BR-0000</span>
</div>
<p class="sum-lede">Here's what we captured. A producer will reply within 24 hours.</p>
<dl class="sum-grid" id="sumGrid"></dl>
<div class="sum-actions">
<button type="button" id="copyBtn" class="submit">Copy summary</button>
<button type="button" id="editBtn" class="ghost-btn">Edit brief</button>
</div>
</section>
</main>
<footer class="foot">Aperture Studio · Cinematic production · Portland — fictional demo</footer>
</div>
<div id="toast" class="toast" role="status" aria-live="polite"></div>
<script src="script.js"></script>
</body>
</html>A film-forward project intake page built for videographers and small production studios. A letterboxed hero sets a cinematic tone with amber accents and a JetBrains Mono timecode, then the brief itself walks a prospective client through project type selection (brand film, music video, event, documentary, social spot), the creative goal, target audience, a deliverables checklist, budget range, deadline, and any reference links they want to share.
Every control has hover, focus and active states with visible focus rings for keyboard users. Selecting a project-type card updates a live estimate chip, checkbox deliverables tally in real time, and a character counter tracks the goal field. Inline validation flags missing required fields on submit without a full page reload.
On a valid submit the form collapses into a polished summary card that echoes back the client’s choices as labelled rows and badges, ready to be copied or emailed to the studio. A toast confirms the send, and an edit action returns to the form with all values intact.