aboutsummaryrefslogtreecommitdiff
path: root/public/admin.css
diff options
context:
space:
mode:
authordax <me@dax.ist>2026-08-05 15:24:33 +0100
committerdax <me@dax.ist>2026-08-05 15:24:33 +0100
commit03dcc91c96ac45ff005a1c3e14a71a5733037447 (patch)
tree48cbb120853132e299dd79559321265a5a8fdd42 /public/admin.css
parentea71584d1fc54d4d6f5799914632328f1327dc08 (diff)
admin panel for walk-graph management; /api/import gated behind admin login
Diffstat (limited to 'public/admin.css')
-rw-r--r--public/admin.css212
1 files changed, 212 insertions, 0 deletions
diff --git a/public/admin.css b/public/admin.css
new file mode 100644
index 0000000..d698076
--- /dev/null
+++ b/public/admin.css
@@ -0,0 +1,212 @@
+:root {
+ --bg: #0e0f13;
+ --panel: #16181f;
+ --panel-2: #1d2028;
+ --ring: #7dd3fc;
+ --ink: #e6e8ee;
+ --muted: #8b90a0;
+ --danger: #fca5a5;
+ --ok: #86efac;
+}
+
+* { box-sizing: border-box; }
+
+html, body {
+ margin: 0;
+ min-height: 100%;
+ background: var(--bg);
+ color: var(--ink);
+ font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
+}
+
+body {
+ display: grid;
+ place-items: start center;
+ padding: 32px 16px 64px;
+}
+
+#app { width: 100%; max-width: 640px; }
+
+h1 {
+ margin: 0 0 6px;
+ font-size: 30px;
+ font-weight: 300;
+ letter-spacing: .12em;
+}
+h1 .dot { color: var(--ring); }
+.sub { color: var(--muted); margin: 0 0 20px; line-height: 1.5; }
+
+form {
+ display: grid;
+ gap: 10px;
+ margin-bottom: 8px;
+}
+
+input[type="password"], input[type="search"], input[type="text"] {
+ width: 100%;
+ padding: 12px 14px;
+ font-size: 15px;
+ color: var(--ink);
+ background: var(--panel);
+ border: 1px solid rgba(255, 255, 255, .14);
+ border-radius: 8px;
+ outline: none;
+}
+input:focus { border-color: var(--ring); }
+
+.remember {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 14px;
+ color: var(--muted);
+}
+
+button {
+ padding: 11px 18px;
+ font-size: 14px;
+ letter-spacing: .08em;
+ color: var(--ink);
+ background: transparent;
+ border: 1px solid rgba(255, 255, 255, .28);
+ border-radius: 999px;
+ cursor: pointer;
+ transition: border-color .15s, background .15s, opacity .15s;
+}
+button:hover { border-color: var(--ring); background: rgba(125, 211, 252, .08); }
+button:disabled { opacity: .45; cursor: default; }
+button.danger { border-color: rgba(252, 165, 165, .5); color: var(--danger); }
+button.danger:hover { border-color: var(--danger); background: rgba(252, 165, 165, .08); }
+
+.err { color: var(--danger); min-height: 20px; font-size: 14px; }
+.facets { color: var(--muted); font-size: 13px; margin: 16px 0 0; line-height: 1.7; }
+
+.top { margin-bottom: 24px; }
+.top nav {
+ display: flex;
+ gap: 8px;
+ align-items: center;
+ flex-wrap: wrap;
+ margin-top: 12px;
+}
+.top nav #logout { margin-left: auto; }
+.tab.active { border-color: var(--ring); background: rgba(125, 211, 252, .12); }
+
+.cards {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
+ gap: 10px;
+}
+.card {
+ background: var(--panel);
+ border: 1px solid rgba(255, 255, 255, .08);
+ border-radius: 10px;
+ padding: 14px;
+ display: grid;
+ gap: 4px;
+}
+.card .k { color: var(--muted); font-size: 12px; text-transform: uppercase; letter-spacing: .08em; }
+.card .v { font-size: 20px; }
+.card .v.ok { color: var(--ok); }
+.card .v.bad { color: var(--danger); }
+
+.row { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 16px; }
+
+#tab-graph { display: grid; gap: 14px; }
+#gq { padding: 12px 14px; }
+
+.results {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
+ gap: 8px;
+ max-height: 320px;
+ overflow-y: auto;
+}
+.result {
+ background: var(--panel-2);
+ border: 1px solid rgba(255, 255, 255, .1);
+ border-radius: 8px;
+ overflow: hidden;
+ cursor: pointer;
+ padding: 0;
+ text-align: left;
+ transition: border-color .15s;
+}
+.result:hover { border-color: var(--ring); }
+.result img { width: 100%; height: 74px; object-fit: cover; display: block; }
+.result .t { padding: 6px 8px; font-size: 12px; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
+.result .d { padding: 0 8px 6px; font-size: 11px; color: var(--muted); }
+
+.graph { display: grid; gap: 10px; }
+.grow {
+ background: var(--panel);
+ border: 1px solid rgba(255, 255, 255, .08);
+ border-radius: 10px;
+ padding: 12px;
+ display: grid;
+ gap: 10px;
+}
+.grow-head { display: flex; gap: 12px; align-items: center; }
+.grow-head img { width: 52px; height: 52px; object-fit: cover; border-radius: 6px; }
+.grow-head .t { font-weight: 500; }
+.grow-head .id { color: var(--muted); font-size: 12px; }
+
+.dir-row {
+ display: grid;
+ grid-template-columns: 34px 1fr auto;
+ gap: 10px;
+ align-items: center;
+ padding: 8px;
+ background: var(--panel-2);
+ border-radius: 8px;
+ border: 1px solid rgba(255, 255, 255, .06);
+}
+.dir-badge {
+ width: 30px;
+ height: 30px;
+ display: grid;
+ place-items: center;
+ border-radius: 6px;
+ font-size: 13px;
+ font-weight: 600;
+ background: rgba(125, 211, 252, .14);
+ color: var(--ring);
+}
+.dir-dest { display: flex; align-items: center; gap: 10px; min-width: 0; }
+.dir-dest img { width: 40px; height: 40px; object-fit: cover; border-radius: 5px; flex: none; }
+.dir-dest .t { font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
+.dir-dest .meta { font-size: 12px; color: var(--muted); }
+.dir-dest .override-badge { font-size: 10px; text-transform: uppercase; letter-spacing: .06em; color: var(--ok); border: 1px solid rgba(134, 239, 172, .4); border-radius: 999px; padding: 1px 6px; }
+.dir-actions { display: flex; gap: 6px; }
+.dir-actions button { padding: 6px 12px; font-size: 12px; }
+
+.picker {
+ grid-column: 1 / -1;
+ display: grid;
+ gap: 8px;
+}
+.picker .presults {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
+ gap: 6px;
+ max-height: 220px;
+ overflow-y: auto;
+}
+
+#toast {
+ position: fixed;
+ left: 50%;
+ bottom: 24px;
+ transform: translateX(-50%);
+ background: var(--panel-2);
+ border: 1px solid rgba(255, 255, 255, .15);
+ color: var(--ink);
+ padding: 10px 18px;
+ border-radius: 999px;
+ font-size: 14px;
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity .2s;
+ max-width: 90vw;
+}
+#toast.show { opacity: 1; }