Arnab
clean HF deployment
2e72d15
Raw
History Blame Contribute Delete
26.3 kB
/* ─────────────────────────────────────────────────────────────────────────────
StyleForge v2 β€” style.css (dark theme)
Theme: deep charcoal bg, warm off-white text, terracotta accent
Fonts: Bricolage Grotesque (headings) Β· DM Sans (body) Β· DM Mono (values)
───────────────────────────────────────────────────────────────────────────── */
/* ── Tokens ─────────────────────────────────────────────────────────────── */
:root {
--bg: #111110; /* near-black warm */
--bg-2: #0d0d0c;
--surface: #1a1a18; /* card surface */
--surface-2: #222220; /* input / dropzone bg */
--border: #2e2e2b; /* subtle border */
--border-2: #3d3d39; /* hover border */
--text: #f0ede8; /* warm off-white */
--text-2: #9c9990; /* muted */
--text-3: #5c5a55; /* dimmed */
--accent: #c4622d; /* terracotta */
--accent-dark: #a84f23;
--accent-light: rgba(196,98,45,.12);
--accent-border:rgba(196,98,45,.28);
--sidebar-w: 340px;
--topbar-h: 52px;
--radius-sm: 5px;
--radius: 9px;
--radius-lg: 14px;
--shadow-sm: 0 1px 3px rgba(0,0,0,.4);
--shadow: 0 4px 24px rgba(0,0,0,.5);
--transition: 0.16s ease;
}
/* ── Reset ───────────────────────────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; font-size: 15px; }
body {
font-family: 'DM Sans', system-ui, sans-serif;
background-color: var(--bg);
color: var(--text);
-webkit-font-smoothing: antialiased;
min-height: 100vh;
}
a { color: inherit; text-decoration: none; }
/* ── Scrollbar ───────────────────────────────────────────────────────────── */
::-webkit-scrollbar { width: 5px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border-2); border-radius: 99px; }
/* ── Topbar ──────────────────────────────────────────────────────────────── */
.topbar {
position: fixed;
top: 0; left: 0; right: 0;
height: var(--topbar-h);
background: rgba(17, 17, 16, 0.85);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 1.5rem;
z-index: 200;
gap: 1rem;
}
.brand {
display: flex;
align-items: center;
gap: 0.5rem;
font-family: 'Bricolage Grotesque', sans-serif;
font-weight: 700;
font-size: 1.05rem;
color: var(--text);
letter-spacing: -0.02em;
white-space: nowrap;
}
.brand-dot {
width: 9px;
height: 9px;
border-radius: 50%;
background: var(--accent);
flex-shrink: 0;
}
.topbar-sep {
width: 1px;
height: 18px;
background: var(--border);
flex-shrink: 0;
}
.topbar-tagline {
font-size: 0.8rem;
color: var(--text-3);
white-space: nowrap;
}
.topbar-nav {
display: flex;
align-items: center;
gap: 0.125rem;
margin-left: auto;
}
.tnav {
padding: 0.35rem 0.7rem;
font-size: 0.85rem;
font-weight: 500;
color: var(--text-2);
border-radius: var(--radius-sm);
transition: background var(--transition), color var(--transition);
}
.tnav:hover { background: var(--surface-2); color: var(--text); }
.tnav-signin {
margin-left: 0.5rem;
padding: 0.35rem 0.85rem;
font-size: 0.85rem;
font-weight: 500;
color: var(--text);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
display: flex;
align-items: center;
gap: 0.4rem;
transition: border-color var(--transition), background var(--transition);
}
.tnav-signin:hover { border-color: var(--border-2); background: var(--surface); }
.topbar-hamburger {
display: none;
background: none;
border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: 0.35rem 0.55rem;
cursor: pointer;
color: var(--text-2);
font-size: 0.85rem;
transition: border-color var(--transition);
}
.topbar-hamburger:hover { border-color: var(--border-2); color: var(--text); }
/* Mobile drawer */
.mobile-drawer {
display: none;
position: fixed;
top: var(--topbar-h);
left: 0; right: 0;
background: var(--surface);
border-bottom: 1px solid var(--border);
flex-direction: column;
padding: 0.5rem 0;
z-index: 199;
}
.mobile-drawer.open { display: flex; }
.mobile-drawer a {
padding: 0.75rem 1.5rem;
font-size: 0.9rem;
color: var(--text-2);
font-weight: 500;
transition: background var(--transition);
}
.mobile-drawer a:hover { background: var(--surface-2); color: var(--text); }
/* ── App shell ───────────────────────────────────────────────────────────── */
.app-shell {
display: flex;
height: calc(100vh - var(--topbar-h));
margin-top: var(--topbar-h);
overflow: hidden;
}
/* ── Sidebar ─────────────────────────────────────────────────────────────── */
.sidebar {
width: var(--sidebar-w);
flex-shrink: 0;
background: var(--surface);
border-right: 1px solid var(--border);
height: 100%;
overflow-y: auto;
overflow-x: hidden;
}
.sidebar-scroll {
padding: 2rem 1.5rem 2.5rem;
display: flex;
flex-direction: column;
gap: 1.75rem;
}
/* Sidebar title block */
.sidebar-title-block { display: flex; flex-direction: column; gap: 0.625rem; }
.eyebrow {
font-size: 0.72rem;
font-weight: 500;
letter-spacing: 0.07em;
text-transform: uppercase;
color: var(--accent);
display: flex;
align-items: center;
gap: 0.4rem;
}
.eyebrow i { font-size: 0.65rem; }
.sidebar-title-block h1 {
font-family: 'Bricolage Grotesque', sans-serif;
font-weight: 700;
font-size: 1.45rem;
line-height: 1.25;
letter-spacing: -0.025em;
color: var(--text);
}
.sidebar-desc {
font-size: 0.825rem;
line-height: 1.6;
color: var(--text-2);
font-weight: 300;
}
/* ── Field group ─────────────────────────────────────────────────────────── */
.field-group {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.field-label-row {
display: flex;
align-items: center;
justify-content: space-between;
}
.field-label {
font-size: 0.8rem;
font-weight: 500;
color: var(--text);
display: flex;
align-items: center;
gap: 0.35rem;
}
.field-label i { color: var(--text-3); font-size: 0.75rem; }
.field-hint {
font-size: 0.72rem;
color: var(--text-3);
}
/* ── Dropzone ────────────────────────────────────────────────────────────── */
.dropzone {
width: 100%;
height: 160px;
background: var(--surface-2);
border: 1.5px dashed var(--border);
border-radius: var(--radius);
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
transition: border-color var(--transition);
}
.dropzone:hover { border-color: var(--border-2); }
.dropzone img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.dz-placeholder {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.4rem;
color: var(--text-3);
font-size: 0.78rem;
pointer-events: none;
}
.dz-placeholder i { font-size: 1.5rem; opacity: 0.4; }
/* ── File input ──────────────────────────────────────────────────────────── */
.file-hidden {
position: absolute;
width: 1px; height: 1px;
opacity: 0; pointer-events: none;
}
.file-choose-btn {
display: inline-flex;
align-items: center;
gap: 0.45rem;
padding: 0.45rem 0.875rem;
font-size: 0.8rem;
font-weight: 500;
color: var(--text);
background: var(--surface-2);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
cursor: pointer;
transition: background var(--transition), border-color var(--transition);
align-self: flex-start;
font-family: inherit;
}
.file-choose-btn i { font-size: 0.72rem; }
.file-choose-btn:hover { background: var(--border); border-color: var(--border-2); }
/* ── Slider ──────────────────────────────────────────────────────────────── */
.slider-val-badge {
font-family: 'DM Mono', monospace;
font-size: 0.75rem;
color: var(--accent);
background: var(--accent-light);
border: 1px solid var(--accent-border);
padding: 0.1rem 0.45rem;
border-radius: 4px;
min-width: 2.2rem;
text-align: center;
}
.sf-range {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 5px;
background: var(--border);
border-radius: 99px;
outline: none;
cursor: pointer;
}
.sf-range::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 17px; height: 17px;
border-radius: 50%;
background: var(--bg);
border: 2px solid var(--accent);
box-shadow: 0 1px 4px rgba(0,0,0,.5);
cursor: pointer;
transition: transform var(--transition);
}
.sf-range::-webkit-slider-thumb:hover { transform: scale(1.2); }
.sf-range::-moz-range-thumb {
width: 17px; height: 17px;
border-radius: 50%;
background: var(--bg);
border: 2px solid var(--accent);
cursor: pointer;
}
.range-labels {
display: flex;
justify-content: space-between;
font-size: 0.68rem;
color: var(--text-3);
margin-top: 0.25rem;
}
/* ── Transfer button ─────────────────────────────────────────────────────── */
.transfer-btn {
width: 100%;
padding: 0.75rem 1rem;
background: var(--accent);
color: #fff;
border: none;
border-radius: var(--radius);
font-family: 'Bricolage Grotesque', sans-serif;
font-size: 0.95rem;
font-weight: 600;
letter-spacing: -0.01em;
cursor: pointer;
transition: background var(--transition), transform var(--transition);
}
.transfer-btn:hover { background: var(--accent-dark); }
.transfer-btn:active { transform: scale(0.98); }
.transfer-btn:disabled { opacity: 0.45; cursor: not-allowed; }
/* ── Inline error ────────────────────────────────────────────────────────── */
.field-error {
display: flex;
align-items: flex-start;
gap: 0.5rem;
padding: 0.7rem 0.875rem;
background: rgba(196,98,45,.08);
border: 1px solid rgba(196,98,45,.2);
border-radius: var(--radius-sm);
font-size: 0.8rem;
color: #e08060;
}
.field-error i { flex-shrink: 0; margin-top: 1px; }
/* ── Canvas panel ────────────────────────────────────────────────────────── */
.canvas-panel {
flex: 1;
background: var(--bg);
overflow-y: auto;
display: flex;
align-items: stretch;
}
/* Empty state */
.canvas-empty {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
position: relative;
margin: 2.5rem;
border: 1.5px dashed var(--border);
border-radius: var(--radius-lg);
background: var(--surface);
}
.canvas-empty-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.625rem;
text-align: center;
padding: 2rem;
}
.canvas-empty-icon {
width: 52px; height: 52px;
border-radius: 50%;
background: var(--surface-2);
border: 1px solid var(--border);
display: flex;
align-items: center;
justify-content: center;
color: var(--text-3);
font-size: 1.25rem;
margin-bottom: 0.5rem;
}
.canvas-empty-title {
font-family: 'Bricolage Grotesque', sans-serif;
font-size: 1.05rem;
font-weight: 600;
color: var(--text);
letter-spacing: -0.01em;
}
.canvas-empty-body {
font-size: 0.825rem;
color: var(--text-2);
line-height: 1.65;
font-weight: 300;
}
/* Corner marks */
.corner {
position: absolute;
width: 14px; height: 14px;
border-color: var(--border-2);
border-style: solid;
}
.corner-tl { top: -1px; left: -1px; border-width: 2px 0 0 2px; border-radius: var(--radius-sm) 0 0 0; }
.corner-tr { top: -1px; right: -1px; border-width: 2px 2px 0 0; border-radius: 0 var(--radius-sm) 0 0; }
.corner-bl { bottom: -1px; left: -1px; border-width: 0 0 2px 2px; border-radius: 0 0 0 var(--radius-sm); }
.corner-br { bottom: -1px; right: -1px; border-width: 0 2px 2px 0; border-radius: 0 0 var(--radius-sm) 0; }
/* Result state */
.result-container {
flex: 1;
display: flex;
flex-direction: column;
animation: fadeUp 0.35s ease both;
}
.result-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.875rem 1.5rem;
border-bottom: 1px solid var(--border);
background: var(--surface);
flex-shrink: 0;
}
.result-status {
font-size: 0.825rem;
font-weight: 500;
color: #4ade80;
display: flex;
align-items: center;
gap: 0.4rem;
}
.result-status i { font-size: 0.75rem; }
.download-btn {
display: inline-flex;
align-items: center;
gap: 0.4rem;
padding: 0.4rem 0.875rem;
background: var(--text);
color: var(--bg);
border-radius: var(--radius-sm);
font-size: 0.8rem;
font-weight: 600;
transition: opacity var(--transition);
}
.download-btn:hover { opacity: 0.85; }
.download-btn i { font-size: 0.72rem; }
.result-img-wrap {
flex: 1;
overflow: auto;
display: flex;
align-items: flex-start;
justify-content: center;
padding: 2rem;
background: var(--bg);
}
.result-img {
max-width: 100%;
border-radius: var(--radius);
box-shadow: var(--shadow);
display: block;
}
/* ── Below fold ──────────────────────────────────────────────────────────── */
.below-fold {
background: var(--surface);
border-top: 1px solid var(--border);
}
.content-section {
max-width: 900px;
margin: 0 auto;
padding: 5rem 2rem;
border-bottom: 1px solid var(--border);
}
.content-section:last-of-type { border-bottom: none; }
.section-header { margin-bottom: 2.5rem; }
.section-eyebrow {
display: inline-block;
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--accent);
margin-bottom: 0.625rem;
}
.section-heading {
font-family: 'Bricolage Grotesque', sans-serif;
font-size: 1.9rem;
font-weight: 700;
letter-spacing: -0.03em;
color: var(--text);
margin-bottom: 0.5rem;
}
.section-body {
font-size: 0.875rem;
color: var(--text-2);
line-height: 1.65;
font-weight: 300;
}
/* ── Examples ────────────────────────────────────────────────────────────── */
.examples-wrap { display: flex; flex-direction: column; gap: 1.25rem; }
.ex-row {
display: flex;
align-items: center;
gap: 1.25rem;
padding: 1.25rem;
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
}
.ex-inputs-group {
flex: 1;
display: grid;
gap: 0.75rem;
}
.ex-cell, .ex-result-cell {
display: flex;
flex-direction: column;
gap: 0.375rem;
}
.ex-result-cell { flex: 1; }
.ex-label {
font-size: 0.68rem;
font-weight: 600;
letter-spacing: 0.07em;
text-transform: uppercase;
color: var(--text-3);
}
.ex-label-out { color: var(--accent); }
.ex-photo {
width: 100%;
height: 300px;
object-fit: cover;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: var(--surface-2);
display: block;
}
.ex-photo-out { height: 410px; }
.ex-sep {
flex-shrink: 0;
color: var(--text-3);
font-size: 1rem;
}
/* ── FAQ ─────────────────────────────────────────────────────────────────── */
.faq-wrap { border-top: 1px solid var(--border); }
.faq-item { border-bottom: 1px solid var(--border); }
.faq-q {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: 1.125rem 0;
background: none;
border: none;
font-family: inherit;
font-size: 0.9375rem;
font-weight: 500;
color: var(--text);
text-align: left;
cursor: pointer;
gap: 1rem;
transition: color var(--transition);
}
.faq-q:hover { color: var(--accent); }
.faq-chevron {
flex-shrink: 0;
font-size: 0.75rem;
color: var(--text-3);
transition: transform 0.2s ease, color 0.2s ease;
}
.faq-q.open .faq-chevron {
transform: rotate(45deg);
color: var(--accent);
}
.faq-a {
display: none;
padding-bottom: 1.125rem;
font-size: 0.875rem;
color: var(--text-2);
line-height: 1.7;
font-weight: 300;
}
.faq-a.open { display: block; }
/* ── Footer ──────────────────────────────────────────────────────────────── */
.site-footer {
background: var(--bg-2);
border-top: 1px solid var(--border);
}
.footer-top {
max-width: 900px;
margin: 0 auto;
padding: 3.5rem 2rem 2.5rem;
display: flex;
gap: 4rem;
}
.footer-brand-col {
flex: 1.2;
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.footer-brand { font-size: 0.95rem; }
.footer-brand-col p {
font-size: 0.8rem;
color: var(--text-2);
line-height: 1.65;
max-width: 240px;
font-weight: 300;
}
.footer-links-cols {
flex: 2;
display: flex;
gap: 3rem;
}
.footer-col {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.footer-col-heading {
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 0.09em;
text-transform: uppercase;
color: var(--text-3);
margin-bottom: 0.25rem;
}
.footer-col a {
font-size: 0.825rem;
color: var(--text-2);
display: flex;
align-items: center;
gap: 0.4rem;
transition: color var(--transition);
}
.footer-col a:hover { color: var(--text); }
.footer-col a i { font-size: 0.72rem; color: var(--text-3); }
.footer-social-row { display: flex; gap: 0.5rem; }
.social-pill {
width: 32px; height: 32px;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text-2);
font-size: 0.8rem;
transition: border-color var(--transition), color var(--transition), background var(--transition);
}
.social-pill:hover { border-color: var(--border-2); background: var(--surface-2); color: var(--text); }
.footer-bottom {
max-width: 900px;
margin: 0 auto;
padding: 1.25rem 2rem;
border-top: 1px solid var(--border);
display: flex;
align-items: center;
justify-content: space-between;
font-size: 0.775rem;
color: var(--text-3);
}
.footer-bottom-links { display: flex; gap: 1.25rem; }
.footer-bottom-links a { color: var(--text-3); transition: color var(--transition); }
.footer-bottom-links a:hover { color: var(--text-2); }
/* ── Loader ──────────────────────────────────────────────────────────────── */
.loader-overlay {
position: fixed;
inset: 0;
background: rgba(10, 10, 9, 0.8);
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
pointer-events: none;
transition: opacity 0.25s ease;
}
.loader-overlay.active {
opacity: 1;
pointer-events: all;
}
.loader-card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 2.5rem 3rem;
display: flex;
flex-direction: column;
align-items: center;
gap: 0.75rem;
box-shadow: var(--shadow);
text-align: center;
}
.loader-ring {
width: 38px; height: 38px;
border: 3px solid var(--border);
border-top-color: var(--accent);
border-radius: 50%;
animation: spin 0.7s linear infinite;
}
.loader-title {
font-family: 'Bricolage Grotesque', sans-serif;
font-size: 1rem;
font-weight: 600;
color: var(--text);
}
.loader-sub {
font-size: 0.8rem;
color: var(--text-2);
}
/* ── Animations ──────────────────────────────────────────────────────────── */
@keyframes spin { to { transform: rotate(360deg); } }
@keyframes fadeUp {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
/* ── Responsive ──────────────────────────────────────────────────────────── */
@media (max-width: 900px) {
.topbar-tagline { display: none; }
.topbar-sep { display: none; }
}
@media (max-width: 768px) {
.topbar-nav { display: none; }
.topbar-hamburger { display: flex; }
.app-shell {
flex-direction: column;
height: auto;
overflow: visible;
}
.sidebar {
width: 100%;
height: auto;
border-right: none;
border-bottom: 1px solid var(--border);
overflow: visible;
}
.canvas-panel { min-height: 60vw; }
.canvas-empty { margin: 1.25rem; }
.result-img-wrap { padding: 1.25rem; }
.footer-top { flex-direction: column; gap: 2rem; }
.footer-links-cols { flex-wrap: wrap; gap: 2rem; }
.footer-bottom { flex-direction: column; gap: 0.5rem; text-align: center; }
.ex-row { flex-direction: column; }
.ex-sep { transform: rotate(90deg); }
.ex-photo-out { height: 180px; }
}
/* ── Clear button ────────────────────────────────────────────────────────── */
#clearBtn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
margin-top: 10px;
padding: 8px 20px;
width: 100%; /* matches Transfer Style full-width */
font-size: 0.875rem;
font-weight: 600;
letter-spacing: 0.03em;
color: var(--text-muted, #6b7280);
background: transparent;
border: 1.5px solid var(--border, #2e2e2e);
border-radius: 10px;
cursor: not-allowed;
opacity: 0.45;
transition:
color 0.2s ease,
border-color 0.2s ease,
opacity 0.2s ease,
background 0.2s ease,
box-shadow 0.2s ease;
}
/* Active state β€” something to clear */
#clearBtn.active {
color: var(--accent, #e07b39);
border-color: var(--accent, #e07b39);
opacity: 1;
cursor: pointer;
}
/* Hover β€” only when active */
#clearBtn.active:hover {
background: rgba(224, 123, 57, 0.08);
box-shadow: 0 0 0 3px rgba(224, 123, 57, 0.15);
color: var(--accent, #e07b39);
}
/* Press */
#clearBtn.active:active {
background: rgba(224, 123, 57, 0.15);
box-shadow: none;
transform: scale(0.98);
}
/* Focus ring β€” keyboard nav */
#clearBtn:focus-visible {
outline: 2px solid var(--accent, #e07b39);
outline-offset: 3px;
}
.btn-samples {
display: inline-flex;
align-items: center;
gap: 7px;
padding: 8px 18px;
border-radius: 8px;
font-size: 0.875rem;
font-weight: 600;
letter-spacing: 0.02em;
color: var(--text-inverse, #fff);
background: var(--accent, #e07b39);
border: 1.5px solid var(--accent, #e07b39);
cursor: pointer;
transition: background 0.2s ease, box-shadow 0.2s ease, transform 0.15s ease;
}
.btn-samples:hover:not(:disabled) {
background: rgba(224, 123, 57, 0.10);
box-shadow: 0 0 0 3px rgba(224, 123, 57, 0.18);
}
.btn-samples:active:not(:disabled) {
transform: scale(0.97);
background: rgba(224, 123, 57, 0.18);
}
.btn-samples:disabled {
opacity: 0.55;
cursor: not-allowed;
}