Add countdown page for Cloudflare Connect 2026, San Francisco
Static index.html at the root, no build step. Counts down to Monday, October 19, 2026, 12:00 AM PDT; Cloudflare's event page could not be reached from the sandbox to check for a keynote time, so the midnight PDT fallback is used, as asked on the issue. Closes #1
- G1t-Session:
- ses_01m4z1kmcee81v4czq1j3k7997
1 file+134−00/1 viewed
| 1 | + | <!doctype html> | |
| 2 | + | <html lang="en"> | |
| 3 | + | <head> | |
| 4 | + | <meta charset="utf-8"> | |
| 5 | + | <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| 6 | + | <title>Countdown to Cloudflare Connect 2026, San Francisco</title> | |
| 7 | + | <meta name="description" content="Countdown to Cloudflare Connect 2026, San Francisco: October 19–21, 2026 at Moscone West."> | |
| 8 | + | <style> | |
| 9 | + | :root { | |
| 10 | + | --bg: #0b0d12; | |
| 11 | + | --card: #161a23; | |
| 12 | + | --text: #f5f6f8; | |
| 13 | + | --muted: #a3a9b6; | |
| 14 | + | --accent: #f6821f; | |
| 15 | + | } | |
| 16 | + | * { box-sizing: border-box; } | |
| 17 | + | html, body { margin: 0; height: 100%; } | |
| 18 | + | body { | |
| 19 | + | font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; | |
| 20 | + | background: radial-gradient(circle at 50% 0%, #2a1a0c 0%, var(--bg) 60%); | |
| 21 | + | color: var(--text); | |
| 22 | + | display: flex; | |
| 23 | + | align-items: center; | |
| 24 | + | justify-content: center; | |
| 25 | + | padding: 1.5rem; | |
| 26 | + | text-align: center; | |
| 27 | + | } | |
| 28 | + | main { width: 100%; max-width: 46rem; } | |
| 29 | + | .eyebrow { | |
| 30 | + | color: var(--accent); | |
| 31 | + | font-weight: 600; | |
| 32 | + | letter-spacing: .12em; | |
| 33 | + | text-transform: uppercase; | |
| 34 | + | font-size: .8rem; | |
| 35 | + | margin: 0 0 .75rem; | |
| 36 | + | } | |
| 37 | + | h1 { | |
| 38 | + | font-size: clamp(1.6rem, 6vw, 3rem); | |
| 39 | + | line-height: 1.15; | |
| 40 | + | margin: 0 0 .75rem; | |
| 41 | + | } | |
| 42 | + | .where { color: var(--muted); margin: 0 0 2rem; font-size: clamp(.95rem, 3vw, 1.1rem); } | |
| 43 | + | .timer { | |
| 44 | + | display: grid; | |
| 45 | + | grid-template-columns: repeat(4, 1fr); | |
| 46 | + | gap: clamp(.5rem, 2vw, 1rem); | |
| 47 | + | margin: 0 0 2rem; | |
| 48 | + | } | |
| 49 | + | .unit { | |
| 50 | + | background: var(--card); | |
| 51 | + | border: 1px solid #262b37; | |
| 52 | + | border-radius: 14px; | |
| 53 | + | padding: clamp(.75rem, 3vw, 1.5rem) .25rem; | |
| 54 | + | } | |
| 55 | + | .num { | |
| 56 | + | display: block; | |
| 57 | + | font-size: clamp(1.8rem, 9vw, 3.75rem); | |
| 58 | + | font-weight: 700; | |
| 59 | + | font-variant-numeric: tabular-nums; | |
| 60 | + | line-height: 1; | |
| 61 | + | } | |
| 62 | + | .label { | |
| 63 | + | display: block; | |
| 64 | + | margin-top: .5rem; | |
| 65 | + | color: var(--muted); | |
| 66 | + | font-size: clamp(.65rem, 2.5vw, .85rem); | |
| 67 | + | text-transform: uppercase; | |
| 68 | + | letter-spacing: .08em; | |
| 69 | + | } | |
| 70 | + | .started { | |
| 71 | + | font-size: clamp(1.4rem, 5vw, 2.25rem); | |
| 72 | + | font-weight: 700; | |
| 73 | + | color: var(--accent); | |
| 74 | + | margin: 0 0 2rem; | |
| 75 | + | } | |
| 76 | + | .target { color: var(--muted); font-size: .95rem; margin: 0; } | |
| 77 | + | .target strong { color: var(--text); font-weight: 600; } | |
| 78 | + | [hidden] { display: none !important; } | |
| 79 | + | </style> | |
| 80 | + | </head> | |
| 81 | + | <body> | |
| 82 | + | <main> | |
| 83 | + | <p class="eyebrow">Countdown</p> | |
| 84 | + | <h1>Cloudflare Connect 2026, San Francisco</h1> | |
| 85 | + | <p class="where">October 19–21, 2026 · Moscone West, San Francisco</p> | |
| 86 | + | ||
| 87 | + | <div class="timer" id="timer" aria-live="polite"> | |
| 88 | + | <div class="unit"><span class="num" id="days">--</span><span class="label">Days</span></div> | |
| 89 | + | <div class="unit"><span class="num" id="hours">--</span><span class="label">Hours</span></div> | |
| 90 | + | <div class="unit"><span class="num" id="minutes">--</span><span class="label">Minutes</span></div> | |
| 91 | + | <div class="unit"><span class="num" id="seconds">--</span><span class="label">Seconds</span></div> | |
| 92 | + | </div> | |
| 93 | + | ||
| 94 | + | <p class="started" id="started" hidden>Cloudflare Connect 2026 has started. See you at Moscone West!</p> | |
| 95 | + | ||
| 96 | + | <p class="target">Counting down to <strong>Monday, October 19, 2026, 12:00 AM PDT</strong> (San Francisco time).</p> | |
| 97 | + | </main> | |
| 98 | + | ||
| 99 | + | <script> | |
| 100 | + | // Event start: midnight Pacific Daylight Time (UTC-7) on October 19, 2026. | |
| 101 | + | var EVENT_START = new Date("2026-10-19T00:00:00-07:00").getTime(); | |
| 102 | + | ||
| 103 | + | var els = { | |
| 104 | + | timer: document.getElementById("timer"), | |
| 105 | + | started: document.getElementById("started"), | |
| 106 | + | days: document.getElementById("days"), | |
| 107 | + | hours: document.getElementById("hours"), | |
| 108 | + | minutes: document.getElementById("minutes"), | |
| 109 | + | seconds: document.getElementById("seconds") | |
| 110 | + | }; | |
| 111 | + | ||
| 112 | + | function pad(n) { return n < 10 ? "0" + n : String(n); } | |
| 113 | + | ||
| 114 | + | var handle; | |
| 115 | + | function tick() { | |
| 116 | + | var remaining = EVENT_START - Date.now(); | |
| 117 | + | if (remaining <= 0) { | |
| 118 | + | els.timer.hidden = true; | |
| 119 | + | els.started.hidden = false; | |
| 120 | + | if (handle) clearInterval(handle); | |
| 121 | + | return; | |
| 122 | + | } | |
| 123 | + | var s = Math.floor(remaining / 1000); | |
| 124 | + | els.days.textContent = Math.floor(s / 86400); | |
| 125 | + | els.hours.textContent = pad(Math.floor(s % 86400 / 3600)); | |
| 126 | + | els.minutes.textContent = pad(Math.floor(s % 3600 / 60)); | |
| 127 | + | els.seconds.textContent = pad(s % 60); | |
| 128 | + | } | |
| 129 | + | ||
| 130 | + | tick(); | |
| 131 | + | handle = setInterval(tick, 1000); | |
| 132 | + | </script> | |
| 133 | + | </body> | |
| 134 | + | </html> |
Comments
Sign in to comment.