/* ==================================================================
   admin/css/portal-auth.css

   School Administrator Portal -- sign-in flow only.
   `https://www.benuestateschools.com/admin`

   SELF-CONTAINED, in the same way console.css is. It must never be
   loaded alongside main.css: both declare :root tokens under the same
   names with different values, and whichever loads second silently
   wins. One <link>, this file, nothing else.

   Relationship to the Ministry console
   ------------------------------------
   Same crest, same greens, same brass, same Cinzel. The difference is
   deliberate and structural, so that an administrator can never be in
   doubt about which door they are standing at:

     Ministry console  ->  dark plaque, crest sunk into the top edge,
                           everything centred, brass key.
     School portal     ->  white panel, crest set beside the wordmark
                           on a green crown, everything left-ranged,
                           green key.

   The emboss here is the load-bearing effect. A white card on a dark
   ground is flat by default, so the panel carries a raised top light,
   a dark under-edge, an engraved inner rule, and a long cast shadow --
   four layers doing the job one drop-shadow could not.
   ================================================================== */


/*****************************************************
 ** Design tokens                                   **
 *****************************************************/
:root
{
	--field:      #041A0F;	/* page base, deepest green-black		*/
	--bark:       #06301C;	/* showcase, low side					*/
	--moss:       #0B4E2E;	/* showcase, lit side					*/
	--leaf:       #12864B;	/* live green, crest					*/
	--leaf-hi:    #1DA65C;	/* the lit face of the sign-in key		*/
	--leaf-lo:    #063E22;	/* the struck under-edge of that key	*/

	--brass:      #C9A34E;
	--brass-hi:   #F0DA9C;
	--brass-lo:   #6E5218;

	--card:       #FFFFFF;
	--card-foot:  #F2F7F2;	/* the panel's shaded lower face		*/
	--well:       #F0F5F0;	/* the sunk floor of an input			*/

	--ink:        #0A2E1A;
	--ink-soft:   #55695E;
	--line:       #D9E5DD;

	--seal-red:   #B3202B;

	--radius:     22px;
}

*,
*::before,
*::after
{
	box-sizing: border-box;
}

html,
body
{
	min-height: 100%;
	margin: 0;
}

body
{
	font-family: "Public Sans", "Segoe UI", Arial, sans-serif;
	color: var(--ink);

	background:
		radial-gradient(ellipse at 78% 12%, rgba(18, 134, 75, 0.30) 0%, transparent 58%),
		radial-gradient(ellipse at 70% 100%, rgba(201, 163, 78, 0.14) 0%, transparent 55%),
		var(--field);
}

/* The sprite is a definitions block, not a picture. */
.sprite
{
	position: absolute;
	width: 0;
	height: 0;
	overflow: hidden;
}

.ico
{
	width: 1em;
	height: 1em;
	fill: none;
	stroke: currentColor;
	stroke-width: 1.9;
	stroke-linecap: round;
	stroke-linejoin: round;
	flex: none;
}


/*****************************************************
 ** The split                                       **
 *****************************************************/
.stage
{
	display: grid;
	grid-template-columns: 1.05fr 0.95fr;
	min-height: 100vh;
	min-height: 100svh;
}


/*****************************************************
 ** Left: the showcase                              **
 *****************************************************/
.showcase
{
	position: relative;
	display: flex;
	align-items: center;
	padding: 48px 4vw;
	overflow: hidden;

	background: linear-gradient(155deg, var(--moss) 0%, #073A22 52%, var(--bark) 100%);
	border-right: 1px solid rgba(201, 163, 78, 0.30);
}

/* The crest, blown up and sunk into the green. soft-light keeps it a
   shadow in the metal rather than a picture laid on top of it. */
.showcase::before
{
	content: "";
	position: absolute;
	inset: -10%;
	z-index: 0;

	background-image: var(--crest);
	background-repeat: no-repeat;
	background-position: 20% 62%;
	background-size: min(78vh, 78vw);

	opacity: 0.10;
	mix-blend-mode: soft-light;
	pointer-events: none;
}

.showcase::after
{
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	background: radial-gradient(ellipse at 30% 40%, transparent 30%, rgba(2, 12, 7, 0.72) 100%);
	pointer-events: none;
}

.showcase__inner
{
	position: relative;
	z-index: 1;
	width: 100%;
	max-width: 560px;
	margin-inline: auto;
}

/* Crest and heading, ranged left as one lockup.

   The font-size lives here rather than on the heading so that both
   children resolve their em against the same value: the heading sets
   itself at 1em, and the disc at 2.32em, which is exactly two lines
   of 1.16 line-height. The disc therefore stands the same height as
   the text beside it at every viewport width, with no aspect-ratio,
   no fixed pixel sizes to keep in step, and no script. */
.showcase__lockup
{
	display: flex;
	align-items: center;
	gap: 0.46em;
	margin-bottom: 18px;

	font-size: clamp(30px, 3.2vw, 44px);
}

/* Small struck disc carrying the crest, beside the heading. */
.showcase__crest
{
	flex: none;
	width: 2.32em;
	height: 2.32em;
	margin: 0;
	padding: 0.11em;
	border-radius: 50%;

	background: linear-gradient(160deg, var(--brass-hi) 0%, var(--brass) 42%, var(--brass-lo) 100%);
	box-shadow:
		inset 0 2px 2px rgba(255, 255, 255, 0.7),
		inset 0 -3px 4px rgba(0, 0, 0, 0.45),
		0 10px 20px rgba(0, 0, 0, 0.55);
}

.showcase__crest::after
{
	content: "";
	display: block;
	width: 100%;
	height: 100%;
	border-radius: 50%;

	background: #FFFFFF var(--crest) center / 86% no-repeat;
	box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.4);
}

.showcase__title
{
	margin: 0;

	font-family: Cinzel, Georgia, serif;
	font-size: 1em;
	font-weight: 700;
	line-height: 1.16;
	letter-spacing: 0.01em;
	color: #F6FCF4;

	text-shadow:
		0 -1px 1px rgba(0, 0, 0, 0.7),
		0 1px 0 rgba(255, 255, 255, 0.2);
}

.showcase__lede
{
	max-width: 44ch;
	margin: 0 0 40px;

	font-size: 16.5px;
	line-height: 1.72;
	color: #BDD6C6;
}


/*****************************************************
 ** The four scenes                                 **
 *****************************************************/
.showcase__grid
{
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 18px;
	margin-bottom: 38px;
}

.vignette
{
	margin: 0;
	padding: 10px 10px 6px;

	border-radius: 16px;
	border: 1px solid rgba(201, 163, 78, 0.26);
	background: rgba(255, 255, 255, 0.05);

	box-shadow:
		inset 0 1px 0 rgba(255, 255, 255, 0.14),
		0 10px 22px -12px rgba(0, 0, 0, 0.75);
}

.vignette__art
{
	display: block;
	width: 100%;
	height: auto;
	border-radius: 12px;
}

.vignette__cap
{
	margin-top: 8px;
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.5;
	color: #C6E0CE;
}

.showcase__foot
{
	margin: 0;
	padding-top: 20px;
	border-top: 1px solid rgba(201, 163, 78, 0.24);

	font-size: 12.5px;
	line-height: 1.7;
	color: #8FAF9C;
}


/*****************************************************
 ** Right: the gateway                              **
 *****************************************************/
.gateway
{
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 48px 5vw;
}


/*****************************************************
 ** The embossed panel                              **
 *****************************************************/
.panel
{
	width: 100%;
	max-width: 448px;

	border-radius: var(--radius);
	background: linear-gradient(180deg, var(--card) 0%, var(--card-foot) 100%);

	/* Raised top light, dark under-edge, then the cast shadow that
	   lifts the whole thing clear of the green. */
	box-shadow:
		inset 0 2px 0 rgba(255, 255, 255, 0.95),
		inset 0 -4px 0 rgba(10, 46, 26, 0.16),
		inset 0 0 0 1px rgba(255, 255, 255, 0.6),
		0 1px 0 rgba(255, 255, 255, 0.14),
		0 30px 50px -20px rgba(2, 12, 7, 0.85),
		0 70px 90px -50px rgba(0, 0, 0, 0.9);

	animation: rise 0.55s cubic-bezier(0.2, 0.8, 0.2, 1) both;
	overflow: hidden;
}


/*****************************************************
 ** Crown: green band, crest beside the wordmark    **
 *****************************************************/
.panel__crown
{
	position: relative;
	display: flex;
	align-items: center;
	gap: 15px;
	padding: 24px 30px 22px;

	background: linear-gradient(158deg, var(--leaf) 0%, #0C6238 55%, var(--moss) 100%);
	border-bottom: 3px solid var(--brass);

	box-shadow:
		inset 0 1px 0 rgba(255, 255, 255, 0.22),
		inset 0 -10px 20px rgba(0, 0, 0, 0.28);
}

.panel__mark
{
	width: 54px;
	height: 54px;
	flex: none;
	padding: 4px;
	border-radius: 50%;

	background: linear-gradient(160deg, var(--brass-hi) 0%, var(--brass) 42%, var(--brass-lo) 100%);
	box-shadow:
		inset 0 2px 2px rgba(255, 255, 255, 0.7),
		inset 0 -2px 3px rgba(0, 0, 0, 0.45),
		0 6px 12px rgba(0, 0, 0, 0.5);
}

.panel__mark::after
{
	content: "";
	display: block;
	width: 100%;
	height: 100%;
	border-radius: 50%;

	background: #FFFFFF var(--crest) center / 86% no-repeat;
	box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.35);
}

.panel__id
{
	min-width: 0;
}

.panel__eyebrow
{
	margin: 0 0 5px;

	font-size: 9.5px;
	font-weight: 700;
	letter-spacing: 0.22em;
	text-transform: uppercase;
	color: var(--brass-hi);

	text-shadow: 0 1px 0 rgba(0, 0, 0, 0.55);
}

.panel__title
{
	margin: 0;

	font-family: Cinzel, Georgia, serif;
	font-size: 22px;
	font-weight: 700;
	line-height: 1.2;
	color: #FFFFFF;

	text-shadow:
		0 -1px 1px rgba(0, 0, 0, 0.6),
		0 1px 0 rgba(255, 255, 255, 0.18);
}


/*****************************************************
 ** Body of the panel                               **
 *****************************************************/
.panel__body
{
	position: relative;
	padding: 30px 30px 26px;
}

/* Crest watermark, sitting behind the form. Kept faint enough that
   the labels never have to compete with it. */
.panel__body::before
{
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;

	background-image: var(--crest);
	background-repeat: no-repeat;
	background-position: center 58%;
	background-size: 300px;

	opacity: 0.045;
	pointer-events: none;
}

.panel__body > *
{
	position: relative;
	z-index: 1;
}


/*****************************************************
 ** Role stamp                                      **
 *****************************************************/
.role
{
	display: inline-flex;
	align-items: center;
	gap: 8px;
	margin: 0 0 24px;
	padding: 8px 15px;

	font-size: 11px;
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: #5E4712;

	border-radius: 999px;
	background: linear-gradient(180deg, #FBF0D2 0%, #F0DFAE 100%);
	box-shadow:
		inset 0 1px 0 rgba(255, 255, 255, 0.9),
		inset 0 -1px 0 rgba(110, 82, 24, 0.28),
		0 1px 0 rgba(255, 255, 255, 0.7);
}

.role .ico
{
	width: 15px;
	height: 15px;
	stroke-width: 2;
	color: #8A6A14;
}


/*****************************************************
 ** Fields, sunk into the panel                     **
 *****************************************************/
.field
{
	margin-bottom: 18px;
}

.field__label
{
	display: block;
	margin-bottom: 8px;

	font-size: 11px;
	font-weight: 700;
	letter-spacing: 0.13em;
	text-transform: uppercase;
	color: var(--ink-soft);
}

.control
{
	position: relative;
}

.control__icon
{
	position: absolute;
	top: 50%;
	left: 15px;
	transform: translateY(-50%);

	width: 19px;
	height: 19px;
	color: var(--leaf);
	pointer-events: none;
	transition: color 0.18s ease;
}

.control__input
{
	width: 100%;
	padding: 15px 16px 15px 45px;

	font-family: inherit;
	font-size: 15.5px;
	font-weight: 500;
	color: var(--ink);

	border: 1px solid var(--line);
	border-radius: 13px;
	background: linear-gradient(180deg, var(--well) 0%, #FAFCFA 100%);

	box-shadow:
		inset 0 3px 5px rgba(10, 46, 26, 0.14),
		inset 0 -1px 0 rgba(255, 255, 255, 0.9),
		0 1px 0 rgba(255, 255, 255, 0.85);

	transition: box-shadow 0.18s ease, border-color 0.18s ease;
	-webkit-appearance: none;
	appearance: none;
}

/* Room for the reveal control on the right. */
.control__input--pw
{
	padding-right: 50px;
}

.control__input::placeholder
{
	color: #9AAFA2;
}

.control__input:focus
{
	outline: none;
	border-color: var(--leaf);

	box-shadow:
		inset 0 3px 5px rgba(10, 46, 26, 0.12),
		inset 0 -1px 0 rgba(255, 255, 255, 0.9),
		0 0 0 3px rgba(18, 134, 75, 0.22);
}

.control:focus-within .control__icon
{
	color: var(--leaf-lo);
}

/* Chrome's autofill wash would repaint the well pale blue. */
.control__input:-webkit-autofill,
.control__input:-webkit-autofill:hover,
.control__input:-webkit-autofill:focus
{
	-webkit-text-fill-color: var(--ink);
	-webkit-box-shadow: inset 0 0 0 60px #F4F9F4, inset 0 3px 5px rgba(10, 46, 26, 0.14);
	caret-color: var(--ink);
}


/*****************************************************
 ** Reveal / hide the password                      **
 *****************************************************/
.reveal
{
	position: absolute;
	top: 50%;
	right: 8px;
	transform: translateY(-50%);

	display: flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 34px;
	padding: 0;

	color: var(--ink-soft);
	background: none;
	border: 0;
	border-radius: 9px;
	cursor: pointer;
	transition: color 0.15s ease, background-color 0.15s ease;
}

.reveal:hover
{
	color: var(--leaf);
	background: rgba(18, 134, 75, 0.09);
}

.reveal:focus-visible
{
	outline: 2px solid var(--leaf);
	outline-offset: 1px;
}

.reveal .ico
{
	width: 19px;
	height: 19px;
}

/* One of the two eyes shows at a time. Swapped by the button's own
   aria-pressed state, so the markup carries the truth and the CSS
   only reacts to it. */
.reveal .reveal__shut,
.reveal[aria-pressed="true"] .reveal__eye
{
	display: none;
}

.reveal[aria-pressed="true"] .reveal__shut
{
	display: block;
}


/*****************************************************
 ** Forgot password                                 **
 *****************************************************/
.aux
{
	margin: 0 0 24px;
	text-align: right;
}

.aux__link
{
	font-size: 13.5px;
	font-weight: 600;
	color: var(--leaf);
	text-decoration: none;
	border-bottom: 1px solid rgba(18, 134, 75, 0.4);
	padding-bottom: 2px;
}

.aux__link:hover
{
	color: var(--leaf-lo);
	border-bottom-color: var(--leaf-lo);
}

.aux__link:focus-visible
{
	outline: 2px solid var(--leaf);
	outline-offset: 3px;
	border-radius: 3px;
}

/* Centred beneath the key on the recovery page, where it is the way
   back rather than a side door off the form. */
.aux--centre
{
	margin: 22px 0 0;
	text-align: center;
}

.aux--centre .aux__link
{
	display: inline-flex;
	align-items: center;
	gap: 7px;
}

.aux__icon
{
	width: 15px;
	height: 15px;
	stroke-width: 2.1;
}


/*****************************************************
 ** Explanatory copy                                **
 **                                                 **
 ** The recovery page has to explain itself before  **
 ** it asks for anything, and has to do it without  **
 ** shouting over the field labels.                 **
 *****************************************************/
.hint
{
	margin: 0 0 22px;

	font-size: 13.5px;
	line-height: 1.68;
	color: var(--ink-soft);
}

.hint strong
{
	font-weight: 600;
	color: var(--ink);
}

/* The second note, sitting between the field and the key. Set into
   the panel with a brass edge so it reads as a standing condition
   rather than another instruction. */
.hint--note
{
	margin-bottom: 24px;
	padding: 12px 14px;

	font-size: 13px;

	border-radius: 10px;
	border-left: 3px solid var(--brass);
	background: #F6F2E7;

	box-shadow: inset 0 1px 2px rgba(110, 82, 24, 0.12);
}


/*****************************************************
 ** The six-digit code box                          **
 **                                                 **
 ** Spaced out so a code read off a phone can be    **
 ** checked digit by digit without losing your      **
 ** place, and tabular so the box does not twitch   **
 ** as the digits go in.                            **
 *****************************************************/
.control__input--code
{
	padding-left: 16px;

	font-family: Consolas, "SF Mono", Monaco, monospace;
	font-size: 27px;
	font-weight: 600;
	font-variant-numeric: tabular-nums;
	letter-spacing: 0.4em;
	text-indent: 0.4em;
	text-align: center;
}

.control__input--code::placeholder
{
	color: #C3D3C8;
	letter-spacing: 0.4em;
}


/*****************************************************
 ** Secondary actions under the code box            **
 **                                                 **
 ** Rendered as forms so each one carries its own   **
 ** CSRF token, but they have to read as plain      **
 ** links -- nobody should mistake "Send a new      **
 ** code" for the thing that finishes the sign-in.  **
 *****************************************************/
.actions
{
	display: flex;
	flex-wrap: wrap;
	gap: 4px 22px;
	justify-content: center;
	margin-top: 18px;
}

.inline-form
{
	margin: 0;
}

.linkbtn
{
	appearance: none;
	-webkit-appearance: none;
	background: none;
	border: 0;
	padding: 5px 0;

	font: inherit;
	font-size: 13.5px;
	font-weight: 600;
	color: var(--leaf);
	text-decoration: underline;
	text-underline-offset: 3px;
	cursor: pointer;
}

.linkbtn:hover
{
	color: var(--leaf-lo);
}

.linkbtn:focus-visible
{
	outline: 2px solid var(--leaf);
	outline-offset: 3px;
	border-radius: 3px;
}

.linkbtn[disabled]
{
	color: #9AAFA2;
	text-decoration: none;
	cursor: not-allowed;
}

/* The way out, rather than a way on. */
.linkbtn--quiet
{
	color: var(--ink-soft);
	font-weight: 500;
}

.linkbtn--quiet:hover
{
	color: var(--ink);
}


/*****************************************************
 ** Password rules on the reset page                **
 **                                                 **
 ** Stated before the boxes, not after a rejection. **
 ** A rule you are told about afterwards reads as a **
 ** telling-off.                                    **
 *****************************************************/
.pw-rules
{
	list-style: none;
	margin: 0 0 22px;
	padding: 14px 16px;

	border: 1px solid var(--line);
	border-radius: 11px;
	background: #F7FAF7;

	font-size: 13px;
	line-height: 1.95;
	color: var(--ink-soft);

	box-shadow: inset 0 1px 2px rgba(10, 46, 26, 0.05);
}

.pw-rules li::before
{
	content: "\2014";
	margin-right: 9px;
	color: var(--leaf);
}


/*****************************************************
 ** The struck green key                            **
 *****************************************************/
.signin
{
	position: relative;
	width: 100%;
	min-height: 58px;
	padding: 17px 20px;

	display: flex;
	align-items: center;
	justify-content: center;
	gap: 12px;

	font-family: Cinzel, Georgia, serif;
	font-size: 15px;
	font-weight: 700;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: #FFFFFF;

	border: 0;
	border-radius: 14px;
	cursor: pointer;

	background: linear-gradient(180deg, var(--leaf-hi) 0%, var(--leaf) 48%, #0A6437 100%);

	box-shadow:
		inset 0 1px 0 rgba(255, 255, 255, 0.42),
		inset 0 -2px 0 rgba(0, 0, 0, 0.24),
		0 6px 0 var(--leaf-lo),
		0 16px 24px rgba(2, 12, 7, 0.42);

	text-shadow: 0 1px 1px rgba(0, 0, 0, 0.35);
	transition: transform 0.09s ease, box-shadow 0.09s ease, filter 0.18s ease;
}

.signin:hover
{
	filter: brightness(1.07);
}

.signin:active
{
	transform: translateY(5px);

	box-shadow:
		inset 0 2px 6px rgba(0, 0, 0, 0.35),
		inset 0 -1px 0 rgba(255, 255, 255, 0.18),
		0 1px 0 var(--leaf-lo),
		0 6px 10px rgba(2, 12, 7, 0.4);
}

.signin:focus-visible
{
	outline: 3px solid var(--brass);
	outline-offset: 3px;
}

.signin__icon
{
	width: 19px;
	height: 19px;
}

.signin__wait,
.signin__spin
{
	display: none;
}

.signin__spin
{
	width: 19px;
	height: 19px;
	border-radius: 50%;
	border: 2.4px solid rgba(255, 255, 255, 0.35);
	border-top-color: #FFFFFF;
	flex: none;
}

/* Held down while the credentials are checked. The key stays struck
   in, so the state reads as "pressed and working" rather than
   "disabled". */
.signin.is-busy
{
	cursor: progress;
	transform: translateY(5px);

	box-shadow:
		inset 0 2px 6px rgba(0, 0, 0, 0.35),
		inset 0 -1px 0 rgba(255, 255, 255, 0.18),
		0 1px 0 var(--leaf-lo),
		0 6px 10px rgba(2, 12, 7, 0.4);
}

.signin.is-busy .signin__icon,
.signin.is-busy .signin__label
{
	display: none;
}

.signin.is-busy .signin__wait
{
	display: inline;
}

.signin.is-busy .signin__spin
{
	display: block;
	animation: turn 0.7s linear infinite;
}


/*****************************************************
 ** Panel footing                                   **
 *****************************************************/
.colophon
{
	margin-top: 26px;
	padding-top: 18px;
	border-top: 1px solid var(--line);
	box-shadow: 0 -1px 0 rgba(255, 255, 255, 0.9);

	font-size: 12px;
	line-height: 1.75;
	color: var(--ink-soft);
}

.colophon__mark
{
	display: flex;
	align-items: center;
	gap: 7px;
	margin-bottom: 5px;

	font-size: 10px;
	font-weight: 700;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--leaf);
}

.colophon__mark .ico
{
	width: 14px;
	height: 14px;
	stroke-width: 2.1;
}


/*****************************************************
 ** Notice slot (wired up when the server side      **
 ** lands; the markup is not emitted yet)           **
 *****************************************************/
.notice
{
	margin: 0 0 22px;
	padding: 13px 15px;

	font-size: 13.5px;
	line-height: 1.55;

	border-radius: 11px;
	border: 1px solid rgba(179, 32, 43, 0.35);
	background: #FDEEEF;
	color: #7E1620;

	box-shadow: inset 0 2px 4px rgba(179, 32, 43, 0.12);
}

.notice--ok
{
	border-color: rgba(18, 134, 75, 0.35);
	background: #EDF7F0;
	color: #0A5A31;
	box-shadow: inset 0 2px 4px rgba(18, 134, 75, 0.1);
}

.notice--info
{
	border-color: rgba(201, 163, 78, 0.45);
	background: #FDF6E6;
	color: #6E5218;
	box-shadow: inset 0 2px 4px rgba(201, 163, 78, 0.14);
}


@keyframes rise
{
	from
	{
		opacity: 0;
		transform: translateY(16px) scale(0.99);
	}
}

@keyframes turn
{
	to
	{
		transform: rotate(360deg);
	}
}


/*****************************************************
 ** Narrower desktops                               **
 *****************************************************/
@media (max-width: 1180px)
{
	.showcase__grid
	{
		gap: 14px;
	}

	.showcase__lede
	{
		margin-bottom: 32px;
	}
}


/*****************************************************
 ** Phones and small tablets                        **
 **                                                 **
 ** The showcase goes. Nobody signs in on a phone   **
 ** to look at pictures, and the scenes would push  **
 ** the panel a screen and a half down the page.    **
 *****************************************************/
@media (max-width: 960px)
{
	.stage
	{
		grid-template-columns: 1fr;
	}

	.showcase
	{
		display: none;
	}

	.gateway
	{
		padding: 32px 20px;
		min-height: 100vh;
		min-height: 100svh;
	}

	.panel
	{
		max-width: 470px;
	}
}

@media (max-width: 420px)
{
	.panel__crown
	{
		gap: 12px;
		padding: 20px 22px 18px;
	}

	.panel__mark
	{
		width: 46px;
		height: 46px;
	}

	.panel__title
	{
		font-size: 19px;
	}

	.panel__body
	{
		padding: 24px 22px 22px;
	}

	.signin
	{
		letter-spacing: 0.13em;
		font-size: 14px;
	}
}


@media (prefers-reduced-motion: reduce)
{
	*
	{
		animation-duration: 0.01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.01ms !important;
	}

	/* The spinner is the one exception: it is the only thing telling
	   the administrator that the sign-in is still running. */
	.signin.is-busy .signin__spin
	{
		animation: turn 1.4s linear infinite !important;
	}
}
