/* Outer wrapper owns the shadow; the inner surface owns the true cutout. */
.ticket-shell{--ticket-shadow:drop-shadow(0 2px 5px #183c4014) drop-shadow(0 12px 22px #183c4010);--ticket-shadow-hover:drop-shadow(0 3px 6px #183c4018) drop-shadow(0 15px 24px #183c4016);filter:var(--ticket-shadow);min-width:0;transition:filter 220ms ease}
.ticket-cutout{--ticket-notch:36px;--ticket-axis:y;position:relative}
.ticket-horizontal{--ticket-axis:x}
.ticket-stub{min-width:0;background:linear-gradient(180deg,#f7f8f1 0%,#f0f3e8 100%)}
@supports (mask-composite:intersect) or (-webkit-mask-composite:source-in){
 .ticket-cutout[data-ticket-axis="y"]{-webkit-mask-image:radial-gradient(circle calc(var(--ticket-notch) / 2) at 0 var(--ticket-y),transparent 98%,#000 100%),radial-gradient(circle calc(var(--ticket-notch) / 2) at 100% var(--ticket-y),transparent 98%,#000 100%);mask-image:radial-gradient(circle calc(var(--ticket-notch) / 2) at 0 var(--ticket-y),transparent 98%,#000 100%),radial-gradient(circle calc(var(--ticket-notch) / 2) at 100% var(--ticket-y),transparent 98%,#000 100%);-webkit-mask-composite:source-in;mask-composite:intersect}
 .ticket-cutout[data-ticket-axis="x"]{-webkit-mask-image:radial-gradient(circle calc(var(--ticket-notch) / 2) at var(--ticket-x) 0,transparent 98%,#000 100%),radial-gradient(circle calc(var(--ticket-notch) / 2) at var(--ticket-x) 100%,transparent 98%,#000 100%);mask-image:radial-gradient(circle calc(var(--ticket-notch) / 2) at var(--ticket-x) 0,transparent 98%,#000 100%),radial-gradient(circle calc(var(--ticket-notch) / 2) at var(--ticket-x) 100%,transparent 98%,#000 100%);-webkit-mask-composite:source-in;mask-composite:intersect}
}
[data-ticket-shape] [data-ticket-seam]::before,[data-ticket-shape] [data-ticket-seam]::after{display:none!important}
@media(max-width:760px){.ticket-horizontal{--ticket-axis:y}}
@media(forced-colors:active){.ticket-cutout{-webkit-mask:none!important;mask:none!important;outline:1px solid CanvasText}.ticket-shell{filter:none}}

/* Match the homepage perforation: 3px marks, 6px gaps, with room for the cutouts.
   These overlays draw only the seam; the card mask owns the missing paper. */
[data-ticket-shape] :is(.mission-controls,.proposal-footer,.recovery-ticket-footer,.showcase-card-footer)[data-ticket-seam]{position:relative}
[data-ticket-shape] :is(.mission-controls,.proposal-footer,.recovery-ticket-footer,.showcase-card-footer)[data-ticket-seam]::before{content:"";display:block!important;position:absolute;inset:0 29px auto;width:auto;height:1px;border:0;border-radius:0;background:repeating-linear-gradient(90deg,#b6c2b4 0 3px,transparent 3px 9px);pointer-events:none}
[data-ticket-shape][data-ticket-axis="x"] :is(.proposal-footer,.recovery-ticket-footer,.showcase-card-footer)[data-ticket-seam]::before{inset:29px auto 29px 0;width:1px;height:auto;background:repeating-linear-gradient(180deg,#b6c2b4 0 3px,transparent 3px 9px)}

@media(hover:hover) and (pointer:fine){.ticket-shell:hover{filter:var(--ticket-shadow-hover)}}
@media(prefers-reduced-motion:reduce){.ticket-shell{transition:none}}
@media(forced-colors:active){.ticket-shell,.ticket-shell:hover{filter:none}}
