rembg / frontend /src /app /globals.css
ilhamdev's picture
fix(ui): expand hero preview thumbnails to fill the frame edge-to-edge
7ad1c2f
Raw History Blame Contribute Delete
37.3 kB
/* ===== NEUBRUTALISM DESIGN SYSTEM (DESIGN.md) ===== */
:root {
/* Neubrutalism Color Palette */
--color-primary: #FFEB3B; /* Dominant Yellow */
--color-secondary: #FF5252; /* Vibrant Coral / Red */
--color-tertiary: #2196F3; /* Supporting Blue */
--color-black: #000000; /* Pure black for outlines & shadows */
/* Light Theme Canvas */
--bg-base: #FFFDE7; /* Soft warm pastel yellow-cream base */
--bg-surface: #FFFFFF;
--bg-card: #FFFFFF;
--bg-card-muted: #F8F9FA;
--bg-input: #FFFFFF;
--bg-accent-soft: #FFF9C4; /* Light yellow tint */
--text-primary: #121212; /* Charcoal off-black */
--text-secondary: #27272A;
--text-muted: #52525B;
--border-color: #000000;
--border-width: 3px;
--border-stroke: 3px solid #000000;
--border-stroke-sm: 2px solid #000000;
--shadow-offset-xs: 2px 2px 0 #000000;
--shadow-offset: 4px 4px 0 #000000;
--shadow-card: 6px 6px 0 #000000;
--shadow-hover: 8px 8px 0 #000000;
--shadow-inset: inset 2px 2px 0 #000000;
--radius-xs: 4px;
--radius-sm: 6px;
--radius-base: 8px; /* 0.5rem base corner radius per DESIGN.md */
--radius-md: 8px;
--radius-lg: 12px;
--font-mono: var(--font-mono, "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace);
--font-sans: var(--font-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);
}
[data-theme="dark"] {
/* Dark Theme Canvas (Full Dark Mode per DESIGN.md) */
--bg-base: #121215; /* Deep charcoal canvas */
--bg-surface: #1C1C21;
--bg-card: #1F1F24;
--bg-card-muted: #27272D;
--bg-input: #18181C;
--bg-accent-soft: #2B281B; /* Dark yellow tint */
--text-primary: #FAFAFA;
--text-secondary: #E4E4E7;
--text-muted: #A1A1AA;
--border-color: #000000;
--border-stroke: 3px solid #000000;
--border-stroke-sm: 2px solid #000000;
--shadow-offset-xs: 2px 2px 0 #000000;
--shadow-offset: 4px 4px 0 #000000;
--shadow-card: 6px 6px 0 #000000;
--shadow-hover: 8px 8px 0 #000000;
}
/* ===== RESET & BASE STYLES ===== */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
scroll-behavior: smooth;
font-size: 16px;
}
body {
font-family: var(--font-sans);
background-color: var(--bg-base);
color: var(--text-primary);
min-height: 100dvh;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
transition: background-color 0.2s ease, color 0.2s ease;
}
/* Accessible high-contrast focus visible ring */
:focus-visible {
outline: 3px solid var(--color-tertiary);
outline-offset: 3px;
}
/* Typography Scale per DESIGN.md */
h1 {
font-size: clamp(2.25rem, 4.5vw, 3.5rem);
font-weight: 700;
line-height: 1.15;
letter-spacing: -0.03em;
color: var(--text-primary);
}
h2 {
font-size: 1.5rem;
font-weight: 700;
line-height: 1.3;
letter-spacing: -0.02em;
color: var(--text-primary);
}
p {
font-size: 1rem;
line-height: 1.6;
max-width: 72ch;
}
code, .mono {
font-family: var(--font-mono);
}
/* ===== APP LAYOUT & CONTAINER ===== */
.app-wrapper {
min-height: 100dvh;
display: flex;
flex-direction: column;
background-color: var(--bg-base);
position: relative;
overflow-x: hidden;
}
/* Max-width containment: 1280px centered with 1.5rem side padding (DESIGN.md) */
.container {
width: 100%;
max-width: 1280px;
margin: 0 auto;
padding: 0 1.5rem;
}
/* ===== HEADER & NAVIGATION ===== */
.header {
padding: 16px 0;
background-color: var(--bg-surface);
border-bottom: 3px solid var(--color-black);
position: sticky;
top: 0;
z-index: 100; /* z-index contract: sticky-nav (100) */
transition: background-color 0.2s ease;
}
.header-inner {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
}
.logo {
display: inline-flex;
align-items: center;
gap: 12px;
text-decoration: none;
color: var(--text-primary);
}
.logo-badge {
display: inline-flex;
align-items: center;
justify-content: center;
width: 42px;
height: 42px;
background-color: var(--color-primary);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: 3px 3px 0 var(--color-black);
color: var(--color-black);
transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.logo:hover .logo-badge {
transform: translate(-2px, -2px);
box-shadow: 5px 5px 0 var(--color-black);
}
.logo-title-group {
display: flex;
flex-direction: column;
}
.logo-text {
font-size: 1.25rem;
font-weight: 800;
letter-spacing: -0.02em;
color: var(--text-primary);
line-height: 1.1;
}
.logo-sub {
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 600;
color: var(--text-muted);
}
.header-meta {
display: flex;
align-items: center;
gap: 12px;
}
/* Theme Toggle Button (Neubrutalism) */
.theme-toggle-btn {
display: inline-flex;
align-items: center;
gap: 8px;
min-height: 44px;
padding: 0 16px;
background-color: var(--bg-card);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset);
color: var(--text-primary);
font-family: var(--font-sans);
font-size: 0.875rem;
font-weight: 700;
cursor: pointer;
user-select: none;
transition: transform 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
}
.theme-toggle-btn:hover {
background-color: var(--color-primary);
color: var(--color-black);
transform: translate(-2px, -2px);
box-shadow: var(--shadow-hover);
}
.theme-toggle-btn:active {
transform: translate(2px, 2px);
box-shadow: var(--shadow-offset-xs);
}
.theme-toggle-label {
font-size: 0.8125rem;
font-weight: 700;
letter-spacing: 0.02em;
}
/* Hugging Face Link Button */
.hf-link {
font-family: var(--font-mono);
font-size: 0.8125rem;
font-weight: 700;
color: var(--text-primary);
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 8px;
min-height: 44px;
padding: 0 16px;
background-color: var(--color-tertiary);
color: #FFFFFF;
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset);
transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.hf-link:hover {
transform: translate(-2px, -2px);
box-shadow: var(--shadow-hover);
color: #FFFFFF;
}
.hf-link:active {
transform: translate(2px, 2px);
box-shadow: var(--shadow-offset-xs);
}
/* ===== HERO SECTION: SPLIT-SCREEN (DESIGN.md) ===== */
.hero {
padding: clamp(3rem, 6vw, 5rem) 0 clamp(2rem, 4vw, 3.5rem);
}
.hero-split-grid {
display: grid;
grid-template-columns: 1.15fr 0.85fr;
gap: 40px;
align-items: center;
}
.hero-content {
display: flex;
flex-direction: column;
gap: 18px;
}
.hero-tag-badge {
display: inline-flex;
align-items: center;
gap: 8px;
align-self: flex-start;
padding: 6px 14px;
background-color: var(--color-primary);
color: var(--color-black);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset-xs);
font-family: var(--font-mono);
font-size: 0.8125rem;
font-weight: 800;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.hero-title {
margin: 0;
color: var(--text-primary);
}
.hero-desc {
font-size: 1.125rem;
line-height: 1.6;
color: var(--text-secondary);
}
.hero-feature-chips {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 6px;
}
.feature-chip {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 700;
box-shadow: var(--shadow-offset-xs);
}
.feature-chip.chip-yellow {
background-color: var(--color-primary);
color: var(--color-black);
}
.feature-chip.chip-blue {
background-color: var(--color-tertiary);
color: #FFFFFF;
}
.feature-chip.chip-red {
background-color: var(--color-secondary);
color: #FFFFFF;
}
/* Hero Visual Card (Neubrutalist Showcase) */
.hero-visual-card {
background-color: var(--bg-card);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-card);
padding: 20px;
position: relative;
display: flex;
flex-direction: column;
gap: 16px;
}
.hero-visual-header {
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 2px solid var(--color-black);
padding-bottom: 12px;
}
.hero-visual-dots {
display: flex;
gap: 6px;
}
.dot {
width: 12px;
height: 12px;
border-radius: 50%;
border: 2px solid var(--color-black);
}
.dot-red { background-color: var(--color-secondary); }
.dot-yellow { background-color: var(--color-primary); }
.dot-blue { background-color: var(--color-tertiary); }
.hero-visual-title {
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 700;
color: var(--text-muted);
}
.hero-visual-preview {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.visual-preview-box {
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
padding: 0;
overflow: hidden;
display: flex;
flex-direction: column;
box-shadow: var(--shadow-offset-xs);
background-color: var(--bg-card);
}
.visual-preview-box.box-original {
background-color: var(--bg-card-muted);
}
.visual-preview-box.box-cutout {
background-color: var(--color-accent-soft);
background-image:
linear-gradient(45deg, rgba(0,0,0,0.06) 25%, transparent 25%),
linear-gradient(-45deg, rgba(0,0,0,0.06) 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, rgba(0,0,0,0.06) 75%),
linear-gradient(-45deg, transparent 75%, rgba(0,0,0,0.06) 75%);
background-size: 12px 12px;
}
[data-theme="dark"] .visual-preview-box.box-cutout {
background-color: #1a1a20;
background-image:
linear-gradient(45deg, rgba(255,255,255,0.06) 25%, transparent 25%),
linear-gradient(-45deg, rgba(255,255,255,0.06) 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, rgba(255,255,255,0.06) 75%),
linear-gradient(-45deg, transparent 75%, rgba(255,255,255,0.06) 75%);
background-size: 12px 12px;
}
.visual-preview-img-frame {
width: 100%;
aspect-ratio: 1 / 1;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
}
.visual-preview-img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
user-select: none;
pointer-events: none;
}
.visual-preview-footer {
width: 100%;
padding: 8px 4px;
background-color: var(--bg-card);
border-top: 2px solid var(--color-black);
text-align: center;
display: flex;
align-items: center;
justify-content: center;
}
.visual-preview-label {
font-family: var(--font-mono);
font-size: 0.6875rem;
font-weight: 700;
text-transform: uppercase;
color: var(--text-primary);
}
.hero-visual-footer {
display: flex;
justify-content: space-between;
align-items: center;
background-color: var(--color-primary);
color: var(--color-black);
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
padding: 8px 12px;
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 700;
}
/* ===== MAIN TOOL CARD (NEUBRUTALISM) ===== */
.main-card {
background-color: var(--bg-card);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
padding: clamp(20px, 3vw, 32px);
box-shadow: var(--shadow-card);
margin-bottom: clamp(3rem, 6vw, 5rem);
}
/* Configuration grid */
.config-grid {
display: grid;
grid-template-columns: 1fr 260px;
gap: 20px;
margin-bottom: 24px;
}
.field-group {
display: flex;
flex-direction: column;
gap: 8px;
}
.field-label {
font-family: var(--font-mono);
font-size: 0.8125rem;
font-weight: 700;
color: var(--text-primary);
text-transform: uppercase;
letter-spacing: 0.02em;
}
.select-control {
width: 100%;
min-height: 48px;
padding: 10px 14px;
background-color: var(--bg-input);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset);
color: var(--text-primary);
font-family: var(--font-sans);
font-size: 0.9375rem;
font-weight: 600;
cursor: pointer;
outline: none;
transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.select-control:focus {
outline: 3px solid var(--color-tertiary);
outline-offset: 2px;
}
.select-control:disabled {
opacity: 0.6;
cursor: not-allowed;
}
/* Toggle card (Alpha Matting) */
.toggle-card {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 14px;
background-color: var(--bg-input);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset);
cursor: pointer;
user-select: none;
min-height: 48px;
transition: transform 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
}
.toggle-card:hover {
transform: translate(-1px, -1px);
box-shadow: 5px 5px 0 var(--color-black);
}
.toggle-card input[type="checkbox"] {
width: 20px;
height: 20px;
cursor: pointer;
accent-color: var(--color-primary);
}
.toggle-text {
font-family: var(--font-sans);
font-size: 0.875rem;
font-weight: 700;
color: var(--text-primary);
line-height: 1.3;
}
/* ===== DROPZONE & UPLOAD (NEUBRUTALISM) ===== */
.dropzone {
border: 3px dashed var(--color-black);
border-radius: var(--radius-base);
background-color: var(--bg-card-muted);
box-shadow: var(--shadow-offset);
padding: 56px 24px;
text-align: center;
cursor: pointer;
position: relative;
transition: background-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
}
.dropzone:hover,
.dropzone.drag-active {
background-color: var(--bg-accent-soft);
transform: translate(-2px, -2px);
box-shadow: var(--shadow-hover);
}
.dropzone-inner {
display: flex;
flex-direction: column;
align-items: center;
gap: 14px;
}
.dropzone-icon {
width: 60px;
height: 60px;
background-color: var(--color-primary);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset-xs);
color: var(--color-black);
display: flex;
align-items: center;
justify-content: center;
}
.dropzone-title {
font-size: 1.125rem;
font-weight: 700;
color: var(--text-primary);
}
.dropzone-hint {
font-size: 0.875rem;
color: var(--text-secondary);
max-width: 520px;
line-height: 1.5;
}
/* Uploaded Image Preview */
.preview-container {
display: flex;
flex-direction: column;
gap: 16px;
}
.preview-media-box {
background-color: var(--bg-card-muted);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset);
padding: 20px;
display: flex;
justify-content: center;
align-items: center;
min-height: 280px;
max-height: 480px;
overflow: hidden;
}
.preview-img {
max-width: 100%;
max-height: 440px;
object-fit: contain;
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
}
.preview-meta-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 4px;
flex-wrap: wrap;
gap: 12px;
}
.meta-info {
font-family: var(--font-mono);
font-size: 0.8125rem;
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
}
.meta-filename {
font-weight: 700;
color: var(--text-primary);
max-width: 320px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.meta-badge {
background-color: var(--color-primary);
color: var(--color-black);
border: 2px solid var(--color-black);
box-shadow: var(--shadow-offset-xs);
padding: 4px 10px;
border-radius: var(--radius-xs);
font-size: 0.75rem;
font-weight: 700;
}
.btn-ghost-small {
background-color: var(--bg-card);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset-xs);
color: var(--text-primary);
font-family: var(--font-sans);
font-size: 0.8125rem;
font-weight: 700;
padding: 0 16px;
cursor: pointer;
min-height: 44px;
display: inline-flex;
align-items: center;
transition: transform 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
}
.btn-ghost-small:hover:not(:disabled) {
background-color: var(--color-secondary);
color: #FFFFFF;
transform: translate(-1px, -1px);
box-shadow: var(--shadow-offset);
}
.btn-ghost-small:disabled {
opacity: 0.5;
cursor: not-allowed;
}
/* Stepped Progress bar (Neubrutalism) */
.progress-wrapper {
margin-top: 20px;
display: flex;
flex-direction: column;
gap: 8px;
}
.progress-header {
display: flex;
justify-content: space-between;
font-family: var(--font-mono);
font-size: 0.8125rem;
font-weight: 700;
color: var(--text-primary);
}
.progress-value {
font-weight: 800;
color: var(--color-secondary);
}
.progress-track {
height: 16px;
background-color: var(--bg-card-muted);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset-xs);
overflow: hidden;
}
.progress-bar-fill {
height: 100%;
background-color: var(--color-primary);
border-right: 2px solid var(--color-black);
transition: width 0.3s ease;
}
/* Error message banner (Neubrutalism) */
.error-banner {
margin-top: 20px;
padding: 14px 18px;
background-color: var(--color-secondary);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset);
color: #FFFFFF;
font-family: var(--font-sans);
font-size: 0.875rem;
font-weight: 700;
display: flex;
align-items: center;
gap: 12px;
}
/* Turnstile container */
.turnstile-box {
margin-top: 24px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
min-height: 65px;
}
.turnstile-notice {
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 600;
color: var(--text-secondary);
}
/* Action button area */
.action-row {
margin-top: 24px;
display: flex;
gap: 16px;
}
/* Primary Button (Neubrutalism per DESIGN.md: Yellow fill, 3px black border, offset shadow, tactile press) */
.btn-primary {
flex: 1;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 10px;
background-color: var(--color-primary);
color: var(--color-black);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset);
font-family: var(--font-sans);
font-size: 1rem;
font-weight: 700;
padding: 14px 24px;
cursor: pointer;
user-select: none;
min-height: 48px;
transition: transform 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
}
.btn-primary:hover:not(:disabled) {
background-color: #FDD835; /* 8% darken per DESIGN.md */
transform: translate(-2px, -2px);
box-shadow: var(--shadow-hover);
}
.btn-primary:active:not(:disabled) {
transform: translate(2px, 2px);
box-shadow: var(--shadow-offset-xs);
}
.btn-primary:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
box-shadow: var(--shadow-offset);
}
/* Secondary Button (Outline variant with tactile press) */
.btn-secondary {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
background-color: var(--bg-card);
color: var(--text-primary);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset);
font-family: var(--font-sans);
font-size: 0.9375rem;
font-weight: 700;
padding: 12px 20px;
cursor: pointer;
user-select: none;
min-height: 48px;
transition: transform 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease, color 0.15s ease;
}
.btn-secondary:hover:not(:disabled) {
background-color: var(--color-tertiary);
color: #FFFFFF;
transform: translate(-2px, -2px);
box-shadow: var(--shadow-hover);
}
.btn-secondary:active:not(:disabled) {
transform: translate(2px, 2px);
box-shadow: var(--shadow-offset-xs);
}
.btn-secondary:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
}
/* Loading spinner */
.spinner-icon {
width: 18px;
height: 18px;
border: 3px solid rgba(0, 0, 0, 0.2);
border-top-color: var(--color-black);
border-radius: 50%;
animation: spin 0.6s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* ===== RESULT SECTION (NEUBRUTALISM) ===== */
.result-section {
margin-top: 32px;
background-color: var(--bg-card);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
padding: clamp(20px, 3vw, 32px);
box-shadow: var(--shadow-card);
margin-bottom: clamp(3rem, 6vw, 5rem);
}
.result-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
flex-wrap: wrap;
gap: 16px;
border-bottom: 2px solid var(--color-black);
padding-bottom: 16px;
}
.result-title-group {
display: flex;
align-items: center;
gap: 12px;
flex-wrap: wrap;
}
.result-title {
font-size: 1.125rem;
font-weight: 800;
color: var(--text-primary);
}
.result-meta-badge {
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 700;
background-color: var(--color-tertiary);
color: #FFFFFF;
border: 2px solid var(--color-black);
box-shadow: var(--shadow-offset-xs);
padding: 4px 10px;
border-radius: var(--radius-xs);
}
.result-controls-bar {
display: flex;
align-items: center;
gap: 12px;
flex-wrap: wrap;
}
/* View mode switcher (Hasil vs Asli) */
.view-mode-group {
display: flex;
align-items: center;
background-color: var(--bg-card-muted);
border: 2px solid var(--color-black);
border-radius: var(--radius-base);
padding: 4px;
gap: 4px;
}
.control-tab-btn {
background: transparent;
border: 2px solid transparent;
font-family: var(--font-sans);
font-size: 0.8125rem;
font-weight: 700;
color: var(--text-secondary);
padding: 0 14px;
border-radius: var(--radius-xs);
cursor: pointer;
min-height: 44px;
display: inline-flex;
align-items: center;
transition: all 0.15s ease;
}
.control-tab-btn.active {
background-color: var(--color-primary);
color: var(--color-black);
border: 2px solid var(--color-black);
box-shadow: var(--shadow-offset-xs);
}
/* Preview background inspector toggle */
.bg-inspector-group {
display: flex;
align-items: center;
background-color: var(--bg-card-muted);
border: 2px solid var(--color-black);
border-radius: var(--radius-base);
padding: 4px;
gap: 4px;
}
.bg-inspector-btn {
background: transparent;
border: 2px solid transparent;
font-family: var(--font-sans);
font-size: 0.8125rem;
font-weight: 700;
color: var(--text-secondary);
padding: 0 12px;
border-radius: var(--radius-xs);
cursor: pointer;
min-height: 44px;
display: inline-flex;
align-items: center;
transition: all 0.15s ease;
}
.bg-inspector-btn.active {
background-color: var(--bg-card);
color: var(--text-primary);
border: 2px solid var(--color-black);
box-shadow: var(--shadow-offset-xs);
}
/* Canvas backgrounds */
.result-canvas {
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset);
padding: 24px;
display: flex;
align-items: center;
justify-content: center;
min-height: 340px;
max-height: 540px;
overflow: hidden;
transition: background-color 0.2s ease;
}
.result-canvas.checkerboard {
background-image:
linear-gradient(45deg, #E0E0E0 25%, transparent 25%),
linear-gradient(-45deg, #E0E0E0 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #E0E0E0 75%),
linear-gradient(-45deg, transparent 75%, #E0E0E0 75%);
background-size: 20px 20px;
background-position: 0 0, 0 10px, 10px -10px, -10px 0px;
background-color: #FFFFFF;
}
[data-theme="dark"] .result-canvas.checkerboard {
background-image:
linear-gradient(45deg, #2B2B30 25%, transparent 25%),
linear-gradient(-45deg, #2B2B30 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #2B2B30 75%),
linear-gradient(-45deg, transparent 75%, #2B2B30 75%);
background-size: 20px 20px;
background-position: 0 0, 0 10px, 10px -10px, -10px 0px;
background-color: #1A1A1F;
}
.result-canvas.white {
background-color: #FFFFFF;
}
.result-canvas.dark {
background-color: #121212;
}
.result-canvas.original-bg {
background-color: var(--bg-card-muted);
}
.result-image {
max-width: 100%;
max-height: 480px;
object-fit: contain;
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
box-shadow: var(--shadow-offset-xs);
}
.result-footer-actions {
margin-top: 24px;
display: flex;
gap: 16px;
}
/* Reprocess panel in result card */
.reprocess-panel {
margin-top: 28px;
padding: 20px;
background-color: var(--bg-accent-soft);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-offset);
}
.reprocess-header {
display: flex;
flex-direction: column;
gap: 4px;
margin-bottom: 16px;
}
.reprocess-title {
font-size: 1rem;
font-weight: 800;
color: var(--text-primary);
}
.reprocess-desc {
font-size: 0.875rem;
color: var(--text-secondary);
}
.reprocess-controls {
display: flex;
align-items: center;
gap: 14px;
flex-wrap: wrap;
}
.reprocess-field {
flex: 1;
min-width: 240px;
}
.reprocess-tip {
margin-top: 10px;
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 600;
color: var(--text-muted);
}
/* ===== FEATURE / INFORMATION SECTION: ZIG-ZAG ROWS (DESIGN.md) ===== */
.info-section {
padding: clamp(2rem, 4vw, 4rem) 0 clamp(3rem, 6vw, 5rem);
}
.section-headline-group {
margin-bottom: 32px;
}
.section-tag {
display: inline-block;
padding: 4px 10px;
background-color: var(--color-tertiary);
color: #FFFFFF;
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
box-shadow: var(--shadow-offset-xs);
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 800;
text-transform: uppercase;
margin-bottom: 8px;
}
.zigzag-container {
display: flex;
flex-direction: column;
gap: 32px;
}
.zigzag-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 28px;
align-items: stretch;
}
.info-card {
background-color: var(--bg-card);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-card);
padding: 28px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.info-card-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 16px;
border-bottom: 2px solid var(--color-black);
padding-bottom: 12px;
}
.info-card-badge {
padding: 4px 10px;
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
font-family: var(--font-mono);
font-size: 0.6875rem;
font-weight: 800;
text-transform: uppercase;
}
.badge-yellow { background-color: var(--color-primary); color: var(--color-black); }
.badge-blue { background-color: var(--color-tertiary); color: #FFFFFF; }
.badge-red { background-color: var(--color-secondary); color: #FFFFFF; }
.info-card h2 {
font-size: 1.25rem;
margin: 0;
}
.model-list {
list-style: none;
display: flex;
flex-direction: column;
gap: 12px;
}
.model-item {
font-size: 0.875rem;
color: var(--text-secondary);
line-height: 1.5;
padding: 8px 12px;
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
background-color: var(--bg-card-muted);
}
.model-item strong {
color: var(--text-primary);
font-family: var(--font-mono);
display: inline-block;
margin-right: 6px;
}
/* Visual companion card for zigzag rows */
.spec-highlight-card {
background-color: var(--color-primary);
color: var(--color-black);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-card);
padding: 28px;
display: flex;
flex-direction: column;
justify-content: space-between;
gap: 16px;
}
.spec-highlight-card.card-blue {
background-color: var(--color-tertiary);
color: #FFFFFF;
}
.spec-highlight-card.card-blue h3,
.spec-highlight-card.card-blue p,
.spec-highlight-card.card-blue .spec-stat-label {
color: #FFFFFF;
}
.spec-highlight-title {
font-size: 1.375rem;
font-weight: 800;
line-height: 1.2;
}
.spec-stat-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
margin-top: 12px;
}
.spec-stat-box {
background-color: var(--bg-card);
color: var(--text-primary);
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
box-shadow: var(--shadow-offset-xs);
padding: 12px;
display: flex;
flex-direction: column;
gap: 4px;
}
.spec-stat-val {
font-family: var(--font-mono);
font-size: 1.125rem;
font-weight: 800;
color: var(--color-secondary);
}
.spec-stat-label {
font-size: 0.75rem;
font-weight: 700;
color: var(--text-secondary);
}
/* ===== FOOTER ===== */
.footer {
margin-top: auto;
padding: 32px 0;
background-color: var(--bg-surface);
border-top: 3px solid var(--color-black);
}
.footer-content {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 16px;
}
.footer-text {
font-family: var(--font-mono);
font-size: 0.8125rem;
font-weight: 700;
color: var(--text-primary);
}
.footer-links {
display: flex;
gap: 16px;
flex-wrap: wrap;
}
.footer-link {
font-family: var(--font-mono);
font-size: 0.8125rem;
font-weight: 700;
color: var(--text-primary);
text-decoration: none;
padding: 6px 12px;
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
background-color: var(--bg-card);
box-shadow: var(--shadow-offset-xs);
transition: transform 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
}
.footer-link:hover {
background-color: var(--color-primary);
color: var(--color-black);
transform: translate(-1px, -1px);
box-shadow: 4px 4px 0 var(--color-black);
}
/* ===== BEFORE/AFTER INTERACTIVE DEMO SHOWCASE SECTION (DESIGN.md) ===== */
.demo-section {
padding: clamp(2rem, 4vw, 3.5rem) 0;
margin-bottom: clamp(2rem, 4vw, 3.5rem);
}
.demo-card {
background-color: var(--bg-card);
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-card);
padding: clamp(20px, 3.5vw, 36px);
}
.demo-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
flex-wrap: wrap;
gap: 16px;
margin-bottom: 24px;
border-bottom: 2px solid var(--color-black);
padding-bottom: 16px;
}
.demo-header-info {
display: flex;
flex-direction: column;
gap: 8px;
max-width: 680px;
}
.demo-tag {
display: inline-flex;
align-items: center;
gap: 6px;
align-self: flex-start;
padding: 4px 10px;
background-color: var(--color-primary);
color: var(--color-black);
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
box-shadow: var(--shadow-offset-xs);
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 800;
text-transform: uppercase;
}
.demo-title {
font-size: clamp(1.375rem, 2.5vw, 1.75rem);
font-weight: 800;
color: var(--text-primary);
margin: 0;
}
.demo-desc {
font-size: 0.9375rem;
color: var(--text-secondary);
line-height: 1.5;
}
.demo-status-pill {
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 700;
padding: 6px 12px;
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
box-shadow: var(--shadow-offset-xs);
display: inline-flex;
align-items: center;
gap: 6px;
}
.demo-status-pill.pill-ready {
background-color: var(--color-primary);
color: var(--color-black);
}
.demo-status-pill.pill-processing {
background-color: var(--color-tertiary);
color: #FFFFFF;
}
.demo-status-pill.pill-idle {
background-color: var(--bg-card-muted);
color: var(--text-secondary);
}
/* Slider frame & container */
.demo-stage {
display: flex;
flex-direction: column;
align-items: center;
gap: 20px;
}
.demo-slider-frame {
position: relative;
width: 100%;
max-width: 520px;
aspect-ratio: 1 / 1;
border: 3px solid var(--color-black);
border-radius: var(--radius-base);
box-shadow: var(--shadow-card);
overflow: hidden;
user-select: none;
background-color: var(--bg-card-muted);
}
/* Checkerboard for transparent after layer */
.demo-layer-after {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
overflow: hidden;
background-image:
linear-gradient(45deg, #E0E0E0 25%, transparent 25%),
linear-gradient(-45deg, #E0E0E0 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #E0E0E0 75%),
linear-gradient(-45deg, transparent 75%, #E0E0E0 75%);
background-size: 20px 20px;
background-position: 0 0, 0 10px, 10px -10px, -10px 0px;
background-color: #FFFFFF;
}
[data-theme="dark"] .demo-layer-after {
background-image:
linear-gradient(45deg, #2A2A30 25%, transparent 25%),
linear-gradient(-45deg, #2A2A30 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #2A2A30 75%),
linear-gradient(-45deg, transparent 75%, #2A2A30 75%);
background-size: 20px 20px;
background-position: 0 0, 0 10px, 10px -10px, -10px 0px;
background-color: #16161B;
}
.demo-layer-before {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
overflow: hidden;
background-color: var(--bg-card-muted);
}
.demo-img {
width: 100%;
max-width: 100%;
height: 100%;
object-fit: contain;
display: block;
pointer-events: none;
}
/* Vertical divider line */
.demo-divider {
position: absolute;
top: 0;
bottom: 0;
width: 3px;
background-color: var(--color-black);
z-index: 10;
pointer-events: none;
}
/* Draggable handle */
.demo-handle {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 44px;
height: 44px;
background-color: var(--color-primary);
border: 3px solid var(--color-black);
border-radius: 50%;
box-shadow: var(--shadow-offset-xs);
display: flex;
align-items: center;
justify-content: center;
color: var(--color-black);
cursor: ew-resize;
pointer-events: auto;
touch-action: none;
transition: transform 0.1s ease;
}
.demo-handle:hover {
transform: translate(-50%, -50%) scale(1.08);
}
.demo-handle:active {
transform: translate(-50%, -50%) scale(0.96);
}
/* Badges inside slider */
.demo-badge-floating {
position: absolute;
top: 14px;
z-index: 12;
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 800;
padding: 4px 10px;
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
box-shadow: var(--shadow-offset-xs);
pointer-events: none;
}
.demo-badge-before {
left: 14px;
background-color: #FFFFFF;
color: #000000;
}
.demo-badge-after {
right: 14px;
background-color: var(--color-primary);
color: var(--color-black);
}
/* Native accessible range input overlaid for keyboard control */
.demo-range-input {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
opacity: 0;
cursor: ew-resize;
z-index: 15;
margin: 0;
}
.demo-range-input:focus-visible + .demo-divider .demo-handle {
outline: 3px solid var(--color-tertiary);
outline-offset: 4px;
}
/* Slider quick controls / presets */
.demo-quick-bar {
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
justify-content: center;
}
.demo-quick-btn {
font-family: var(--font-sans);
font-size: 0.8125rem;
font-weight: 700;
padding: 8px 16px;
background-color: var(--bg-card);
color: var(--text-primary);
border: 2px solid var(--color-black);
border-radius: var(--radius-xs);
box-shadow: var(--shadow-offset-xs);
cursor: pointer;
min-height: 44px;
display: inline-flex;
align-items: center;
transition: transform 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;
}
.demo-quick-btn:hover {
background-color: var(--color-primary);
color: var(--color-black);
transform: translate(-1px, -1px);
box-shadow: 3px 3px 0 var(--color-black);
}
.demo-quick-btn.active {
background-color: var(--color-primary);
color: var(--color-black);
box-shadow: inset 2px 2px 0 var(--color-black);
}
/* Actions below comparison */
.demo-actions {
display: flex;
gap: 14px;
flex-wrap: wrap;
justify-content: center;
width: 100%;
max-width: 580px;
}
.demo-helper-note {
font-family: var(--font-mono);
font-size: 0.75rem;
font-weight: 600;
color: var(--text-muted);
text-align: center;
}
/* ===== RESPONSIVE BREAKPOINTS (COLLAPSE BELOW 768px per DESIGN.md) ===== */
@media (max-width: 768px) {
.hero-split-grid {
grid-template-columns: 1fr;
gap: 32px;
}
.config-grid {
grid-template-columns: 1fr;
}
.main-card {
padding: 18px;
}
.result-section {
padding: 18px;
}
.result-footer-actions {
flex-direction: column;
}
.action-row {
flex-direction: column;
}
.btn-primary, .btn-secondary {
width: 100%;
}
.zigzag-row {
grid-template-columns: 1fr;
}
.footer-content {
flex-direction: column;
align-items: flex-start;
}
}