/* =========================================================
   Doodle Earth — ぷにぷにデザインシステム
   ========================================================= */
:root{
  /* Brand */
  --bg-0:#070a1f;
  --bg-1:#0d1230;
  --bg-2:#151a45;
  --ink:#f6f7ff;
  --ink-2:#b9bee8;
  --ink-3:#7a80b4;

  --primary:#8b6dff;
  --primary-2:#ff7ac6;
  --accent:#5ee0ff;
  --warn:#ffb84d;
  --danger:#ff6b81;
  --ok:#7bf0a6;

  --grad-1:linear-gradient(135deg,#8b6dff 0%,#ff7ac6 50%,#ffb84d 100%);
  --grad-2:linear-gradient(135deg,#5ee0ff 0%,#8b6dff 100%);
  --grad-bg:radial-gradient(1200px 700px at 20% 0%, #1d1660 0%, transparent 60%),
            radial-gradient(900px 600px at 90% 100%, #4b1d6e 0%, transparent 60%),
            linear-gradient(180deg,#070a1f 0%, #0a0e2c 100%);

  /* Punipuni */
  --r-sm:14px; --r-md:22px; --r-lg:28px; --r-xl:36px; --r-pill:999px;
  --shadow-soft: 0 10px 30px rgba(0,0,0,.25), inset 0 1px 0 rgba(255,255,255,.08);
  --shadow-pop : 0 18px 40px rgba(139,109,255,.35), 0 6px 14px rgba(255,122,198,.25), inset 0 1px 0 rgba(255,255,255,.18);
  --bezel: inset 0 1px 0 rgba(255,255,255,.18), inset 0 -2px 0 rgba(0,0,0,.18);

  --ease-puni: cubic-bezier(.34,1.56,.64,1);
  --ease-out: cubic-bezier(.2,.8,.2,1);

  --safe-top: env(safe-area-inset-top, 0px);
  --safe-bot: env(safe-area-inset-bottom, 0px);
}

*{box-sizing:border-box}
html,body{margin:0;padding:0;height:100%; -webkit-tap-highlight-color: transparent;}
body{
  font-family:"Zen Maru Gothic","Inter",system-ui,-apple-system,"Hiragino Kaku Gothic ProN","Noto Sans JP",sans-serif;
  color:var(--ink);
  background:var(--grad-bg);
  overflow:hidden;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  user-select:none;
}
button{font:inherit;color:inherit;border:0;background:transparent;cursor:pointer}
input{font:inherit}
a{color:inherit;text-decoration:none}
.hidden{display:none !important}

/* ====== Boot loader ====== */
.boot{
  position:fixed;inset:0;z-index:9999;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;
  background:var(--grad-bg);
  transition:opacity .6s var(--ease-out);
}
.boot.is-hidden{opacity:0;pointer-events:none}
.boot__globe{
  width:96px;height:96px;border-radius:50%;
  background:
    radial-gradient(circle at 30% 30%, #5ee0ff 0%, transparent 35%),
    radial-gradient(circle at 70% 60%, #8b6dff 0%, transparent 40%),
    radial-gradient(circle at 50% 80%, #ff7ac6 0%, transparent 40%),
    #0d1230;
  box-shadow: 0 0 0 6px rgba(255,255,255,.04), 0 0 60px rgba(139,109,255,.6), inset -10px -10px 30px rgba(0,0,0,.4);
  animation: spin 4s linear infinite, puniPulse 1.6s var(--ease-puni) infinite;
}
.boot__text{color:var(--ink-2);letter-spacing:.06em;font-weight:700}
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes puniPulse{
  0%,100%{transform:scale(1) rotate(var(--r,0deg))}
  50%{transform:scale(1.08)}
}

/* ====== Landing ====== */
.landing{
  position:fixed;inset:0;z-index:50;
  display:grid;place-items:center;
  padding:max(24px,var(--safe-top)) 20px max(24px,var(--safe-bot));
  overflow:auto;
}
.landing__bg{
  position:absolute;inset:0;z-index:-1;
  background:
    radial-gradient(600px 400px at 20% 30%, rgba(139,109,255,.35), transparent 60%),
    radial-gradient(500px 400px at 80% 70%, rgba(255,122,198,.3), transparent 60%),
    radial-gradient(700px 500px at 50% 100%, rgba(94,224,255,.18), transparent 60%);
  filter:blur(2px);
  animation: bgFloat 14s ease-in-out infinite alternate;
}
@keyframes bgFloat{
  from{transform:translate3d(-2%,-1%,0) scale(1)}
  to  {transform:translate3d(2%,2%,0) scale(1.05)}
}
.landing__inner{
  text-align:center;max-width:760px;width:100%;
  display:flex;flex-direction:column;gap:22px;align-items:center;
  animation: rise .9s var(--ease-puni) .1s both;
}
@keyframes rise{from{opacity:0;transform:translateY(20px) scale(.96)}to{opacity:1;transform:none}}
.badge{
  display:inline-flex;gap:8px;align-items:center;
  padding:10px 18px;border-radius:var(--r-pill);
  background:rgba(255,255,255,.08);
  backdrop-filter: blur(14px) saturate(140%);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  font-weight:800;letter-spacing:.04em;
  border:1px solid rgba(255,255,255,.12);
  box-shadow: var(--shadow-soft);
}
[data-pulse]{animation: badgeBob 2.4s var(--ease-puni) infinite}
@keyframes badgeBob{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}

.landing__title{
  font-size: clamp(34px, 7vw, 68px);
  line-height:1.1;font-weight:900;
  margin:6px 0 0;letter-spacing:.01em;
}
.grad{background:var(--grad-1);-webkit-background-clip:text;background-clip:text;color:transparent}
.grad2{background:var(--grad-2);-webkit-background-clip:text;background-clip:text;color:transparent}
.landing__sub{
  color:var(--ink-2);font-size:clamp(15px,2.4vw,18px);line-height:1.7;margin:0;
}
.landing__sub b{color:var(--ink)}
.landing__cta{display:flex;gap:12px;flex-wrap:wrap;justify-content:center}
.landing__stats{
  display:grid;grid-template-columns:repeat(3,minmax(90px,1fr));gap:14px;
  width:min(100%, 460px);margin-top:8px;
}
.landing__stats > div{
  background:rgba(255,255,255,.06);
  backdrop-filter: blur(12px);
  border:1px solid rgba(255,255,255,.1);
  border-radius:var(--r-md);
  padding:14px 8px;
  box-shadow:var(--shadow-soft);
  transition: transform .4s var(--ease-puni);
}
.landing__stats > div:hover{transform: translateY(-3px) scale(1.03)}
.landing__stats b{display:block;font-size:22px;font-weight:900;background:var(--grad-1);-webkit-background-clip:text;background-clip:text;color:transparent}
.landing__stats span{font-size:12px;color:var(--ink-3)}
.landing__hint{color:var(--ink-3);font-size:12px;margin-top:6px}

/* ====== Buttons (puni) ====== */
.btn{
  display:inline-flex;align-items:center;gap:8px;
  padding:14px 22px;border-radius:var(--r-pill);
  font-weight:800;letter-spacing:.02em;
  transition: transform .25s var(--ease-puni), box-shadow .25s var(--ease-out), filter .2s;
  will-change: transform;
}
.btn--primary{
  background:var(--grad-1);
  color:#fff;
  box-shadow: var(--shadow-pop), var(--bezel);
}
.btn--primary:hover{transform: translateY(-2px) scale(1.03)}
.btn--primary:active{transform: translateY(1px) scale(.97)}
.btn--ghost{
  background:rgba(255,255,255,.08);
  border:1px solid rgba(255,255,255,.14);
  color:var(--ink);
  backdrop-filter: blur(10px);
  box-shadow: var(--shadow-soft);
}
.btn--ghost:hover{background:rgba(255,255,255,.12);transform:translateY(-1px)}
.puni{position:relative}
.puni::after{
  content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  box-shadow: inset 0 2px 0 rgba(255,255,255,.4), inset 0 -2px 6px rgba(0,0,0,.25);
}

/* ====== App ====== */
.app{position:fixed;inset:0;z-index:1}
#map{position:absolute;inset:0;background:#06081a}
.leaflet-container{background:#06081a !important; font-family:inherit}
.leaflet-control-attribution{
  background:rgba(13,18,48,.6) !important;
  color:var(--ink-3) !important;
  backdrop-filter: blur(8px);
  border-radius: 8px 0 0 0 !important;
  font-size:10px !important;
}
.leaflet-control-attribution a{color:var(--ink-2) !important}

/* topbar */
.topbar{
  position:absolute;top:calc(12px + var(--safe-top));left:12px;right:12px;
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:8px 10px;
  z-index:10;
}
.brand{
  display:flex;align-items:center;gap:8px;font-weight:900;letter-spacing:.04em;font-size:14px;
}
.brand__dot{
  width:10px;height:10px;border-radius:50%;
  background:var(--grad-1);
  box-shadow:0 0 12px rgba(255,122,198,.7);
  animation: puniPulse 1.6s var(--ease-puni) infinite;
}
.iconbtn{
  display:grid;place-items:center;
  width:40px;height:40px;border-radius:var(--r-pill);
  background:rgba(255,255,255,.06);
  border:1px solid rgba(255,255,255,.1);
  color:var(--ink);
  transition: transform .2s var(--ease-puni), background .2s;
  backdrop-filter: blur(10px);
}
.iconbtn:hover{background:rgba(255,255,255,.12);transform:scale(1.06)}
.iconbtn:active{transform:scale(.92)}

/* puni-card 共通 */
.puni-card{
  background:rgba(13,18,48,.55);
  border:1px solid rgba(255,255,255,.1);
  border-radius:var(--r-lg);
  backdrop-filter: blur(18px) saturate(140%);
  -webkit-backdrop-filter: blur(18px) saturate(140%);
  box-shadow: var(--shadow-soft);
}

/* toolbar */
.toolbar{
  position:absolute;left:50%;transform:translateX(-50%);
  bottom:calc(16px + var(--safe-bot));
  display:flex;gap:6px;
  padding:8px;
  z-index:10;
  border-radius:var(--r-pill);
}
.tool{
  display:flex;flex-direction:column;align-items:center;gap:2px;
  padding:10px 14px;border-radius:var(--r-pill);
  color:var(--ink-2);font-size:11px;font-weight:700;
  transition: transform .25s var(--ease-puni), color .2s, background .2s;
}
.tool:hover{color:var(--ink);background:rgba(255,255,255,.06);transform:translateY(-2px) scale(1.04)}
.tool:active{transform:scale(.94)}
.tool--draw{
  background:var(--grad-1);color:#fff;
  box-shadow: var(--shadow-pop);
  padding:10px 18px;
}

/* HUD */
.hud{
  position:absolute;top:calc(70px + var(--safe-top));right:12px;
  padding:6px 12px;border-radius:var(--r-pill);
  font-size:11px;color:var(--ink-3);font-weight:700;letter-spacing:.04em;
  z-index:10;
}
.hud span{color:var(--ink)}

/* Modal */
.modal{
  position:fixed;inset:0;z-index:100;
  display:grid;place-items:center;
  padding:16px;
}
.modal__backdrop{
  position:absolute;inset:0;
  background:rgba(2,4,18,.55);
  backdrop-filter: blur(8px);
  animation: fade .2s ease-out;
}
@keyframes fade{from{opacity:0}to{opacity:1}}
.modal__panel{
  position:relative;z-index:1;
  width:min(420px,100%);
  padding:20px;
  display:flex;flex-direction:column;gap:14px;
  animation: pop .35s var(--ease-puni);
}
@keyframes pop{
  from{opacity:0;transform:translateY(12px) scale(.92)}
  to  {opacity:1;transform:none}
}
.modal__panel h3{margin:0;font-size:18px}
.modal__panel input[type=text]{
  width:100%;padding:14px 16px;border-radius:var(--r-pill);
  background:rgba(255,255,255,.06);
  color:var(--ink);
  border:1px solid rgba(255,255,255,.12);
  outline:none;
  transition: border-color .2s, background .2s;
}
.modal__panel input[type=text]:focus{
  border-color:var(--primary);background:rgba(139,109,255,.1);
}
.search-results{display:flex;flex-direction:column;gap:6px;max-height:240px;overflow:auto}
.search-results button{
  text-align:left;padding:10px 14px;border-radius:var(--r-md);
  background:rgba(255,255,255,.04);
  border:1px solid rgba(255,255,255,.08);
  color:var(--ink-2);
  transition: background .2s;
}
.search-results button:hover{background:rgba(255,255,255,.1);color:var(--ink)}

/* Draw modal */
.modal__panel--draw{width:min(360px,100%)}
.draw-head{display:flex;justify-content:space-between;align-items:baseline}
.draw-head small{color:var(--ink-3);font-size:11px}
#draw-canvas{
  width:100%;aspect-ratio:1/1;height:auto;
  background:#fff;
  border-radius:var(--r-md);
  touch-action:none;
  cursor:crosshair;
  box-shadow: inset 0 0 0 2px rgba(255,255,255,.1), 0 8px 24px rgba(0,0,0,.4);
}
.draw-controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.palette{display:flex;gap:6px;flex-wrap:wrap}
.palette button{
  width:26px;height:26px;border-radius:50%;
  border:2px solid rgba(255,255,255,.2);
  transition:transform .2s var(--ease-puni), border-color .2s;
}
.palette button.active{transform:scale(1.2);border-color:#fff;box-shadow:0 0 0 3px rgba(255,255,255,.18)}
#brush-size{flex:1;min-width:100px;accent-color:var(--primary)}
.draw-actions{display:flex;gap:10px;justify-content:flex-end}
.draw-note{margin:0;font-size:11px;color:var(--ink-3);line-height:1.6}

/* Menu */
.menu{
  position:absolute;top:calc(64px + var(--safe-top));right:12px;
  width:240px;
  background:rgba(13,18,48,.7);
  border:1px solid rgba(255,255,255,.1);
  border-radius:var(--r-md);
  backdrop-filter: blur(18px);
  padding:6px;
  z-index:20;
  animation: pop .25s var(--ease-puni);
  box-shadow: 0 14px 30px rgba(0,0,0,.4);
}
.menu__item{
  display:block;width:100%;text-align:left;
  padding:12px 14px;border-radius:var(--r-sm);
  color:var(--ink-2);font-weight:600;
  transition:background .2s, color .2s;
}
.menu__item:hover{background:rgba(255,255,255,.06);color:var(--ink)}

/* Toast */
.toast{
  position:fixed;left:50%;transform:translateX(-50%);
  bottom:calc(96px + var(--safe-bot));
  background:rgba(13,18,48,.9);
  border:1px solid rgba(255,255,255,.12);
  color:var(--ink);
  padding:12px 18px;border-radius:var(--r-pill);
  font-weight:700;font-size:13px;
  z-index:200;
  box-shadow: 0 12px 30px rgba(0,0,0,.5);
  animation: toastIn .35s var(--ease-puni);
}
@keyframes toastIn{from{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%,0)}}

/* Doodle marker on map */
.doodle-marker{
  width:48px;height:48px;border-radius:50%;
  background:#fff;padding:3px;
  box-shadow: 0 6px 16px rgba(0,0,0,.4), 0 0 0 2px rgba(255,255,255,.5);
  transition: transform .25s var(--ease-puni);
  animation: pinDrop .5s var(--ease-puni);
}
.doodle-marker:hover{transform:scale(1.15) translateY(-2px)}
.doodle-marker img{width:100%;height:100%;border-radius:50%;display:block;object-fit:cover}
@keyframes pinDrop{
  from{opacity:0;transform: translateY(-20px) scale(.5)}
  to{opacity:1;transform: none}
}

/* Popup */
.leaflet-popup-content-wrapper{
  background:rgba(13,18,48,.92) !important;
  color:var(--ink) !important;
  border-radius:var(--r-md) !important;
  border:1px solid rgba(255,255,255,.12);
  backdrop-filter: blur(12px);
}
.leaflet-popup-tip{background:rgba(13,18,48,.92) !important}
.leaflet-popup-content{margin:14px 16px !important;font-size:12px}
.leaflet-popup-content img{max-width:200px;border-radius:12px;display:block;margin-bottom:8px}

/* ====== Reduced motion ====== */
@media (prefers-reduced-motion: reduce){
  *{animation:none !important;transition:none !important}
}

/* ====== Phones ====== */
@media (max-width:480px){
  .landing__title{font-size:38px}
  .tool span{font-size:10px}
  .modal__panel--draw{padding:16px}
}
