hd-commerce: neutrales SQLite-Commerce-Backend (Admin + API + Demo-Storefront)
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
/* hd-commerce Admin — Shopify-inspiriert, hell/grau. Akzentfarbe aus settings (CSS-Var --accent). */
|
||||
:root{
|
||||
--s-bg:#f1f1f1; --s-surface:#ffffff; --s-sunken:#f6f6f7;
|
||||
--s-border:#e1e3e5; --s-border-2:#d2d5d8;
|
||||
--s-ink:#1a1a1a; --s-text:#303030; --s-subtle:#616161; --s-faint:#8a8a8a;
|
||||
--accent:#b8566a; --accent-dark:#8d3f50;
|
||||
--s-acc-l:color-mix(in srgb,var(--accent) 14%, white);
|
||||
--s-amber:#ffd79d; --s-amber-t:#5e4200; --s-amber-bg:#fff5ea;
|
||||
--s-red:#fee9e8; --s-red-t:#8e1f0b;
|
||||
--s-blue:#ebf0ff; --s-blue-t:#1f3d7a;
|
||||
--s-gray:#e3e3e3; --s-gray-t:#4a4a4a;
|
||||
--s-radius:10px; --s-shadow:0 1px 0 rgba(0,0,0,.04),0 1px 3px rgba(0,0,0,.06);
|
||||
--s-font:'Public Sans Variable',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;
|
||||
}
|
||||
*{box-sizing:border-box}
|
||||
.admin-body{margin:0;background:var(--s-bg);color:var(--s-text);font-family:var(--s-font);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}
|
||||
.admin-body a{color:inherit;text-decoration:none}
|
||||
.admin-shell{display:grid;grid-template-columns:236px 1fr;min-height:100vh}
|
||||
.s-side{background:var(--s-surface);border-right:1px solid var(--s-border);display:flex;flex-direction:column;position:sticky;top:0;height:100vh}
|
||||
.s-brand{display:flex;align-items:center;gap:10px;padding:16px 16px 14px;border-bottom:1px solid var(--s-border)}
|
||||
.s-brand-logo{width:30px;height:30px;border-radius:7px;background:var(--accent);color:#fff;display:grid;place-items:center;font-weight:800;font-size:13px}
|
||||
.s-brand-name{font-weight:700;font-size:14px;color:var(--s-ink);line-height:1.1}
|
||||
.s-brand-sub{font-size:11px;color:var(--s-faint)}
|
||||
.s-nav{padding:10px 8px;display:flex;flex-direction:column;gap:2px;flex:1;overflow:auto}
|
||||
.s-nav a{display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:8px;font-weight:500;font-size:13.5px;color:var(--s-text)}
|
||||
.s-nav a svg{width:18px;height:18px;flex:none;color:var(--s-subtle)}
|
||||
.s-nav a:hover{background:var(--s-sunken)}
|
||||
.s-nav a.active{background:var(--s-acc-l);color:var(--accent-dark);font-weight:600}
|
||||
.s-nav a.active svg{color:var(--accent-dark)}
|
||||
.s-nav-sec{font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--s-faint);padding:14px 12px 6px;font-weight:700}
|
||||
.s-side-foot{padding:12px 14px;border-top:1px solid var(--s-border);font-size:12px;color:var(--s-faint)}
|
||||
.s-side-foot a{color:var(--accent);font-weight:600}
|
||||
.s-main{display:flex;flex-direction:column;min-width:0}
|
||||
.s-topbar{position:sticky;top:0;z-index:10;background:var(--s-surface);border-bottom:1px solid var(--s-border);padding:14px 28px;display:flex;align-items:center;justify-content:space-between;gap:16px}
|
||||
.s-crumbs{font-size:12px;color:var(--s-faint);margin-bottom:3px;display:flex;align-items:center;gap:6px}
|
||||
.s-crumbs a{color:var(--s-subtle)}.s-crumbs a:hover{color:var(--accent)}
|
||||
.s-title{font-size:20px;font-weight:700;color:var(--s-ink);letter-spacing:-.01em}
|
||||
.s-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
|
||||
.s-content{padding:24px 28px 60px;max-width:1120px;width:100%}
|
||||
.s-btn{display:inline-flex;align-items:center;gap:7px;border-radius:8px;font-size:13px;font-weight:600;padding:8px 14px;cursor:pointer;border:1px solid var(--s-border-2);background:var(--s-surface);color:var(--s-text);transition:.12s;font-family:inherit}
|
||||
.s-btn:hover{background:var(--s-sunken)}
|
||||
.s-btn-primary{background:var(--accent);border-color:var(--accent);color:#fff;box-shadow:0 1px 0 rgba(0,0,0,.08)}
|
||||
.s-btn-primary:hover{background:var(--accent-dark);border-color:var(--accent-dark)}
|
||||
.s-btn-danger{color:var(--s-red-t);border-color:#f0c6c0}.s-btn-danger:hover{background:var(--s-red)}
|
||||
.s-btn-sm{padding:5px 10px;font-size:12px}
|
||||
.s-card{background:var(--s-surface);border:1px solid var(--s-border);border-radius:var(--s-radius);box-shadow:var(--s-shadow)}
|
||||
.s-card-pad{padding:18px 20px}
|
||||
.s-card-head{padding:14px 20px;border-bottom:1px solid var(--s-border);font-weight:700;color:var(--s-ink);font-size:14px;display:flex;justify-content:space-between;align-items:center}
|
||||
.s-grid{display:grid;gap:16px}
|
||||
.s-stack{display:flex;flex-direction:column;gap:16px}
|
||||
.s-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
|
||||
.s-kpi{background:var(--s-surface);border:1px solid var(--s-border);border-radius:var(--s-radius);padding:16px 18px;box-shadow:var(--s-shadow)}
|
||||
.s-kpi-label{font-size:12px;color:var(--s-subtle);font-weight:600;display:flex;align-items:center;gap:7px}
|
||||
.s-kpi-val{font-size:26px;font-weight:700;color:var(--s-ink);margin-top:8px;letter-spacing:-.02em}
|
||||
.s-kpi-sub{font-size:12px;color:var(--s-faint);margin-top:2px}
|
||||
.s-table-wrap{overflow:auto}
|
||||
.s-table{width:100%;border-collapse:collapse;font-size:13.5px}
|
||||
.s-table th{text-align:left;padding:11px 16px;font-size:12px;color:var(--s-subtle);font-weight:600;background:var(--s-sunken);border-bottom:1px solid var(--s-border);white-space:nowrap}
|
||||
.s-table td{padding:12px 16px;border-bottom:1px solid var(--s-border);vertical-align:middle}
|
||||
.s-table tr:last-child td{border-bottom:none}
|
||||
.s-table tbody tr.clk{cursor:pointer}
|
||||
.s-table tbody tr.clk:hover{background:var(--s-sunken)}
|
||||
.s-table .num{text-align:right;font-variant-numeric:tabular-nums}
|
||||
.s-prodcell{display:flex;align-items:center;gap:12px}
|
||||
.s-prodcell img{width:38px;height:46px;object-fit:cover;border-radius:6px;border:1px solid var(--s-border);background:#f0ede8}
|
||||
.s-prodcell .nm{font-weight:600;color:var(--s-ink)}
|
||||
.s-muted{color:var(--s-faint)}
|
||||
.s-link{color:var(--accent);font-weight:600}
|
||||
.s-badge{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:999px;font-size:12px;font-weight:600;line-height:1.4}
|
||||
.s-badge::before{content:'';width:7px;height:7px;border-radius:50%;background:currentColor;opacity:.85}
|
||||
.s-badge.green{background:#e3f1ed;color:#004c3f}
|
||||
.s-badge.amber{background:var(--s-amber-bg);color:var(--s-amber-t)}
|
||||
.s-badge.gray{background:var(--s-gray);color:var(--s-gray-t)}
|
||||
.s-badge.red{background:var(--s-red);color:var(--s-red-t)}
|
||||
.s-badge.blue{background:var(--s-blue);color:var(--s-blue-t)}
|
||||
.s-form-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
|
||||
.s-field{display:flex;flex-direction:column;gap:6px;margin-bottom:16px}
|
||||
.s-field.full{grid-column:1/-1}
|
||||
.s-label{font-size:13px;font-weight:600;color:var(--s-text)}
|
||||
.s-input,.s-textarea,.s-select{border:1px solid var(--s-border-2);border-radius:8px;padding:9px 12px;font:inherit;font-size:14px;background:var(--s-surface);color:var(--s-ink);width:100%;font-family:inherit}
|
||||
.s-textarea{min-height:120px;resize:vertical;line-height:1.5}
|
||||
.s-input:focus,.s-textarea:focus,.s-select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px var(--s-acc-l)}
|
||||
.s-input[type=color]{padding:4px;height:40px;cursor:pointer}
|
||||
.s-help{font-size:12px;color:var(--s-faint)}
|
||||
.s-check{display:flex;align-items:center;gap:8px;font-size:14px}
|
||||
.s-check input{width:16px;height:16px;accent-color:var(--accent)}
|
||||
.s-two-col{display:grid;grid-template-columns:1fr 320px;gap:16px;align-items:start}
|
||||
.s-flash{background:var(--s-acc-l);color:var(--accent-dark);border:1px solid color-mix(in srgb,var(--accent) 30%, white);padding:10px 16px;border-radius:8px;font-weight:600;margin-bottom:16px;display:flex;align-items:center;gap:8px}
|
||||
.s-empty{padding:40px;text-align:center;color:var(--s-faint)}
|
||||
.s-section-title{font-size:13px;font-weight:700;color:var(--s-ink);margin:0 0 4px}
|
||||
/* funnel */
|
||||
.s-funnel{display:flex;flex-direction:column;gap:10px}
|
||||
.s-funnel-row{display:flex;align-items:center;gap:14px}
|
||||
.s-funnel-row .fl{width:140px;font-size:13px;color:var(--s-subtle);font-weight:600;flex:none}
|
||||
.s-funnel-bar{flex:1;height:30px;background:var(--s-sunken);border-radius:6px;overflow:hidden;position:relative}
|
||||
.s-funnel-fill{height:100%;background:var(--accent);border-radius:6px;display:flex;align-items:center;padding:0 10px;color:#fff;font-size:12px;font-weight:700;min-width:38px}
|
||||
.s-funnel-mini{display:flex;align-items:center;gap:10px;margin-top:6px}
|
||||
.s-fm-step{flex:1;text-align:center;background:var(--s-sunken);border-radius:8px;padding:12px 8px}
|
||||
.s-fm-step .v{font-size:20px;font-weight:700;color:var(--s-ink)}
|
||||
.s-fm-step .l{font-size:11px;color:var(--s-subtle);font-weight:600}
|
||||
.s-fm-arrow{color:var(--s-faint);font-size:18px}
|
||||
.s-bar-track{height:8px;background:var(--s-sunken);border-radius:999px;overflow:hidden}
|
||||
.s-bar-track i{display:block;height:100%;background:var(--accent);border-radius:999px}
|
||||
.s-media-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:14px}
|
||||
.s-media-item{border:1px solid var(--s-border);border-radius:8px;overflow:hidden;background:var(--s-surface)}
|
||||
.s-media-item img{width:100%;height:110px;object-fit:cover;background:var(--s-sunken)}
|
||||
.s-media-item .mi{padding:8px 10px;font-size:11px;color:var(--s-subtle);display:flex;flex-direction:column;gap:6px}
|
||||
.s-tabs{display:flex;gap:6px;border-bottom:1px solid var(--s-border);margin-bottom:20px;flex-wrap:wrap}
|
||||
.s-tab{padding:9px 14px;font-size:13.5px;font-weight:600;color:var(--s-subtle);border-bottom:2px solid transparent;cursor:pointer}
|
||||
.s-tab.active{color:var(--accent-dark);border-color:var(--accent)}
|
||||
@media(max-width:860px){.admin-shell{grid-template-columns:1fr}.s-side{position:static;height:auto}.s-nav{flex-direction:row;flex-wrap:wrap}.s-kpis{grid-template-columns:1fr 1fr}.s-form-grid{grid-template-columns:1fr}.s-two-col{grid-template-columns:1fr}}
|
||||
Reference in New Issue
Block a user