ui/tutorialmodal.razor.scss
@import "Theme.scss";

// Full-screen scrim + centred dialog, matching the HUD's confirm/end modals. Scoped here so the
// component works the same wherever it's mounted (table setup or the in-game HUD).
TutorialModal {
	position: absolute;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	flex-direction: column;   // header above the panel
	align-items: center;
	justify-content: center;
	gap: 14px;
	background-color: rgba(0, 0, 0, .6);
	backdrop-filter: blur(15px);
	pointer-events: all;

	// Sit above the setup sheet / HUD content — those create stacking contexts via their transforms.
	z-index: 100;

	animation: cg-modal-fade-in .3s ease-out;

	// Title sits above the panel, left-aligned to its edge (matches the game-setup header).
	.head {
		flex-direction: column;
		align-items: flex-start;
		gap: 4px;
		width: 560px;
		max-width: 90%;
		animation: cg-modal-scale-in .3s ease-out;

		.title {
			font-family: $serif;
			font-size: 38px;
			font-weight: 700;
			color: $text;
		}
	}

	.dialog {
		flex-direction: column;
		align-items: stretch;
		gap: 16px;
		padding: 30px 34px;
		width: 560px;
		max-width: 90%;
		max-height: 70%;          // keep room above/below so a long tutorial scrolls inside the panel
		min-height: 0;            // let the scroller own the overflow rather than growing the dialog

		animation: cg-modal-scale-in .3s ease-out;
		flex-shrink: 0;           // hold the set width instead of collapsing to the text's intrinsic size

		// The scrolling region for the body copy. Pinned between the heading and the button row.
		.scroller {
			flex-grow: 1;
			width: 100%;
			min-height: 0;
			overflow-y: scroll;
			pointer-events: all;

			.tutorial-body {
				width: 100%;      // give the rich label a definite width to wrap against (else it lays out as one long line)
				font-family: $sans;
				font-size: 15px;
				line-height: 1.5em;
				color: $text-dim;
			}
		}

		.row {
			flex-direction: row;
			justify-content: center;
			margin-top: 2px;
		}
	}
}

// Rich-text <b> in the tutorial body. The label parses its text into a standalone html DOM, so styles are
// matched against the bare <b> node directly — a descendant selector (.tutorial-body b) would never hit it.
// Inline headers read as warm gold and actually bold.
b {
	font-family: $sans;
	font-weight: bold;
	color: $gold-soft;
}

@keyframes cg-modal-fade-in  { from { opacity: 0; } to { opacity: 1; } }
@keyframes cg-modal-scale-in { from { transform: scale(0.85); } to { transform: scale(1); } }