<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://wikisp.org/wiki/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3AMainpage%2Fground.css</id>
	<title>Módulo:Mainpage/ground.css - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://wikisp.org/wiki/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3AMainpage%2Fground.css"/>
	<link rel="alternate" type="text/html" href="https://wikisp.org/wiki/index.php?title=M%C3%B3dulo:Mainpage/ground.css&amp;action=history"/>
	<updated>2026-09-14T06:04:57Z</updated>
	<subtitle>Historial de revisiones de esta página en la wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wikisp.org/wiki/index.php?title=M%C3%B3dulo:Mainpage/ground.css&amp;diff=8129&amp;oldid=prev</id>
		<title>scw&gt;Alistar Bot: Comment states the mechanism rather than the bug it was found through (via update-page on MediaWiki MCP Server)</title>
		<link rel="alternate" type="text/html" href="https://wikisp.org/wiki/index.php?title=M%C3%B3dulo:Mainpage/ground.css&amp;diff=8129&amp;oldid=prev"/>
		<updated>2026-08-26T19:59:43Z</updated>

		<summary type="html">&lt;p&gt;Comment states the mechanism rather than the bug it was found through (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* Main page ground -- HUD graduation tapes down the two outer margins, with a&lt;br /&gt;
   dot grid in the band outside each of them.&lt;br /&gt;
&lt;br /&gt;
   The tape is the divider. Inside it: the content column and clean ground,&lt;br /&gt;
   with nothing running under the cards or through the gutters between them.&lt;br /&gt;
   Outside it: the dot lattice, ending exactly where the tape begins.&lt;br /&gt;
&lt;br /&gt;
   Kept page-local rather than put in MediaWiki:Citizen.css so none of it&lt;br /&gt;
   rides along with every other page on the wiki. A position: fixed layer&lt;br /&gt;
   inside the parser output still covers the whole viewport; the only thing&lt;br /&gt;
   it cannot reach is the opaque 56px header rail, which nothing here paints.&lt;br /&gt;
&lt;br /&gt;
   No -webkit-mask-* on purpose: the sanitizer rejects -webkit-mask-size&lt;br /&gt;
   outright, and Citizen uses the unprefixed properties throughout.&lt;br /&gt;
&lt;br /&gt;
   ONE SET OF NUMBERS drives the whole file, and they are all measured from&lt;br /&gt;
   the content column&amp;#039;s centre:&lt;br /&gt;
&lt;br /&gt;
       540   half the 1080 measure&lt;br /&gt;
      + 32   the gap the tape keeps off the column&lt;br /&gt;
      + 16   the major tick, which is also the tape&amp;#039;s width&lt;br /&gt;
      = 588  the tape&amp;#039;s outer edge, and where the dot band stops&lt;br /&gt;
&lt;br /&gt;
   The tape is viewport-anchored and the band is not, so only the tape carries&lt;br /&gt;
   the 28px rail correction (588 - 28 = 560 on the left, 572 + 28 = 600 on the&lt;br /&gt;
   right). Change the gap or the tick length and every figure below moves. */&lt;br /&gt;
&lt;br /&gt;
/* The bands hang off this, and TemplateStyles prefixes every selector with&lt;br /&gt;
   .mw-parser-output, so that box is unreachable -- hence a wrapper of our own. */&lt;br /&gt;
.home-page {&lt;br /&gt;
	position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.home-sky {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	inset: 0;&lt;br /&gt;
	z-index: -2;&lt;br /&gt;
	pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* One band down each outer margin, from the window edge to the tape. No rail&lt;br /&gt;
   correction here, unlike the tape: this element spans the content area, so&lt;br /&gt;
   its own 50% already IS the column centre. The band is 24px at 1280, 104px&lt;br /&gt;
   at 1440 and 344px at 1920.&lt;br /&gt;
&lt;br /&gt;
   A dot only exists where two axes cross and a gradient cannot place a mark&lt;br /&gt;
   at an intersection, so this is the one pattern that needs a tile. Used as a&lt;br /&gt;
   mask, so the colour stays on a token and one file serves both themes. A&lt;br /&gt;
   data: URI is fatal to the sanitizer written plainly and survives intact on&lt;br /&gt;
   a custom property. */&lt;br /&gt;
.home-sky::before,&lt;br /&gt;
.home-sky::after {&lt;br /&gt;
	--home-dot: url( &amp;quot;data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgc2hhcGUtcmVuZGVyaW5nPSJjcmlzcEVkZ2VzIj48cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIi8+PC9zdmc+&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	content: &amp;quot;&amp;quot;;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	inset-block: 0;&lt;br /&gt;
	inline-size: calc( 50% - 588px );&lt;br /&gt;
	background-color: light-dark( rgba( 12, 24, 36, 0.148 ), rgba( 214, 233, 245, 0.212 ) );&lt;br /&gt;
	mask-image: var( --home-dot );&lt;br /&gt;
	mask-size: 16px 16px;&lt;br /&gt;
	mask-repeat: repeat;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each band is phase-locked to the tape rather than to the window, because&lt;br /&gt;
   the tape is the edge the eye actually reads the lattice against and the&lt;br /&gt;
   band&amp;#039;s width changes with the viewport. The dot sits at the centre of its&lt;br /&gt;
   16px tile, so aligning the left band right and the right band left leaves&lt;br /&gt;
   it the same 8px off the tape on both sides from a single tile. Whatever&lt;br /&gt;
   partial cell is left over falls at the window edge, where nothing lines up&lt;br /&gt;
   against it. */&lt;br /&gt;
.home-sky::before {&lt;br /&gt;
	left: 0;&lt;br /&gt;
	mask-position: right top;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.home-sky::after {&lt;br /&gt;
	right: 0;&lt;br /&gt;
	mask-position: left top;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fixed on purpose: an instrument does not scroll with the view outside it,&lt;br /&gt;
   so the tape holds still while the dots move past with the page. A fixed&lt;br /&gt;
   layer is also rastered once and reused by the compositor -- the opposite of&lt;br /&gt;
   background-attachment: fixed, which re-rasters on every scroll. */&lt;br /&gt;
.home-tape {&lt;br /&gt;
	--home-minor: light-dark( rgba( 12, 24, 36, 0.064 ), rgba( 214, 233, 245, 0.092 ) );&lt;br /&gt;
	--home-major: light-dark( rgba( 12, 24, 36, 0.102 ), rgba( 214, 233, 245, 0.147 ) );&lt;br /&gt;
&lt;br /&gt;
	position: fixed;&lt;br /&gt;
	inset: 0;&lt;br /&gt;
	z-index: -1;&lt;br /&gt;
	pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Each tape is its own positioned box rather than a background layer placed&lt;br /&gt;
   with a percentage, and that is a correctness requirement, not tidying.&lt;br /&gt;
&lt;br /&gt;
   background-position percentages resolve against (container - image), so two&lt;br /&gt;
   layers of different widths sharing one calc() do NOT line up: each is offset&lt;br /&gt;
   by half its own excess, which reads as the graduations being centred on each&lt;br /&gt;
   other instead of aligned to a common edge. An element&amp;#039;s own `left` has no&lt;br /&gt;
   such subtraction, so anchoring the box and then aligning the backgrounds to&lt;br /&gt;
   its edge with keywords (left / right, which are 0% and 100% and so exact at&lt;br /&gt;
   any image width) puts every tick on the same line.&lt;br /&gt;
&lt;br /&gt;
   The box is exactly one major tick wide, so the major fills it and the minor&lt;br /&gt;
   sits inside it. The left tape grows rightwards from its edge and the right&lt;br /&gt;
   tape leftwards, so both sets of graduations point at the content. */&lt;br /&gt;
.home-tape::before,&lt;br /&gt;
.home-tape::after {&lt;br /&gt;
	content: &amp;quot;&amp;quot;;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	inset-block: 0;&lt;br /&gt;
	inline-size: 16px;&lt;br /&gt;
	background-image:&lt;br /&gt;
		repeating-linear-gradient( to bottom, var( --home-minor ), var( --home-minor ) 1px, transparent 1px, transparent 12px ),&lt;br /&gt;
		repeating-linear-gradient( to bottom, var( --home-major ), var( --home-major ) 1px, transparent 1px, transparent 60px );&lt;br /&gt;
	background-size: 8px 100%, 16px 100%;&lt;br /&gt;
	background-repeat: repeat-y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.home-tape::before {&lt;br /&gt;
	left: calc( 50% - 560px );&lt;br /&gt;
	background-position: left top, left top;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.home-tape::after {&lt;br /&gt;
	left: calc( 50% + 600px );&lt;br /&gt;
	background-position: right top, right top;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Cut off below 1280, not below the 1200 where the column stops holding its&lt;br /&gt;
   full measure, because the tape runs out of room first. At 1232 its outer&lt;br /&gt;
   edge reaches the 56px rail and the band computes to zero; below that the&lt;br /&gt;
   tape would sit behind the rail and the band width would go negative. 1280&lt;br /&gt;
   is the last width where either still reads as anything -- 24px of band and&lt;br /&gt;
   24px of clearance -- so it has to stay visible.&lt;br /&gt;
&lt;br /&gt;
   Hence 1279.98 and not 1280: `max-width: 1280px` also matches AT 1280 and&lt;br /&gt;
   would hide the width this is trying to keep. The fraction rather than 1279&lt;br /&gt;
   is so a viewport landing between the two integers, which zoom and fractional&lt;br /&gt;
   device pixels both produce, does not fall through the gap. */&lt;br /&gt;
@media ( max-width: 1279.98px ) {&lt;br /&gt;
	.home-tape,&lt;br /&gt;
	.home-sky {&lt;br /&gt;
		display: none;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>scw&gt;Alistar Bot</name></author>
	</entry>
</feed>