@use 'sass:math';
@use '../lib/colors';
@use '../lib/layout';
@use '../lib/motion';
@use '../lib/typography';

.timeline {
	$stampSize: 4rem;
	$lineWeight: 0.2rem;
	$itemSpacing: layout.$normal-gap;

	@extend %content-gutter;
	display: flex;
	flex-direction: column;
	align-items: center;

	> .stamp {
		display: inline-block;
		flex-shrink: 0;
		width: $stampSize;
		height: $stampSize;
		z-index: 10; // To lift it above the line.
		border: $lineWeight solid colors.$gray-300;
		border-radius: 100%;
		line-height: #{$stampSize - 2 * $lineWeight};
		text-align: center;
		background-color: colors.$gray-50;
		transition:
			border-color motion.$subtle,
			background-color motion.$subtle,
			color motion.$subtle;

		&.small {
			background-color: colors.$gray-300;
		}
	}

	> .content {
		> p {
			margin-left: 0;
			margin-right: 0;
		}

		> h3:first-child {
			text-align: center;

			> time {
				display: block;
				padding-inline: layout.$small-gap;
				font-size: typography.$base-size;
				font-weight: typography.$normal-weight;
			}
		}
	}

	@media screen and (min-width: layout.$breakpoint) {
		flex-direction: row;
		align-items: flex-start;

		> .content {
			position: relative;
			flex-grow: 1;
			margin-left: layout.$normal-gap;
			margin-bottom: $itemSpacing;

			&::before {
				content: '';
				position: absolute;
				top: 0;
				right: calc(100% + #{layout.$normal-gap + math.div($stampSize, 2)});
				bottom: #{-1 * $itemSpacing};
				width: $lineWeight;
				background-color: colors.$gray-300;
				transform: translateX(50%);
				transition: background-color motion.$subtle;
			}

			> h3:first-child {
				position: relative;
				margin-top: 0;
				margin-left: layout.$large-gap;
				line-height: $stampSize;
				text-align: left;

				&::after {
					content: '';
					position: absolute;
					right: calc(100% + #{layout.$small-gap});
					top: 50%;
					width: 4rem;
					height: $lineWeight;
					background-color: colors.$gray-300;
					transform: translateY(-100%);
					transition: background-color motion.$subtle;
				}

				> time {
					display: inline-block;
					float: right;
					transition: background-color motion.$subtle;
				}
			}
		}
	}

	&:hover {
		@mixin stamp-hover($color) {
			> .stamp {
				border-color: $color;
				background-color: $color;
				color: colors.$inverse-text;
			}

			> .content {
				&::before,
				> h3:first-child::after {
					background-color: $color;
				}
			}
		}

		@include stamp-hover(colors.$blue-800);
		> .content > h3:first-child > time {
			background-color: colors.$yellow-300;
		}

		@include colors.coderdojo-theme {
			@include stamp-hover(colors.$orange-500);
			> .content > h3:first-child > time {
				background-color: colors.$orange-100;
			}
		}
	}

	&:last-child {
		margin-bottom: 0;

		> .content {
			padding-bottom: layout.$normal-gap;
		}
	}

	+ .timeline {
		margin-top: #{-1 * layout.$normal-gap};
	}
}

.gallery-preview {
	position: relative;
	display: grid;
	grid-template-columns: var(--x1, 50%) minmax(0, 1fr);
	grid-template-rows: var(--y1, 50%) minmax(0, 1fr);
	gap: layout.$tiny-gap;
	padding: layout.$tiny-gap;
	height: 27rem;
	background-color: colors.$blue-800;
	@include colors.card-shadow;

	&,
	&:any-link {
		transition: grid-template motion.$subtle;
	}

	> img {
		object-fit: cover;
		width: 100%;
		height: 100%;
	}

	&:not(.flip) > img:nth-of-type(1) {
		grid-row: 1 / span 2;
	}
	&.flip > img:nth-of-type(3) {
		grid-column: 2;
		grid-row: 1 / span 2;
	}

	&::after {
		content: '\279C';
		position: absolute;
		top: 0;
		right: 0;
		bottom: 0;
		left: 0;
		display: flex;
		justify-content: center;
		align-items: center;
		font-size: typography.$heading-size;
		background-color: #00000077;
		color: colors.$gray-50;
		opacity: 0;
		transition: opacity motion.$subtle;
	}

	&:hover {
		grid-template-columns: var(--x2, var(--x1, 50%)) minmax(0, 1fr);
		grid-template-rows: var(--y2, var(--x2, 50%)) minmax(0, 1fr);

		&::after {
			opacity: 1;
		}
	}

	&.horizontal {
		grid-template-columns: var(--a1, 33.3%) var(--b1, 33.3%) minmax(0, 1fr);
		grid-template-rows: minmax(0, 1fr);

		> img:nth-of-type(1),
		> div:nth-of-type(1) > img,
		> img:nth-of-type(3),
		> div:nth-of-type(3) > img {
			grid-column: unset;
			grid-row: unset;
		}

		&:hover {
			grid-template-columns: var(--a2, 33.3%) var(--b2, 33.3%) minmax(0, 1fr);
		}

		&.two {
			grid-template-columns: var(--a1, 50%) minmax(0, 1fr);

			&:hover {
				grid-template-columns: var(--a2, 50%) minmax(0, 1fr);
			}
		}
	}
}
