
:root{
  --paper:#f6f4ef;
  --paper-2:#efece3;
  --ink:#1c1b18;
  --ink-soft:#5c584f;
  --border:#e1dccd;
  --accent:#45614f;
  --accent-ink:#f3f7f3;
  --danger:#9a3b34;
  --danger-bg:#f8e9e7;
  --shadow:rgba(28,27,24,0.14);
  --btn-bg:rgba(21,22,19,0.66);
  --btn-bg-hover:rgba(21,22,19,0.8);
  --btn-text:#f7f5ee;
  --btn-caption:rgba(247,245,238,0.68);
  --focus:#7fa38c;
}
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]){
    --paper:#171512;
    --paper-2:#201d18;
    --ink:#f2efe8;
    --ink-soft:#b7b1a4;
    --border:#332e26;
    --accent:#7fa38c;
    --accent-ink:#12201a;
    --danger:#e17b73;
    --danger-bg:#3a201d;
    --shadow:rgba(0,0,0,0.5);
  }
}
:root[data-theme="dark"]{
  --paper:#171512;
  --paper-2:#201d18;
  --ink:#f2efe8;
  --ink-soft:#b7b1a4;
  --border:#332e26;
  --accent:#7fa38c;
  --accent-ink:#12201a;
  --danger:#e17b73;
  --danger-bg:#3a201d;
  --shadow:rgba(0,0,0,0.5);
}
*,*::before,*::after{box-sizing:border-box;}
html,body{height:100%;}
body{
  margin:0;
  background:var(--paper);
  color:var(--ink);
  font-family:'IBM Plex Sans',system-ui,sans-serif;
  -webkit-font-smoothing:antialiased;
}
a{color:inherit;}
button,input,select{font:inherit;color:inherit;}
:focus-visible{outline:2px solid var(--focus);outline-offset:2px;}
#app-root{min-height:100vh;}

/* ---------- public page ---------- */
.public-shell{
  position:relative;
  min-height:100vh;
  overflow:hidden;
}
.public-bg{
  position:fixed;
  inset:0;
  background-size:cover;
  background-position:center;
  background-color:var(--paper-2);
  background-image:radial-gradient(circle at 30% 20%, #3a4a40 0%, #14140f 75%);
}
.public-veil{
  position:fixed;
  inset:0;
  background:radial-gradient(circle at 50% 45%, rgba(0,0,0,0.05) 0%, rgba(0,0,0,0.32) 100%);
  pointer-events:none;
}
.button-stage{
  position:fixed;
  inset:0;
  display:flex;
  align-items:center;
  justify-content:center;
  padding:32px;
}
.tile-row{
  display:flex;
  flex-wrap:wrap;
  justify-content:center;
  align-items:stretch;
  gap:14px;
  width:100%;
  max-width:1400px;
}
.link-tile{
  position:relative;
  flex:1 1 230px;
  max-width:320px;
  min-width:190px;
  height:216px;
  display:grid;
  grid-template-rows:1fr auto;
  border-radius:18px;
  overflow:hidden;
  background-size:cover;
  background-position:center;
  background-repeat:no-repeat;
  text-decoration:none;
  box-shadow:0 10px 26px rgba(0,0,0,0.32), 0 1px 2px rgba(0,0,0,0.24);
  transition:transform .15s ease, box-shadow .15s ease;
}
.link-tile:nth-child(4n+1){ background-image:linear-gradient(160deg, #2c3a33 0%, #14140f 80%); }
.link-tile:nth-child(4n+2){ background-image:linear-gradient(160deg, #33302f 0%, #171310 80%); }
.link-tile:nth-child(4n+3){ background-image:linear-gradient(160deg, #223038 0%, #10151a 80%); }
.link-tile:nth-child(4n+4){ background-image:linear-gradient(160deg, #362f3a 0%, #16121a 80%); }
.link-tile:hover{
  transform:translateY(-3px);
  box-shadow:0 16px 34px rgba(0,0,0,0.4), 0 1px 2px rgba(0,0,0,0.28);
}
.tile-glow{
  position:absolute;
  inset:0;
  background:linear-gradient(180deg, rgba(0,0,0,0) 42%, rgba(0,0,0,0.58) 100%);
  pointer-events:none;
}
.tile-icon-wrap{
  position:relative;
  z-index:1;
  display:flex;
  align-items:center;
  justify-content:center;
}
.tile-icon{
  width:52px;
  height:52px;
  object-fit:contain;
  filter:drop-shadow(0 2px 6px rgba(0,0,0,0.55));
}
.tile-text{
  position:relative;
  z-index:1;
  display:flex;
  flex-direction:column;
  gap:2px;
  padding:14px 18px 16px;
}
.tile-label{
  font-family:'IBM Plex Sans',sans-serif;
  font-weight:700;
  font-size:1rem;
  color:#f7f5ee;
  text-shadow:0 1px 5px rgba(0,0,0,0.55);
}
.tile-caption{
  font-family:'IBM Plex Mono',monospace;
  font-size:.62rem;
  letter-spacing:.09em;
  text-transform:uppercase;
  color:rgba(247,245,238,0.72);
  text-shadow:0 1px 5px rgba(0,0,0,0.55);
}
.empty-note{
  font-family:'Fraunces',serif;
  font-size:1.3rem;
  color:#f4f1ea;
  text-shadow:0 2px 10px rgba(0,0,0,0.4);
}
.admin-entry{
  position:fixed;
  right:18px;
  bottom:16px;
  font-family:'IBM Plex Mono',monospace;
  font-size:.7rem;
  letter-spacing:.08em;
  text-transform:uppercase;
  color:rgba(255,255,255,0.55);
  text-decoration:none;
  padding:6px 8px;
}
.admin-entry:hover{color:rgba(255,255,255,0.92);}

/* ---------- admin ---------- */
.admin-shell{
  min-height:100vh;
  background:var(--paper);
  padding:40px 20px 100px;
}
.admin-inner{max-width:720px;margin:0 auto;}
.admin-header{
  display:flex;
  justify-content:space-between;
  align-items:baseline;
  gap:16px;
  margin-bottom:32px;
  flex-wrap:wrap;
}
.admin-header h1{
  font-family:'Fraunces',serif;
  font-weight:600;
  font-size:1.9rem;
  margin:0;
}
.admin-nav{display:flex;gap:14px;align-items:baseline;}
.admin-nav a, .admin-nav button{
  font-family:'IBM Plex Mono',monospace;
  font-size:.78rem;
  letter-spacing:.03em;
  background:none;
  border:none;
  color:var(--ink-soft);
  text-decoration:none;
  cursor:pointer;
  padding:0;
}
.admin-nav a:hover, .admin-nav button:hover{color:var(--ink);}

.card{
  background:var(--paper-2);
  border:1px solid var(--border);
  border-radius:16px;
  padding:26px;
  margin-bottom:20px;
  box-shadow:0 1px 2px var(--shadow);
}
.card h2{
  font-family:'Fraunces',serif;
  font-weight:600;
  font-size:1.2rem;
  margin:0 0 6px;
}
.card p.hint{
  margin:0 0 18px;
  color:var(--ink-soft);
  font-size:.9rem;
}
label{
  display:block;
  font-size:.78rem;
  font-weight:600;
  letter-spacing:.02em;
  color:var(--ink-soft);
  margin-bottom:6px;
}
input[type="text"], input[type="url"], input[type="password"], select{
  width:100%;
  padding:10px 12px;
  border-radius:9px;
  border:1px solid var(--border);
  background:var(--paper);
  color:var(--ink);
}
.field{margin-bottom:14px;}
.row{display:flex;gap:12px;}
.row > .field{flex:1;min-width:0;}

.btn{
  display:inline-flex;
  align-items:center;
  gap:6px;
  border-radius:10px;
  padding:10px 18px;
  font-weight:600;
  font-size:.9rem;
  border:1px solid transparent;
  cursor:pointer;
}
.btn-primary{background:var(--accent);color:var(--accent-ink);}
.btn-primary:hover{filter:brightness(1.06);}
.btn-primary:disabled{opacity:.5;cursor:not-allowed;filter:none;}
.btn-ghost{background:transparent;border-color:var(--border);color:var(--ink);}
.btn-ghost:hover{background:var(--paper);}
.btn-danger{background:transparent;border-color:var(--border);color:var(--danger);}
.btn-danger:hover{background:var(--danger-bg);}
.btn-icon{
  background:transparent;border:1px solid var(--border);border-radius:8px;
  width:30px;height:30px;padding:0;color:var(--ink-soft);cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;font-size:.85rem;
}
.btn-icon:hover{color:var(--ink);background:var(--paper);}
.btn-icon:disabled{opacity:.35;cursor:not-allowed;}

.bg-preview{
  width:100%;
  height:150px;
  border-radius:12px;
  background-size:cover;
  background-position:center;
  background-color:var(--paper);
  border:1px solid var(--border);
  margin-bottom:14px;
  display:flex;align-items:center;justify-content:center;
  color:var(--ink-soft);
  font-family:'IBM Plex Mono',monospace;
  font-size:.78rem;
}
.file-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;}

.link-row{
  display:flex;
  align-items:center;
  gap:10px;
  padding:12px 0;
  border-top:1px solid var(--border);
}
.link-row:first-of-type{border-top:none;}
.link-row .info{flex:1;min-width:0;}
.link-row .info .l-label{font-weight:600;font-size:.94rem;}
.link-row .info .l-url{
  font-family:'IBM Plex Mono',monospace;
  font-size:.75rem;
  color:var(--ink-soft);
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
}
.badge{
  font-family:'IBM Plex Mono',monospace;
  font-size:.65rem;
  letter-spacing:.06em;
  text-transform:uppercase;
  border:1px solid var(--border);
  border-radius:6px;
  padding:2px 6px;
  color:var(--ink-soft);
  white-space:nowrap;
}
.link-actions{display:flex;gap:6px;flex-shrink:0;}
.empty-links{color:var(--ink-soft);font-size:.9rem;padding:6px 0;}

.thumbs{display:flex;gap:6px;flex-shrink:0;}
.thumb{
  width:44px;
  height:44px;
  border-radius:8px;
  border:1px solid var(--border);
  background-color:var(--paper);
  background-size:cover;
  background-position:center;
  display:flex;
  align-items:center;
  justify-content:center;
  overflow:hidden;
}
.thumb span{
  font-family:'IBM Plex Mono',monospace;
  font-size:.48rem;
  color:var(--ink-soft);
  text-align:center;
  line-height:1.2;
  padding:2px;
}
.icon-thumb{background-color:#20211d;}

.link-media{
  padding:0 0 14px;
  margin:0 0 4px;
  border-bottom:1px dashed var(--border);
}
.link-media form{
  display:flex;
  flex-wrap:wrap;
  align-items:flex-end;
  gap:12px;
}
.media-field{
  display:flex;
  flex-direction:column;
  gap:4px;
  font-size:.72rem;
  font-weight:600;
  color:var(--ink-soft);
}
.media-field input[type="file"]{font-size:.78rem;}
.btn-small{padding:7px 12px;font-size:.8rem;}
.media-remove{display:flex;gap:14px;margin-top:6px;}
.link-btn-text{
  background:none;
  border:none;
  padding:0;
  font-family:'IBM Plex Mono',monospace;
  font-size:.7rem;
  color:var(--ink-soft);
  text-decoration:underline;
  cursor:pointer;
}
.link-btn-text:hover{color:var(--danger);}

.savebar{
  position:sticky;
  bottom:16px;
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:12px;
  background:var(--paper-2);
  border:1px solid var(--border);
  border-radius:14px;
  padding:14px 18px;
  box-shadow:0 8px 24px var(--shadow);
  flex-wrap:wrap;
}
.savebar .msg{font-size:.82rem;color:var(--ink-soft);}
.savebar .actions{display:flex;gap:10px;}

.login-wrap{
  min-height:100vh;
  display:flex;
  align-items:center;
  justify-content:center;
  padding:20px;
  background:var(--paper);
}
.login-card{
  width:100%;
  max-width:340px;
}
.login-card h1{
  font-family:'Fraunces',serif;
  font-size:1.6rem;
  margin:0 0 4px;
}
.login-card p.hint{margin-bottom:22px;}
.error-msg{
  color:var(--danger);
  background:var(--danger-bg);
  border-radius:8px;
  padding:8px 10px;
  font-size:.82rem;
  margin-bottom:12px;
}
.notice{
  color:var(--ink-soft);
  font-size:.8rem;
  margin-top:18px;
  line-height:1.5;
}

.flash{
  background:var(--paper);
  border:1px solid var(--border);
  border-radius:10px;
  padding:10px 14px;
  font-size:.85rem;
  color:var(--ink-soft);
  margin-bottom:20px;
}
.link-row form{display:inline-flex;margin:0;}
.link-row .link-actions form + form{margin-left:6px;}
