easteregg/cluepanel.razor.scss
// Clue — text or an image on a wall, drawn into the world by WorldPanel.
//
// ⚠️ NO BACKGROUND ON THE ROOT. A clue is meant to look like writing ON the surface it
// was placed against; a panel with its own plate would read as a floating sign and
// defeat the point of mounting it flush to a wall.

.clue {
	width: 100%;
	height: 100%;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	padding: 4px;

	.img {
		width: 100%;
		height: 100%;
		background-size: contain;
		background-repeat: no-repeat;
		background-position: center;
	}

	// ⚠️ THE ROOT MUST NOT CLIP. `PanelSizeFor` sizes the board from glyph metrics, which
	// are an estimate — a font that renders a touch wider than assumed would have the last
	// character cut off, and a clue with a missing letter is worse than one that overhangs
	// its board by a pixel. The board has no background, so overhang is invisible anyway.
	overflow: visible;

	.txt {
		// ⚠️ Outlined rather than shadowed. A clue can land on a wall of any colour and
		// the mapper cannot preview every angle; an outline keeps it readable on both a
		// white tile and a black one, which a drop shadow does not.
		text-stroke: 2px rgba( 0, 0, 0, 0.85 );
		text-align: center;
		// ⛔ `pre`, NOT `pre-wrap`. With pre-wrap the text WRAPS at the board's width, and
		// the board's HEIGHT was computed for the line count the author wrote — so a width
		// estimate a few percent short turned one line into two and the second was cropped.
		// `pre` honours authored newlines and never wraps on its own, which takes the width
		// estimate out of the correctness path entirely: a board slightly too narrow now
		// overhangs invisibly instead of losing a line.
		white-space: pre;

		// ⚠️ A flex child shrinks to fit by default, which would re-introduce the wrap this
		// is avoiding.
		flex-shrink: 0;
		font-weight: 600;
		font-family: Consolas, monospace;
	}
}