:root {
--bg: #e5ded2;
--bg-deep: #d0c7b8;
--paper: rgba(248, 244, 237, 0.9);
--paper-strong: #f7f1e7;
--paper-muted: rgba(255, 255, 255, 0.5);
--ink: #241f1a;
--muted: #655d53;
--line: rgba(82, 72, 60, 0.14);
--accent: #355f57;
--accent-strong: #24453f;
--accent-warm: #9f6246;
--danger: #8b4a3c;
--success: #2f6b45;
--shadow: 0 18px 42px rgba(44, 36, 29, 0.1);
--radius: 22px;
--radius-tight: 14px;
}
* {
box-sizing: border-box;
}
html {
font-size: 16px;
}
body {
margin: 0;
min-height: 100vh;
overflow: auto;
font-family: "Avenir Next", "Gill Sans", "Trebuchet MS", sans-serif;
color: var(--ink);
background:
radial-gradient(circle at top left, rgba(255, 255, 255, 0.5), transparent 28%),
linear-gradient(135deg, rgba(53, 95, 87, 0.08), transparent 38%),
linear-gradient(180deg, var(--bg), var(--bg-deep));
}
img {
display: block;
max-width: 100%;
}
button,
input,
select,
a {
font: inherit;
}
a {
color: inherit;
}
.page-shell {
width: min(1260px, calc(100% - 1.25rem));
height: 100dvh;
margin: 0 auto;
padding: 0.45rem 0;
display: grid;
grid-template-rows: auto minmax(0, 1fr);
gap: 0.5rem;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
padding: 0.42rem 0.65rem;
border: 1px solid var(--line);
border-radius: 999px;
background: rgba(248, 244, 237, 0.8);
backdrop-filter: blur(12px);
box-shadow: 0 10px 24px rgba(44, 36, 29, 0.08);
}
.brand {
display: inline-flex;
align-items: center;
text-decoration: none;
}
.brand-mark {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 3.8rem;
min-height: 1.8rem;
padding: 0.18rem 0.7rem;
border-radius: 999px;
background: linear-gradient(135deg, var(--accent), var(--accent-strong));
color: #f4eee4;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: lowercase;
}
.topbar-nav {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
}
.topbar-nav a {
padding: 0.28rem 0.62rem;
border-radius: 999px;
color: var(--muted);
text-decoration: none;
transition: background 180ms ease, color 180ms ease, transform 180ms ease;
}
.topbar-nav a:hover {
background: rgba(255, 255, 255, 0.54);
color: var(--ink);
transform: translateY(-1px);
}
.topbar-nav a:focus-visible {
background: rgba(255, 255, 255, 0.54);
color: var(--ink);
transform: translateY(-1px);
outline: 2px solid rgba(53, 95, 87, 0.28);
outline-offset: 2px;
}
.panel {
position: relative;
overflow: hidden;
border: 1px solid var(--line);
border-radius: var(--radius);
background: var(--paper);
backdrop-filter: blur(10px);
box-shadow: var(--shadow);
}
.panel::before {
content: "";
position: absolute;
inset: 0 auto auto 0;
width: 100%;
height: 3px;
background: linear-gradient(90deg, var(--accent), rgba(53, 95, 87, 0));
opacity: 0.7;
}
.layout {
min-height: 0;
display: grid;
grid-template-columns: minmax(0, 1.2fr) minmax(300px, 0.74fr);
gap: 0.75rem;
}
.editor-column {
min-height: 0;
display: grid;
grid-template-rows: auto minmax(0, 1fr);
gap: 0.75rem;
}
.stack {
min-height: 0;
display: grid;
gap: 0.75rem;
padding: 0.9rem;
}
.source-panel,
.controls-panel,
.result-panel {
min-height: 0;
}
.result-panel {
position: relative;
}
.controls-panel,
.result-panel {
overflow: auto;
scrollbar-width: thin;
scrollbar-color: rgba(82, 72, 60, 0.26) transparent;
}
.controls-panel::-webkit-scrollbar,
.result-panel::-webkit-scrollbar {
width: 8px;
}
.controls-panel::-webkit-scrollbar-track,
.result-panel::-webkit-scrollbar-track {
background: transparent;
}
.controls-panel::-webkit-scrollbar-thumb,
.result-panel::-webkit-scrollbar-thumb {
border-radius: 999px;
background: rgba(82, 72, 60, 0.26);
}
.controls-panel::-webkit-scrollbar-thumb:hover,
.result-panel::-webkit-scrollbar-thumb:hover {
background: rgba(82, 72, 60, 0.38);
}
.source-panel {
align-content: start;
overflow: hidden;
}
.section-head {
display: grid;
gap: 0.18rem;
}
.section-kicker,
.meta-grid dt,
.result-stat-label {
margin: 0;
text-transform: uppercase;
letter-spacing: 0.16em;
font-size: 0.7rem;
color: var(--muted);
}
.section-head h2,
.option-section-head h3 {
margin: 0;
font-family: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, serif;
font-weight: 600;
letter-spacing: -0.03em;
line-height: 1;
}
.section-head h2 {
font-size: 1.35rem;
}
.inline-note,
.placeholder,
.status-line,
.option-section-head p,
.dropzone-copy {
margin: 0;
color: var(--muted);
line-height: 1.5;
}
.dropzone {
display: grid;
gap: 0.4rem;
padding: 1rem;
border-radius: calc(var(--radius) - 8px);
border: 1px dashed rgba(82, 72, 60, 0.22);
background:
linear-gradient(135deg, rgba(255, 255, 255, 0.46), transparent 58%),
var(--paper-strong);
cursor: pointer;
transition: border-color 180ms ease, transform 180ms ease, background 180ms ease;
}
.dropzone:hover,
.dropzone.dragover,
.dropzone:focus-within {
border-color: var(--accent);
background:
linear-gradient(135deg, rgba(53, 95, 87, 0.12), transparent 58%),
var(--paper-strong);
transform: translateY(-1px);
}
.dropzone-preview {
min-width: 0;
padding: 0.7rem;
gap: 0.6rem;
}
.dropzone input {
position: absolute;
opacity: 0;
pointer-events: none;
}
.dropzone-title {
font-size: 1rem;
font-weight: 700;
}
.preview-block {
min-height: 0;
display: grid;
gap: 0.55rem;
grid-template-rows: minmax(0, 1fr) auto;
align-content: start;
}
.preview-frame {
min-height: 0;
min-width: 0;
width: 100%;
height: clamp(150px, 28vh, 250px);
display: grid;
place-items: center;
overflow: hidden;
padding: 0.7rem;
border-radius: calc(var(--radius) - 8px);
border: 1px solid rgba(82, 72, 60, 0.08);
background:
linear-gradient(135deg, rgba(255, 255, 255, 0.34), transparent 60%),
rgba(245, 240, 233, 0.98);
}
.preview-frame-input {
height: clamp(160px, 24vh, 220px);
}
.result-panel .preview-frame {
height: clamp(140px, 24vh, 220px);
}
.preview-frame img {
width: 100%;
height: 100%;
min-width: 0;
min-height: 0;
border-radius: 12px;
object-fit: contain;
object-position: center;
}
.placeholder {
max-width: 28ch;
text-align: center;
}
.meta-grid {
margin: 0;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.5rem;
}
.meta-grid div,
.result-stat {
border: 1px solid rgba(82, 72, 60, 0.09);
border-radius: var(--radius-tight);
background: var(--paper-muted);
}
.meta-grid div {
padding: 0.72rem 0.8rem;
}
.meta-grid dt {
margin-bottom: 0.25rem;
}
.meta-grid dd {
margin: 0;
font-size: 0.96rem;
}
.control-stack {
display: grid;
gap: 0.7rem;
}
.option-section {
display: grid;
gap: 0.7rem;
padding: 0.8rem;
border-radius: calc(var(--radius) - 8px);
background: rgba(255, 255, 255, 0.34);
border: 1px solid rgba(82, 72, 60, 0.08);
}
.option-section-head {
display: grid;
gap: 0.18rem;
}
.option-section-head h3 {
font-size: 1.18rem;
}
.form-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.7rem;
}
.form-grid label {
display: grid;
gap: 0.35rem;
}
.form-grid label > span {
font-size: 0.84rem;
color: var(--muted);
}
.form-grid input[type="text"],
.form-grid input[type="number"],
.form-grid select {
width: 100%;
min-height: 40px;
padding: 0.62rem 0.75rem;
border: 1px solid rgba(82, 72, 60, 0.16);
border-radius: 12px;
background: rgba(255, 255, 255, 0.72);
color: var(--ink);
}
.form-grid input:focus,
.form-grid select:focus,
.action-button:focus,
.download-link:focus,
.watermark-clear-button:focus {
outline: 2px solid rgba(53, 95, 87, 0.28);
outline-offset: 2px;
}
.checkbox {
grid-column: 1 / -1;
display: flex;
align-items: center;
gap: 0.55rem;
padding: 0.2rem 0;
}
.checkbox input {
width: 18px;
height: 18px;
accent-color: var(--accent);
}
.quality-field,
.blur-field,
.sharpen-field {
grid-column: 1 / -1;
}
.quality-pair {
display: grid;
grid-template-columns: 1fr 88px;
gap: 0.6rem;
align-items: center;
}
.quality-pair input[type="range"] {
width: 100%;
accent-color: var(--accent);
}
.advanced-details,
.watermark-details {
border: 1px solid rgba(82, 72, 60, 0.08);
border-radius: calc(var(--radius) - 8px);
background: rgba(255, 255, 255, 0.34);
}
.advanced-details summary,
.watermark-summary {
cursor: pointer;
padding: 0.75rem 0.85rem;
font-weight: 700;
}
.advanced-body,
.watermark-controls {
display: grid;
gap: 0.7rem;
padding: 0 0.85rem 0.85rem;
}
.watermark-dropzone {
padding: 0.85rem;
}
.watermark-preview-row {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.65rem;
}
.watermark-preview-img {
max-width: 120px;
max-height: 64px;
border-radius: 8px;
border: 1px solid var(--line);
object-fit: contain;
}
.watermark-clear-button {
padding: 0.4rem 0.75rem;
border: 1px solid rgba(82, 72, 60, 0.16);
border-radius: 10px;
background: rgba(255, 255, 255, 0.58);
color: var(--danger);
cursor: pointer;
font-weight: 700;
}
.watermark-clear-button:hover {
border-color: var(--danger);
}
.action-row,
.download-row {
display: grid;
gap: 0.6rem;
}
.action-button,
.download-link {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 42px;
padding: 0.7rem 1rem;
border-radius: 999px;
border: 1px solid rgba(82, 72, 60, 0.16);
text-decoration: none;
font-weight: 700;
transition: transform 180ms ease, background 180ms ease, border-color 180ms ease;
}
.action-button {
background: linear-gradient(135deg, var(--accent), var(--accent-strong));
color: #f5efe4;
cursor: pointer;
}
.download-link {
background: rgba(255, 255, 255, 0.56);
color: var(--ink);
}
.action-button:hover,
.download-link:hover:not(.disabled) {
transform: translateY(-1px);
border-color: rgba(82, 72, 60, 0.28);
}
.download-link.disabled {
pointer-events: none;
opacity: 0.55;
}
.result-summary {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.5rem;
}
.result-stat {
display: grid;
gap: 0.25rem;
padding: 0.72rem 0.8rem;
}
.result-stat-value {
font-size: 1.25rem;
line-height: 1;
}
.result-stat-value[data-trend="down"] {
color: var(--success);
}
.result-stat-value[data-trend="up"] {
color: var(--accent-warm);
}
.comparison-grid {
margin: 0;
display: grid;
gap: 0.5rem;
position: relative;
z-index: 1;
}
.comparison-grid div {
display: grid;
gap: 0.24rem;
padding: 0.68rem 0.8rem;
border: 1px solid rgba(82, 72, 60, 0.09);
border-radius: var(--radius-tight);
background: var(--paper-muted);
}
.comparison-grid dd {
margin: 0;
display: flex;
align-items: center;
gap: 0.45rem;
min-width: 0;
font-size: 0.94rem;
}
.comparison-grid dd span {
min-width: 0;
}
.comparison-grid dd span:not(.comparison-arrow) {
flex: 1 1 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.comparison-arrow {
flex: 0 0 auto;
color: var(--muted);
}
.status-stack {
display: grid;
gap: 0.55rem;
}
.warning-list,
.error-box {
margin: 0;
padding: 0.75rem 0.9rem;
border-radius: var(--radius-tight);
border: 1px solid rgba(159, 98, 70, 0.16);
background: rgba(159, 98, 70, 0.08);
}
.warning-list {
padding-left: 1.45rem;
}
.error-box {
color: var(--danger);
border-color: rgba(139, 74, 60, 0.18);
background: rgba(139, 74, 60, 0.08);
}
.is-unavailable {
color: var(--accent-warm);
}
.is-busy button,
.is-busy input,
.is-busy select,
.is-busy .dropzone,
.is-busy .download-link {
opacity: 0.55;
pointer-events: none;
}
@media (max-height: 780px) {
.stack {
gap: 0.6rem;
padding: 0.8rem;
}
.preview-frame {
height: clamp(130px, 24vh, 210px);
}
.preview-frame-input {
height: clamp(140px, 20vh, 180px);
}
.meta-grid div,
.result-stat {
padding: 0.65rem 0.75rem;
}
}
@media (max-width: 1120px) {
.page-shell {
height: auto;
min-height: 100dvh;
}
.layout {
grid-template-columns: 1fr;
}
.editor-column {
grid-template-rows: auto auto;
}
.controls-panel,
.result-panel {
overflow: visible;
}
}
@media (max-width: 720px) {
.page-shell {
width: min(100% - 0.75rem, 100%);
padding-top: 0.5rem;
}
.topbar {
flex-direction: column;
align-items: stretch;
border-radius: 24px;
}
.topbar-nav {
justify-content: space-between;
}
.layout,
.form-grid,
.meta-grid,
.result-summary {
grid-template-columns: 1fr;
}
.preview-frame {
height: 180px;
}
.action-button,
.download-link {
width: 100%;
}
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation: none !important;
transition: none !important;
scroll-behavior: auto !important;
}
}