From c9b2d7d62519b5f00c4afe215c445af5639e9619 Mon Sep 17 00:00:00 2001 From: luxick Date: Wed, 10 Jun 2026 17:08:43 +0200 Subject: [PATCH] Add missing files --- go.mod | 3 + static/style.css | 354 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 357 insertions(+) create mode 100644 go.mod create mode 100644 static/style.css diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..8fe380f --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.luxick.de/luxick/mediator + +go 1.26.4 diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..018be32 --- /dev/null +++ b/static/style.css @@ -0,0 +1,354 @@ +:root { + --paper: #f4f5f1; + --card: #ffffff; + --ink: #222633; + --muted: #6a7080; + --line: #e2e4dd; + --marker: #ffd43b; + --marker-soft: #fff3c4; + --blue: #2f4bc7; + --blue-dark: #24389b; + --green: #15805b; + --green-soft: #e2f3ec; + --red: #b3362c; + --radius: 14px; + --font-display: "Bricolage Grotesque", "Avenir Next", "Segoe UI", system-ui, sans-serif; + --font-body: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; +} + +* { box-sizing: border-box; } + +html, body { margin: 0; padding: 0; } + +body { + background: var(--paper); + color: var(--ink); + font-family: var(--font-body); + font-size: 16px; + line-height: 1.5; +} + +.wrap { + max-width: 680px; + margin: 0 auto; + padding: 28px 18px 80px; +} + +header.site { + display: flex; + align-items: baseline; + gap: 10px; + margin-bottom: 26px; +} + +.logo { + font-family: var(--font-display); + font-weight: 800; + font-size: 20px; + letter-spacing: -0.02em; + text-decoration: none; + color: var(--ink); +} + +.logo .dot { + display: inline-block; + width: 12px; height: 12px; + border-radius: 50%; + background: var(--marker); + border: 2px solid var(--ink); + margin-right: 7px; + transform: translateY(1px); +} + +.tagline { color: var(--muted); font-size: 14px; } + +h1 { + font-family: var(--font-display); + font-weight: 800; + letter-spacing: -0.025em; + font-size: clamp(28px, 5vw, 38px); + line-height: 1.12; + margin: 0 0 8px; +} + +.sub { color: var(--muted); margin: 0 0 24px; max-width: 48ch; } + +.card { + background: var(--card); + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 20px; + margin-bottom: 18px; +} + +label.field { + display: block; + font-weight: 600; + font-size: 14px; + margin-bottom: 14px; +} + +label.field span { display: block; margin-bottom: 5px; } + +input[type="text"], textarea, input[type="time"] { + width: 100%; + font: inherit; + color: var(--ink); + background: var(--paper); + border: 1px solid var(--line); + border-radius: 9px; + padding: 9px 12px; +} + +input:focus-visible, textarea:focus-visible, button:focus-visible, .day:focus-visible { + outline: 3px solid var(--blue); + outline-offset: 2px; +} + +textarea { resize: vertical; min-height: 64px; } + +.hint { font-weight: 400; color: var(--muted); } + +/* ---------- Calendar ---------- */ + +.cal { user-select: none; } + +.cal-head { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 10px; +} + +.cal-title { + font-family: var(--font-display); + font-weight: 700; + font-size: 18px; + letter-spacing: -0.01em; +} + +.cal-nav { display: flex; gap: 6px; } + +.cal-nav button { + width: 36px; height: 36px; + border-radius: 9px; + border: 1px solid var(--line); + background: var(--card); + font-size: 16px; + cursor: pointer; + color: var(--ink); +} + +.cal-nav button:hover { border-color: var(--ink); } + +.cal-grid { + display: grid; + grid-template-columns: repeat(7, 1fr); + gap: 4px; +} + +.dow { + text-align: center; + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--muted); + padding: 6px 0 8px; +} + +.day { + position: relative; + aspect-ratio: 1 / 1.05; + border: none; + background: transparent; + border-radius: 10px; + font: inherit; + font-variant-numeric: tabular-nums; + font-size: 15px; + color: var(--ink); + display: flex; + align-items: center; + justify-content: center; + cursor: default; + padding: 0; +} + +.day.blank { visibility: hidden; } + +.day.clickable { cursor: pointer; } +.day.clickable:hover { background: var(--paper); } + +.day.past { color: #b9bdc6; } + +.day.today .num { text-decoration: underline; text-underline-offset: 3px; } + +/* Offered (poll page): soft marker swipe behind the number */ +.day.offered { background: var(--marker-soft); } +.day.offered:hover { background: #ffeaa3; } + +/* The signature: a hand-drawn highlighter circle around picked dates */ +.day .ring { + position: absolute; + inset: 4%; + pointer-events: none; + opacity: 0; + transform: scale(0.7) rotate(-8deg); + transition: opacity 0.12s ease, transform 0.18s cubic-bezier(0.34, 1.56, 0.64, 1); +} + +.day.picked .ring { opacity: 1; transform: scale(1) rotate(0deg); } + +@media (prefers-reduced-motion: reduce) { + .day .ring { transition: none; } +} + +.day.picked { font-weight: 700; } + +.day .badge { + position: absolute; + bottom: 4px; + left: 50%; + transform: translateX(-50%); + font-size: 10px; + font-weight: 700; + line-height: 1; + color: var(--green); +} + +.day .timechip { + position: absolute; + top: 3px; + right: 4px; + font-size: 9px; + font-weight: 700; + color: var(--blue); +} + +/* ---------- Picked dates list (create page) ---------- */ + +.picked-list { margin-top: 4px; } + +.picked-row { + display: flex; + align-items: center; + gap: 10px; + padding: 9px 0; + border-top: 1px dashed var(--line); +} + +.picked-row .d { flex: 1; font-weight: 600; font-size: 14px; } + +.picked-row input[type="time"] { width: 110px; padding: 6px 8px; } + +.picked-row .rm { + border: none; + background: none; + color: var(--red); + font-size: 13px; + cursor: pointer; + padding: 4px; +} + +.empty { + color: var(--muted); + font-size: 14px; + text-align: center; + padding: 14px 0 6px; +} + +/* ---------- Buttons ---------- */ + +.btn { + display: inline-block; + font: inherit; + font-weight: 700; + border-radius: 11px; + padding: 12px 22px; + cursor: pointer; + border: 1px solid transparent; +} + +.btn-primary { background: var(--blue); color: #fff; } +.btn-primary:hover { background: var(--blue-dark); } +.btn-primary:disabled { background: #aab3d6; cursor: not-allowed; } + +.btn-ghost { background: var(--card); border-color: var(--line); color: var(--ink); } +.btn-ghost:hover { border-color: var(--ink); } + +.btn-danger { background: var(--card); border-color: var(--red); color: var(--red); } +.btn-danger:hover { background: #fbeae8; } + +.actions { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; } + +.error { color: var(--red); font-size: 14px; margin-top: 10px; min-height: 1.2em; } +.ok { color: var(--green); font-size: 14px; margin-top: 10px; } + +/* ---------- Share box ---------- */ + +.share-link { + display: flex; + gap: 8px; + margin: 8px 0 4px; +} + +.share-link input { + flex: 1; + font-size: 14px; + background: var(--paper); +} + +.note { font-size: 13px; color: var(--muted); } + +/* ---------- Results ---------- */ + +.result-row { + display: flex; + align-items: baseline; + gap: 12px; + padding: 11px 0; + border-top: 1px dashed var(--line); +} + +.result-row .when { width: 165px; flex-shrink: 0; font-weight: 600; font-size: 14px; } +.result-row .when .t { color: var(--blue); margin-left: 6px; } + +.result-row .who { flex: 1; font-size: 14px; color: var(--muted); } + +.result-row .count { + font-family: var(--font-display); + font-weight: 800; + font-size: 17px; + font-variant-numeric: tabular-nums; +} + +.result-row.best .when, .result-row.best .count { color: var(--green); } + +.best-tag { + display: inline-block; + background: var(--green-soft); + color: var(--green); + font-size: 11px; + font-weight: 700; + border-radius: 99px; + padding: 2px 9px; + margin-left: 6px; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.closed-banner { + background: var(--ink); + color: var(--paper); + border-radius: var(--radius); + padding: 13px 18px; + font-weight: 600; + font-size: 14px; + margin-bottom: 18px; +} + +@media (max-width: 480px) { + .result-row { flex-wrap: wrap; } + .result-row .when { width: auto; } + .result-row .who { flex-basis: 100%; order: 3; } +}