← back to Wallco Ai
public/css/admin.css
124 lines
/* wallco.ai admin UI — distinct from the public site so it's visually obvious you're in admin mode. */
body[data-admin="true"] { background: var(--bg); color: var(--ink); }
.admin-header {
position: sticky; top: 0; z-index: 100;
display: flex; align-items: center; gap: 20px;
padding: 14px 28px;
background: var(--header-bg);
border-bottom: 2px solid var(--gold);
font-family: var(--sans);
}
.admin-brand {
font-family: var(--serif); font-size: 19px; font-weight: 400;
color: var(--ink); text-decoration: none; letter-spacing: 0.02em;
}
.admin-tabs { display: flex; gap: 4px; margin-left: auto; }
.admin-tabs a {
font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase;
color: var(--ink-soft); text-decoration: none; padding: 8px 14px;
border-radius: 4px;
}
.admin-tabs a:hover { background: var(--card-bg); color: var(--ink); }
.admin-tabs a.active { background: var(--accent); color: var(--bg); }
.admin-email {
font-size: 11px; color: var(--ink-faint);
font-family: ui-monospace, monospace;
padding-left: 12px; border-left: 1px solid var(--line);
}
.admin-main { padding: 28px 32px 80px; max-width: 1600px; margin: 0 auto; }
.admin-intro h1 { font-family: var(--serif); font-weight: 300; font-size: 32px; margin: 0 0 8px; letter-spacing: 0.01em; }
.admin-intro p { color: var(--ink-soft); max-width: 760px; margin: 0 0 16px; }
.admin-intro p.muted { color: var(--ink-faint); font-size: 13px; }
.aesthetic-search {
display: flex; gap: 8px; align-items: center; max-width: 700px;
margin: 14px 0 24px;
}
.aesthetic-search input[type=search] {
flex: 1; border: 1px solid var(--line); background: var(--card-bg); color: var(--ink);
font: 15px var(--sans); padding: 11px 16px; border-radius: 8px;
}
.aesthetic-search input[type=search]:focus { outline: 0; border-color: var(--gold); }
.aesthetic-search button {
background: var(--accent); color: var(--bg);
border: 0; padding: 11px 20px; border-radius: 8px;
font: 13px/1 var(--sans); font-weight: 500; cursor: pointer;
}
.aesthetic-search.inline { margin: 8px 0 18px; }
.density-label { font-size: 11px; color: var(--ink-faint); text-transform: uppercase; letter-spacing: 0.06em; display: inline-flex; gap: 8px; align-items: center; }
.density-label input[type=range] { width: 110px; }
/* Vendor grid (landing) */
.v-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 18px; }
.v-card {
background: var(--card-bg); border: 1px solid var(--line); border-radius: 10px;
overflow: hidden; text-decoration: none; color: inherit;
transition: transform .18s, border-color .18s, box-shadow .18s;
}
.v-card:hover { transform: translateY(-2px); border-color: var(--gold); box-shadow: 0 12px 28px -10px rgba(0,0,0,.18); }
.v-mosaic { display: grid; grid-template-columns: 1fr 1fr; aspect-ratio: 1; }
.v-thumb { background: var(--bg) no-repeat center/cover; }
.v-meta { padding: 12px 14px 14px; }
.v-name { font-family: var(--serif); font-size: 17px; text-transform: capitalize; line-height: 1.1; }
.v-count { font-size: 11px; color: var(--ink-faint); margin-top: 4px; letter-spacing: 0.05em; }
/* Product grid (vendor + aesthetic + inspiration).
Steve's rule (2026-05-13): pattern image alone in the resting card —
no name, no SKU, no collection number bleed-through. The full meta
block surfaces as an overlay on :hover / :focus-within (keyboard
a11y). Applies to admin AND user AND designer surfaces. See the
companion overlay block in site.css for .design-card. */
.p-grid { display: grid; gap: 14px; grid-template-columns: repeat(var(--cols, 5), 1fr); }
.p-card {
background: var(--card-bg); border: 1px solid var(--line); border-radius: 6px;
overflow: hidden; display: flex; flex-direction: column;
position: relative;
}
.p-card.is-picked { border-color: var(--gold); box-shadow: 0 0 0 2px rgba(201, 161, 75, .25); }
.p-img { aspect-ratio: 1; background: var(--bg) no-repeat center/cover; flex: 1; }
/* Resting state: pattern only. Meta absolutely positions over the
bottom of the image with a smoke-gradient backdrop so text is
legible against any pattern color. */
.p-meta {
position: absolute; left: 0; right: 0; bottom: 0;
padding: 12px 14px 14px;
font-size: 11.5px;
display: flex; flex-direction: column; gap: 4px;
background: linear-gradient(to top, rgba(20,16,8,0.94) 0%, rgba(20,16,8,0.78) 55%, rgba(20,16,8,0) 100%);
color: #f4ecd9;
opacity: 0; pointer-events: none;
transform: translateY(6px);
transition: opacity .18s ease, transform .18s ease;
}
.p-card:hover .p-meta,
.p-card:focus-within .p-meta {
opacity: 1; pointer-events: auto; transform: none;
}
.p-name { font-weight: 500; color: #fff; line-height: 1.25; }
.p-color { color: #e3d6b2; font-size: 11px; }
.p-coll { color: #c9a14b; font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; }
.p-add, .p-remove {
margin-top: 6px; align-self: flex-start;
background: transparent; border: 1px solid rgba(244,236,217,0.5); color: #f4ecd9;
font: 10.5px/1 var(--sans); text-transform: uppercase; letter-spacing: 0.06em;
padding: 5px 9px; border-radius: 3px; cursor: pointer;
}
.p-add:hover { background: var(--gold); color: var(--accent); border-color: var(--gold); }
.p-card.is-picked .p-add { background: var(--gold); color: var(--accent); border-color: var(--gold); }
.p-remove { color: #ffb4a8; border-color: rgba(255,180,168,0.45); }
.p-remove:hover { background: rgba(192,68,52,0.85); color: #fff; border-color: rgba(192,68,52,0.85); }
.btn-gen {
background: var(--accent); color: var(--bg); border: 0; border-radius: 8px;
font: 13px var(--sans); font-weight: 500; padding: 12px 22px; cursor: pointer;
}
@media (max-width: 720px) {
.admin-tabs a:not(.active) { display: none; }
.v-grid { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); }
}