oga-market / styles.css
harystyleseze
Oga Market: Day 2 hybrid shopper + creator app for Good Online
dcc955a
/* Oga Market — styles using the Good Online + Oga Mi design system */
@import url('https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=Geist:wght@300;400;500;600&family=Geist+Mono:wght@400;500&display=swap');
:root {
--forest: #1F3B2D;
--forest-hover: #16291F;
--forest-soft: #2E5840;
--terracotta: #C84B23;
--terracotta-soft: #E0744F;
--saffron: #E8B547;
--saffron-soft: #F2D080;
--cream: #F5EFE3;
--cream-deep: #ECE3CF;
--paper: #FBF7EE;
--ink: #15130F;
--ink-soft: #2A2620;
--stone-1: #EAE3D2;
--stone-2: #D9D2C0;
--stone-3: #B8AD96;
--stone-4: #8A8170;
--stone-5: #6B6354;
--fg-1: var(--ink);
--fg-2: var(--stone-5);
--fg-3: var(--stone-4);
--bg-1: var(--cream);
--bg-2: var(--paper);
--bg-3: var(--cream-deep);
--border-1: var(--stone-2);
--accent: var(--forest);
--accent-hover: var(--forest-hover);
--warn: var(--terracotta);
--highlight: var(--saffron);
--font-serif: 'Instrument Serif', Georgia, serif;
--font-sans: 'Geist', system-ui, sans-serif;
--font-mono: 'Geist Mono', 'Courier New', monospace;
--sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px;
--sp-6: 24px; --sp-8: 32px; --sp-12: 48px; --sp-16: 64px;
--radius-sm: 2px;
--radius-md: 4px;
--radius-pill: 999px;
--shadow-1: 0 1px 2px rgba(21,19,15,0.06);
--shadow-2: 0 8px 24px -8px rgba(21,19,15,0.12);
--shadow-3: 0 24px 64px -16px rgba(21,19,15,0.22);
--ease: cubic-bezier(.2,.7,.2,1);
--dur-quick: 120ms;
--dur-state: 200ms;
--dur-panel: 400ms;
--content-max: 1280px;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: var(--font-sans);
background: var(--cream);
color: var(--fg-1);
-webkit-font-smoothing: antialiased;
min-height: 100vh;
}
a { color: var(--forest); text-decoration: none; }
a:hover { text-decoration: underline; }
/* ═══ TOPBAR ═══ */
.om-topbar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px var(--sp-6);
background: var(--paper);
border-bottom: 1px solid var(--border-1);
position: sticky;
top: 0;
z-index: 50;
}
.om-brand {
display: flex;
align-items: center;
gap: var(--sp-3);
}
.om-brand a {
font-family: var(--font-serif);
font-style: italic;
font-size: 22px;
color: var(--fg-1);
text-decoration: none;
}
.om-brand-tag {
font-family: var(--font-sans);
font-size: 10px;
font-weight: 500;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--fg-2);
padding: 3px 10px;
border: 1px solid var(--border-1);
border-radius: var(--radius-sm);
}
.om-topbar-actions {
display: flex;
align-items: center;
gap: var(--sp-3);
}
.om-services {
display: flex;
gap: var(--sp-2);
}
.om-chip {
display: flex;
align-items: center;
gap: 4px;
font-family: var(--font-sans);
font-size: 10px;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
padding: 3px 8px;
border-radius: var(--radius-pill);
opacity: 0.35;
transition: opacity var(--dur-state);
}
.om-chip.active { opacity: 1; }
.om-chip.compute { background: rgba(31,59,45,0.1); color: var(--forest); }
.om-chip.storage { background: rgba(232,181,71,0.12); color: #8A6A1A; }
.om-chip.chain { background: rgba(200,75,35,0.1); color: var(--terracotta); }
.om-chip::before {
content: '';
width: 5px; height: 5px;
border-radius: 50%;
background: currentColor;
}
/* ═══ LANDING (mode selector) ═══ */
.om-landing {
max-width: 1100px;
margin: 0 auto;
padding: var(--sp-16) var(--sp-6) var(--sp-8);
}
.om-landing-eyebrow {
font-family: var(--font-sans);
font-size: 12px;
font-weight: 500;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--fg-2);
text-align: center;
}
.om-landing h1 {
font-family: var(--font-serif);
font-style: italic;
font-size: 84px;
line-height: 88px;
font-weight: 400;
letter-spacing: -0.02em;
text-align: center;
margin-top: var(--sp-4);
}
.om-landing .sub {
font-family: var(--font-sans);
font-size: 17px;
line-height: 26px;
color: var(--fg-2);
max-width: 600px;
margin: var(--sp-4) auto 0;
text-align: center;
}
.om-modes {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--sp-6);
margin-top: var(--sp-12);
}
.om-mode {
background: var(--paper);
border: 1px solid var(--border-1);
padding: var(--sp-8);
text-decoration: none;
color: var(--fg-1);
display: flex;
flex-direction: column;
gap: var(--sp-3);
transition: all var(--dur-state) var(--ease);
}
.om-mode:hover {
background: var(--bg-3);
transform: translateY(-2px);
box-shadow: var(--shadow-2);
text-decoration: none;
}
.om-mode-icon {
width: 56px; height: 56px;
background: var(--forest);
color: var(--cream);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: var(--sp-3);
}
.om-mode-icon svg { width: 28px; height: 28px; }
.om-mode-title {
font-family: var(--font-serif);
font-style: italic;
font-size: 36px;
line-height: 40px;
}
.om-mode-desc {
font-family: var(--font-sans);
font-size: 14px;
line-height: 22px;
color: var(--fg-2);
}
.om-mode-cta {
font-family: var(--font-sans);
font-size: 13px;
font-weight: 500;
color: var(--forest);
margin-top: auto;
padding-top: var(--sp-3);
display: flex;
align-items: center;
gap: 6px;
}
.om-stack-row {
display: flex;
justify-content: center;
gap: var(--sp-4);
margin-top: var(--sp-12);
padding-top: var(--sp-6);
border-top: 1px solid var(--border-1);
}
.om-stack-item {
font-family: var(--font-mono);
font-size: 11px;
color: var(--fg-3);
letter-spacing: 0.04em;
}
.om-stack-item strong {
color: var(--forest);
font-weight: 500;
}
/* ═══ APP SHELL (shopper + creator) ═══ */
.om-app {
max-width: var(--content-max);
margin: 0 auto;
padding: var(--sp-6);
}
.om-app-grid-shopper {
display: grid;
grid-template-columns: 1fr 340px;
gap: var(--sp-6);
min-height: calc(100vh - 110px);
}
.om-app-grid-creator {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--sp-6);
}
/* ═══ SETUP CARD ═══ */
.om-setup {
position: fixed;
inset: 0;
background: rgba(21,19,15,0.5);
backdrop-filter: blur(16px);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.om-setup.hidden { display: none; }
.om-setup-card {
width: 90%;
max-width: 460px;
background: var(--paper);
border-radius: var(--radius-md);
padding: 36px;
box-shadow: var(--shadow-3);
}
.om-setup-card h2 {
font-family: var(--font-serif);
font-style: italic;
font-size: 32px;
font-weight: 400;
margin-bottom: 4px;
}
.om-setup-card .sub {
font-size: 13px;
color: var(--fg-2);
line-height: 1.5;
margin-bottom: var(--sp-6);
}
.om-field { margin-bottom: var(--sp-4); }
.om-field label {
display: block;
font-size: 11px;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--fg-3);
margin-bottom: 6px;
}
.om-field input, .om-field select, .om-field textarea {
width: 100%;
padding: 11px 14px;
font-family: var(--font-mono);
font-size: 13px;
color: var(--fg-1);
background: var(--bg-1);
border: 1px solid var(--border-1);
border-radius: var(--radius-sm);
outline: none;
-webkit-appearance: none;
transition: border-color var(--dur-state), box-shadow var(--dur-state);
}
.om-field input:focus, .om-field select:focus, .om-field textarea:focus {
border-color: var(--forest);
box-shadow: 0 0 0 3px rgba(31,59,45,0.08);
}
.om-field-hint {
font-size: 11px;
color: var(--fg-3);
margin-top: 4px;
}
.om-field-hint a { color: var(--forest); }
.om-cta {
width: 100%;
padding: 13px;
font-family: var(--font-sans);
font-size: 14px;
font-weight: 600;
color: var(--cream);
background: var(--forest);
border: none;
border-radius: var(--radius-sm);
cursor: pointer;
transition: background var(--dur-state);
}
.om-cta:hover { background: var(--forest-hover); }
.om-cta:disabled { opacity: 0.5; cursor: default; }
.om-cta-secondary {
background: transparent;
color: var(--ink);
border: 1px solid var(--ink);
}
.om-cta-secondary:hover { background: var(--ink); color: var(--cream); }
.om-err {
color: var(--terracotta);
font-size: 12px;
margin-top: 8px;
display: none;
}
/* ═══ CONVERSATION (shopper) ═══ */
.om-conv {
display: flex;
flex-direction: column;
background: var(--paper);
border: 1px solid var(--border-1);
min-height: 0;
}
.om-conv-head {
padding: 14px 20px;
border-bottom: 1px solid var(--border-1);
display: flex;
align-items: center;
justify-content: space-between;
}
.om-conv-head h3 {
font-family: var(--font-serif);
font-style: italic;
font-size: 18px;
font-weight: 400;
}
#customer-badge {
font-size: 10px;
font-family: var(--font-mono);
padding: 2px 8px;
border-radius: var(--radius-pill);
background: rgba(31,59,45,0.08);
color: var(--forest);
display: none;
}
#transcript {
flex: 1;
overflow-y: auto;
padding: 20px;
display: flex;
flex-direction: column;
gap: var(--sp-3);
max-height: 60vh;
}
.msg {
max-width: 88%;
padding: 10px 16px;
font-size: 14px;
line-height: 1.55;
border-radius: var(--radius-pill);
animation: msgIn 0.35s var(--ease) both;
}
@keyframes msgIn {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
.msg.user {
align-self: flex-end;
background: var(--forest);
color: var(--cream);
border-bottom-right-radius: var(--radius-sm);
}
.msg.bot {
align-self: flex-start;
background: var(--bg-1);
border: 1px solid var(--border-1);
border-bottom-left-radius: var(--radius-sm);
}
.msg.system {
align-self: center;
background: transparent;
color: var(--fg-3);
font-size: 12px;
}
.msg.receipt {
align-self: center;
background: var(--ink);
color: var(--cream);
font-family: var(--font-mono);
font-size: 11px;
padding: 8px 14px;
border-radius: var(--radius-sm);
}
.msg.receipt::before { content: '⛓ '; }
.msg.product-card {
align-self: flex-start;
width: 88%;
max-width: 88%;
padding: 0;
background: var(--bg-1);
border: 1px solid var(--border-1);
border-radius: var(--radius-sm);
border-bottom-left-radius: var(--radius-sm);
display: grid;
grid-template-columns: 80px 1fr;
gap: 0;
overflow: hidden;
}
.msg.product-card .pc-img {
background: linear-gradient(135deg, var(--saffron-soft), var(--saffron));
display: flex;
align-items: center;
justify-content: center;
font-family: var(--font-serif);
font-style: italic;
font-size: 32px;
color: var(--cream);
}
.msg.product-card .pc-body {
padding: 10px 14px;
display: flex;
flex-direction: column;
gap: 4px;
}
.msg.product-card .pc-title {
font-family: var(--font-serif);
font-size: 16px;
line-height: 20px;
color: var(--fg-1);
}
.msg.product-card .pc-creator {
font-size: 11px;
color: var(--fg-2);
}
.msg.product-card .pc-price {
font-family: var(--font-mono);
font-size: 13px;
font-weight: 500;
color: var(--ink);
margin-top: 2px;
}
.msg.product-card .pc-add {
margin-top: 4px;
align-self: flex-start;
font-size: 11px;
padding: 4px 10px;
background: var(--forest);
color: var(--cream);
border: none;
border-radius: var(--radius-pill);
cursor: pointer;
font-family: var(--font-sans);
}
/* ═══ INPUT ═══ */
.om-input-area {
padding: 14px 20px;
border-top: 1px solid var(--border-1);
background: var(--bg-3);
}
.om-input-row {
display: flex;
align-items: center;
gap: 8px;
background: var(--bg-1);
border: 1px solid var(--border-1);
border-radius: var(--radius-pill);
padding: 4px 4px 4px 18px;
transition: border-color var(--dur-state);
}
.om-input-row:focus-within { border-color: var(--forest); }
#chat-input {
flex: 1;
background: transparent;
border: none;
outline: none;
font-family: var(--font-sans);
font-size: 14px;
padding: 8px 0;
min-width: 0;
}
.om-mic, .om-send {
display: flex;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
border-radius: 50%;
border: none;
cursor: pointer;
flex-shrink: 0;
transition: transform var(--dur-quick);
}
.om-mic { background: var(--bg-3); color: var(--fg-2); }
.om-mic:hover { background: var(--stone-1); color: var(--fg-1); }
.om-send { background: var(--forest); color: var(--cream); }
.om-send:hover { background: var(--forest-hover); transform: scale(1.04); }
.om-send svg { width: 16px; height: 16px; }
/* ═══ SIDEBAR (wishlist) ═══ */
.om-side {
background: var(--paper);
border: 1px solid var(--border-1);
padding: var(--sp-4);
display: flex;
flex-direction: column;
gap: var(--sp-4);
}
.om-side h4 {
font-family: var(--font-serif);
font-style: italic;
font-size: 20px;
font-weight: 400;
}
.om-side-eyebrow {
font-size: 10px;
font-weight: 500;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--fg-3);
}
.om-wishlist {
display: flex;
flex-direction: column;
gap: 8px;
margin-top: 8px;
}
.om-wishlist-empty {
font-size: 12px;
color: var(--fg-3);
padding: 16px 0;
text-align: center;
}
.om-wishlist-item {
display: flex;
justify-content: space-between;
align-items: baseline;
padding: 8px 10px;
background: var(--bg-1);
border: 1px solid var(--border-1);
gap: 8px;
}
.om-wishlist-item .name {
font-size: 13px;
font-family: var(--font-serif);
}
.om-wishlist-item .price {
font-family: var(--font-mono);
font-size: 12px;
color: var(--forest);
white-space: nowrap;
}
.om-wishlist-item .remove {
border: none;
background: transparent;
color: var(--fg-3);
cursor: pointer;
font-size: 14px;
padding: 0 4px;
}
/* ═══ CREATOR MODE ═══ */
.om-upload {
display: flex;
flex-direction: column;
gap: var(--sp-4);
background: var(--paper);
border: 1px solid var(--border-1);
padding: var(--sp-6);
}
.om-upload h3 {
font-family: var(--font-serif);
font-style: italic;
font-size: 28px;
font-weight: 400;
}
.om-dropzone {
border: 2px dashed var(--stone-3);
padding: var(--sp-8);
text-align: center;
cursor: pointer;
background: var(--bg-1);
transition: all var(--dur-state) var(--ease);
}
.om-dropzone:hover {
border-color: var(--forest);
background: var(--bg-3);
}
.om-dropzone.has-image {
padding: 0;
border-style: solid;
border-color: var(--border-1);
}
.om-dropzone img {
display: block;
width: 100%;
max-height: 320px;
object-fit: cover;
}
.om-dropzone p {
font-size: 13px;
color: var(--fg-2);
margin-top: 6px;
}
.om-listing-preview {
background: var(--paper);
border: 1px solid var(--border-1);
padding: var(--sp-6);
}
.om-listing-preview h3 {
font-family: var(--font-serif);
font-style: italic;
font-size: 28px;
font-weight: 400;
margin-bottom: var(--sp-4);
}
.om-listing-preview-empty {
text-align: center;
color: var(--fg-3);
padding: var(--sp-12) 0;
font-size: 14px;
}
.om-listing-card {
border: 1px solid var(--border-1);
background: var(--bg-1);
padding: var(--sp-4);
display: flex;
flex-direction: column;
gap: var(--sp-3);
}
.om-listing-eyebrow {
font-size: 10px;
font-weight: 500;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--fg-3);
}
.om-listing-title {
font-family: var(--font-serif);
font-size: 28px;
line-height: 32px;
font-weight: 400;
}
.om-listing-tagline {
font-family: var(--font-serif);
font-style: italic;
font-size: 18px;
color: var(--forest);
}
.om-listing-desc {
font-size: 14px;
line-height: 1.55;
color: var(--fg-1);
}
.om-listing-meta {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 4px;
}
.om-listing-meta .pill {
font-size: 11px;
padding: 4px 10px;
border-radius: var(--radius-pill);
background: var(--bg-3);
color: var(--fg-2);
}
.om-listing-price {
font-family: var(--font-mono);
font-size: 24px;
font-weight: 500;
color: var(--ink);
}
.om-listing-feedback {
background: var(--bg-3);
padding: 10px 14px;
font-size: 12px;
color: var(--fg-2);
border-left: 3px solid var(--saffron);
}
.om-listing-actions {
display: flex;
gap: 8px;
margin-top: var(--sp-3);
}
/* ═══ MINTED LISTINGS GRID ═══ */
.om-minted-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: var(--sp-3);
margin-top: var(--sp-3);
}
.om-minted-card {
background: var(--bg-1);
border: 1px solid var(--border-1);
padding: var(--sp-3);
text-decoration: none;
color: var(--fg-1);
display: flex;
flex-direction: column;
gap: 4px;
}
.om-minted-card:hover { background: var(--bg-3); text-decoration: none; }
.om-minted-card .id { font-family: var(--font-mono); font-size: 10px; color: var(--fg-3); }
.om-minted-card .name { font-family: var(--font-serif); font-size: 15px; }
.om-minted-card .tx { font-family: var(--font-mono); font-size: 10px; color: var(--forest); }
@media (max-width: 900px) {
.om-app-grid-shopper, .om-app-grid-creator { grid-template-columns: 1fr; }
.om-modes { grid-template-columns: 1fr; }
.om-landing h1 { font-size: 56px; line-height: 60px; }
}