/* Tailwind not used; rely on tokens + custom CSS below */ /* ============================================================ v3 · Restraint — Design Tokens ============================================================ */ :root { --bg: #FAF9F5; --bg-soft: #F4F2EC; --bg-softer: #F7F5EE; --card: #FFFFFF; --border: #E9E5DB; --border-soft: #EFEBE0; --border-strong: #D8D3C5; --ink: #15140F; --ink-2: #5A584F; --ink-3: #9C988C; --ink-4: #C8C4B8; --orange: #E55B26; --orange-d: #D04E1F; --orange-soft: #FAE8DC; --orange-tint: #FFF4ED; --green: #3F6B3F; --green-soft: #EAF2EA; --red: #B33A2A; --red-soft: #FBEBE7; --blue: #1B4FAA; --blue-soft: #E8EFFB; --topbar-h: 57px; --aside-w: 248px; --mono: "Inter", system-ui, -apple-system, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; --sans: "Inter", system-ui, -apple-system, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; } * { box-sizing: border-box; margin: 0; padding: 0; } html, body { background: var(--bg); color: var(--ink); font-family: var(--sans); font-size: 13px; line-height: 1.5; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } a { color: inherit; text-decoration: none; } button { font: inherit; color: inherit; background: none; border: none; cursor: pointer; } input, textarea, select { font: inherit; color: inherit; } ::selection { background: var(--orange-soft); color: var(--ink); } .mono { font-family: var(--mono); } .tnum { font-variant-numeric: tabular-nums; } .muted { color: var(--ink-2); } .muted-2 { color: var(--ink-3); } .spacer { flex: 1; } .hstack { display: flex; align-items: center; gap: 8px; } .vstack { display: flex; flex-direction: column; gap: 8px; } /* ============================================================ App shell ============================================================ */ .app { display: grid; grid-template-columns: var(--aside-w) 1fr; min-height: 100vh; } /* ──────── Sidebar ──────── */ aside.sidebar { padding: 18px 14px; border-right: 1px solid var(--border); background: var(--bg); position: relative; } .brand { display: flex; align-items: center; gap: 10px; padding: 6px 8px 14px; } .brand-mark, .flame { width: 22px; height: 22px; color: var(--orange); } .brand-mark svg, .flame svg { width: 100%; height: 100%; } .brand-name { font-weight: 700; font-size: 18px; letter-spacing: -.012em; } .brand-ver { font-family: var(--mono); font-size: 9.5px; color: var(--ink-3); background: var(--bg-soft); padding: 1px 5px; border: 1px solid var(--border-soft); border-radius: 3px; margin-left: auto; } .search-box { display: flex; align-items: center; gap: 8px; padding: 9px 12px; background: var(--card); border: 1px solid var(--border); border-radius: 9px; color: var(--ink-3); margin-bottom: 14px; font-size: 13px; cursor: text; } .search-box svg { width: 14px; height: 14px; } .search-box .kbd { margin-left: auto; font-family: var(--mono); font-size: 11px; background: var(--bg-soft); padding: 1px 6px; border-radius: 4px; border: 1px solid var(--border-soft); } .nav-section { font-family: var(--mono); font-size: 10px; color: var(--ink-3); letter-spacing: .08em; padding: 12px 12px 6px; text-transform: uppercase; } nav.sidebar-nav { display: flex; flex-direction: column; gap: 1px; } nav.sidebar-nav a, nav.sidebar-nav .nav-item { display: flex; align-items: center; gap: 11px; padding: 8px 12px; color: var(--ink-2); font-size: 13.5px; font-weight: 500; border-radius: 7px; cursor: pointer; } nav.sidebar-nav a:hover, nav.sidebar-nav .nav-item:hover { background: var(--bg-soft); color: var(--ink); } nav.sidebar-nav a.active { background: var(--orange-tint); color: var(--orange); } nav.sidebar-nav .nav-item.disabled { opacity: .55; cursor: not-allowed; } nav.sidebar-nav .nav-item.disabled:hover { background: transparent; color: var(--ink-2); } nav.sidebar-nav svg { width: 14px; height: 14px; opacity: .85; flex-shrink: 0; } nav.sidebar-nav a.active svg { opacity: 1; } nav.sidebar-nav .chev { margin-left: auto; width: 12px; height: 12px; opacity: .5; } nav.sidebar-nav .label { flex: 1; } nav.sidebar-nav .badge-mini { font-family: var(--mono); font-size: 9.5px; background: var(--bg-soft); color: var(--ink-3); padding: 1px 5px; border: 1px solid var(--border-soft); border-radius: 3px; } .aside-foot { position: absolute; left: 14px; right: 14px; bottom: 14px; } .aside-user { display: flex; align-items: center; gap: 9px; padding: 8px; border-radius: 8px; cursor: pointer; } .aside-user:hover { background: var(--bg-soft); } .aside-user .av { width: 24px; height: 24px; border-radius: 6px; background: var(--ink); color: #FFF; display: flex; align-items: center; justify-content: center; font-weight: 600; font-size: 11px; } .aside-user .em { font-size: 12.5px; } .aside-collapse { display: flex; align-items: center; gap: 8px; padding: 8px 10px; color: var(--ink-3); font-size: 12.5px; border-top: 1px solid var(--border); margin-top: 8px; cursor: pointer; } .aside-collapse svg { width: 12px; height: 12px; } /* ──────── Main / graph-paper bg ──────── */ main.main { position: relative; overflow: hidden; background: var(--bg); min-width: 0; } .grid-bg { position: absolute; inset: 0; pointer-events: none; background-image: /* "+" registration marks at major (240×240) intersections */ url("data:image/svg+xml;utf8,"), /* tiny dots at sub-grid (60×60) intersections */ url("data:image/svg+xml;utf8,"), /* faint dashed grid lines (240×240) */ url("data:image/svg+xml;utf8,"); background-size: 240px 240px, 60px 60px, 240px 240px; background-position: 0 0, 0 0, 0 0; -webkit-mask-image: radial-gradient(ellipse 95% 80% at 50% 35%, #000 25%, transparent 95%); mask-image: radial-gradient(ellipse 95% 80% at 50% 35%, #000 25%, transparent 95%); } .scatter { position: absolute; font-family: var(--mono); font-size: 8.5px; line-height: 1.05; color: var(--ink-4); white-space: pre; pointer-events: none; opacity: .8; letter-spacing: .04em; } .sq { position: absolute; width: 5px; height: 5px; background: var(--ink-3); opacity: .55; pointer-events: none; } .corner-tag { position: absolute; color: var(--ink-3); font-family: var(--mono); font-size: 10.5px; letter-spacing: .06em; pointer-events: none; opacity: .85; } /* ──────── Topbar ──────── */ .topbar { display: flex; align-items: center; justify-content: space-between; padding: 12px 24px; border-bottom: 1px solid var(--border); background: var(--bg); position: relative; z-index: 2; min-height: var(--topbar-h); } .crumbs { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--ink-2); } .crumbs a { color: var(--ink-2); } .crumbs a:hover { color: var(--ink); } .crumbs .sep { color: var(--ink-4); } .crumbs .here { color: var(--ink); font-weight: 500; } .team-switcher { display: flex; align-items: center; gap: 8px; padding: 7px 11px 7px 8px; background: var(--card); border: 1px solid var(--border); border-radius: 9px; font-size: 13px; font-weight: 500; cursor: pointer; } .team-switcher .p { width: 22px; height: 22px; border-radius: 6px; background: var(--orange); color: #FFF; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 11.5px; } .team-switcher .chev { width: 12px; height: 12px; color: var(--ink-3); } .top-r { display: flex; align-items: center; gap: 8px; } .icon-btn { width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; background: var(--card); border: 1px solid var(--border); border-radius: 9px; color: var(--ink-2); cursor: pointer; position: relative; } .icon-btn:hover { color: var(--ink); } .icon-btn svg { width: 15px; height: 15px; } .icon-btn .dot { position: absolute; top: 8px; right: 9px; width: 7px; height: 7px; border-radius: 50%; background: var(--orange); border: 1.5px solid var(--card); } .pill-btn { display: flex; align-items: center; gap: 7px; padding: 8px 14px; background: var(--card); border: 1px solid var(--border); border-radius: 9px; font-size: 13px; color: var(--ink); font-weight: 500; cursor: pointer; } .pill-btn:hover { background: var(--bg-soft); } .pill-btn svg { width: 14px; height: 14px; color: var(--ink-2); } .upgrade { background: var(--orange); color: #FFF; border: 1px solid var(--orange); font-weight: 600; padding: 8px 16px; } .upgrade:hover { background: var(--orange-d); } .upgrade svg { color: #FFF; } .balance-chip { display: inline-flex; align-items: center; gap: 6px; padding: 7px 11px; background: var(--card); border: 1px solid var(--border); border-radius: 9px; font-size: 12.5px; color: var(--ink-2); } .balance-chip strong { color: var(--ink); font-family: var(--mono); font-weight: 500; } /* ──────── Content shell ──────── */ .content { padding: 40px 56px 56px; position: relative; z-index: 1; max-width: 1480px; } /* page head */ .page-head { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 28px; gap: 16px; } .page-head h1 { font-size: 26px; font-weight: 600; letter-spacing: -.018em; line-height: 1.2; } .page-head .sub { font-size: 13.5px; color: var(--ink-2); margin-top: 6px; display: flex; align-items: center; gap: 8px; } .page-head .sub .mono-sub { font-family: var(--mono); font-size: 11.5px; color: var(--ink-3); letter-spacing: .02em; } .page-head .actions { display: flex; align-items: center; gap: 8px; } /* ──────── Buttons ──────── */ .btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px; border-radius: 9px; font-size: 13px; font-weight: 500; border: 1px solid var(--border); background: var(--card); color: var(--ink); cursor: pointer; white-space: nowrap; transition: background 100ms; } .btn:hover { background: var(--bg-soft); } .btn svg { width: 13px; height: 13px; } .btn.btn-primary { background: var(--orange); color: #FFF; border-color: var(--orange); font-weight: 600; padding: 8px 16px; } .btn.btn-primary:hover { background: var(--orange-d); } .btn.btn-primary.btn-lg { padding: 10px 20px; font-size: 13.5px; } .btn.btn-secondary { background: var(--bg-soft); color: var(--ink); } .btn.btn-secondary:hover { background: var(--bg-softer); } .btn.btn-ghost { background: transparent; border-color: transparent; color: var(--ink-2); } .btn.btn-ghost:hover { background: var(--bg-soft); color: var(--ink); } .btn.btn-sm { padding: 5px 11px; font-size: 12px; } .btn.btn-lg { padding: 10px 18px; font-size: 13.5px; } .btn.btn-create svg { width: 16px; height: 16px; } .btn:disabled { opacity: .45; cursor: not-allowed; } .btn:disabled:hover { background: var(--card); } /* ──────── Pills ──────── */ .pill { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border-radius: 999px; font-size: 11.5px; font-weight: 500; border: 1px solid var(--border); white-space: nowrap; } .pill .dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; } .pill-info { background: var(--orange-tint); color: var(--orange); border-color: var(--orange-soft); } .pill-success, .pill-ok { background: var(--green-soft); color: var(--green); border-color: #D5E5D5; } .pill-error, .pill-err { background: var(--red-soft); color: var(--red); border-color: #F2D6CE; } .pill-neutral { background: var(--bg-soft); color: var(--ink-2); border-color: var(--border); } /* ──────── Mono tag ──────── */ .tag-mono { font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: .06em; padding: 2px 8px; border: 1px solid var(--border-soft); background: var(--bg-soft); border-radius: 4px; display: inline-block; } /* ──────── Inputs ──────── */ .input, .select, .textarea { width: 100%; height: 36px; padding: 0 12px; background: var(--card); border: 1px solid var(--border); border-radius: 7px; font-size: 13px; color: var(--ink); transition: border-color 100ms; } .input:focus, .select:focus, .textarea:focus { outline: none; border-color: var(--orange); box-shadow: 0 0 0 3px var(--orange-tint); } .textarea { height: auto; padding: 10px 12px; resize: vertical; } .select { appearance: none; padding-right: 32px; background-image: url("data:image/svg+xml;utf8,"); background-repeat: no-repeat; background-position: right 10px center; } .field { display: block; margin-bottom: 16px; } .field-label { display: block; font-size: 12.5px; color: var(--ink-2); font-weight: 500; margin-bottom: 6px; } .field-label .req { color: var(--orange); margin-left: 2px; } .field-hint { font-size: 11.5px; color: var(--ink-3); margin-top: 4px; } /* ──────── Card (hard-corner v3) ──────── */ .card { background: var(--card); border: 1px solid var(--border); padding: 20px; } .card.padded { padding: 24px; } .card-hd { display: flex; align-items: center; justify-content: space-between; padding: 14px 18px; border-bottom: 1px solid var(--border); } .card-hd h3 { font-size: 14px; font-weight: 600; } /* corner SVG crosshair marks (V2.1 spec · 22×21 viewBox · 圆弧内凹) */ .has-corners { position: relative; } .has-corners::before, .has-corners::after, .corner-tr, .corner-bl { content: ''; position: absolute; width: 14px; height: 14px; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 21' fill='%239C988C'%3E%3Cpath d='M10.5 4C10.5 7.31371 7.81371 10 4.5 10H0.5V11H4.5C7.81371 11 10.5 13.6863 10.5 17V21H11.5V17C11.5 13.6863 14.1863 11 17.5 11H21.5V10H17.5C14.1863 10 11.5 7.31371 11.5 4V0H10.5V4Z'/%3E%3C/svg%3E") no-repeat center; background-size: contain; pointer-events: none; } .has-corners::before { top: -7px; left: -7px; } .has-corners::after { bottom: -7px; right: -7px; } .corner-tr { top: -7px; right: -7px; } .corner-bl { bottom: -7px; left: -7px; } /* ──────── Section heading ──────── */ .section-h { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 12px; } .section-h h2 { font-size: 15px; font-weight: 600; letter-spacing: -.01em; } .section-h .more { font-family: var(--mono); font-size: 11px; color: var(--ink-3); letter-spacing: .04em; } .section-h .more:hover { color: var(--orange); } /* ──────── Tabs ──────── */ .tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--border); margin-bottom: 20px; } .tab { padding: 10px 14px; font-size: 13px; color: var(--ink-2); font-weight: 500; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; display: inline-flex; align-items: center; gap: 6px; } .tab:hover { color: var(--ink); } .tab.active { color: var(--ink); border-bottom-color: var(--orange); } .tab .count { font-family: var(--mono); font-size: 10.5px; background: var(--bg-soft); border: 1px solid var(--border-soft); color: var(--ink-3); padding: 1px 6px; border-radius: 3px; } .tab.active .count { color: var(--orange); background: var(--orange-tint); border-color: var(--orange-soft); } /* ──────── Filter chips ──────── */ .toolbar { display: flex; align-items: center; gap: 10px; margin-bottom: 18px; flex-wrap: wrap; } .toolbar-search { position: relative; flex: 1; max-width: 320px; min-width: 200px; } .toolbar-search svg { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); color: var(--ink-3); width: 14px; height: 14px; } .toolbar-search input { padding-left: 34px; } .filter-chip { height: 32px; padding: 0 12px; border: 1px solid var(--border); background: var(--card); border-radius: 8px; font-size: 12.5px; color: var(--ink-2); font-weight: 500; display: inline-flex; align-items: center; gap: 6px; cursor: pointer; } .filter-chip:hover { background: var(--bg-soft); } .filter-chip.active { border-color: var(--orange); color: var(--orange); background: var(--orange-tint); } .filter-chip svg { width: 12px; height: 12px; } .filter-chip .count-mini { color: var(--ink-3); font-family: var(--mono); font-size: 10.5px; } /* ──────── Progress bar (5 segs) ──────── */ .prog { display: flex; gap: 3px; } .prog span { width: 18px; height: 5px; border-radius: 2px; background: var(--bg-soft); } .prog span.done { background: var(--ink-2); } .prog span.cur { background: var(--orange); } .prog span.fail { background: var(--red); } /* ──────── Placeholder thumb / image ──────── */ .placeholder { background: var(--bg-soft); border: 1px solid var(--border-soft); display: flex; align-items: center; justify-content: center; font-family: var(--mono); font-size: 10px; color: var(--ink-3); letter-spacing: .04em; text-align: center; padding: 4px; position: relative; overflow: hidden; } .placeholder::before { content: ''; position: absolute; inset: 0; background-image: linear-gradient(45deg, var(--border-soft) 25%, transparent 25%), linear-gradient(-45deg, var(--border-soft) 25%, transparent 25%); background-size: 14px 14px; background-position: 0 0, 7px 0; opacity: .35; pointer-events: none; } .placeholder .ph-frame { position: relative; z-index: 1; padding: 2px 6px; background: var(--bg); border: 1px solid var(--border-soft); } /* ──────── Divider ──────── */ .divider { height: 1px; background: var(--border); margin: 14px 0; } /* ──────── Spinner ──────── */ .spinner { width: 18px; height: 18px; border: 2px solid var(--bg-soft); border-top-color: var(--orange); border-radius: 50%; animation: spin 800ms linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* ============================================================ Workspace page ============================================================ */ .welcome { margin-bottom: 36px; } .stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; background: var(--card); border: 1px solid var(--border); position: relative; } .stat { padding: 22px 24px; border-right: 1px solid var(--border); position: relative; } .stat:last-child { border-right: 0; } .stat .lbl { font-size: 12.5px; color: var(--ink-3); font-weight: 500; letter-spacing: .01em; display: flex; align-items: center; gap: 6px; } .stat .lbl .badge { font-family: var(--mono); font-size: 9.5px; color: var(--ink-3); background: var(--bg-soft); padding: 1px 6px; border-radius: 4px; border: 1px solid var(--border-soft); } .stat .v { font-size: 30px; font-weight: 600; letter-spacing: -.02em; line-height: 1; margin-top: 14px; color: var(--ink); font-variant-numeric: tabular-nums; } .stat .v small { font-size: 14px; color: var(--ink-3); font-weight: 500; margin-left: 2px; } .stat .delta { font-family: var(--mono); font-size: 11px; margin-top: 8px; color: var(--ink-3); letter-spacing: .02em; } .stat .delta.up { color: var(--green); } .stat .usage-bar { height: 5px; background: var(--bg-soft); border-radius: 3px; margin-top: 12px; overflow: hidden; } .stat .usage-bar span { display: block; height: 100%; background: var(--orange); border-radius: 3px; width: 33%; } .stat .sub-mono { font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); margin-top: 8px; letter-spacing: .02em; } .grid2 { display: grid; grid-template-columns: 1.7fr 1fr; gap: 24px; align-items: start; } .list-card { background: var(--card); border: 1px solid var(--border); overflow: hidden; } .recent-row { display: grid; grid-template-columns: 54px 1fr auto auto auto; align-items: center; gap: 16px; padding: 14px 18px; border-bottom: 1px solid var(--border); text-decoration: none; } .recent-row:last-child { border-bottom: 0; } .recent-row:hover { background: var(--bg-soft); } .recent-row .thumb { width: 54px; height: 70px; background: var(--bg-soft); border: 1px solid var(--border-soft); display: flex; align-items: center; justify-content: center; font-family: var(--mono); font-size: 10px; color: var(--ink-3); letter-spacing: .04em; } .r-meta .name { font-weight: 600; font-size: 13.5px; color: var(--ink); } .r-meta .sub { font-size: 12px; color: var(--ink-3); margin-top: 3px; font-family: var(--mono); letter-spacing: .01em; } .shortcuts { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .shortcut { background: var(--card); border: 1px solid var(--border); padding: 14px; display: flex; align-items: flex-start; gap: 11px; color: var(--ink); cursor: pointer; position: relative; } .shortcut:hover { background: var(--bg-soft); } .shortcut .ic { width: 30px; height: 30px; background: var(--orange-tint); color: var(--orange); display: flex; align-items: center; justify-content: center; flex-shrink: 0; border: 1px solid var(--orange-soft); } .shortcut .ic svg { width: 16px; height: 16px; } .shortcut .t { font-size: 13px; font-weight: 600; } .shortcut .d { font-size: 11.5px; color: var(--ink-3); margin-top: 2px; font-family: var(--mono); letter-spacing: .01em; } .tip { background: var(--card); border: 1px dashed var(--border); padding: 14px 16px; font-size: 12.5px; color: var(--ink-2); line-height: 1.6; } .tip strong { color: var(--ink); font-weight: 600; display: block; margin-bottom: 4px; } .tip .mono-pill { font-family: var(--mono); color: var(--orange); background: var(--orange-tint); padding: 1px 5px; border-radius: 3px; font-size: 11.5px; } /* ============================================================ Wizard (New Project) ============================================================ */ .wizard-content { max-width: 1400px; } .wizard-shell { display: grid; grid-template-columns: 200px minmax(0, 1fr) 300px; gap: 36px; align-items: start; } @media (max-width: 1180px) { .wizard-shell { grid-template-columns: 200px minmax(0, 1fr); } .wiz-preview { display: none; } } /* ──────── Steps rail ──────── */ .steps { position: sticky; top: 28px; align-self: start; } .step { display: flex; gap: 12px; padding: 12px 0; position: relative; } .step:not(.last)::after { content: ''; position: absolute; left: 13px; top: 38px; width: 1px; height: calc(100% - 22px); background: var(--border); } .step .num { width: 26px; height: 26px; border: 1px solid var(--border); background: var(--card); font-family: var(--mono); font-size: 11.5px; color: var(--ink-3); display: flex; align-items: center; justify-content: center; flex-shrink: 0; } .step.done .num { background: var(--ink); border-color: var(--ink); color: #FFF; } .step.active .num { background: var(--orange); border-color: var(--orange); color: #FFF; } .step .step-label { font-size: 13px; font-weight: 600; color: var(--ink); line-height: 1.3; } .step.pending .step-label { color: var(--ink-3); font-weight: 500; } .step .step-desc { font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); margin-top: 3px; letter-spacing: .02em; } /* ──────── Wiz main ──────── */ .wiz-main { min-width: 0; } .wiz-main > .card { margin-bottom: 14px; } .collapsed-step { padding: 16px 20px; } .collapsed-step h3 { font-size: 13.5px; font-weight: 600; } .active-step { padding: 26px 28px; position: relative; } .active-step::before, .active-step::after { content: ''; position: absolute; width: 14px; height: 14px; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 21' fill='%239C988C'%3E%3Cpath d='M10.5 4C10.5 7.31371 7.81371 10 4.5 10H0.5V11H4.5C7.81371 11 10.5 13.6863 10.5 17V21H11.5V17C11.5 13.6863 14.1863 11 17.5 11H21.5V10H17.5C14.1863 10 11.5 7.31371 11.5 4V0H10.5V4Z'/%3E%3C/svg%3E") no-repeat center; background-size: contain; pointer-events: none; } .active-step::before { top: -7px; left: -7px; } .active-step::after { bottom: -7px; right: -7px; } .step-h { margin-bottom: 20px; } .step-h h2 { font-size: 19px; font-weight: 600; letter-spacing: -.015em; } .step-h p { font-size: 13px; color: var(--ink-2); margin-top: 6px; line-height: 1.5; } /* ──────── Option cards (radio-grid) ──────── */ .option-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; } .option-row.cols-4 { grid-template-columns: repeat(4, 1fr); } .option-row.cols-6 { grid-template-columns: repeat(3, 1fr); } @media (min-width: 1280px) { .option-row.cols-6 { grid-template-columns: repeat(6, 1fr); } } .option-card { border: 1px solid var(--border); background: var(--card); padding: 14px; cursor: pointer; position: relative; display: flex; flex-direction: column; transition: border-color .12s, background .12s; min-width: 0; } .option-card:hover { background: var(--bg-soft); } .option-card.selected { border-color: var(--orange); background: var(--orange-tint); } .option-card.selected::after { content: ''; position: absolute; top: 8px; right: 10px; width: 16px; height: 16px; background-color: var(--orange); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: center; background-size: 10px 10px; } .option-card h4 { font-size: 13px; font-weight: 600; letter-spacing: -.005em; } .option-card .sub { font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); margin-top: 3px; letter-spacing: .02em; } .option-card .note { font-size: 11.5px; color: var(--ink-2); margin-top: 6px; line-height: 1.5; } .option-card .metric { margin-top: auto; padding-top: 10px; font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: .02em; display: flex; align-items: center; gap: 4px; } .option-card .metric .val { color: var(--ink); font-weight: 500; } .option-card.selected .metric .val { color: var(--orange); } .option-card .badge, .option-card .tag-mono { display: inline-block; font-family: var(--mono); font-size: 9.5px; padding: 1px 6px; background: var(--card); border: 1px solid var(--border); color: var(--ink-3); margin-top: 8px; letter-spacing: .04em; align-self: flex-start; } .option-card.selected .badge { color: var(--orange); border-color: var(--orange-soft); } /* ──────── Theme pill (key-points) ──────── */ .theme-pill { display: inline-flex; align-items: center; gap: 4px; height: 28px; padding: 0 12px; border: 1px solid var(--border); background: var(--card); font-size: 12.5px; color: var(--ink-2); border-radius: 999px; cursor: pointer; white-space: nowrap; } .theme-pill:hover { background: var(--bg-soft); } .theme-pill.on, .theme-pill.active { background: var(--orange-tint); color: var(--orange); border-color: var(--orange-soft); font-weight: 600; } /* ──────── Wiz foot ──────── */ .wiz-foot { display: flex; justify-content: space-between; align-items: center; padding-top: 18px; margin-top: 18px; border-top: 1px solid var(--border); } /* ──────── Preview panel (right rail) ──────── */ .wiz-preview { position: sticky; top: 28px; align-self: start; background: var(--card); border: 1px solid var(--border); padding: 18px 18px 16px; position: sticky; } .wiz-preview::before, .wiz-preview::after { content: ''; position: absolute; width: 14px; height: 14px; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 21' fill='%239C988C'%3E%3Cpath d='M10.5 4C10.5 7.31371 7.81371 10 4.5 10H0.5V11H4.5C7.81371 11 10.5 13.6863 10.5 17V21H11.5V17C11.5 13.6863 14.1863 11 17.5 11H21.5V10H17.5C14.1863 10 11.5 7.31371 11.5 4V0H10.5V4Z'/%3E%3C/svg%3E") no-repeat center; background-size: contain; pointer-events: none; } .wiz-preview::before { top: -7px; left: -7px; } .wiz-preview::after { bottom: -7px; right: -7px; } .wiz-preview .pv-h { font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: .08em; margin-bottom: 12px; text-transform: uppercase; display: flex; align-items: center; justify-content: space-between; } .wiz-preview .pv-h .live-dot { display: inline-flex; align-items: center; gap: 5px; color: var(--orange); } .wiz-preview .pv-h .live-dot::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: var(--orange); animation: pv-pulse 1.6s ease-in-out infinite; } @keyframes pv-pulse { 0%, 100% { opacity: 1; } 50% { opacity: .35; } } .pv-title { font-size: 14px; font-weight: 600; line-height: 1.3; margin-bottom: 14px; word-break: break-all; } .pv-metrics { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; background: var(--border); border: 1px solid var(--border); margin-bottom: 14px; } .pv-metric { padding: 10px 12px; background: var(--card); } .pv-metric .l { font-family: var(--mono); font-size: 9.5px; color: var(--ink-3); letter-spacing: .04em; text-transform: uppercase; } .pv-metric .v { font-size: 18px; font-weight: 600; letter-spacing: -.01em; margin-top: 3px; font-variant-numeric: tabular-nums; color: var(--ink); } .pv-metric .v small { font-size: 11px; font-weight: 500; color: var(--ink-3); margin-left: 1px; } .pv-metric.accent .v { color: var(--orange); } .pv-section { margin-top: 14px; } .pv-section .lbl { font-family: var(--mono); font-size: 9.5px; color: var(--ink-3); letter-spacing: .06em; text-transform: uppercase; margin-bottom: 8px; } .pv-flow { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 0; font-size: 11.5px; color: var(--ink-2); line-height: 1.7; } .pv-flow .node { padding: 2px 7px; background: var(--bg-soft); border: 1px solid var(--border-soft); color: var(--ink); font-weight: 500; } .pv-flow .arrow { color: var(--orange); margin: 0 5px; font-family: var(--mono); } .pv-list { list-style: none; padding: 0; margin: 0; } .pv-list li { font-size: 11.5px; color: var(--ink-2); padding: 4px 0; display: flex; align-items: center; gap: 6px; } .pv-list li::before { content: ''; width: 11px; height: 11px; flex-shrink: 0; background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23E55B26' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 12l5 5L20 6'/%3E%3C/svg%3E") no-repeat center; background-size: contain; } .pv-foot { margin-top: 14px; padding-top: 12px; border-top: 1px dashed var(--border); font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: .02em; display: flex; justify-content: space-between; } .pv-foot strong { color: var(--ink); font-weight: 500; } /* ──────── Recommendation bubble ──────── */ .reco-bubble { position: relative; margin-top: 10px; padding: 10px 14px; background: var(--orange-tint); border: 1px solid var(--orange-soft); display: flex; align-items: center; gap: 12px; font-size: 12.5px; color: var(--ink); animation: reco-in .25s ease-out; } @keyframes reco-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } } .reco-bubble::before { content: ''; position: absolute; top: -5px; left: 28px; width: 9px; height: 9px; background: var(--orange-tint); border-left: 1px solid var(--orange-soft); border-top: 1px solid var(--orange-soft); transform: rotate(45deg); } .reco-bubble .ic { color: var(--orange); flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; } .reco-bubble .ic svg { display: block; } .reco-bubble .txt { flex: 1; line-height: 1.5; } .reco-bubble .txt strong { color: var(--orange); font-weight: 600; } .reco-bubble .txt .meta { display: block; font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); margin-top: 2px; letter-spacing: .02em; } .reco-bubble button { flex-shrink: 0; height: 26px; padding: 0 12px; background: var(--orange); color: #FFF; border: 1px solid var(--orange); font-size: 11.5px; font-weight: 600; font-family: inherit; cursor: pointer; letter-spacing: .01em; } .reco-bubble button:hover { background: var(--orange-d); } .reco-bubble .dismiss { background: transparent; color: var(--ink-3); border: 0; width: 24px; height: 24px; padding: 0; display: inline-flex; align-items: center; justify-content: center; cursor: pointer; } .reco-bubble .dismiss:hover { color: var(--ink); background: transparent; } .reco-bubble .dismiss svg { display: block; } /* ============================================================ Wizard — Step 1 / 2 / 4 extras ============================================================ */ /* ──────── Step rail · clickable ──────── */ .step.clickable { cursor: pointer; } .step.clickable:hover .step-label { color: var(--orange); } .step.clickable:hover .num { border-color: var(--orange); color: var(--orange); } .step.done.clickable:hover .num { background: var(--orange); border-color: var(--orange); color: #FFF; } /* ──────── Step 1 · Product picker ──────── */ .pick-toolbar { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 16px; } .pick-section-h { display: flex; align-items: baseline; gap: 8px; margin: 14px 0 8px; font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: .08em; text-transform: uppercase; } .pick-section-h .count { background: var(--bg-soft); border: 1px solid var(--border-soft); padding: 1px 6px; color: var(--ink-3); font-size: 10px; } .product-pick-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; } @media (max-width: 1100px) { .product-pick-grid { grid-template-columns: repeat(2, 1fr); } } .product-pick { display: flex; gap: 12px; padding: 12px; border: 1px solid var(--border); background: var(--card); cursor: pointer; position: relative; transition: background .12s, border-color .12s; min-width: 0; } .product-pick:hover { background: var(--bg-soft); } .product-pick.selected { border-color: var(--orange); background: var(--orange-tint); } .product-pick.selected::after { content: ''; position: absolute; top: 8px; right: 10px; width: 16px; height: 16px; background-color: var(--orange); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: center; background-size: 10px 10px; } .product-pick .thumb { width: 56px; height: 72px; flex-shrink: 0; } .product-pick .body { flex: 1; min-width: 0; } .product-pick .name { font-weight: 600; font-size: 13px; line-height: 1.3; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .product-pick .meta { margin-top: 4px; font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: .02em; } .product-pick .meta b { color: var(--ink); font-weight: 500; } .product-pick .tags { margin-top: 6px; display: flex; gap: 4px; flex-wrap: wrap; } .product-pick .tag-s { font-size: 10.5px; color: var(--ink-2); background: var(--bg-soft); padding: 1px 6px; border: 1px solid var(--border-soft); } .product-pick.selected .tag-s { background: var(--card); border-color: var(--orange-soft); color: var(--orange); } .product-pick.add { display: flex; align-items: center; justify-content: center; flex-direction: column; gap: 8px; border-style: dashed; color: var(--ink-3); min-height: 96px; } .product-pick.add:hover { color: var(--orange); border-color: var(--orange); background: var(--orange-tint); } .product-pick.add .pc { width: 32px; height: 32px; border: 1px solid currentColor; display: grid; place-items: center; } /* ──────── Step 2 · Source type cards ──────── */ .source-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; } .source-card { display: flex; flex-direction: column; gap: 8px; padding: 16px 16px 14px; border: 1px solid var(--border); background: var(--card); cursor: pointer; position: relative; transition: background .12s, border-color .12s; min-height: 132px; } .source-card:hover { background: var(--bg-soft); } .source-card.selected { border-color: var(--orange); background: var(--orange-tint); } .source-card.selected::after { content: ''; position: absolute; top: 10px; right: 12px; width: 16px; height: 16px; background-color: var(--orange); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: center; background-size: 10px 10px; } .source-card .src-ic { width: 32px; height: 32px; background: var(--bg-soft); color: var(--ink-2); border: 1px solid var(--border-soft); display: grid; place-items: center; } .source-card.selected .src-ic { background: var(--card); color: var(--orange); border-color: var(--orange-soft); } .source-card h4 { font-size: 14px; font-weight: 600; letter-spacing: -.005em; } .source-card .src-tag { font-family: var(--mono); font-size: 9.5px; color: var(--ink-3); letter-spacing: .06em; background: var(--card); border: 1px solid var(--border-soft); padding: 1px 6px; align-self: flex-start; } .source-card.selected .src-tag { color: var(--orange); border-color: var(--orange-soft); } .source-card .src-desc { font-size: 12px; color: var(--ink-2); line-height: 1.55; margin-top: auto; } .source-detail { margin-top: 16px; padding: 18px 20px; background: var(--bg-soft); border: 1px solid var(--border-soft); } .source-detail .sd-h { font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: .08em; text-transform: uppercase; margin-bottom: 10px; } .source-detail .sd-h b { color: var(--ink); font-weight: 500; } /* ──────── Step 4 · Summary + Billing ──────── */ .confirm-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 18px; } .confirm-card { position: relative; border: 1px solid var(--border); background: var(--card); padding: 14px 16px; } .confirm-card .cc-h { display: flex; align-items: center; justify-content: space-between; font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: .08em; text-transform: uppercase; margin-bottom: 10px; } .confirm-card .cc-edit { font-size: 11.5px; color: var(--ink-2); letter-spacing: 0; font-family: var(--sans); text-transform: none; padding: 2px 8px; border: 1px solid var(--border-soft); background: var(--card); cursor: pointer; border-radius: 4px; } .confirm-card .cc-edit:hover { color: var(--orange); border-color: var(--orange-soft); } .confirm-card .cc-body { font-size: 13px; color: var(--ink); } .confirm-card .cc-body .ln { display: flex; align-items: center; gap: 8px; padding: 2px 0; font-size: 12.5px; color: var(--ink-2); } .confirm-card .cc-body .ln b { color: var(--ink); font-weight: 500; } .section-sub { font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: .08em; text-transform: uppercase; margin: 18px 0 10px; } .bill-list { border: 1px solid var(--border); background: var(--card); } .bill-row { display: grid; grid-template-columns: 1fr auto 80px; align-items: baseline; gap: 12px; padding: 11px 16px; border-bottom: 1px solid var(--border); } .bill-row:last-child { border-bottom: 0; } .bill-row .l { font-size: 12.5px; color: var(--ink); } .bill-row .l .l-sub { color: var(--ink-3); font-size: 11.5px; margin-left: 6px; } .bill-row .qty { font-family: var(--mono); font-size: 11px; color: var(--ink-3); letter-spacing: .02em; text-align: right; } .bill-row .amt { font-family: var(--mono); font-size: 12.5px; color: var(--ink); font-variant-numeric: tabular-nums; text-align: right; } .bill-row.subtotal { background: var(--bg-soft); } .bill-row.subtotal .l { color: var(--ink-2); font-size: 12px; } .bill-row.total { background: var(--bg-soft); border-top: 1px solid var(--border-strong); } .bill-row.total .l { font-weight: 600; font-size: 13px; } .bill-row.total .amt { font-size: 16px; font-weight: 600; color: var(--ink); } .bill-row.total .amt small { font-size: 11px; color: var(--ink-3); font-weight: 500; margin-left: 2px; } .balance-row { display: flex; align-items: center; gap: 14px; padding: 14px 16px; background: var(--card); border: 1px solid var(--border); margin-top: 10px; } .balance-row .bl { display: flex; align-items: center; gap: 8px; flex: 1; } .balance-row .bl .lbl { font-size: 12.5px; color: var(--ink-2); } .balance-row .bl .val { font-family: var(--mono); font-size: 14px; color: var(--ink); font-variant-numeric: tabular-nums; font-weight: 500; } .balance-row .bl .arrow { color: var(--ink-3); font-family: var(--mono); } .balance-row .bl .val.after { color: var(--ink); } .balance-row.low .bl .val.after { color: var(--red); } .balance-row .pill { margin-left: auto; } .eta-block { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 10px; } .eta-tile { padding: 14px 16px; border: 1px solid var(--border); background: var(--card); } .eta-tile .lbl { font-family: var(--mono); font-size: 10px; color: var(--ink-3); letter-spacing: .08em; text-transform: uppercase; margin-bottom: 6px; } .eta-tile .v { font-size: 15px; font-weight: 600; font-variant-numeric: tabular-nums; letter-spacing: -.01em; } .eta-tile .v small { font-size: 11px; color: var(--ink-3); font-weight: 500; margin-left: 2px; } .eta-tile .desc { font-family: var(--mono); font-size: 10.5px; color: var(--ink-3); letter-spacing: .02em; margin-top: 6px; } /* ──────── SVG checkbox ──────── */ .check-row { display: flex; align-items: center; gap: 10px; padding: 9px 0; font-size: 12.5px; color: var(--ink-2); cursor: pointer; } .check-row:hover .check-box { border-color: var(--ink-2); } .check-box { width: 16px; height: 16px; background: var(--card); border: 1px solid var(--border-strong); flex-shrink: 0; border-radius: 3px; display: grid; place-items: center; } .check-row.on .check-box { background: var(--orange); border-color: var(--orange); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: center; background-size: 11px 11px; } .check-row.on .lab { color: var(--ink); } .check-row .lab b { color: var(--ink); font-weight: 500; } .check-row .lab .mono { font-family: var(--mono); font-size: 11.5px; color: var(--ink-3); margin-left: 6px; letter-spacing: .02em; } .tos-row { display: flex; align-items: center; gap: 10px; padding: 14px 16px; background: var(--bg-soft); border: 1px solid var(--border-soft); margin-top: 14px; cursor: pointer; font-size: 12.5px; color: var(--ink-2); } .tos-row:hover .check-box { border-color: var(--ink-2); } .tos-row.on { background: var(--orange-tint); border-color: var(--orange-soft); } .tos-row.on .lab { color: var(--ink); } .tos-row .lab a { color: var(--orange); text-decoration: underline; }