.contact-sheet{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;align-items:start}
.sheet-item{display:block;min-width:0;outline:1px solid transparent;outline-offset:4px;transition:outline-color .18s ease}
.sheet-item:hover{outline-color:var(--accent)}
.sheet-item:focus-visible{outline:2px solid var(--accent)}
.sheet-image{display:block;width:100%;height:auto;aspect-ratio:3/2;object-fit:cover;border-radius:1px}
.artwork-sheet .contact-sheet{display:block;columns:3;column-gap:12px}
.artwork-sheet .sheet-item{break-inside:avoid;page-break-inside:avoid;margin:0 0 12px}
/* Reserve each artwork's full height before its lazy-loaded thumbnail arrives. */
.artwork-sheet .sheet-image{aspect-ratio:var(--artwork-ratio,3/2);height:auto;object-fit:contain}
@media(max-width:580px){.artwork-sheet .contact-sheet{columns:2;column-gap:10px}.artwork-sheet .sheet-item{margin-bottom:10px}}
.sheet-footer{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-top:.65rem;color:var(--muted);font-size:.875rem;min-height:28px}
.gallery-toggle,.viewer-close,.viewer-nav button{font:inherit;font-size:.875rem;color:var(--ink);border:0;background:none;padding:.5rem 0;min-height:44px;cursor:pointer;text-decoration:underline;text-underline-offset:5px;text-decoration-color:var(--line)}
.gallery-toggle:hover,.viewer-close:hover,.viewer-nav button:hover{color:var(--accent-text)}
.gallery-toggle:focus-visible,.photo-viewer button:focus-visible{outline:2px solid var(--accent);outline-offset:4px}
.gallery-empty{font-size:1rem;color:var(--muted);margin:0;padding:.6rem 0 1rem}
.photo-viewer{color:var(--ink);background:var(--page);width:min(94vw,1100px);max-width:94vw;max-height:94dvh;padding:0;border:0;overflow:auto}
.photo-viewer::backdrop{background:light-dark(#272726cc,#000c)}
.viewer-inner{padding:1rem 1.5rem}
.viewer-top,.viewer-nav{display:flex;align-items:center;justify-content:space-between;gap:1.5rem}
.viewer-count{font-size:.875rem;color:var(--muted)}
.photo-viewer figure{margin:.5rem 0 0}
.viewer-image{display:block;width:100%;height:min(65dvh,800px);object-fit:contain}
.photo-viewer figcaption{margin-top:1rem}
.viewer-title{font-size:1rem;font-weight:400;margin:0}
.viewer-caption{font-size:.9375rem;color:var(--muted);margin:.4rem 0 0}
.viewer-nav button:disabled{opacity:.35;cursor:default}
@media(max-width:580px){.contact-sheet{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.viewer-inner{padding:.6rem 1rem}.viewer-image{height:60dvh}}
@media(prefers-reduced-motion:reduce){.sheet-item{transition:none}}

.section-heading{position:relative;display:flex;align-items:center;justify-content:space-between;gap:1rem;min-height:1.5rem;margin-bottom:1rem}
.section-heading:has(.view-more){padding-right:6.5rem}
.section-heading>.view-more{position:absolute;right:0;top:50%;transform:translateY(-50%)}
.section-heading h2{margin:0}
.view-more{flex-shrink:0;font-size:.875rem;min-height:44px;display:inline-flex;align-items:center;text-decoration:underline;text-underline-offset:5px;text-decoration-color:var(--line)}
.view-more:hover{color:var(--accent-text)}
.travel-nav{display:flex;align-items:center;justify-content:space-between;gap:1rem;font-size:.875rem;color:var(--muted);border-bottom:1px solid var(--line);padding-bottom:1rem;margin-bottom:3rem}
.travel-nav a{padding:.4rem 0}
.travel-nav a:hover{color:var(--accent-text)}
.city-navigation{position:sticky;top:0;z-index:10;background:var(--page);padding:.35rem 0;margin:0 0 1.5rem}
.city-home-link{display:inline-flex;align-items:center;gap:.6rem;min-height:44px;font-size:.875rem;color:var(--muted)}
.city-home-link svg{width:18px;height:18px;flex:none}
.city-home-link:hover{color:var(--ink)}
.city-home-link:focus-visible{outline:2px solid var(--accent-text);outline-offset:4px;border-radius:2px}
:is([data-travel-page^="city-"],[data-travel-page="artwork"]){padding-top:2rem}
:is([data-travel-page^="city-"],[data-travel-page="artwork"]) .travel-intro{margin-bottom:1.75rem}
:is([data-travel-page^="city-"],[data-travel-page="artwork"]) .travel-intro p{font-size:.875rem;line-height:1.7}
:is([data-travel-page^="city-"],[data-travel-page="artwork"]) .gallery-section{margin-bottom:0}
.travel-intro{margin-bottom:2.5rem}
.travel-intro h1{font-size:1.875rem;word-spacing:normal;letter-spacing:-.055em}
.travel-intro p{color:var(--muted);margin:.85rem 0 0;max-width:34rem}
.album-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2rem;margin-bottom:4rem}
.album-cover{position:relative;padding-top:8px}
.album-cover:before{content:'';position:absolute;inset:0 10px 12px;border:1px solid var(--line);transform:rotate(-2deg);background:var(--soft);z-index:-1}
.album-cover img{display:block;width:100%;height:auto;aspect-ratio:4/3;object-fit:cover}
.album-count{position:absolute;bottom:.65rem;right:.65rem;background:var(--page);padding:.15rem .5rem;font-size:.75rem}
.album-label{display:flex;align-items:baseline;justify-content:space-between;gap:.6rem;margin-top:1rem}
.album-label h3{margin:0;font-size:1rem;font-weight:400}
.album-label span{font-size:.8125rem;text-decoration:underline;text-underline-offset:4px;text-decoration-color:var(--line);color:var(--muted)}
.album-card p{font-size:.875rem;color:var(--muted);margin:.35rem 0 0}
.album-card:hover .album-label{color:var(--accent-text)}
/* Passport stamps: overlapping rows; transforms leave the layout stable. */
.passport{border-top:0;padding-top:0}

.passport-stack{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1.8rem 0;list-style:none;margin:0;padding:.5rem .65rem .75rem;isolation:isolate}
.passport-card{position:relative;min-width:0;margin:0;padding:0;z-index:1}
.stamp-link{display:block;width:calc(100% + 14px);margin-left:-7px;transform:rotate(var(--stamp-tilt));transform-origin:50% 55%;transition:transform 220ms cubic-bezier(.2,.7,.2,1);-webkit-tap-highlight-color:transparent}
.passport-card:focus-within{z-index:10}
.stamp-link:focus-visible{transform:translateY(-5px) rotate(0) scale(1.12);outline:2px solid var(--accent);outline-offset:5px}
@media(hover:hover) and (pointer:fine){.passport-card:hover{z-index:10}.stamp-link:hover{transform:translateY(-5px) rotate(0) scale(1.12)}}
.stamp-link:active{transform:rotate(0) scale(1.02)}
.passport .city-stamp{display:block;width:100%;height:auto;overflow:visible;--stamp-paper:var(--page);--stamp-ink:var(--ink);--stamp-muted:var(--muted);--stamp-line:var(--line)}
.passport .city-stamp .lineart{fill:none;stroke:var(--stamp-accent);stroke-width:1.35;stroke-linecap:round;stroke-linejoin:round}
.passport .city-stamp .paper-fill{fill:var(--stamp-wash)}
.passport .city-stamp .fine{stroke-width:.85;opacity:.72}
.passport .city-stamp .quiet{stroke-width:1;opacity:.4}
.passport .city-stamp .mono{font-family:'Victor Mono',monospace;font-weight:400}
.passport .city-stamp .hand{font-family:Delius,system-ui,sans-serif;font-weight:400}
.city-album-empty{min-height:10rem;display:flex;align-items:center;border-top:1px solid var(--line);border-bottom:1px solid var(--line);color:var(--muted)}
.city-album-empty p{margin:0}
.album-return{margin:2rem 0 3rem}
@media(max-width:580px){.travel-nav{margin-bottom:2rem}.album-grid{gap:1.5rem}.passport-stack{display:flex;overflow-x:auto;gap:0;padding:.75rem .7rem 1rem;scroll-padding-inline:1rem;scroll-snap-type:x proximity;scrollbar-width:thin;scrollbar-color:var(--line) transparent}.passport-card{flex:0 0 180px;scroll-snap-align:start}.stamp-link{width:194px}.stamp-link:focus-visible{transform:rotate(0) scale(1.04)}}
@media(max-width:400px){.album-grid{grid-template-columns:1fr}}
@media(prefers-reduced-motion:reduce){.stamp-link{transition:none}.stamp-link:hover,.stamp-link:focus-visible,.stamp-link:active{transform:none}}

.passport h2 .passport-heading-icon{display:block;flex:0 0 1rem;width:1rem;height:1rem;color:var(--muted)}

/* Passport atlas: a quiet map paired with the original illustrated stamps. */
.passport-map{position:relative;aspect-ratio:1000/480;overflow:hidden;background:var(--page);border:1px solid var(--line);border-radius:4px;cursor:grab;touch-action:pan-y;isolation:isolate}
.passport-map.is-dragging{cursor:grabbing}
.passport-world{display:block;width:100%;height:100%;pointer-events:none}
.map-land{fill:var(--soft);stroke:var(--page);stroke-width:.7;stroke-linejoin:round}
.map-land path{vector-effect:non-scaling-stroke}
.map-dots{position:absolute;inset:0;pointer-events:none}
.map-dot{position:absolute;display:grid;place-items:center;transform:translate(-50%,-50%);width:28px;height:28px;border:0;padding:0;border-radius:50%;color:var(--city-color);background:transparent;cursor:pointer;pointer-events:auto;font:inherit;z-index:1}
.map-dot-core{display:block;width:7px;height:7px;border-radius:50%;background:currentColor;box-shadow:0 0 0 2px var(--page);transition:transform .2s ease,box-shadow .2s ease}
.map-dot.is-selected{z-index:3}
.map-dot.is-selected .map-dot-core{transform:scale(1.35);box-shadow:0 0 0 2px var(--page),0 0 0 6px color-mix(in srgb,currentColor 20%,transparent)}
.map-cluster-count{display:grid;place-items:center;min-width:27px;height:27px;border:1px solid var(--line);border-radius:50%;background:var(--page);color:var(--muted);font-family:'Victor Mono',monospace;font-size:12px;line-height:1}
.map-dot.is-selected .map-cluster-count{border-color:var(--city-color);color:var(--city-color);box-shadow:0 0 0 4px color-mix(in srgb,var(--city-color) 12%,transparent)}
.map-dot-label{position:absolute;bottom:calc(100% + 2px);left:50%;transform:translateX(-50%);opacity:0;pointer-events:none;white-space:nowrap;padding:1px 6px;border:1px solid var(--line);border-radius:3px;background:var(--page);color:var(--ink);font-size:12px;line-height:1.6;transition:opacity .15s ease}
.map-dot:hover,.map-dot:focus-visible{z-index:5;outline:2px solid var(--accent);outline-offset:1px}
.map-dot:hover .map-dot-label,.map-dot:focus-visible .map-dot-label,.map-dot.is-selected:not(.is-cluster) .map-dot-label{opacity:1}
.map-toolbar{position:absolute;top:10px;right:10px;display:flex;background:var(--page);border:1px solid var(--line);border-radius:4px;overflow:hidden}
.map-toolbar button{min-width:36px;min-height:36px;background:none;border:0;color:var(--ink);font:inherit;font-size:14px;cursor:pointer;padding:0 9px}
.map-toolbar button+button{border-left:1px solid var(--line)}
.map-toolbar button:hover{background:var(--soft)}
.map-toolbar button:disabled{opacity:.35;cursor:default}
.map-toolbar button:focus-visible,.passport-reel-controls button:focus-visible{outline:2px solid var(--accent);outline-offset:-3px}
.map-summary,.map-credit{position:absolute;bottom:8px;background:var(--page);color:var(--muted);font-size:12px;line-height:1.4;padding:1px 4px;cursor:default}
.map-summary{left:8px}.map-credit{right:8px}.map-credit a{text-decoration:underline;text-underline-offset:2px}
.passport-selection{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding:.85rem 0 .4rem;min-height:80px}
.selected-place h3{font-size:1rem;line-height:1.5;font-weight:500;margin:0}
.selected-place h3 span{font-family:Delius,sans-serif;color:var(--muted);font-weight:400}
.selected-place p{font-size:.8125rem;color:var(--muted);margin:.1rem 0 0}
.passport-reel{min-width:0}
.passport-explorer .passport-stack{display:flex;position:relative;overflow-x:auto;gap:12px;list-style:none;padding:12px 7px 18px;margin:0;scroll-padding-inline:7px;scroll-snap-type:x proximity;overscroll-behavior-x:contain;scrollbar-width:thin;scrollbar-color:var(--line) transparent;isolation:isolate}
.passport-explorer .passport-card{flex:0 0 142px;scroll-snap-align:center;margin:0;padding:0;opacity:.64;transition:opacity .2s ease}
.passport-explorer .stamp-link{width:100%;margin:0;transform:rotate(var(--stamp-tilt));transform-origin:50% 65%}
.passport-explorer .passport-card.is-selected,.passport-explorer .passport-card:hover,.passport-explorer .passport-card:focus-within{opacity:1}
.passport-explorer .passport-card.is-selected .stamp-link{transform:translateY(-4px) rotate(0)}
.passport-explorer .passport-card.is-selected::after{content:'';position:absolute;bottom:-9px;left:calc(50% - 3px);width:6px;height:6px;border-radius:50%;background:var(--city-color)}
@media(hover:hover) and (pointer:fine){.passport-explorer .stamp-link:hover{transform:translateY(-4px) rotate(0) scale(1.035)}}
.passport-explorer .stamp-link:focus-visible{transform:rotate(0);outline:2px solid var(--ink);outline-offset:3px}
.passport-reel-controls{display:flex;align-items:center;justify-content:space-between;gap:1rem;color:var(--muted);font-size:.8125rem;margin-top:.2rem}
.passport-reel-controls>div{display:flex;gap:1.25rem}
.passport-reel-controls button{font:inherit;font-size:.875rem;padding:.4rem 0;min-height:40px;background:none;border:0;color:var(--ink);cursor:pointer;text-decoration:underline;text-underline-offset:5px;text-decoration-color:var(--line)}
.passport-reel-controls button:disabled{opacity:.3;cursor:default}
@media(max-width:580px){.passport-explorer .passport-card{flex-basis:112px}.passport-explorer .passport-stack{gap:10px}.passport-selection{gap:.6rem}.selected-place h3 span{display:block}.map-toolbar{top:6px;right:6px}.map-toolbar button{min-width:32px;min-height:32px;padding:0 7px}.map-summary,.map-credit{font-size:12px;bottom:4px}}
@media(prefers-reduced-motion:reduce){.passport-explorer .stamp-link,.passport-explorer .passport-card,.map-dot-core,.map-dot-label{transition:none}}

/* Keep natural strip edges; selection scrolling clamps to the available content. */
.passport-explorer .passport-stack{padding-inline:7px;scroll-padding-inline:7px;scroll-behavior:auto;overflow-anchor:none}
.passport-explorer .passport-stack.is-centering{scroll-snap-type:none}
.passport-explorer .passport-card{opacity:.58;transition:opacity .35s ease}
.passport-explorer .stamp-link{transition:transform .55s cubic-bezier(.22,1,.36,1)}
.passport-explorer .passport-card.is-selected .stamp-link{transform:translateY(-5px) rotate(0) scale(1.045)}
.map-dot{transition:opacity .2s ease}
.map-dot-core{transition:transform .35s cubic-bezier(.22,1,.36,1),box-shadow .35s ease}
.map-dot.is-selected .map-dot-core{box-shadow:0 0 0 3px var(--page),0 0 0 8px color-mix(in srgb,currentColor 16%,transparent)}
.passport-map{user-select:none}
@media(prefers-reduced-motion:reduce){.passport-explorer .stamp-link,.passport-explorer .passport-card,.map-dot,.map-dot-core{transition:none}}

/* Artwork labels reveal like a small gallery caption. */
.artwork-sheet .sheet-item{position:relative;isolation:isolate;transition:transform .28s cubic-bezier(.22,1,.36,1)}
.artwork-sheet .sheet-item:hover{outline-color:transparent}
.artwork-caption{position:absolute;left:.55rem;bottom:.55rem;z-index:1;display:block;max-width:calc(100% - 1.1rem);padding:.6rem .75rem;background:var(--page);color:var(--ink);border:1px solid var(--line);border-radius:3px;box-shadow:0 3px 12px #0000000c;opacity:0;transform:translateY(7px);transition:opacity .2s ease,transform .28s cubic-bezier(.22,1,.36,1);pointer-events:none;overflow-wrap:anywhere;text-align:left}
.artwork-caption-title{display:block;font-family:'Victor Mono',monospace;font-size:.875rem;font-weight:500;line-height:1.45;letter-spacing:-.025em}
.artwork-caption-meta{display:block;margin-top:.25rem;font-size:.8125rem;line-height:1.45;color:var(--muted)}
@media(hover:hover) and (pointer:fine){.artwork-sheet .sheet-item:hover{transform:translateY(-5px);z-index:2}.artwork-sheet .sheet-item:hover .artwork-caption{opacity:1;transform:translateY(0)}}
.artwork-sheet .sheet-item:focus-visible{outline:2px solid var(--ink);outline-offset:4px;transform:translateY(-5px);z-index:2}
.artwork-sheet .sheet-item:focus-visible .artwork-caption{opacity:1;transform:translateY(0)}
/* Touch and mobile grids show only artwork; details remain in the opened viewer. */
@media(max-width:580px),(hover:none),(pointer:coarse){.artwork-caption{display:none}.artwork-sheet .sheet-item:focus-visible{transform:none}}
@media(prefers-reduced-motion:reduce){.artwork-sheet .sheet-item,.artwork-caption{transition:none}.artwork-sheet .sheet-item:hover,.artwork-sheet .sheet-item:focus-visible,.artwork-caption{transform:none}}
@media print{.artwork-caption{display:block;position:static;opacity:1;transform:none;box-shadow:none;margin-top:.4rem}}

/* Close geographic neighbors remain selectable without moving their coordinates. */
.map-place-choice{position:absolute;z-index:10;left:10px;top:10px;display:flex;flex-direction:column;gap:2px;max-width:calc(100% - 20px);max-height:calc(100% - 20px);overflow:auto;padding:8px;background:var(--page);border:1px solid var(--line);border-radius:4px;box-shadow:0 4px 16px #00000012;cursor:default}
.map-choice-heading{font-size:12px;color:var(--muted);padding:2px 8px 6px}
.map-place-choice button{display:block;text-align:left;border:0;border-radius:2px;background:transparent;color:var(--ink);font:inherit;font-size:14px;padding:7px 8px;min-height:36px;cursor:pointer}
.map-place-choice button:hover,.map-place-choice button[aria-current]{background:var(--soft)}
.map-place-choice button:focus-visible{outline:2px solid var(--ink);outline-offset:-2px}

/* Brief departure and arrival motion for opening a collection. */
.view-more{transition:color .18s ease,text-decoration-color .18s ease}
.view-more:hover,.view-more:focus-visible{text-decoration-color:var(--accent-text)}
@keyframes collection-arrive{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
@media(prefers-reduced-motion:no-preference){
  [data-travel-page]>.city-navigation,[data-travel-page]>#travel{animation:collection-arrive .3s cubic-bezier(.22,1,.36,1) both}
}
@media print{[data-travel-page]>.city-navigation,[data-travel-page]>#travel{animation:none}}

/* Shared photo and artwork viewer: quiet entrance, quick dismissal. */
@keyframes viewer-enter{from{opacity:0;transform:translateY(6px) scale(.985)}to{opacity:1;transform:none}}
@keyframes viewer-leave{from{opacity:1;transform:none}to{opacity:0;transform:translateY(4px) scale(.985)}}
@keyframes viewer-backdrop-enter{from{opacity:0}to{opacity:1}}
@keyframes viewer-backdrop-leave{from{opacity:1}to{opacity:0}}
@media(prefers-reduced-motion:no-preference){
  .photo-viewer[open]{animation:viewer-enter .22s cubic-bezier(.22,1,.36,1) both}
  .photo-viewer[open]::backdrop{animation:viewer-backdrop-enter .22s ease both}
  .photo-viewer[open].is-closing{animation:viewer-leave .15s ease-in both;pointer-events:none}
  .photo-viewer[open].is-closing::backdrop{animation:viewer-backdrop-leave .15s ease-in both}
}
