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 604467e480f8468389092a3b
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
/* Images. Shared look comes from /kit.css; this is the app's own layout. */
body.app-mode .landing-only { display: none !important; }
/* Phones held sideways: keep content clear of the notch (zero everywhere else). */
body { padding-inline: var(--safe-left) var(--safe-right); }
.small { font-size: 14px; }
/* Landing hero with the workspace */
.app-hero { padding: 48px 0 72px; background: linear-gradient(180deg, var(--paper-warm) 0%, var(--paper) 100%); border-bottom: 1px solid #f0ebe1; }
.app-hero-grid { display: grid; grid-template-columns: minmax(0, 1fr) 460px; grid-template-areas: "head work" "body work"; column-gap: 56px; }
.hero-head { grid-area: head; align-self: end; }
.hero-work { grid-area: work; align-self: center; }
.hero-body { grid-area: body; align-self: start; }
.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); }
@media (max-width: 900px) {
.app-hero { padding: 24px 0 56px; }
.app-hero-grid { grid-template-columns: minmax(0, 1fr); grid-template-areas: "head" "work" "body"; row-gap: 22px; }
.app-hero .lede { margin-top: 0; }
}
body.app-mode .app-hero { padding: 16px 0 40px; background: var(--paper); border-bottom: 0; }
body.app-mode .app-hero-grid { display: block; }
.drop { display: grid; justify-items: center; gap: 14px; padding: 28px 24px 26px; text-align: center; border: 1.5px dashed var(--line-strong); transition: border-color var(--motion-fast) var(--ease-out), background-color var(--motion-fast) var(--ease-out); }
@media (hover: hover) { .drop { cursor: pointer; } .drop:hover { border-color: #b5bdc8; } }
.drop.is-over { border-color: var(--cobalt); background: var(--cobalt-wash); }
.drop-art { width: 200px; height: auto; margin-bottom: -6px; -webkit-mask-image: radial-gradient(closest-side, #000 72%, #0000); mask-image: radial-gradient(closest-side, #000 72%, #0000); }
.drop-title { font: 380 28px/1.15 var(--serif); letter-spacing: -.02em; color: var(--ink-solid); }
.drop .btn { min-width: 230px; }
.drop-check { min-height: 32px; }
.drop .hint { max-width: 34ch; }
.drop .problems { width: 100%; text-align: left; }
@media (pointer: coarse) { .paste-hint { display: none; } }
@media (max-width: 900px) { .drop-art { width: 120px; } .drop { padding: 18px 18px 22px; gap: 12px; } }
/* Workspace */
.editor { padding-bottom: 24px; animation: oa-enter var(--motion) var(--ease-out); }
.editor-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 14px 16px; flex-wrap: wrap; padding: 8px 0 20px; }
.editor-title-wrap { min-width: 0; max-width: 100%; }
.editor-title { margin-top: 8px; font: 360 clamp(28px, 3.4vw, 40px)/1.1 var(--serif); letter-spacing: -.025em; color: var(--ink-solid); overflow-wrap: anywhere; }
.editor-status { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 8px; min-height: 26px; margin-top: 6px; color: var(--muted); font-size: 15px; }
.editor-status .spinner { width: 14px; height: 14px; flex: none; }
/* Work in progress stays on one line beside its spinner, so nothing below moves. */
.status-text { flex: 1 1 0; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.status-failed { color: var(--brick); }
.editor-actions { gap: 6px; }
.problems { display: grid; gap: 8px; margin-bottom: 14px; }
.problems .notice { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding-block: 6px; padding-right: 6px; }
.problems .btn-icon { color: inherit; }
.editor-grid { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 28px; align-items: start; }
/* The settings stay in view with the download button pinned at their foot. */
.editor-side { position: sticky; top: 80px; display: flex; flex-direction: column; max-height: calc(100vh - 100px); max-height: calc(100dvh - 100px); overflow: hidden; }
.side-body { display: grid; grid-template-columns: minmax(0, 1fr); gap: 18px; padding: 20px; overflow-y: auto; overscroll-behavior: contain; }
.side-body > .field + .field { padding-top: 18px; border-top: 1px solid var(--line); }
.side-foot { padding: 14px 20px 18px; border-top: 1px solid var(--line); }
.editor-bar { display: none; }
.link-btn { padding: 0; border: 0; background: none; color: var(--cobalt); font: inherit; font-weight: 600; cursor: pointer; text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1px; }
.link-btn:hover { color: var(--cobalt-ink); }
/* Image rows */
.items { list-style: none; padding: 0; display: grid; gap: 10px; }
.item { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 14px; padding: 10px; border: 1px solid var(--line); border-radius: 14px; background: #fff; }
.item-thumb { display: grid; place-items: center; width: 84px; height: 84px; padding: 4px; border: 1px solid var(--line); border-radius: 10px; background: var(--paper-warm); overflow: hidden; cursor: zoom-in; }
.item-thumb img { max-width: 100%; max-height: 100%; object-fit: contain; transition: opacity var(--motion) var(--ease-out); }
.item-body { min-width: 0; display: grid; gap: 2px; }
.item-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 600 15px/1.35 var(--sans); color: var(--ink-solid); }
.item-meta { color: var(--muted); font-size: 13.5px; }
.item-result { font-size: 14px; color: #33363c; }
.item-result strong { font-weight: 650; color: var(--ink-solid); }
.is-stale { opacity: .5; transition: opacity var(--motion) var(--ease-out); }
.saving { display: inline-flex; align-items: center; gap: 6px; vertical-align: 1px; padding: 1px 8px; border-radius: 999px; background: var(--panel); font: 650 12.5px/1.5 var(--sans); color: #3c4048; white-space: nowrap; }
.saving .spinner { width: 11px; height: 11px; border-width: 1.5px; }
.saving.good { background: var(--sage-wash); color: #2f5a3c; }
.saving.bad { background: var(--brick-wash); color: #7c2f1d; }
.kept { color: var(--muted); font-size: 13px; }
.working { display: inline-flex; align-items: center; gap: 8px; color: var(--muted); }
.working .spinner { width: 14px; height: 14px; }
.item-error { color: var(--brick); }
.item-tools { display: flex; gap: 2px; }
.item-skeleton .item-thumb { border: 0; }
.item-skeleton .item-body { width: 60%; }
/* A light checkerboard shows where an image is see-through. */
.checker { background-color: #fff; background-image: conic-gradient(#eef0f3 25%, #fff 0 50%, #eef0f3 0 75%, #fff 0); background-size: 16px 16px; }
/* One image: shown large, drag across it to compare */
.single { display: grid; grid-template-columns: minmax(0, 1fr); gap: 14px; animation: oa-enter var(--motion) var(--ease-out); }
.single-meta { display: grid; gap: 3px; justify-items: center; text-align: center; }
.stage { position: relative; margin-inline: auto; border: 1px solid var(--line); border-radius: 14px; overflow: hidden; -webkit-user-select: none; user-select: none; }
.stage.can-compare { cursor: ew-resize; touch-action: pan-y; }
.stage img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; pointer-events: none; -webkit-user-drag: none; }
.stage-line { position: absolute; top: 0; bottom: 0; width: 2px; margin-left: -1px; background: #fff; box-shadow: 0 0 0 1px #15171b2e; pointer-events: none; }
.stage-knob { position: absolute; top: 50%; left: 50%; display: grid; place-items: center; width: 38px; height: 38px; margin: -19px 0 0 -19px; border-radius: 50%; background: #fff; color: var(--ink-solid); box-shadow: 0 2px 10px #15171b40; }
.stage-tag { position: absolute; top: 10px; padding: 3px 9px; border-radius: 999px; background: #15171bb8; color: #fff; font: 600 12px/1.5 var(--sans); pointer-events: none; }
.stage-tag-before { left: 10px; }
.stage-tag-after { right: 10px; }
.stage-note { position: absolute; left: 50%; bottom: 14px; display: inline-flex; align-items: center; gap: 8px; max-width: calc(100% - 24px); padding: 8px 14px; border-radius: 999px; background: #fff; color: var(--ink); box-shadow: 0 4px 16px #15171b26; font: 600 13.5px/1.3 var(--sans); white-space: nowrap; transform: translateX(-50%); animation: oa-fade-in var(--motion) var(--ease-out); }
.stage-note .spinner { width: 14px; height: 14px; flex: none; }
.stage.skeleton { border: 0; }
.single > .skeleton-text { justify-self: center; }
/* Settings */
.check-strong span { font-weight: 650; }
.spread .value { font: 650 13.5px/1.2 var(--sans); color: var(--ink-solid); }
.range { width: 100%; height: 28px; margin: 0; accent-color: var(--ink-solid); cursor: pointer; }
.segmented { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; padding: 4px; border-radius: 12px; background: var(--panel); border: 1px solid var(--panel-line); }
.segmented-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.segmented button { min-height: 38px; padding: 0 4px; border: 0; border-radius: 9px; background: transparent; cursor: pointer; font: var(--type-control); color: var(--muted); transition: background-color var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out); }
@media (hover: hover) { .segmented button:hover:not([aria-checked="true"]) { color: var(--ink-solid); } }
.segmented button[aria-checked="true"] { background: #fff; color: var(--ink-solid); box-shadow: 0 1px 3px #0000001a; }
@media (pointer: coarse) { .segmented button { min-height: 44px; } }
.with-unit { display: flex; align-items: center; gap: 10px; }
.with-unit .input { max-width: 140px; }
.with-unit span { color: var(--muted); font-weight: 600; }
.color-pick { display: inline-flex; align-items: center; gap: 10px; min-height: 44px; font: 600 13.5px var(--mono); color: var(--muted); cursor: pointer; }
.color-pick input { width: 52px; height: 36px; padding: 2px; border: 1px solid var(--line-strong); border-radius: 8px; background: #fff; cursor: pointer; }
.model { display: grid; gap: 8px; }
.bar { display: block; height: 4px; border-radius: 2px; background: var(--panel-line); overflow: hidden; }
.bar span { display: block; height: 100%; background: var(--ink-solid); transform-origin: left; transition: transform var(--motion) var(--ease-out); }
.drop-overlay { position: fixed; inset: 0; z-index: 90; display: grid; place-items: center; background: #2e5ec414; border: 3px dashed var(--cobalt); pointer-events: none; animation: oa-fade-in var(--motion-fast) var(--ease-out); }
.drop-overlay span { padding: 14px 22px; border-radius: 12px; background: #fff; box-shadow: var(--shadow); font: 600 17px var(--sans); }
/* Before and after, for one image of many */
.compare-dialog { width: min(960px, 100%); }
.compare-dialog .dialog-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.compare-sizes { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 8px; margin-right: auto; color: var(--muted); font-size: 14px; }
@media (max-width: 1000px) { .editor-grid { grid-template-columns: minmax(0, 1fr) 320px; gap: 20px; } }
/* Phones: one column, settings under the images, the buttons pinned to the bottom. */
@media (max-width: 720px) {
/* No space under the bar, so it rests on the bottom edge even when scrolled to the end. */
body.app-mode .app-hero, .editor { padding-bottom: 0; }
.editor-grid { grid-template-columns: minmax(0, 1fr); gap: 18px; }
.editor-side { position: static; max-height: none; overflow: visible; }
.side-foot { display: none; }
.editor-bar { display: flex; margin-top: 18px; }
.editor-bar .bar-share { flex: 0 0 auto; }
.editor-head { padding-top: 0; padding-bottom: 16px; }
.item { gap: 10px; padding: 8px; align-items: start; }
.item-thumb { width: 64px; height: 64px; }
.item-tools { flex-direction: column; gap: 8px; }
.single-meta { justify-items: start; text-align: left; }
.single > .skeleton-text { justify-self: start; }
.compare-dialog .dialog-foot { flex-wrap: wrap; }
.compare-sizes { flex: 1 0 100%; justify-content: center; margin-right: 0; }
}
/* Landing sections */
.steps { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px; margin-top: 28px; padding: 0; counter-reset: step; list-style: none; }
.steps li { 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: minmax(0, 1fr); gap: 22px; } }
.tools { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; margin-top: 40px; list-style: none; padding: 0; }
.tools li { padding: 18px 18px 20px; border: 1px solid var(--line); border-radius: 14px; background: #fff; }
.tools h3 { font: 600 17px/1.3 var(--sans); }
.tools p { margin-top: 6px; color: #4a4e56; font-size: 15px; }
@media (max-width: 960px) { .tools { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 520px) { .tools { grid-template-columns: minmax(0, 1fr); } }
.private-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 40px; align-items: start; }
.private-grid .lede { margin-top: 14px; }
.private-list { list-style: none; padding: 0; display: grid; gap: 14px; }
.private-list li { padding: 16px 18px; border-radius: 14px; background: var(--paper-warm); border: 1px solid #ece2cf; }
.private-list strong { display: block; font: 600 16px/1.35 var(--sans); }
.private-list span { display: block; margin-top: 4px; color: #4a4e56; font-size: 15px; }
@media (max-width: 900px) { .private-grid { grid-template-columns: minmax(0, 1fr); gap: 24px; } }
.compare-table td:first-child { font-weight: 600; }
.compare-table { min-width: 680px; }
.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); }
.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; }
.ai-note { display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: 40px; align-items: start; }
.ai-note .lede { margin-top: 14px; }
.ai-note .code { margin-top: 18px; white-space: pre; }
@media (max-width: 900px) { .ai-note { grid-template-columns: minmax(0, 1fr); gap: 20px; } }
Change history
Quality pass: background removal, blur background, paste images
Bounded source sync
Bounded source sync
Bounded source sync