Source
This app’s code and revision history are public. Download a copy or explore the files below.
Public
The app’s code and revision history are public.
Run it yourself
Take the whole tree and run it on your own machine. The download needs no account. Cloning needs a sign-in.
Download .zip
bounded clone 3e1cb86700a5e96238d7a2f1
A copy you download is not bounded. The guarantees this app runs under - declared egress, proven invariants, writes that fail closed - live in the runtime serving this page, not in the files. What you get is auditable source you can read and run, with no runtime guarantees attached.
src/styles.css
/* When. Shared look comes from /kit.css; this is the app's own layout. */
body.app-mode .landing-only { display: none !important; }
body:not(.app-mode) #app:empty { display: none; }
body.app-mode main { min-height: calc(100vh - 64px); min-height: calc(100dvh - 64px); }
.page-pad { padding-block: 56px 80px; }
button, a, label { -webkit-tap-highlight-color: transparent; }
.back-link { display: inline-flex; align-items: center; gap: 4px; min-height: 44px; margin-left: -4px; font: var(--type-control); }
.narrow { max-width: 640px; }
.link-btn { justify-self: start; min-height: 32px; padding: 2px 0; border: 0; background: none; color: var(--cobalt); font: var(--type-control); font-size: 14px; cursor: pointer; transition: color var(--motion-fast) var(--ease-out); }
@media (hover: hover) { .link-btn:hover { color: var(--cobalt-ink); } }
.hint .link-btn { min-height: 0; padding: 0; font-size: inherit; }
.link-danger { color: var(--brick); }
@media (hover: hover) { .link-danger:hover { color: #7c2f1d; } }
.optional { margin-left: 4px; font-weight: 400; color: var(--faint); }
.select-inline { width: auto; max-width: 100%; min-height: 40px; padding: 6px 32px 6px 12px; font: var(--type-control); }
@media (pointer: coarse) { .select-inline { min-height: 44px; font-size: 16px; } } /* 16px, so iOS does not zoom on focus */
.input-sm { min-height: 40px; padding: 8px 11px; }
:is(.empty-state, .error-state) > h1 { font: var(--type-title); letter-spacing: -.02em; color: var(--ink-solid); text-wrap: balance; }
.error-state > h1 { color: #7c2f1d; }
/* Landing hero with the poll maker */
.app-hero { padding: 44px 0 72px; background: var(--paper-warm); border-bottom: 1px solid #ece2cf; }
.app-hero-grid { display: grid; grid-template-columns: minmax(0, 1fr) 460px; gap: 56px; align-items: start; }
.app-hero-copy { padding-top: 12px; }
.app-hero h1 { margin-top: 14px; }
.app-hero .lede { margin-top: 18px; }
.hero-points { list-style: none; padding: 0; margin-top: 26px; display: grid; gap: 10px; font-size: 15.5px; color: #3c4048; }
.hero-points li { display: flex; gap: 10px; align-items: baseline; }
.hero-points li::before { content: ""; flex: 0 0 8px; height: 8px; border-radius: 50%; background: var(--cobalt); transform: translateY(-2px); }
.hero-art { width: 190px; height: auto; margin-bottom: -6px; }
@media (max-width: 960px) { .app-hero-grid { grid-template-columns: minmax(0, 1fr); gap: 32px; } .app-hero-copy { padding-top: 0; } }
@media (max-width: 600px) { .app-hero { padding-top: 24px; } .hero-art { width: 120px; } .hero-points { margin-top: 20px; } }
.your-polls { margin-top: 30px; display: grid; gap: 10px; }
.your-title { font: var(--type-caps); letter-spacing: .12em; text-transform: uppercase; color: var(--muted); }
.your-list { list-style: none; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 8px; }
.your-list a { display: grid; gap: 2px; min-height: 56px; padding: 10px 14px; border: 1px solid var(--line); border-radius: 12px; background: #fff; color: var(--ink); transition: border-color var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out); }
@media (hover: hover) { .your-list a:hover { border-color: var(--line-strong); box-shadow: var(--shadow); color: var(--ink); } }
.your-list strong { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.your-list span { font-size: 13px; color: var(--muted); }
/* Poll maker */
.editor { display: grid; grid-template-columns: minmax(0, 1fr); gap: 20px; padding: 22px; }
.editor-details, .editor-times, .editor-submit { display: grid; grid-template-columns: minmax(0, 1fr); gap: 12px; }
.editor-submit { gap: 10px; }
.cal { padding: 8px 8px 10px; border: 1px solid var(--line); border-radius: 14px; background: #fff; }
.cal-head { display: flex; align-items: center; justify-content: space-between; }
.cal-month { font: 600 15px/1 var(--sans); }
.cal-grid { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 3px; margin-top: 4px; }
.cal-wd { padding: 6px 0; text-align: center; font: 600 11.5px/1 var(--sans); color: var(--faint); }
.cal-day { height: 44px; border: 0; border-radius: 10px; background: transparent; color: var(--ink); font: 500 15px/1 var(--sans); cursor: pointer; transition: background-color var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out), transform var(--motion-fast) var(--ease-out); }
.cal-day:active:not(:disabled) { transform: scale(.94); }
@media (hover: hover) { .cal-day:hover:not(:disabled) { background: var(--panel); } .cal-day.on:hover { background: #2a2c31; } }
.cal-day.today { box-shadow: inset 0 0 0 1px var(--line-strong); }
.cal-day.on { background: var(--ink-solid); color: #fff; font-weight: 600; }
.cal-day:disabled { color: #c5c9cf; cursor: default; }
.cal-count { margin-top: 6px; text-align: center; font-size: 13px; color: var(--muted); }
.times-head { display: flex; align-items: baseline; justify-content: space-between; gap: 6px 12px; flex-wrap: wrap; }
.zone-note { font-size: 13px; color: var(--muted); }
.zone-note .link-btn { margin-left: 4px; font-size: 13px; }
.times-empty { padding: 16px; border: 1px dashed var(--line-strong); border-radius: 14px; text-align: center; font-size: 14.5px; color: var(--muted); }
.times { display: grid; grid-template-columns: minmax(0, 1fr); gap: 8px; padding: 12px 14px; border: 1px solid var(--line); border-radius: 14px; background: #fff; animation: oa-enter var(--motion) var(--ease-out); }
.times-row-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.times-label { font: 600 14.5px/1.3 var(--sans); }
.check-sm { font-size: 14px; color: #3c4048; }
.check-sm input { width: 16px; height: 16px; }
.slot { display: flex; align-items: center; gap: 8px; }
.input-time { flex: 1 1 0; width: 0; min-width: 0; min-height: 44px; padding: 8px 10px; }
.slot-to { font-size: 14px; color: var(--muted); }
.edit-page .editor { max-width: 560px; margin-top: 24px; }
.edit-skeleton { max-width: 560px; height: 520px; margin-top: 24px; border-radius: var(--radius-lg); }
@media (pointer: coarse) { .input-time::-webkit-calendar-picker-indicator { display: none; } }
@media (max-width: 600px) {
.editor { padding: 16px; }
.times { padding: 12px; }
.slot { gap: 6px; }
}
/* Landing sections */
.steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; margin-top: 28px; padding: 0; counter-reset: step; }
.steps li { list-style: none; counter-increment: step; }
.steps li::before { content: counter(step); display: grid; place-items: center; width: 34px; height: 34px; margin-bottom: 14px; border-radius: 50%; background: var(--ink-solid); color: #fff; font: 650 15px var(--sans); }
.steps h3 { font: 600 18px/1.3 var(--sans); }
.steps p { margin-top: 8px; color: #4a4e56; }
@media (max-width: 760px) { .steps { grid-template-columns: 1fr; } }
.api-grid { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: 40px; align-items: start; }
.api-grid .code { font-size: 12.5px; }
@media (max-width: 900px) { .api-grid { grid-template-columns: minmax(0, 1fr); } }
.more-apps { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; list-style: none; padding: 0; margin-top: 22px; }
.more-apps a { display: grid; gap: 4px; padding: 16px 18px; border: 1px solid var(--line); border-radius: 14px; background: #fff; color: var(--ink); transition: border-color var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out); }
@media (hover: hover) { .more-apps a:hover { border-color: var(--line-strong); box-shadow: var(--shadow); color: var(--ink); } }
.more-apps strong { font: 400 22px/1.1 var(--serif); }
.more-apps span { color: var(--muted); font-size: 14px; }
.compare td:first-child { font-weight: 600; }
.compare th a { color: inherit; text-decoration: underline; text-decoration-color: var(--line-strong); text-underline-offset: 3px; }
@media (max-width: 760px) {
.compare { min-width: 640px; font-size: 14px; }
.compare th, .compare td { padding: 11px 12px; }
}
/* Poll page */
.poll-head { border-bottom: 1px solid #ece2cf; background: var(--paper-warm); }
.poll-head-inner { display: flex; align-items: flex-end; justify-content: space-between; gap: 18px 24px; flex-wrap: wrap; padding: 30px 0 24px; }
.poll-title-block { display: grid; min-width: 0; max-width: 760px; }
.poll-title { margin-top: 8px; font: 360 clamp(32px, 4vw, 46px)/1.08 var(--serif); letter-spacing: -.03em; overflow-wrap: anywhere; text-wrap: balance; }
.poll-meta { display: flex; flex-wrap: wrap; gap: 4px 16px; margin-top: 10px; font-size: 14.5px; color: var(--muted); }
.meta-item { display: inline-flex; align-items: center; gap: 6px; min-width: 0; overflow-wrap: anywhere; }
.meta-item svg { flex: none; }
.poll-desc { margin-top: 12px; max-width: 70ch; color: #3d4148; white-space: pre-wrap; overflow-wrap: anywhere; }
.poll-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
@media (max-width: 600px) {
.poll-head-inner { padding: 22px 0 18px; }
.poll-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); width: 100%; }
.poll-actions > :only-child, .poll-actions > :first-child:not(:nth-last-child(2)) { grid-column: 1 / -1; }
.poll-actions .dropdown, .poll-actions .dropdown > .btn { width: 100%; }
}
.poll-body { display: grid; grid-template-columns: minmax(0, 1fr); gap: 18px; padding-top: 24px; padding-bottom: 64px; }
.invite { position: relative; display: grid; grid-template-columns: minmax(0, 1fr); gap: 12px; padding: 18px 20px; }
.invite-title { padding-right: 40px; font: 600 16px/1.4 var(--sans); color: var(--ink-solid); }
.invite-link { display: flex; gap: 8px; }
.invite-link .input { flex: 1; min-width: 0; font-size: 14px; background: #fff; }
.invite-close { position: absolute; top: 10px; right: 10px; }
@media (max-width: 600px) {
.invite { padding: 16px; }
.invite-link { flex-direction: column; }
.invite-link .input { font-size: 16px; }
}
.poll-tools { display: grid; gap: 10px; }
.best { display: flex; align-items: center; gap: 6px 10px; flex-wrap: wrap; font-size: 15px; }
.best strong { font-weight: 600; }
.tz { display: flex; align-items: center; gap: 8px 10px; flex-wrap: wrap; font-size: 14.5px; color: #3d4148; }
.tz strong { font-weight: 600; }
.tz svg { color: var(--muted); }
.mark { display: inline-flex; align-items: center; justify-content: center; }
.mark-yes { color: #2f6b45; }
.mark-maybe { color: #8a6a1f; }
.mark-no { color: #b3b8bf; }
.count { display: inline-flex; align-items: center; gap: 8px; font: 650 14px/1 var(--sans); font-variant-numeric: tabular-nums; }
.count-yes, .count-maybe { display: inline-flex; align-items: center; gap: 2px; }
.count-maybe { color: #6e5214; }
.count-yes.zero { color: var(--faint); }
.count-yes.zero .mark-yes { color: var(--faint); }
.count .mark-maybe svg { width: 18px; height: 14px; }
.col-tag { display: inline-block; padding: 3px 8px; border-radius: 999px; background: var(--cobalt); color: #fff; font: 650 10.5px/1.2 var(--sans); letter-spacing: .07em; text-transform: uppercase; }
.col-tag.final { background: var(--sage); }
.col-tag.hide { visibility: hidden; }
/* Desktop grid: times across, people down */
.grid-block { display: grid; grid-template-columns: minmax(0, 1fr); gap: 12px; width: fit-content; max-width: 100%; }
.grid-help { display: flex; align-items: center; justify-content: space-between; gap: 6px 24px; flex-wrap: wrap; font-size: 14px; color: #3d4148; }
.legend { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; font-size: 13.5px; color: var(--muted); }
.legend .mark { margin-left: 10px; }
.legend .mark:first-child { margin-left: 0; }
.grid-scroll { overflow-x: auto; border: 1px solid var(--line); border-radius: 16px; background: #fff; }
.vote-grid { width: 100%; border-collapse: separate; border-spacing: 0; }
.vote-grid th, .vote-grid td { border-bottom: 1px solid var(--line); }
.vote-grid tbody tr:last-child > * { border-bottom: 0; }
.vote-grid .who { position: sticky; left: 0; z-index: 1; width: 210px; min-width: 190px; max-width: 240px; padding: 8px 14px; border-right: 1px solid var(--line); background: #fff; text-align: left; font: 600 14.5px/1.3 var(--sans); }
.who-name { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.who-remove { position: absolute; right: 6px; top: 50%; display: grid; place-items: center; width: 30px; height: 30px; transform: translateY(-50%); border: 0; border-radius: 8px; background: #fff; color: var(--muted); cursor: pointer; opacity: 0; transition: opacity var(--motion-fast) var(--ease-out), background-color var(--motion-fast) var(--ease-out); }
.who:hover .who-remove, .who-remove:focus-visible { opacity: 1; }
.who-remove:hover { background: var(--brick-wash); color: var(--brick); }
.opt { min-width: 96px; padding: 10px 6px 12px; border-left: 1px solid var(--line); text-align: center; vertical-align: bottom; font-weight: 400; }
.opt > span { display: block; }
.opt > .col-tag { display: inline-block; margin-bottom: 6px; }
.oh-month { font: 650 11px/1.2 var(--sans); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }
.oh-day { font: 380 30px/1.05 var(--serif); letter-spacing: -.02em; }
.oh-wd { font: 600 12.5px/1.3 var(--sans); color: var(--muted); }
.oh-time { margin-top: 6px; font: 600 13px/1.3 var(--sans); white-space: nowrap; }
.oh-end { margin-top: 0; font-size: 12px; font-weight: 500; color: var(--muted); }
.opt > .count { display: inline-flex; margin-top: 8px; }
.vote-grid .col-best { box-shadow: inset 2px 0 0 var(--cobalt), inset -2px 0 0 var(--cobalt); }
.vote-grid .col-final { box-shadow: inset 2px 0 0 var(--sage), inset -2px 0 0 var(--sage); }
.vote-grid th.col-best { background: var(--cobalt-wash); }
.vote-grid th.col-final { background: var(--sage-wash); }
.cell { height: 46px; padding: 0; border-left: 1px solid var(--line); text-align: center; transition: background-color var(--motion) var(--ease-out); }
.cell > .mark { vertical-align: middle; }
.cell-yes { background: #e8f1ea; }
.cell-maybe { background: #f8f0dc; }
.me-row > * { background-color: #fbfaf6 !important; }
.me-row .who { padding: 8px 10px; }
.name-input { width: 100%; }
.cell-input { padding: 5px; }
.cell-btn { display: grid; place-items: center; width: 100%; height: 40px; border: 1px solid var(--line-strong); border-radius: 8px; background: #fff; cursor: pointer; transition: background-color var(--motion-fast) var(--ease-out), border-color var(--motion-fast) var(--ease-out), transform var(--motion-fast) var(--ease-out); }
.cell-btn:active { transform: scale(.94); }
@media (hover: hover) { .cell-btn:hover { border-color: #9aa3ae; } }
.cell-btn.cell-none { border-style: dashed; }
.cell-btn.cell-yes { background: #e2efe5; border-color: #9cc3a7; }
.cell-btn.cell-maybe { background: #f6ecd2; border-color: #dcc58f; }
.cell-btn.cell-no { background: #f1f2f4; border-color: #cfd4da; }
.cell-btn .mark { animation: oa-enter var(--motion-fast) var(--ease-out); }
.grid-empty { padding: 18px; text-align: center; color: var(--muted); }
/* Saving answers: the kit's action bar, pinned above the home bar on phones */
.save-bar { flex-wrap: wrap; }
.save-bar .save-error { flex-basis: 100%; text-align: right; }
.save-btn { min-width: 220px; }
/* On wide screens the button stays in reach while the grid is on screen, however many rows it has. */
@media (min-width: 721px) {
.grid-block .save-bar { position: sticky; bottom: 0; z-index: 2; padding-block: 10px; background: #fdfdfcf2; -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); }
}
.saved-note { display: inline-flex; align-items: center; gap: 6px; font-size: 14.5px; color: #2f5a3c; }
@media (max-width: 720px) {
.save-bar .save-error { text-align: left; }
.poll-body > .saved-note { justify-self: start; }
}
/* Phone list: one card per time */
.m-list { display: grid; grid-template-columns: minmax(0, 1fr); gap: 18px; }
.m-name { padding: 14px 16px; border: 1px solid var(--line); border-radius: 14px; background: #fff; }
.day-label { margin-bottom: 8px; font: var(--type-caps); letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }
.m-options { list-style: none; padding: 0; border: 1px solid var(--line); border-radius: 14px; background: #fff; overflow: hidden; }
.m-options li { display: grid; grid-template-columns: minmax(0, 1fr); gap: 10px; padding: 14px 16px; transition: box-shadow var(--motion) var(--ease-out); }
.m-options li + li { border-top: 1px solid var(--line); }
.m-options li.col-best { box-shadow: inset 3px 0 0 var(--cobalt); }
.m-options li.col-final { box-shadow: inset 3px 0 0 var(--sage); }
.m-top { display: flex; align-items: center; gap: 10px; }
.m-time { font: 600 16px/1.3 var(--sans); }
.m-top .count { margin-left: auto; }
.tri { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
.tri button { min-height: 44px; padding: 0 6px; border: 1px solid var(--line-strong); border-radius: 10px; background: #fff; color: #3c4048; font: var(--type-control); cursor: pointer; transition: background-color var(--motion-fast) var(--ease-out), border-color var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out), transform var(--motion-fast) var(--ease-out); }
.tri button:active { transform: scale(.97); }
.tri .tri-yes[aria-pressed="true"] { background: #e2efe5; border-color: #7fb08d; color: #24563a; }
.tri .tri-maybe[aria-pressed="true"] { background: #f6ecd2; border-color: #d2b56f; color: #6e5214; }
.tri .tri-no[aria-pressed="true"] { background: #eceef1; border-color: #aab2bd; color: #2f3237; }
.m-names { display: grid; gap: 2px; font-size: 13.5px; color: var(--muted); }
.m-names strong { font-weight: 600; color: #3c4048; }
/* Final time */
.final-card { display: flex; align-items: center; gap: 24px; max-width: 820px; padding: 22px 26px; border-color: #cfe2d4; }
.final-art { flex: none; width: 120px; height: auto; }
.final-day { margin-top: 8px; font: 380 clamp(28px, 3.4vw, 38px)/1.1 var(--serif); letter-spacing: -.02em; }
.final-time { margin-top: 4px; font-size: 17px; color: #2f3237; }
.final-actions { margin-top: 16px; --gap: 8px; }
@media (max-width: 600px) {
.final-card { flex-direction: column; align-items: stretch; gap: 6px; padding: 20px; }
.final-art { width: 84px; }
.final-actions { display: grid; grid-template-columns: minmax(0, 1fr); }
.final-actions .dropdown, .final-actions .btn { width: 100%; }
}
/* Comments */
.comments { display: grid; grid-template-columns: minmax(0, 1fr); gap: 14px; max-width: 680px; margin-top: 18px; padding-top: 26px; border-top: 1px solid var(--line); }
.comments-title { font: 360 26px/1.2 var(--serif); letter-spacing: -.02em; }
.comment-list { list-style: none; padding: 0; display: grid; gap: 10px; }
.comment-list li { display: grid; gap: 4px; padding: 12px 14px; border: 1px solid var(--line); border-radius: 12px; background: #fff; }
.comment-head { display: flex; align-items: baseline; gap: 4px 10px; flex-wrap: wrap; font-size: 13.5px; }
.comment-head strong { font-weight: 600; font-size: 14.5px; }
.comment-head .link-btn { min-height: 0; margin-left: auto; font-size: 13px; }
.comment-text { white-space: pre-wrap; overflow-wrap: anywhere; color: #2a2d33; }
.comment-form { display: grid; grid-template-columns: minmax(0, 1fr); gap: 8px; }
.comment-form .textarea { min-height: 76px; }
.comment-actions { display: flex; align-items: center; justify-content: space-between; gap: 8px 12px; flex-wrap: wrap; }
.comment-actions .btn { min-width: 110px; margin-left: auto; }
/* Dialog contents */
.pick-list { list-style: none; padding: 0; display: grid; gap: 8px; }
.pick { display: flex; align-items: center; gap: 12px; min-height: 56px; padding: 10px 14px; border: 1px solid var(--line); border-radius: 12px; cursor: pointer; transition: border-color var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out); }
@media (hover: hover) { .pick:hover { border-color: var(--line-strong); } }
.pick.on { border-color: var(--ink-solid); box-shadow: 0 0 0 1px var(--ink-solid); }
.pick input { flex: none; width: 18px; height: 18px; accent-color: var(--ink-solid); }
.pick-main { display: grid; flex: 1; min-width: 0; font-size: 15px; }
.pick-day { font-weight: 600; }
.people-list { list-style: none; padding: 0; display: grid; }
.people-list li { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 52px; padding: 6px 0; border-top: 1px solid var(--line); font-size: 15px; }
.people-list li:first-child { border-top: 0; }
.people-list span { min-width: 0; overflow-wrap: anywhere; }
.quote { padding: 10px 14px; border-left: 3px solid var(--line-strong); background: var(--paper); color: #3d4148; overflow-wrap: anywhere; white-space: pre-wrap; }
Change history
Quality pass: comments, CSV export, share the final time, calendar menu, fixes
Bounded source sync
Bounded source sync
Bounded source sync
Bounded source sync
Bounded source sync
Bounded source sync
Bounded source sync