@import 'mediawiki.skin.variables.less';

.mw-highlight-lines pre,
/* Increase specificty over mobile selectors */
.content .mw-highlight-lines pre {
	span[ id ] {
		// Include context when following permalinks to individual lines of code.
		// Example: https://example.org/wiki/MediaWiki:Common.js#L-10
		// Instead of scrolling down until the selected line hits the top edge at 0,
		// go a bit further until the selected line is at 20% from the top.
		scroll-margin-top: 20vh;
	}

	.mw-content-ltr& {
		/* @noflip */
		padding-left: 3.5em;
		/* @noflip */
		box-shadow: inset 2.75em 0 0 @background-color-neutral;

		.hll {
			/* @noflip */
			margin-left: -3.5em;
			/* @noflip */
			padding-left: 3.5em;
		}
	}

	/* stylelint-disable-next-line no-descending-specificity */
	.mw-content-rtl& {
		/* @noflip */
		padding-right: 3.5em;
		/* @noflip */
		box-shadow: inset -2.75em 0 0 @background-color-neutral;

		/* stylelint-disable-next-line no-descending-specificity */
		.hll {
			/* @noflip */
			margin-right: -3.5em;
			/* @noflip */
			padding-right: 3.5em;
		}
	}
}

.mw-highlight {
	unicode-bidi: embed;

	div& {
		// Position absolutely positioned elements relative to this container.
		position: relative;
		// Create a block formatting context so that the code block's background and
		// absolutely positioned elements inside it (line numbers, copy button)
		// do not overlap floated elements outside of it (e.g. image thumbnails, infoboxes).
		// See T126010, T272853, T40932#10211022.
		display: flow-root;
		// Move the margin from the nested pre, as the block formatting context prevents margin collapsing
		margin: 1em 0;
	}

	pre {
		margin: 0;
		/* Use a more commonly found tab size of 4 (e.g. as used in CodeEditor)
		instead of the browser-default value of 8 */
		-moz-tab-size: 4;
		tab-size: 4;
	}

	/* Avoid displaying double borders for nested 'code' elements.
	   Before we started using the 'code' tag for inline code snippets,
	   <code><syntaxhighlight enclose=none ...>...</syntaxhighlight></code>
	   was a common pattern. Continue supporting it in existing content. */
	code code& {
		background-color: transparent;
		color: inherit;
		border: 0;
		padding: 0;
	}

	/*
	 * Don't show a red border around syntax errors. This behavior may be useful
	 * in code editors, but it is not useful in a wiki environment, especially
	 * given the longstanding habit of using an existing, mostly-compatible lexer
	 * to highlight a language for which no lexer exists.
	 */
	.err {
		border: 0;
	}

	/* Highlight background of whole lines, not just text in them */
	.hll {
		display: block;
	}

	.linenos {
		position: absolute;
		box-sizing: border-box;
		width: 2.75em;
		background: none;
		color: @color-placeholder;
		white-space: pre;

		.mw-content-ltr& {
			/* @noflip */
			left: 0;
			/* @noflip */
			text-align: right;
			/* @noflip */
			margin-right: 4px;
		}

		.mw-content-rtl& {
			/* @noflip */
			right: 0;
			/* @noflip */
			text-align: left;
			/* @noflip */
			margin-left: 4px;
		}

		&::before {
			content: attr( data-line );
		}
	}

	a:hover .linenos,
	.hll a .linenos {
		color: @color-base--hover;
	}
}
