/* Contact widget — shares the portfolio's existing color tokens. */
.uplink-launch{position:fixed;right:max(24px,env(safe-area-inset-right));bottom:max(24px,env(safe-area-inset-bottom));z-index:40;display:flex;align-items:center;gap:10px;min-height:54px;padding:14px 20px;border:1px solid var(--green);border-radius:14px;background:rgba(13,16,14,.96);color:var(--green);box-shadow:0 8px 32px #0007;font:600 14px/1.4 Inter,system-ui,sans-serif;cursor:pointer;transition:background .2s,color .2s,box-shadow .2s,transform .2s;touch-action:manipulation}
.uplink-launch svg,.uplink-close svg,.uplink-send svg{width:22px;height:22px;flex:none;transition:transform .22s}
.uplink-launch.is-touched,.uplink-launch[aria-expanded="true"],.uplink-launch:active{background:var(--green);color:var(--ink);box-shadow:0 0 28px #c8f55d55;transform:translateY(-2px)}
.uplink-launch.is-touched svg,.uplink-launch[aria-expanded="true"] svg{transform:rotate(-9deg) scale(1.1)}
@media(hover:hover) and (pointer:fine){.uplink-launch:hover{background:var(--green);color:var(--ink);box-shadow:0 0 28px #c8f55d55;transform:translateY(-3px)}.uplink-launch:hover svg{transform:rotate(-9deg)}.uplink-close:hover{color:var(--green);background:#c8f55d12}.uplink-send:hover:not(:disabled){box-shadow:0 0 24px #c8f55d33;filter:brightness(1.05)}}
.uplink-dialog{padding:0;border:1px solid #c8f55d40;border-radius:20px;width:min(540px,calc(100% - 40px));max-height:calc(100dvh - 40px);margin:auto;overflow:auto;overscroll-behavior:contain;background:var(--panel);color:var(--text);box-shadow:0 30px 120px #000b;color-scheme:dark}
.uplink-dialog::backdrop{background:rgba(0,0,0,.72);backdrop-filter:blur(7px)}
.uplink-dialog[open]{animation:uplink-enter .26s cubic-bezier(.2,.8,.2,1) both}.uplink-dialog[open]::backdrop{animation:uplink-shade .26s both}
.uplink-dialog.is-closing{animation:uplink-exit .18s ease both}.uplink-dialog.is-closing::backdrop{animation:uplink-shade .18s reverse both}
.uplink-surface{padding:28px;background:radial-gradient(ellipse at 100% 0,#c8f55d0c,transparent 60%);border-top:2px solid var(--green)}
.uplink-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.uplink-kicker{margin:0 0 8px;font:600 12px/1.5 ui-monospace,monospace;letter-spacing:.16em;color:var(--green)}
.uplink-heading h2{margin:0;font-size:clamp(22px,4vw,28px);line-height:1.25;letter-spacing:-.03em}.uplink-close{display:grid;place-items:center;flex:none;width:44px;height:44px;margin:-8px -8px 0 0;padding:0;border:1px solid var(--line);border-radius:10px;background:transparent;color:var(--muted);cursor:pointer;touch-action:manipulation}.uplink-close:active{background:#c8f55d25;color:var(--green)}
#uplink-intro{margin:12px 0 22px;color:var(--muted);font-size:14px;line-height:1.6}.uplink-fields{display:grid;gap:15px}.uplink-fields label{display:grid;gap:7px;font-size:14px;font-weight:600;line-height:1.5}.uplink-fields input,.uplink-fields textarea{box-sizing:border-box;width:100%;min-width:0;border:1px solid var(--line);border-radius:9px;background:#050605a6;padding:11px 13px;color:var(--text);font:400 16px/1.5 Inter,system-ui,sans-serif;transition:border-color .18s,box-shadow .18s}.uplink-fields textarea{resize:vertical;min-height:112px;max-height:300px}.uplink-fields input::placeholder,.uplink-fields textarea::placeholder{color:#8d9388;opacity:1}.uplink-fields input:focus,.uplink-fields textarea:focus{outline:none;border-color:var(--green);box-shadow:0 0 0 3px #c8f55d13}.uplink-fields small{font-size:12px;font-weight:400;color:var(--muted)}
.uplink-meter{display:flex;justify-content:space-between;gap:12px;margin-top:9px;color:var(--muted);font-size:12px;line-height:1.5}.uplink-meter output{white-space:nowrap;font-variant-numeric:tabular-nums}.uplink-track{height:3px;border-radius:3px;background:#ffffff0d;margin:9px 0 20px;overflow:hidden}.uplink-track span{display:block;width:0;height:100%;background:var(--green);transition:width .18s,background .18s}.uplink-over .uplink-meter{color:#ffaaa3}.uplink-over .uplink-track span{background:#ffaaa3}.uplink-over #uplink-message{border-color:#ffaaa3}
.uplink-send{display:flex;align-items:center;justify-content:center;gap:12px;width:100%;min-height:48px;border:0;border-radius:9px;padding:12px 16px;background:var(--green);color:var(--ink);font:700 16px/1.5 Inter,system-ui,sans-serif;cursor:pointer;transition:box-shadow .2s,transform .15s;touch-action:manipulation}.uplink-send:active:not(:disabled){transform:scale(.98);box-shadow:0 0 24px #c8f55d44}.uplink-send:disabled{opacity:.5;cursor:not-allowed}.uplink-send.is-sending svg{animation:uplink-send 1s ease-in-out infinite}.uplink-status{font-size:14px;line-height:1.5;margin:12px 0 0;overflow-wrap:anywhere;color:var(--muted)}.uplink-status:empty{display:none}.uplink-status[data-state="error"]{color:#ffaaa3}.uplink-status[data-state="success"]{color:var(--green)}.uplink-trap{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
.uplink-launch:focus-visible,.uplink-close:focus-visible,.uplink-send:focus-visible{outline:2px solid var(--cyan);outline-offset:4px}html.uplink-open{overflow:hidden}
@media(max-width:600px){.uplink-launch{right:max(16px,env(safe-area-inset-right));bottom:max(16px,env(safe-area-inset-bottom));min-height:52px;padding:13px 16px}.uplink-dialog{width:calc(100% - 24px);max-height:calc(100dvh - 24px);border-radius:16px}.uplink-surface{padding:22px 18px}.uplink-fields{gap:12px}#uplink-intro{margin-bottom:16px}}
@media(max-height:620px){.uplink-dialog{max-height:calc(100dvh - 16px)}.uplink-surface{padding:20px}.uplink-fields{gap:10px}}
@keyframes uplink-enter{from{opacity:0;transform:translateY(18px) scale(.97)}to{opacity:1;transform:none}}@keyframes uplink-exit{to{opacity:0;transform:translateY(10px) scale(.98)}}@keyframes uplink-shade{from{opacity:0}to{opacity:1}}@keyframes uplink-send{50%{transform:translate(3px,-3px)}}
@media(prefers-reduced-motion:reduce){.uplink-dialog,.uplink-dialog::backdrop,.uplink-send svg{animation:none!important}.uplink-launch,.uplink-launch svg,.uplink-track span,.uplink-send,.uplink-fields input,.uplink-fields textarea{transition:none}}
