:root{--pp-paper:#f4eee2;--pp-ink:#211c17;--pp-blue:#1d3557;--pp-brass:#9a7442;--pp-graphite:#55524c;--pp-kraft:#d8c296;--pp-manila:#eadcb4;--pp-desk:#2a1f17;--pp-rule:rgba(33,28,23,.2);--pp-shadow:0 1px 1px rgba(40,28,15,.18),0 6px 14px -6px rgba(40,28,15,.35);--pp-shadow-up:0 2px 2px rgba(40,28,15,.14),0 18px 26px -10px rgba(40,28,15,.45)}.paper-grain{background-color:var(--pp-paper);background-image:url(/textures/paper.jpg);background-size:640px auto;background-blend-mode:multiply}.pencil{font-family:var(--font-hand);font-weight:500;font-size:1.45rem;line-height:1.15;color:var(--pp-graphite);margin:.6rem 0;width:-moz-fit-content;width:fit-content}.ticket{--lift:0px;--tilt:0deg;display:inline-flex;align-items:stretch;height:92px;text-decoration:none;color:var(--pp-ink);transform:translateY(var(--lift)) rotate(var(--tilt));transition:transform .35s cubic-bezier(.2,1.4,.4,1);filter:drop-shadow(0 4px 6px rgba(40,28,15,.3));outline-offset:6px}.ticket:focus-visible,.ticket:hover{--lift:-6px;--tilt:-2.5deg;filter:drop-shadow(0 12px 12px rgba(40,28,15,.32))}.ticket-main,.ticket-stub{position:relative;background:var(--pp-kraft) url(/textures/kraft.jpg) center /300px;background-blend-mode:multiply;display:flex;flex-direction:column;justify-content:center;align-items:center}.ticket-main{padding:0 22px 0 18px;-webkit-mask:radial-gradient(circle 9px at 100% 0,transparent 98%,#000) top /100% 51% no-repeat,radial-gradient(circle 9px at 100% 100%,transparent 98%,#000) bottom /100% 51% no-repeat;mask:radial-gradient(circle 9px at 100% 0,transparent 98%,#000) top /100% 51% no-repeat,radial-gradient(circle 9px at 100% 100%,transparent 98%,#000) bottom /100% 51% no-repeat}.ticket-stub{width:78px;border-left:2px dotted rgba(60,40,20,.55);-webkit-mask:radial-gradient(circle 9px at 0 0,transparent 98%,#000) top /100% 51% no-repeat,radial-gradient(circle 9px at 0 100%,transparent 98%,#000) bottom /100% 51% no-repeat;mask:radial-gradient(circle 9px at 0 0,transparent 98%,#000) top /100% 51% no-repeat,radial-gradient(circle 9px at 0 100%,transparent 98%,#000) bottom /100% 51% no-repeat;transform-origin:0 100%}.ticket-stamp{font-family:var(--font-serif);font-weight:700;font-size:1.7rem;letter-spacing:.06em;color:var(--pp-blue);border:3px solid var(--pp-blue);padding:0 12px;rotate:-5deg;opacity:.88}.ticket-host{font-size:.72rem;margin-top:6px}.ticket-admit,.ticket-host{font-family:var(--font-mono)}.ticket-admit{font-size:.62rem}.ticket-no{font-family:var(--font-serif);font-style:italic;font-size:1.4rem;color:var(--pp-blue)}.ticket.is-torn .ticket-stub{animation:tear-stub 1.1s cubic-bezier(.3,.6,.4,1) forwards}@keyframes tear-stub{0%{transform:none}18%{transform:translate(2px,1px) rotate(4deg)}40%{transform:translate(14px,8px) rotate(16deg);opacity:1}to{transform:translate(40px,90px) rotate(48deg);opacity:0}}.luggage{--swing:0deg;position:relative;display:inline-block;padding-top:26px;text-decoration:none;color:var(--pp-ink);outline-offset:6px}.luggage-string{position:absolute;left:-8px;top:-6px;width:52px;height:52px;overflow:visible}.luggage-string path{fill:none;stroke:#8a7a5c;stroke-width:2}.luggage-body{position:relative;display:flex;flex-direction:column;min-width:190px;padding:12px 18px 12px 46px;background:var(--pp-manila) url(/textures/kraft.jpg) center /260px;background-blend-mode:soft-light;-webkit-clip-path:polygon(22px 0,100% 0,100% 100%,22px 100%,0 calc(100% - 22px),0 22px);clip-path:polygon(22px 0,100% 0,100% 100%,22px 100%,0 calc(100% - 22px),0 22px);transform-origin:20px 50%;transform:rotate(var(--swing));filter:drop-shadow(0 3px 3px rgba(40,28,15,.3))}.luggage-hole{position:absolute;left:13px;top:calc(50% - 9px);width:18px;height:18px;border-radius:50%;background:radial-gradient(circle,#5c4d36 0 4px,#cdb98a 5px 9px)}.luggage-top{font-size:.68rem;color:var(--pp-graphite);border-bottom:1px solid var(--pp-rule);padding-bottom:3px}.luggage-name,.luggage-top{font-family:var(--font-mono)}.luggage-name{font-weight:600;font-size:1rem;padding-top:4px;white-space:nowrap;overflow:hidden;width:calc(var(--chars) * 1ch + 2px);border-right:2px solid transparent}.luggage.is-typing .luggage-name{animation:type-in calc(var(--chars) * 55ms) steps(var(--chars)) both,caret .6s step-end 3}@keyframes type-in{0%{width:0}to{width:calc(var(--chars) * 1ch + 2px)}}@keyframes caret{50%{border-right-color:var(--pp-ink)}}.stamp{position:relative;display:inline-flex;flex-direction:column;align-items:flex-start;gap:10px;text-decoration:none;color:var(--pp-ink);outline-offset:6px}.stamp-face{display:block;width:108px;height:128px;padding:8px;background:radial-gradient(circle at 5px 5px,transparent 3.6px,#fbf8f2 4px) -5px -5px /10px 10px;filter:drop-shadow(0 4px 5px rgba(40,28,15,.3));transition:transform .35s cubic-bezier(.2,1.4,.4,1)}.stamp-ink{display:grid;place-items:center;align-content:center;grid-gap:6px;gap:6px;height:100%;background:var(--pp-blue);color:var(--pp-paper);font-family:var(--font-serif);font-style:italic;font-size:.85rem}.stamp-face svg{width:52px;fill:none;stroke:currentColor;stroke-width:2.5}.stamp-postmark{position:absolute;left:58px;top:-10px;width:70px;height:70px;border:2px solid rgba(33,28,23,.55);border-radius:50%;display:grid;place-items:center;font-family:var(--font-mono);font-size:.6rem;color:rgba(33,28,23,.7);rotate:-12deg;transition:transform .35s ease,opacity .35s ease;opacity:0;transform:scale(1.4)}.stamp:focus-visible .stamp-face,.stamp:hover .stamp-face{transform:rotate(-3deg) translateY(-4px)}.stamp:focus-visible .stamp-postmark,.stamp:hover .stamp-postmark{opacity:1;transform:none}.stamp-addr{font-family:var(--font-mono);font-size:.78rem;border-bottom:1px solid var(--pp-blue)}.resume{display:inline-flex;flex-direction:column;width:150px;text-decoration:none;color:var(--pp-ink);perspective:600px;outline-offset:6px}.resume-flap,.resume-top{display:block;background:#fbf8f2;padding:12px 14px;height:78px;box-shadow:var(--pp-shadow)}.resume-top{-webkit-clip-path:polygon(0 0,calc(100% - 22px) 0,100% 22px,100% 100%,0 100%);clip-path:polygon(0 0,calc(100% - 22px) 0,100% 22px,100% 100%,0 100%)}.resume-flap{transform-style:preserve-3d;padding:0;transform-origin:top;transform:rotateX(-172deg);background:linear-gradient(#e9e1d1,#f6f1e7);transition:transform .6s cubic-bezier(.3,1.3,.5,1);position:relative}.resume:focus-visible .resume-flap,.resume:hover .resume-flap{transform:rotateX(0);background:#fbf8f2}.resume-back,.resume-face{position:absolute;inset:0;padding:12px 14px;backface-visibility:hidden;-webkit-backface-visibility:hidden}.resume-back{transform:rotateX(180deg);background:linear-gradient(#f6f1e7,#e9e1d1)}.resume-hint{font-family:var(--font-hand);color:var(--pp-graphite);margin-top:4px}.resume-hint,.resume-title{display:block;font-size:1.1rem}.resume-title{font-family:var(--font-serif);font-weight:600}.resume-lines{display:block;height:36px;margin-top:6px;background:repeating-linear-gradient(180deg,rgba(33,28,23,.3) 0 3px,transparent 3px 9px);width:86%}.resume-meta{position:absolute;right:12px;bottom:8px;font-family:var(--font-mono);font-size:.65rem;color:var(--pp-graphite)}.resume.is-compact{width:120px}.resume.is-compact .resume-flap,.resume.is-compact .resume-top{height:58px}.contact-row{display:flex;flex-wrap:wrap;align-items:flex-start;gap:2.4rem 3rem;margin:2.5rem 0 1rem}.taped{position:relative;margin:0;padding:10px 10px 12px;background:#fbf8f2;box-shadow:var(--pp-shadow-up)}.taped img{display:block;width:100%;height:auto}.taped figcaption{font-family:var(--font-hand);font-size:1.25rem;color:var(--pp-graphite);padding-top:6px}.tape{position:absolute;top:-12px;width:110px;height:26px;background:hsla(41,45%,71%,.72);-webkit-mask:linear-gradient(90deg,transparent 0 3px,#000 3px calc(100% - 3px),transparent 0),repeating-linear-gradient(#000 0 4px,transparent 4px 6px);mask:linear-gradient(90deg,transparent 0 3px,#000 3px calc(100% - 3px),transparent 0),repeating-linear-gradient(#000 0 4px,transparent 4px 6px);z-index:1}.tape-l{left:-14px;rotate:-28deg}.tape-r{right:-14px;rotate:26deg}:where(.ticket,.luggage,.stamp,.resume):focus-visible{outline:3px dashed var(--pp-blue);border-radius:2px}@media (prefers-reduced-motion:reduce){.resume-flap,.stamp-face,.stamp-postmark,.ticket{transition:none}.luggage.is-typing .luggage-name,.ticket.is-torn .ticket-stub{animation:none}}