/* ═══════════════════════════════════════════════════════════════════════════════════════════════════
   /create-review/     brief of 23 Sep 2026
   Tokens from css/header-footer-global.css. 🔴 Stars are INK, never orange.
   ═══════════════════════════════════════════════════════════════════════════════════════════════════ */

body.pt-bg-paper{background:var(--pt-surface-dim)}
.pt-cr{width:100%;max-width:100%;margin:0;color:var(--pt-ink)}
.pt-cr .cr-wrap{max-width:1100px;margin:0 auto;padding:0 32px}

/* Graphite, like every other dark band on the site — the old page used pure black. Painted sideways
   with a shadow rather than 100vw, which would overflow once a scrollbar exists. */
.pt-cr .cr-band{background:var(--pt-graphite,#23211E);color:var(--pt-on-dark,#F3F1EB);padding:36px 0 32px;
    box-shadow:0 0 0 100vmax var(--pt-graphite,#23211E);clip-path:inset(0 -100vmax)}
.pt-cr .cr-rule{display:flex;justify-content:space-between;gap:16px;font-family:var(--pt-mono);font-size:12.5px;color:var(--pt-on-dark-mute,#AFA89C);border-bottom:1px solid var(--pt-dark-line,#3A3631);padding-bottom:12px;margin:0 0 24px}
.pt-cr .cr-band h1{margin:0 0 8px;font-size:38px;font-weight:800;letter-spacing:-.03em;line-height:1.1;color:var(--pt-on-dark,#F3F1EB)}
.pt-cr .cr-band p{margin:0;max-width:560px;color:var(--pt-on-dark-mute,#AFA89C)}

/* THE FORM IS 760px AND CENTRED (Leon, 24 Sep 2026) — this reverses the 23 Sep decision below.
   760 is the measure `#cr-hl` and the textarea were already capped at, so the form now ends where
   the fields inside it always ended; the difference is that the heading rows, the context card, the
   star row and the buttons line up with them instead of running out to 1100.

   ⚠️ It no longer aligns with the H1, which is what 23 Sep was for — the hero band stays full
   width, so the heading sits left of a centred form. Leon asked for centred knowing that. If it ever
   reads wrong, centre `.cr-band .cr-wrap` content too rather than un-centring the form.

   The per-field 760px cap that used to live in the 861px media query is GONE: the column now IS 760,
   so the cap was declaring the same number twice and the next person to change one would have
   changed only one of them. */
.pt-cr .cr-cols{display:block;max-width:760px;margin:0 auto;padding:32px 0 64px}

/* Context card — replaces the old grey banner. It tells somebody their review will carry weight. */
.pt-cr .cr-ctx{display:grid;grid-template-columns:72px minmax(0,1fr);gap:16px;align-items:center;margin:0 0 30px;padding:16px;background:var(--pt-surface);border:1px solid var(--pt-border)}
.pt-cr .cr-ctx__im{aspect-ratio:1;background:var(--pt-fill-control);border:1px solid var(--pt-border);position:relative;overflow:hidden;display:block}
.pt-cr .cr-ctx__im img{position:absolute;inset:10%;width:80%;height:80%;object-fit:contain;mix-blend-mode:multiply}
.pt-cr .cr-k{margin:0 0 4px;font-family:var(--pt-mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--pt-ink-3)}
.pt-cr .cr-ctx__nm{margin:0 0 6px;font-size:17px;font-weight:700;letter-spacing:-.01em;line-height:1.25}
.pt-cr .cr-ctx__sub{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:0;font-size:13px;color:var(--pt-ink-3)}
.pt-cr .cr-who{display:inline-flex;gap:7px;align-items:center}
.pt-cr .cr-av{width:22px;height:22px;border-radius:50%;border:1px solid var(--pt-border);background:var(--pt-fill-control) center/cover no-repeat;display:block}
.pt-cr .cr-sep{color:var(--pt-border-strong)}
.pt-cr .cr-vp{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:500;color:var(--pt-green-text)}
.pt-cr .cr-vp svg{width:12px;height:12px;fill:var(--pt-green-text)}

.pt-cr .cr-fld{padding:26px 0;border-top:1px solid var(--pt-border)}
.pt-cr .cr-fld:first-of-type{border-top:0;padding-top:0}
.pt-cr .cr-lg{display:block;margin:0 0 4px;font-size:16px;font-weight:700;letter-spacing:-.01em}
.pt-cr .cr-req{margin-left:8px;font-size:12px;font-weight:400;color:var(--pt-ink-3)}
.pt-cr .cr-help{margin:0 0 14px;font-size:13px;color:var(--pt-ink-3)}
.pt-cr input[type=text],.pt-cr textarea{width:100%;padding:12px 14px;border:1px solid var(--pt-border-strong);background:var(--pt-surface);font:inherit;font-size:15px;border-radius:0}
.pt-cr textarea{min-height:150px;resize:vertical;line-height:1.6}
.pt-cr .cr-count{display:flex;justify-content:space-between;gap:12px;margin:6px 0 0;font-size:12px;color:var(--pt-ink-3)}
.pt-cr .cr-count .is-ok{color:var(--pt-green-text)}

/* 44px and ink. Large enough for a thumb, and the word says the number out loud. */
.pt-cr .cr-rate{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.pt-cr .cr-star{background:none;border:0;padding:0;cursor:pointer;line-height:0}
.pt-cr .cr-star svg{width:44px;height:44px;fill:var(--pt-border-strong)}
.pt-cr .cr-star.is-on svg{fill:var(--pt-ink)}
.pt-cr .cr-star:focus-visible{outline:2px solid var(--pt-accent);outline-offset:2px}
.pt-cr .cr-word{margin-left:12px;font-size:15px;font-weight:600;min-height:38px}
.pt-cr .cr-word span{display:block;font-size:12.5px;font-weight:400;color:var(--pt-ink-3)}

.pt-cr .cr-chips{display:flex;gap:6px;flex-wrap:wrap}
.pt-cr .cr-chip{padding:9px 14px;border:1px solid var(--pt-border-strong);background:var(--pt-surface);color:var(--pt-ink);font:inherit;font-size:13.5px;cursor:pointer;border-radius:0}
.pt-cr .cr-chip:hover{background:var(--pt-fill-control)}
.pt-cr .cr-chip.is-on{background:var(--pt-ink);border-color:var(--pt-ink);color:#fff}

.pt-cr .cr-drop{border:1px dashed var(--pt-border-strong);background:var(--pt-fill-control);padding:26px;text-align:center;cursor:pointer}
.pt-cr .cr-drop.is-over{border-color:var(--pt-ink);background:var(--pt-surface)}
.pt-cr .cr-drop b{display:block;margin:0 0 4px;font-size:14.5px}
.pt-cr .cr-drop span{font-size:13px;color:var(--pt-ink-3)}
.pt-cr .cr-uploads{display:flex;gap:10px;flex-wrap:wrap;margin:12px 0 0}
.pt-cr .cr-up{width:92px;height:92px;border:1px solid var(--pt-border);position:relative;background:var(--pt-fill-control) center/cover no-repeat}
/* 🔴 THE GLYPH WAS INVISIBLE (Leon, 23 Sep: "its just blank"). The rule set a white background
   and never set a colour, so it inherited GeneratePress's white button text — a white x on a
   white box. Colour stated explicitly, and it darkens on hover like every other control. */
.pt-cr .cr-up__x{position:absolute;top:-8px;right:-8px;width:22px;height:22px;background:var(--pt-surface);border:1px solid var(--pt-border-strong);color:var(--pt-ink,#1A1A1A);font-size:14px;font-weight:700;line-height:20px;text-align:center;cursor:pointer;padding:0;border-radius:0}
.pt-cr .cr-up__x:hover,.pt-cr .cr-up__x:focus{background:var(--pt-ink,#1A1A1A);color:#fff;border-color:var(--pt-ink,#1A1A1A)}
.pt-cr .cr-up__tag{position:absolute;left:0;bottom:0;background:rgba(26,26,26,.72);color:#fff;font-family:var(--pt-mono);font-size:10px;padding:2px 5px}

.pt-cr .cr-actions{display:flex;gap:12px;align-items:center;padding:26px 0 0;border-top:1px solid var(--pt-ink)}
.pt-cr .cr-btn{display:inline-flex;align-items:center;justify-content:center;height:52px;padding:0 26px;border:1px solid var(--pt-ink);background:transparent;color:var(--pt-ink);font:inherit;font-size:15px;font-weight:600;cursor:pointer;border-radius:0}
.pt-cr .cr-btn:hover{background:var(--pt-fill-control)}
.pt-cr .cr-btn--solid{background:var(--pt-ink);border-color:var(--pt-ink);color:var(--pt-surface-dim)}
.pt-cr .cr-btn--solid:hover{background:#1f1f1f}
.pt-cr .cr-btn--sm{height:42px;padding:0 16px;font-size:14px}
/* Disabled rather than post-and-fail: the button says it is not ready before it wastes the press. */
.pt-cr .cr-btn[disabled]{background:var(--pt-fill-control);border-color:var(--pt-border-strong);color:var(--pt-ink-3);cursor:not-allowed}
.pt-cr .cr-fine{margin:14px 0 0;max-width:640px;font-size:12.5px;color:var(--pt-ink-3)}

/* Errors sit under the field they belong to — brand red as a rule, never a red headline. */
.pt-cr .cr-err{margin:10px 0 0;padding:10px 14px;background:#FBEFEE;border-left:2px solid var(--pt-brand);font-size:13.5px;color:#7A1B15}
.pt-cr .cr-note{margin:18px 0;padding:10px 14px;background:var(--pt-surface);border-left:2px solid var(--pt-ink);font-size:13.5px;color:var(--pt-ink-2)}


.pt-cr .cr-box{margin:0 0 12px;padding:18px 20px;background:var(--pt-surface);border:1px solid var(--pt-border)}
.pt-cr .cr-box h3{margin:0 0 12px;font-family:var(--pt-mono);font-size:11px;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:var(--pt-ink-3)}
.pt-cr .cr-box ul{margin:0;padding:0;list-style:none}
.pt-cr .cr-box li{display:flex;gap:9px;padding:7px 0;border-top:1px solid var(--pt-border);font-size:13.5px;color:var(--pt-ink-2)}
.pt-cr .cr-box li:first-child{border-top:0;padding-top:0}
.pt-cr .cr-box li svg{width:14px;height:14px;flex:0 0 14px;margin-top:3px;fill:none;stroke:var(--pt-ink);stroke-width:1.7}
.pt-cr .cr-box a{color:var(--pt-accent)}
.pt-cr .cr-note2{margin:0;font-size:12.5px;line-height:1.55;color:var(--pt-ink-3)}

.pt-cr .cr-plist{border-top:1px solid var(--pt-ink);margin:28px 0 0}
.pt-cr .cr-prow{display:grid;grid-template-columns:76px minmax(0,1fr) auto;gap:18px;align-items:center;padding:18px 0;border-bottom:1px solid var(--pt-border)}
.pt-cr .cr-prow__im{aspect-ratio:1;background:var(--pt-fill-control);border:1px solid var(--pt-border);position:relative;overflow:hidden;display:block}
.pt-cr .cr-prow__im img{position:absolute;inset:10%;width:80%;height:80%;object-fit:contain;mix-blend-mode:multiply}
.pt-cr .cr-prow__nm{margin:0 0 3px;font-size:15px;font-weight:600}
.pt-cr .cr-prow__meta{margin:0;font-size:12.5px;color:var(--pt-ink-3)}
.pt-cr .cr-done{display:flex;gap:7px;align-items:center;font-size:13px;color:var(--pt-ink-3)}
.pt-cr .cr-done svg{width:14px;height:14px;fill:var(--pt-green-text)}
.pt-cr .cr-done a{color:var(--pt-accent)}
.pt-cr .cr-empty{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:24px;align-items:center;max-width:760px;margin:28px 0;padding:26px 28px;background:var(--pt-surface);border:1px solid var(--pt-border)}
.pt-cr .cr-empty b{display:block;font-size:16px;margin:0 0 4px}
.pt-cr .cr-empty span{font-size:13.5px;color:var(--pt-ink-3)}

@media (max-width:1000px){
    .pt-cr .cr-cols{max-width:100%}   /* below 1000 the wrap is already narrower than 760 + padding */
    /* Below the form on a phone, never hidden — the promise box is the most valuable thing on it. */
}
@media (max-width:640px){
    .pt-cr .cr-wrap{padding:0 16px}
    .pt-cr .cr-band h1{font-size:28px}
    .pt-cr .cr-star svg{width:38px;height:38px}
    .pt-cr .cr-word{margin-left:0;width:100%}
    .pt-cr .cr-ctx{grid-template-columns:56px minmax(0,1fr);gap:12px}
    .pt-cr .cr-actions{flex-direction:column;align-items:stretch}
    .pt-cr .cr-btn{width:100%}
    .pt-cr .cr-prow{grid-template-columns:56px minmax(0,1fr);gap:12px}
    .pt-cr .cr-prow .cr-done,.pt-cr .cr-prow .cr-btn{grid-column:1 / -1;justify-self:start}
    .pt-cr .cr-empty{grid-template-columns:1fr}
}

/* The purchases list ended flush against the footer (Leon, 23 Sep). */
.pt-cr .cr-fine{margin-bottom:0}
.pt-cr .cr-plist + .cr-fine{margin:18px 0 56px}

/* "You've already reviewed this" — a box that asks, not a line that warns. Neutral container, no
   amber: nothing is held and nothing is owed, it is simply information about what is already there. */
/* ── ALREADY REVIEWED: SUMMARY FIRST (24 Sep 2026) ─────────────────────────────────
   Replaces `.cr-already`, the warning box that sat above a pre-filled form. The section head and the
   review row deliberately borrow the shape of `/reviews/?product_id=` — somebody who has just come
   from there should recognise their own review, not meet a third presentation of it. */
.pt-cr .cr-sec{padding:8px 0 0}
.pt-cr .cr-sechead{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:24px;align-items:start;
    padding-bottom:20px;border-bottom:1px solid var(--pt-border)}
.pt-cr .cr-sechead h2{margin:0 0 2px;font-size:18px;font-weight:600;letter-spacing:-.01em}
.pt-cr .cr-sechead p{margin:0;font-size:15px;color:var(--pt-ink-3)}
.pt-cr .cr-sechead--edit{margin:0 0 4px}
@media (max-width:640px){
    .pt-cr .cr-sechead{grid-template-columns:1fr;gap:14px}
    .pt-cr .cr-sechead .cr-btn{width:100%;justify-content:center}
}

/* The member's own review. Same 44px avatar column as the review rows on the hub. */
.pt-cr .cr-mine{display:grid;grid-template-columns:44px minmax(0,1fr);gap:16px;padding:24px 0;border-bottom:1px solid var(--pt-border)}
.pt-cr .cr-mine__av{width:44px;height:44px;border-radius:50%;background:var(--pt-fill-control) center/cover no-repeat}
.pt-cr .cr-mine__who{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.pt-cr .cr-mine__nm{font-weight:600}
.pt-cr .cr-mine__stars{display:inline-flex;gap:3px}
.pt-cr .cr-mine__stars svg{width:15px;height:15px;fill:var(--pt-border-strong)}
.pt-cr .cr-mine__stars svg.is-on{fill:var(--pt-ink)}
.pt-cr .cr-mine__date{font-size:12px;color:var(--pt-ink-3)}
.pt-cr .cr-mine__var{margin:2px 0 0;font-size:14px;color:var(--pt-ink-3)}
/* Amber: waiting, not broken. Never red — moderation is not a failure. */
.pt-cr .cr-mine__pending{margin:8px 0 0;font-size:13px;color:#8A6D3B}
.pt-cr .cr-mine__hl{margin:12px 0 4px;font-size:17px}
.pt-cr .cr-mine__body{color:var(--pt-ink-2)}
.pt-cr .cr-mine__body p{margin:0 0 8px}
.pt-cr .cr-mine__body p:last-child{margin-bottom:0}
.pt-cr .cr-mine__media{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap}
.pt-cr .cr-mine__m{position:relative;width:116px;height:116px;border:1px solid var(--pt-border);
    background:var(--pt-fill-control) center/cover no-repeat}
.pt-cr .cr-mine__len{position:absolute;right:6px;bottom:6px;padding:2px 6px;background:rgba(26,26,26,.82);
    color:#fff;font-family:var(--pt-mono);font-size:11px;font-weight:400}
@media (max-width:640px){
    .pt-cr .cr-mine{grid-template-columns:36px minmax(0,1fr);gap:12px}
    .pt-cr .cr-mine__av{width:36px;height:36px}
    .pt-cr .cr-mine__m{width:88px;height:88px}
}

/* "Cancel editing" — a link, because it is a way back, not an action. */
.pt-cr .cr-link{background:none;border:0;padding:0;color:var(--pt-accent);font-size:15px;white-space:nowrap;cursor:pointer}
.pt-cr .cr-changed{font-size:12.5px;color:var(--pt-ink-3);margin-left:auto}
.pt-cr .cr-changed[hidden]{display:none}

/* Noir confirm — white card, dark backdrop, black confirm, ghost cancel. Never a native confirm(). */
.pt-cr .cr-modal{position:fixed;inset:0;z-index:60;display:flex;align-items:center;justify-content:center;
    padding:24px;background:rgba(26,26,26,.6)}
.pt-cr .cr-modal[hidden]{display:none}
.pt-cr .cr-modal__card{width:100%;max-width:420px;padding:24px;background:var(--pt-surface);border:1px solid var(--pt-border-strong)}
.pt-cr .cr-modal__card h2{margin:0 0 6px;font-size:18px}
.pt-cr .cr-modal__card p{margin:0 0 20px;font-size:15px;color:var(--pt-ink-3)}
.pt-cr .cr-modal__row{display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap}

/* The reviewed row: shield, the word, then the control — the control is a button, not a word in a
   sentence, because it is the only thing on that row anyone presses. */
.pt-cr .cr-done{display:inline-flex;align-items:center;gap:10px;white-space:nowrap}

/* The old 861px block capped textarea + text inputs at 760px. `.cr-cols` is 760px now, so the cap
   was redundant — removed rather than left to disagree with the column one day. */

/* ── MEDIA ALREADY ON THE REVIEW, WHEN EDITING (25 Sep 2026) ─────────────────────────
   Same 96px square as the new-upload thumbnails, because they are the same thing to the person
   looking: media on their review. The × is the same control too. */
.pt-cr .cr-keep{display:flex;flex-wrap:wrap;gap:10px;margin:14px 0 0}
.pt-cr .cr-keep__i{position:relative;width:96px;height:96px;border:1px solid var(--pt-border);
    background:var(--pt-fill-control) center/cover no-repeat}
.pt-cr .cr-keep__x{position:absolute;top:4px;right:4px;width:24px;height:24px;display:flex;
    align-items:center;justify-content:center;padding:0;border:0;border-radius:0;
    background:rgba(26,26,26,.85);color:#fff;font-size:15px;line-height:1;cursor:pointer}
/* Dim, never recolour — and never red: removing a photo from your own draft is not a failure. */
.pt-cr .cr-keep__x:hover,.pt-cr .cr-keep__x:focus{background:rgba(26,26,26,.95);color:#fff}
.pt-cr .cr-keep__x:focus-visible{outline:2px solid #fff;outline-offset:-3px}
.pt-cr .cr-keep__len{position:absolute;left:6px;bottom:6px;padding:2px 6px;background:rgba(26,26,26,.82);
    color:#fff;font-family:var(--pt-mono);font-size:11px;font-weight:400}
.pt-cr .cr-keepnote{margin:8px 0 0;font-size:12.5px;color:var(--pt-ink-3)}

/* ── VIDEO UPLOADS (24 Sep) ─────────────────────────────────────────────────────────────────
   A clip goes to Cloudflare as it is picked, so it needs its own row with progress — it is not one
   of the six photo thumbnails and it never becomes one. */
.pt-cr .cr-vidlist{display:flex;flex-direction:column;gap:8px;margin:10px 0 0}
.pt-cr .cr-vid{display:flex;align-items:baseline;justify-content:space-between;gap:16px;
    padding:10px 12px;border:1px solid var(--pt-border-strong);background:var(--pt-surface);font-size:13px}
.pt-cr .cr-vid__n{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.pt-cr .cr-vid__s{flex:0 0 auto;color:var(--pt-ink-3);font-family:var(--pt-mono);font-size:12px;text-align:right}
/* Green for done, because it IS done. Red nowhere — a failed upload is a retry, not a dispute. */
.pt-cr .cr-vid.is-done{border-color:#bbf7d0;background:#f0fdf4}
.pt-cr .cr-vid.is-done .cr-vid__s{color:#2F6B3A}
.pt-cr .cr-vid.is-bad{border-color:var(--pt-border-strong)}
.pt-cr .cr-vid.is-bad .cr-vid__s{color:var(--pt-ink)}
