/* A layered, cut-corner restricted-access sign. Its finite entrance gives way
   to a slow frame breath and scan; copy and return controls stay stationary. */
.stage[data-scene="revoked"] .fallback-logo,
.stage[data-scene="revoked"] .stage-label,
.stage[data-scene="revoked"] .stage-coordinate{opacity:0!important;pointer-events:none}
.revoked{display:flex;flex-direction:column;align-items:center;padding:46px 24px 38px;overflow:auto;background:transparent}
.revoked-console{width:min(100%,650px);flex:none;margin-block:auto;text-align:center;position:relative}
.restricted-sign{position:relative;min-height:230px;isolation:isolate}
.restricted-frame{display:block;position:absolute;inset:0;width:100%;height:100%;overflow:visible;pointer-events:none}
.restricted-copy{position:relative;z-index:1;min-height:230px;padding:61px 61px 47px 80px;display:flex;flex-direction:column;justify-content:center;gap:12px}
.restricted-warning{display:flex;align-items:center;gap:11px;min-width:0}
.restricted-warning h2{position:relative;isolation:isolate;flex:1;min-width:0;margin:0;padding:6px 12px;color:#090909;font:600 clamp(21px,2.3vw,29px)/1.4 var(--sans);letter-spacing:.1em;text-wrap:balance}
.restricted-warning h2::before{content:'';position:absolute;inset:0;z-index:-1;background:#e55852;transform-origin:left;pointer-events:none}
.restricted-warning h2:focus{outline:none}
.restricted-warning h2 span{display:block}
.restricted-ban{width:35px;height:35px;flex:none;display:block;fill:#e55852;overflow:visible;transform-origin:center}
.restricted-ban path{fill:none;stroke:#090909;stroke-width:6;stroke-linecap:square}
.restricted-english{font:10px/1.8 var(--mono);letter-spacing:.32em;color:#df7770;overflow-wrap:anywhere}
.restricted-meta{position:absolute;z-index:1;top:33px;left:80px;right:61px;display:flex;justify-content:space-between;gap:12px;color:#aaaaaa;font:8px/1.6 var(--mono);letter-spacing:.12em;pointer-events:none}
.restricted-scan{position:absolute;left:12%;right:9%;top:51px;height:1px;background:linear-gradient(90deg,transparent,#f0f0f060,transparent);opacity:0;pointer-events:none}
.revoked-console>p{font-size:13px;line-height:1.9;letter-spacing:.06em;color:#b4b4b4;max-width:460px;margin:15px auto 27px;padding-inline:16px}
.revoked-actions{display:flex;justify-content:center;align-items:center;gap:12px 28px;flex-wrap:wrap;margin-bottom:17px}
.revoked .revoked-actions .primary{min-height:46px;min-width:195px;justify-content:center;background:transparent;border:1px solid #777777;color:#ededed;font-size:12px;letter-spacing:.08em;transition:background .18s,border-color .18s}
.revoked .revoked-actions .primary:hover{border-color:#dddddd;background:#1b1b1b}
.revoked .revoked-actions .primary:active{background:#282828}
.revoked-actions .back{min-height:46px;font-size:12px;color:#bcbcbc}
.revoked-actions .back:hover{color:#eeeeee}
.revoked-actions :is(a,button):focus-visible{outline:2px solid #f5f5f5;outline-offset:5px}
.revoked-record{display:flex;justify-content:center;gap:16px;flex-wrap:wrap;font:8px/1.6 var(--mono);letter-spacing:.13em;color:#999999}
.revoked-record span+span::before{content:'/';margin-right:16px;color:#656565}
.revoked.active .restricted-shell{animation:restricted-shell-enter .65s cubic-bezier(.16,1,.3,1) both}
.revoked.active .restricted-rails{animation:restricted-rail-enter .7s .05s cubic-bezier(.16,1,.3,1) both}
.revoked.active .restricted-corners{animation:restricted-details-enter .5s .25s ease both}
.revoked.active .restricted-warning h2::before{animation:restricted-bar-open .55s .27s cubic-bezier(.16,1,.3,1) both}
.revoked.active .restricted-warning h2 span{animation:restricted-text-enter .35s .48s ease both}
.revoked.active .restricted-ban{animation:restricted-ban-enter .5s .4s cubic-bezier(.16,1,.3,1) both}
.revoked.active .restricted-english{animation:restricted-text-enter .5s .6s ease both}
.revoked.active .restricted-frame{animation:restricted-frame-breathe 5.8s 1.1s ease-in-out infinite}
.revoked.active .restricted-scan{animation:restricted-scan-cycle 5.8s 1.1s linear infinite}
.page-paused .revoked.active *,
.page-paused .revoked.active *::before{animation-play-state:paused}
@keyframes restricted-shell-enter{from{opacity:.15;transform:translateX(-26px)}to{opacity:1;transform:none}}
@keyframes restricted-rail-enter{from{opacity:.15;transform:translateX(26px)}to{opacity:1;transform:none}}
@keyframes restricted-details-enter{from{opacity:0}to{opacity:1}}
@keyframes restricted-bar-open{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes restricted-text-enter{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
@keyframes restricted-ban-enter{from{opacity:0;transform:rotate(-90deg) scale(.75)}to{opacity:1;transform:none}}
@keyframes restricted-frame-breathe{0%,100%{opacity:1}50%{opacity:.72}}
@keyframes restricted-scan-cycle{0%,8%{opacity:0;transform:translateY(0)}16%{opacity:.7}48%{opacity:.25}56%,100%{opacity:0;transform:translateY(120px)}}
@media(max-width:700px){
  .revoked{padding:34px 16px 30px}
  .restricted-sign,.restricted-copy{min-height:190px}
  .restricted-copy{padding:54px 29px 39px 38px;gap:10px}
  .restricted-meta{top:28px;left:38px;right:29px;font-size:7px;letter-spacing:.07em}
  .restricted-warning{gap:7px}
  .restricted-warning h2{font-size:clamp(18px,5vw,24px);letter-spacing:.04em;padding:7px 9px}
  .restricted-ban{width:27px;height:27px}
  .restricted-english{font-size:8px;letter-spacing:.17em;line-height:1.8}
  .restricted-scan{left:12%;right:9%;top:42px}
  .revoked-console>p{font-size:13px;letter-spacing:.02em;margin:12px auto 22px;padding-inline:17px}
  .revoked-actions{flex-direction:column;gap:4px;margin-bottom:15px}
  .revoked .revoked-actions .primary{width:min(100%,270px);min-height:48px;font-size:13px}
  .revoked-record{gap:10px;font-size:7px;letter-spacing:.04em}
  .revoked-record span+span::before{margin-right:10px}
}
@media(max-height:650px) and (min-width:701px){.revoked{padding-block:28px}.restricted-sign,.restricted-copy{min-height:205px}.restricted-copy{padding-block:57px 44px}.revoked-console>p{margin-block:10px 18px}}
@media(prefers-reduced-motion:reduce){
  .revoked.active,.revoked.active *,.revoked.active *::before{animation:none!important;transition:none!important}
}

/* Reuse the existing identity card only while displaying rejected permissions.
   All seven original rows are restored before another account can sign in. */
.stage[data-revocation="checking"] .identity-card:focus{outline:none}
.stage[data-revocation="checking"] .permission-list li{transition:background .16s,border-color .16s}
.stage[data-revocation="checking"] .permission-list b{color:#888;min-width:82px}
.stage[data-revocation="checking"] .permission-list b::before{background:transparent}
.stage[data-revocation="checking"] .permission-list li[data-rejected="true"]{background:linear-gradient(90deg,transparent,#e8153d0d);border-color:#e8153d35}
.stage[data-revocation="checking"] .permission-list li[data-rejected="true"] b{color:#ff627b;transform:translateX(-5px)}
.stage[data-revocation="checking"] .permission-list li[data-rejected="true"] b::before{content:'×';background:none;border:0;width:8px;height:auto;font:14px/1 var(--mono);color:#ff627b}
.revocation-controls{display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;margin-top:16px;padding-top:8px;border-top:1px solid #ffffff15}
.revocation-controls button{background:transparent;border:0;min-height:44px;padding:8px 0;color:#d9d9dc;font-size:11px}
.revocation-controls button:last-child{color:#d9d9dc}
@media(max-width:700px){.stage[data-revocation="checking"] .permission-list b{font-size:10px;min-width:76px}.revocation-controls{margin-top:10px}.revocation-controls button{font-size:12px}}
/* Never flash the restored normal labels while leaving a rejected identity. */
.stage[data-scene="revoked"] #screen-identity,
html[data-psi-inline-auth][data-auth-state="login"] #screen-identity{visibility:hidden;transition:none}
.stage[data-revocation="checking"] .permission-list b::before{animation:none!important;box-shadow:none;border:1px solid #777;opacity:1}
/* Draw the unchanged PSI outline and fill; hold the mark through the
   original identity window while the final rejection transitions to red. */
.stage[data-revocation="checking"] .psi-line-cycle{animation-name:psi-denied-cycle!important}
.stage[data-revocation="checking"] .psi-line-solid{animation-name:psi-denied-solid!important}
.stage[data-revocation="checking"].no-canvas .fallback-logo{animation:psi-denied-fallback var(--psi-access-cycle-duration,5200ms) linear both}
@keyframes psi-denied-cycle{from{opacity:1}to{opacity:1}}
@keyframes psi-denied-solid{0%,45.652174%{opacity:0}54.347826%,100%{opacity:1}}
@keyframes psi-denied-fallback{from{opacity:.25}54.347826%,100%{opacity:1}}
@media(max-width:700px){
  .app .stage[data-revocation="checking"]{height:auto;min-height:calc(100svh - 121px)}
  .stage[data-revocation="checking"] #screen-identity{position:relative;inset:auto;display:flex;justify-content:center;padding:164px 20px 24px}
  .stage[data-revocation="checking"] .identity-card{position:relative;left:auto;top:auto;transform:none;width:min(100%,440px);margin:0}
  .stage[data-revocation="checking"] .psi-line-logo.scene-identity{top:108px!important;width:132px!important}
  .stage[data-revocation="checking"] .fallback-logo{top:108px;width:132px}
}

/* The normal card and its original curves remain neutral until each contact
   rejects. The final contact starts one smooth red vignette around the viewport edges. */
.stage[data-revocation="checking"][data-revocation-ready="false"] .permission-list li,
.stage[data-revocation="checking"][data-revocation-ready="false"] .psi-line-svg *{animation-play-state:paused!important}
.stage[data-revocation-phase="alarm"] .identity-card{border-color:#e8153d90}
.stage[data-revocation-phase="alarm"] .card-heading span:last-child,
.stage[data-revocation-phase="alarm"] .id-role,
.stage[data-revocation-phase="alarm"] .revocation-controls button:last-child{color:#ff879b}
/* The same absolute fade width applies to every edge. Lighten takes the
   stronger edge at corners without adding the two red ramps together.
   Screen blending leaves the black center completely clear. */
.revocation-alarm{--revocation-edge-width:clamp(34px,8vmin,88px);--revocation-edge-ramp:#b91738 0,#580b20 calc(var(--revocation-edge-width)*.3),#000 var(--revocation-edge-width),#000 calc(100% - var(--revocation-edge-width)),#580b20 calc(100% - var(--revocation-edge-width)*.3),#b91738 100%;position:fixed;inset:0;z-index:20;pointer-events:none;background:transparent;box-shadow:inset 0 0 0 1px #ff3f6059}
@supports (background-blend-mode:lighten) and (mix-blend-mode:screen){
  .revocation-alarm{background:linear-gradient(90deg,var(--revocation-edge-ramp)),linear-gradient(0deg,var(--revocation-edge-ramp));background-blend-mode:lighten;mix-blend-mode:screen}
}
.revocation-alarm:not([hidden]){animation:psi-page-reject var(--psi-revocation-alarm-duration,872ms) ease both}
.page-paused .revocation-alarm{animation-play-state:paused!important}
.revocation-announcement{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
@keyframes psi-page-reject{from{opacity:0}75%,100%{opacity:1}}
@media(prefers-reduced-motion:reduce){.revocation-alarm{animation:none!important}}
