/* ZBPLUGZ — zbplugz.uk
   Amber Prism: the zlatko.hu theme, ported whole. Same palette, same faceted
   tessellation, same fixed banner-strip + masthead lockup, same h1 rule-bars,
   same square amber controls, same two-step give-way at 960px.

   Three things that were ZBPLUGZ's own and are now gone, so nobody puts them
   back by accident:
     · the mono typeface — this theme labels everything in Arial, and hierarchy
       comes from scale, letterspacing and case, not from a second family;
     · the green (#AFDD5B) and the magenta reagent — there is ONE hue here.
       "Released" and "in development" are the far ends of the amber ramp
       (filled and hot vs dashed and dim), not two different colours;
     · the millimetre grid and the giant logo wash — the facet tessellation on
       <body> is this theme's only texture, and two textures fight.

   The logo art is still the green PNG on disk. It is never drawn as an <img>
   here: every appearance of the zb and the plugz is an element MASKED by the
   PNG's alpha and filled with amber, so the recolour is exact, keeps every
   antialiased edge, and is one custom property away from being undone. */

:root {
	--ink:       #1a1510;   /* page */
	--ink-2:     #231a0e;   /* the lighter middle of the masthead gradient */
	--panel:     #1d1710;   /* dropdowns, and anything laid over the page */

	--amber:     #d4870a;   /* the hue. everything below is this, moved */
	--amber-hi:  #f2b84b;   /* hover, focus, live */
	--amber-lit: #e4b860;   /* headings and control labels */
	--link:      #c87d00;

	--bone:      #d4c89a;   /* body text */
	--bone-2:    #b8a882;   /* secondary */
	--bone-3:    #8e825f;   /* captions, descriptions */

	--hair:      rgba(212,135,10,0.14);   /* list rules */
	--edge:      rgba(212,135,10,0.38);   /* control borders */
	--edge-hot:  rgba(212,135,10,0.75);   /* armed control borders */
	--wash:      rgba(212,135,10,0.10);   /* control fill */
	--wash-2:    rgba(212,135,10,0.22);   /* control fill, hover */
	--wash-3:    rgba(212,135,10,0.28);   /* control fill, armed */

	/* the culture dish in the banner strip. It is laid over the gap logo.svg
	   leaves at 49,94 — change one and you must change the other. */
	--dish:      112px;
	--dish-x:    49px;
	--dish-y:    94px;

	/* the mark glyph, recoloured out of the green source art by masking */
	--glyph:     var(--amber-hi);
}

* { box-sizing: border-box; }

[hidden] { display: none !important; }

html { scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }

body {
	background-color: var(--ink);
	/* triangular facet tessellation */
	background-image:
		linear-gradient(60deg,  rgba(212,135,10,0.07) 25%, transparent 25%, transparent 75%, rgba(212,135,10,0.07) 75%),
		linear-gradient(-60deg, rgba(212,135,10,0.07) 25%, transparent 25%, transparent 75%, rgba(212,135,10,0.07) 75%),
		linear-gradient(60deg,  rgba(212,135,10,0.04) 25%, transparent 25%, transparent 75%, rgba(212,135,10,0.04) 75%),
		linear-gradient(-60deg, rgba(212,135,10,0.04) 25%, transparent 25%, transparent 75%, rgba(212,135,10,0.04) 75%);
	background-size: 80px 138px, 80px 138px, 40px 69px, 40px 69px;
	background-position: 0 0, 0 0, 40px 69px, 40px 69px;
	background-attachment: fixed;
	font-family: "Avenir Next", "Avenir", "Trebuchet MS", "Segoe UI", sans-serif;
	font-size: 10.5pt;
	color: var(--bone);
	margin: 235px 0 100px;
}

a {
	color: var(--link);
	text-decoration: none;
}
a:hover {
	color: var(--amber-hi);
	text-decoration: none;
}

img { max-width: 100%; }

h1 {
	background: rgba(212,135,10,0.13);
	border-left: 3px solid var(--edge-hot);
	width: 100%;
	font-size: 10.5pt;
	font-weight: normal;
	padding: 4px 4px 4px 8px;
	letter-spacing: 1.8px;
	text-transform: uppercase;
	color: var(--amber-lit);
}

/* the count that rides along in a heading — a section's rule-bar, the register
   frame's title, or one of the group headings inside it */
.h1n {
	color: var(--bone-3);
	letter-spacing: 1.2px;
}

#main {
	margin-left: 282px;
	margin-right: 100px;
}

/* Anchors are in-page here, unlike zlatko.hu where every nav target is its own
   file. The masthead is FIXED, so a jump would otherwise land the h1 underneath
   it; this is the height of that header plus a little air. */
#main section, #main .key, #main .hit, #main .plugz > li { scroll-margin-top: 250px; }

/* ---------- the banner strip ---------- */

#logo {
	position: absolute;
	top: 0px;
	left: 0px;
	width: 210px;
	height: 560px;
	overflow: hidden;
	background: url("logo.svg") no-repeat 0 0;
	background-size: 210px 560px;
	z-index: 25;
}
html * > #logo { position: fixed; }

/* ---------- the culture dish: the zb, with the plugz swarming it ----------
   The one thing this site keeps that zlatko.hu has no equivalent of, because it
   IS the ZBPLUGZ mark. It sits in the gap the banner leaves for it. The flies
   orbit out past the ring, so nothing around it may clip. */

.culture {
	position: absolute;
	left: var(--dish-x);
	top: var(--dish-y);
	width: var(--dish);
	height: var(--dish);
	display: block;
	z-index: 4;
	overflow: visible;
}
.culture::before {           /* the dish */
	content: "";
	position: absolute;
	inset: 0;
	border-radius: 50%;
	border: 1px solid var(--edge);
	background: radial-gradient(circle at 42% 36%,
	            rgba(212,135,10,0.16), rgba(212,135,10,0.04) 55%, transparent 72%);
}

/* zb.png and plugz.png are green artwork with the glyph in the alpha channel.
   Masked rather than drawn, so what lands on the page is amber with the art's
   own antialiasing intact — a hue-rotate or a "remove black" key would fringe. */
.culture-zb {
	position: absolute;
	left: 50%;
	top: 50%;
	width: 44%;
	height: calc(44% * 171 / 180);          /* zb.png is 180x171 */
	transform: translate(-50%, -50%);
	z-index: 2;
	background-color: var(--glyph);
	background-image: url("assets/zb.png");
	background-repeat: no-repeat;
	background-position: center;
	background-size: contain;
	-webkit-mask-image: url("assets/zb.png");
	-webkit-mask-repeat: no-repeat;
	-webkit-mask-position: center;
	-webkit-mask-size: contain;
	mask-image: url("assets/zb.png");
	mask-repeat: no-repeat;
	mask-position: center;
	mask-size: contain;
	filter: drop-shadow(0 0 9px rgba(212,135,10,0.55));
}

/* app.js sets width, height and transform per fly; the transform self-centres,
   so the sprite needs no margin correction whatever size it is given. */
.fly {
	position: absolute;
	top: 50%;
	left: 50%;
	z-index: 3;
	will-change: transform;
	pointer-events: none;
	background-color: var(--amber);
	background-image: url("assets/plugz.png");
	background-repeat: no-repeat;
	background-position: center;
	background-size: contain;
	-webkit-mask-image: url("assets/plugz.png");
	-webkit-mask-repeat: no-repeat;
	-webkit-mask-position: center;
	-webkit-mask-size: contain;
	mask-image: url("assets/plugz.png");
	mask-repeat: no-repeat;
	mask-position: center;
	mask-size: contain;
	filter: drop-shadow(0 0 4px rgba(212,135,10,0.6));
}

/* ---------- the masthead ---------- */

#head {
	color: var(--bone);
	position: absolute;
	top: 0px;
	left: 210px;
	/* right rather than width:100% — with width the box runs 210px past the
	   viewport, which puts the tail of the gradient and of the nav off-screen */
	right: 0;
	height: 230px;
	border-bottom: 1px solid rgba(212,135,10,0.45);
	box-shadow: 0 2px 24px rgba(212,135,10,0.18);
	/* visible so the nav dropdowns are not clipped by the header box */
	overflow: visible;
	z-index: 20;
	/* layered: ambient glow + main dark gradient */
	background:
		linear-gradient(160deg, rgba(212,135,10,0.28) 0%, rgba(212,135,10,0.06) 28%, transparent 55%),
		linear-gradient(to right, #1a1510 0%, #231a0e 38%, #1a1510 100%);
}
html * > #head { position: fixed; }

/* thin light-ray shafts */
#head::before {
	content: '';
	position: absolute;
	inset: 0;
	background:
		linear-gradient(158deg, rgba(242,184,75,0.20) 0%, transparent 14%),
		linear-gradient(164deg, rgba(242,184,75,0.10) 0%, transparent 18%),
		linear-gradient(149deg, rgba(242,184,75,0.06) 0%, transparent 24%);
	pointer-events: none;
}

/* glowing bottom hairline sweep */
#head::after {
	content: '';
	position: absolute;
	bottom: 0; left: 0;
	width: 55%; height: 2px;
	background: linear-gradient(to right, rgba(242,184,75,0.7), transparent);
	pointer-events: none;
}

/* the one line of type in the masthead's upper half, where zlatko.hu leaves the
   rays to do the talking — a shop has to say what it sells above the fold */
#headline {
	position: absolute;
	top: 92px;
	left: 82px;
	right: 24px;
	z-index: 2;
	margin: 0;
	font-size: 9pt;
	letter-spacing: 3.4px;
	text-transform: uppercase;
	color: var(--amber-lit);
	text-shadow: 0 0 18px rgba(212,135,10,0.5), 1px 1px 3px rgba(0,0,0,0.9);
}
#headline .sep { color: rgba(212,135,10,0.55); padding: 0 4px; }

#navbar {
	position: absolute;
	top: 175px;
	left: 80px;
	/* a definite width instead of shrink-to-fit: if the tabs ever do outgrow the
	   bar they wrap and stay clickable rather than running off the edge of a
	   fixed header nothing can scroll */
	right: 16px;
	font-size: 19pt;
	color: var(--bone);
	text-shadow: 0 0 22px rgba(212,135,10,0.65), 1px 1px 4px rgba(0,0,0,0.9);
}
html * > #navbar { top: 157px; }

#head a { color: #c0a870; }
#head a:hover {
	color: var(--amber-hi);
	text-decoration: none;
}

/* ---------- primary navigation with dropdowns ---------- */

#nav, #nav ul {
	list-style: none;
	margin: 0;
	padding: 0;
}

#nav {
	display: flex;
	/* Keep the navigation as one stable row. The masthead may become narrower,
	   but the menu itself should not reflow into a different arrangement. */
	flex-wrap: nowrap;
	align-items: baseline;
	gap: 10px;
	white-space: nowrap;
}

#nav > li {
	position: relative;
	display: flex;
	align-items: baseline;
}

/* the old " | " separators, now drawn by CSS */
#nav > li + li::before {
	content: none;
}

#nav > li > a {
	white-space: nowrap;
	display: inline-flex;
	align-items: center;
	padding: 9px 14px;
	border-radius: 999px;
	border: 1px solid rgba(212,135,10,0.28);
	background: linear-gradient(to bottom, rgba(212,135,10,0.14), rgba(212,135,10,0.06));
	box-shadow: 0 0 0 1px rgba(0,0,0,0.12) inset, 0 8px 18px rgba(0,0,0,0.18);
	color: var(--amber-lit);
	letter-spacing: 2px;
	text-transform: uppercase;
}
#nav > li > a:hover,
#nav > li > a:focus-visible {
	background: linear-gradient(to bottom, rgba(242,184,75,0.20), rgba(212,135,10,0.11));
	border-color: rgba(242,184,75,0.55);
}

/* caret button that opens a submenu — kept narrow so the tabs still fit on one
   line, with an invisible 30px hit area for touch */
.sub-toggle {
	position: relative;
	font: inherit;
	font-size: 10pt;
	line-height: 1;
	background: rgba(212,135,10,0.10);
	border: 1px solid rgba(212,135,10,0.24);
	border-radius: 999px;
	margin: 0;
	padding: 5px 8px;
	color: rgba(192,168,112,0.88);
	cursor: pointer;
	text-shadow: none;
	box-shadow: 0 8px 18px rgba(0,0,0,0.14);
}
.sub-toggle::after {
	content: "";
	position: absolute;
	top: 50%;
	left: 50%;
	width: 30px;
	height: 30px;
	transform: translate(-50%, -50%);
}
.sub-toggle:hover,
#nav > li[data-open] > .sub-toggle {
	color: var(--amber-hi);
	background: rgba(212,135,10,0.18);
	border-color: rgba(242,184,75,0.55);
}
.sub-toggle:focus-visible,
#nav a:focus-visible {
	outline: 1px dotted var(--amber-hi);
	outline-offset: 3px;
}
.sub-caret {
	display: inline-block;
	transition: transform 0.15s ease;
}
#nav > li[data-open] > .sub-toggle .sub-caret { transform: rotate(180deg); }

/* ---------- the dropdown panel ---------- */

#nav .sub {
	display: none;
	position: absolute;
	top: 100%;
	left: -10px;
	min-width: 230px;
	margin-top: 12px;
	padding: 8px 0;
	background: linear-gradient(to bottom, rgba(29,23,16,0.98), rgba(22,18,13,0.96));
	border: 1px solid rgba(212,135,10,0.30);
	border-radius: 14px;
	box-shadow: 0 18px 40px rgba(0,0,0,0.72), 0 0 26px rgba(212,135,10,0.12);
	backdrop-filter: blur(8px);
	font-size: 9.5pt;
	letter-spacing: 1.2px;
	text-transform: uppercase;
	text-shadow: none;
	z-index: 50;
	/* the catalogue menus are as long as the catalogue — 27 effects will not fit
	   on any screen, so they scroll inside the panel like the compact bar's do */
	max-height: 62vh;
	overflow-y: auto;
	-webkit-overflow-scrolling: touch;
}

/* invisible bridge so the pointer can cross the gap without closing */
#nav .sub::before {
	content: "";
	position: absolute;
	top: -12px;
	left: 0;
	right: 0;
	height: 12px;
}

#nav > li[data-open] > .sub { display: block; }

/* no-JS fallback: hover and keyboard focus alone open the menu */
html:not(.js) #nav > li:hover > .sub,
html:not(.js) #nav > li:focus-within > .sub { display: block; }
html:not(.js) .sub-toggle { cursor: default; }

#nav .sub li { display: block; }

#nav .sub a {
	display: block;
	padding: 9px 15px;
	color: var(--bone-2);
	text-decoration: none;
}
#nav .sub a:hover,
#nav .sub a:focus {
	background: rgba(212,135,10,0.15);
	color: var(--amber-hi);
}
#nav .sub a.ittvagyunk { text-shadow: none; }
#nav .sub .ext { color: rgba(192,168,112,0.6); }

/* the catalogue menus carry the plugin's category alongside its name */
#nav .sub .subcat {
	float: right;
	margin-left: 12px;
	color: rgba(192,168,112,0.5);
	font-size: 8.5pt;
}

@media (prefers-reduced-motion: reduce) {
	.sub-caret { transition: none; }
}

/* ---------- the narrow-viewport bar ---------- */

/* Up to two menus — the section, then the place inside it — that app.js builds
   from the markup already present in the page. Hidden until the masthead gives
   way to it in the phone block at the end of this file.

   The section menu is only built when the masthead has more than one tab, which
   it usually does not: with one tab its panel would hold one entry, so app.js
   drops it and the place menu takes the whole bar. Nothing here needs to know
   which case it is — both menus are .navmob-menu and they share the width.

   They are not <select>s: a native picker hands the list to the OS, which draws
   it in its own colours and loses the marks, the rules and the arrows on the
   links out. These are buttons over a panel of real links, dropped full width
   under the bar and dressed like the desktop dropdowns. */

#navmob {
	display: none;
	position: sticky;
	top: 0;
	z-index: 60;
	align-items: stretch;
	gap: 8px;
	padding: 8px 10px;
	border-bottom: 1px solid rgba(212,135,10,0.45);
	background: linear-gradient(to right, rgba(26,21,16,0.96) 0%, rgba(36,27,15,0.96) 45%, rgba(26,21,16,0.96) 100%);
	box-shadow: 0 2px 18px rgba(0,0,0,0.55);
}

/* the masthead's glowing hairline, kept so the bar reads as the same object */
#navmob::after {
	content: '';
	position: absolute;
	bottom: 0; left: 0;
	width: 55%; height: 2px;
	background: linear-gradient(to right, rgba(242,184,75,0.7), transparent);
	pointer-events: none;
}

/* the dish again, at 36px and without the swarm — six flies at this size are a
   smudge, and a phone should not pay for an animation it cannot read */
#navmob .navmob-mark {
	flex: 0 0 auto;
	position: relative;
	width: 36px;
	height: 36px;
	align-self: center;
}
#navmob .navmob-mark .culture {
	position: absolute;
	left: 0;
	top: 0;
	width: 36px;
	height: 36px;
}

/* flex-basis 0 rather than auto, so the two menus split what the mark leaves
   evenly instead of being sized by whichever label happens to be longer */
#navmob .navmob-menu {
	flex: 1 1 0;
	min-width: 0;
}

.navmob-btn {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 6px;
	width: 100%;
	height: 100%;
	font-family: inherit;
	font-size: 10.5pt;
	line-height: 1.2;
	letter-spacing: 1.2px;
	text-transform: uppercase;
	text-align: left;
	color: var(--amber-lit);
	background: linear-gradient(to bottom, rgba(212,135,10,0.14), rgba(212,135,10,0.06));
	border: 1px solid rgba(212,135,10,0.26);
	border-radius: 999px;
	padding: 10px 12px;
	cursor: pointer;
	box-shadow: 0 8px 18px rgba(0,0,0,0.18);
}
.navmob-lbl {
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
.navmob-caret {
	flex: 0 0 auto;
	font-size: 8pt;
	color: rgba(192,168,112,0.8);
	transition: transform 0.15s ease;
}
.navmob-menu[data-open] .navmob-btn {
	background: linear-gradient(to bottom, rgba(242,184,75,0.22), rgba(212,135,10,0.12));
	border-color: rgba(242,184,75,0.55);
	color: var(--amber-hi);
}
.navmob-menu[data-open] .navmob-caret {
	transform: rotate(180deg);
	color: var(--amber-hi);
}
.navmob-btn:focus-visible,
.navmob-list a:focus-visible {
	outline: 1px dotted var(--amber-hi);
	outline-offset: -3px;
}

/* the panel: full width of the bar, so neither menu can collide with an edge */
.navmob-list {
	display: none;
	position: absolute;
	top: 100%;
	left: 0;
	right: 0;
	z-index: 61;
	margin: 0;
	padding: 6px 0;
	list-style: none;
	background: linear-gradient(to bottom, rgba(29,23,16,0.98), rgba(22,18,13,0.96));
	border: 1px solid rgba(212,135,10,0.30);
	border-radius: 14px;
	box-shadow: 0 14px 34px rgba(0,0,0,0.8), 0 0 22px rgba(212,135,10,0.10);
	max-height: 72vh;
	overflow-y: auto;
	-webkit-overflow-scrolling: touch;
}
.navmob-menu[data-open] .navmob-list {
	display: block;
	animation: navmob-drop 0.16s ease-out;
}
@keyframes navmob-drop {
	from { opacity: 0; transform: translateY(-7px); }
	to   { opacity: 1; transform: none; }
}

.navmob-list li { line-height: inherit; }

.navmob-list a {
	display: block;
	position: relative;
	padding: 10px 14px 10px 32px;
	font-size: 10.5pt;
	letter-spacing: 1.2px;
	text-transform: uppercase;
	color: var(--bone-2);
	border-bottom: 1px solid rgba(212,135,10,0.12);
}
.navmob-list li:last-child a { border-bottom: none; }

/* the banner's diamond accent, one per row; filled on the section you are in */
.navmob-list a::before {
	content: '';
	position: absolute;
	left: 13px;
	top: 50%;
	width: 5px;
	height: 5px;
	margin-top: -4px;
	border: 1px solid var(--edge);
	transform: rotate(45deg);
}
.navmob-list a:hover,
.navmob-list a:focus {
	background: rgba(212,135,10,0.15);
	color: var(--amber-hi);
}
.navmob-list a.ittvagyunk::before {
	background: var(--amber);
	border-color: var(--amber);
}
.navmob-list .ext { color: rgba(192,168,112,0.6); }
.navmob-list .subcat { float: right; color: rgba(192,168,112,0.5); font-size: 8.5pt; }

@media (prefers-reduced-motion: reduce) {
	.navmob-caret { transition: none; }
	.navmob-menu[data-open] .navmob-list { animation: none; }
}

/* ---------- how the layout gives way as the window narrows ----------

   Same two steps, held at the same single threshold, as zlatko.hu — see the long
   note in its theme.css. The tab row is the shorter of the two here by a long way
   now that index.html writes no tabs of its own (ONE tab, compressors, and at most
   one per group after that), so it is the 282px content indent that runs out
   first, exactly as it does there.

   960px          the strip goes — the masthead takes the full width and the mark
                  comes back above the tabs as logo-h.svg, the same design laid on
                  its side — and #navmob takes over the navigation (last block in
                  this file).

   The last block UNPINS the lockup rather than building it, so the lockup must
   already exist at the width where #navmob takes over. Keep the two equal, and
   never let the second exceed the first. */

@media (max-width: 960px) {
	body { margin-top: 132px; }

	/* the tall strip becomes the horizontal lockup, laid over the masthead */
	#logo, html * > #logo {
		position: fixed;
		top: 14px;
		left: 24px;
		width: 210px;
		height: 60px;
		z-index: 25;
		background: url("logo-h.svg") no-repeat 0 0;
		background-size: 210px 60px;
	}

	/* the dish moves to the gap the horizontal lockup leaves at 4,4 */
	#logo .culture {
		left: 4px;
		top: 4px;
		width: 52px;
		height: 52px;
	}

	#head, html * > #head {
		left: 0;
		height: 64px;
	}
	#logo, html * > #logo { display: none; }

	/* kept hidden at narrow widths so the menu can sit at the top */
	#headline {
		display: none;
		top: 56px;
		left: 24px;
		right: 12px;
		font-size: 8pt;
		letter-spacing: 2.2px;
	}

	#navbar, html * > #navbar {
		left: 24px;
		right: 12px;
		top: 14px;
	}

	#main {
		margin-left: 24px;
		margin-right: 40px;
		/* non-binding now this block starts at 960px, but it is what keeps the
		   measure sane if the threshold is ever moved back up */
		max-width: 940px;
	}
}

/* ---------- milk bar beta redesign ---------- */
:root {
	--ink: #14251f;
	--ink-2: #1d382e;
	--panel: #183229;
	--amber: #d9ff62;
	--amber-hi: #f2ffb0;
	--amber-lit: #ecf6d2;
	--link: #d9ff62;
	--bone: #e7efd9;
	--bone-2: #b8cbb2;
	--bone-3: #789782;
	--hair: rgba(217,255,98,.16);
	--edge: rgba(217,255,98,.4);
	--edge-hot: rgba(217,255,98,.9);
	--wash: rgba(217,255,98,.11);
	--wash-2: rgba(217,255,98,.2);
	--wash-3: rgba(217,255,98,.28);
}

body {
	background-color: var(--ink);
	background-image: radial-gradient(circle at 77% 14%, rgba(217,255,98,.14), transparent 25%), linear-gradient(135deg, rgba(255,255,255,.025) 25%, transparent 25%, transparent 75%, rgba(255,255,255,.025) 75%);
	background-size: auto, 56px 56px;
	font-family: "Avenir Next", "Avenir", "Trebuchet MS", sans-serif;
	margin-bottom: 80px;
}

#head { background: linear-gradient(110deg, #14251f, #294c3b 55%, #14251f); border-bottom-color: rgba(217,255,98,.5); box-shadow: 0 2px 28px rgba(0,0,0,.35); }
#headline { color: var(--amber); font-weight: 700; }
#head::before { background: linear-gradient(150deg, rgba(217,255,98,.2), transparent 35%); }
#head::after { background: linear-gradient(to right, var(--amber), transparent); }
#logo { filter: saturate(.65) hue-rotate(60deg); }

#main { margin-right: 8vw; }
.milk-hero {
	position: relative;
	min-height: 480px;
	display: grid;
	grid-template-columns: minmax(300px, .9fr) minmax(360px, 1.1fr);
	align-items: center;
	gap: 3vw;
	margin: 0 0 28px;
	padding: 52px 5vw 50px 42px;
	overflow: visible;
	border: 1px solid rgba(217,255,98,.38);
	background: linear-gradient(110deg, rgba(42,79,61,.85), rgba(19,38,31,.55));
	box-shadow: 0 22px 60px rgba(0,0,0,.22);
}
.milk-hero::after { content: ""; position: absolute; width: 360px; height: 360px; right: 12%; top: -210px; border-radius: 50%; border: 1px solid rgba(217,255,98,.22); box-shadow: 0 0 0 20px rgba(217,255,98,.035), 0 0 0 42px rgba(217,255,98,.025); }
.hero-copy { position: relative; z-index: 3; max-width: 500px; }
.eyebrow { padding: 0; margin: 0 0 18px; text-align: left; color: var(--amber); font-size: 9pt; font-weight: 700; letter-spacing: 3px; }
.status-dot { display: inline-block; width: 8px; height: 8px; margin-right: 7px; border-radius: 50%; background: var(--amber); box-shadow: 0 0 12px var(--amber); }
.milk-hero h1 { width: auto; margin: 0; padding: 0; border: 0; background: none; color: var(--bone); font-size: clamp(40px, 6vw, 82px); line-height: .88; letter-spacing: -3px; font-weight: 800; text-transform: lowercase; }
.milk-hero h1 em { color: var(--amber); font-style: normal; }
.hero-lede { max-width: 42ch; margin: 25px 0 20px; padding: 0; color: var(--bone-2); font-size: 13pt; line-height: 1.55; text-align: left; }
.hero-stamp { display: inline-block; margin: 6px 12px 0 0; padding: 9px 11px; border: 1px solid var(--amber); color: var(--amber); font-size: 8pt; letter-spacing: 1.5px; line-height: 1.2; transform: rotate(-3deg); }
.hero-stamp strong { color: var(--bone); font-size: 12pt; }
.hero-cta { display: inline-flex; align-items: center; gap: 14px; padding: 14px 18px; border: 1px solid var(--amber); border-radius: 999px; background: var(--amber); color: var(--ink); font-weight: 800; letter-spacing: 1px; text-transform: uppercase; }
.hero-cta:hover { background: var(--amber-hi); color: var(--ink); transform: translateY(-2px); }
.hero-cta span { font-size: 16pt; line-height: 0; }

.milk-art { position: relative; z-index: 8; height: 380px; min-width: 340px; }
.canister { position: absolute; right: 16%; bottom: 42px; width: 190px; height: 240px; border-radius: 25px 25px 36px 36px; transform: rotate(-17deg); background: linear-gradient(100deg, #dce7ce 0%, #f7fbe7 35%, #b9c9aa 64%, #718b74 100%); box-shadow: inset -16px 0 18px rgba(30,69,48,.2), 12px 25px 28px rgba(0,0,0,.3); }
.can-lid { position: absolute; left: -5px; top: -18px; width: 200px; height: 38px; border-radius: 50%; background: linear-gradient(#f7fbe7, #aabda1); border: 3px solid #79917a; box-shadow: inset 0 5px 0 rgba(255,255,255,.7); }
.can-label { position: absolute; top: 68px; left: 22px; width: 146px; padding: 13px 0 11px; border-top: 2px solid var(--ink); border-bottom: 2px solid var(--ink); color: var(--ink); font-size: 42px; font-weight: 900; letter-spacing: -5px; line-height: .75; text-align: center; transform: rotate(1deg); }
.can-label small { display: block; margin-top: 10px; font-size: 9px; letter-spacing: 2px; }
.can-shine { position: absolute; left: 26px; top: 14px; width: 14px; height: 180px; border-radius: 50%; background: rgba(255,255,255,.43); filter: blur(5px); }
.milk-stream { position: absolute; right: 18%; top: 3px; width: 48px; height: 180px; border-radius: 50%; background: linear-gradient(90deg, #b9d6bf, #fbfff1 45%, #bad2bb); transform: rotate(16deg); box-shadow: 0 0 20px rgba(239,255,222,.3); }
.milk-splash { position: absolute; right: 5%; bottom: 30px; width: 320px; height: 95px; border-radius: 50%; background: radial-gradient(ellipse, #f8ffec 0 32%, rgba(225,248,216,.65) 33% 46%, transparent 47%); transform: rotate(-7deg); filter: blur(.4px); }
.splash-b { right: 19%; bottom: 2px; width: 230px; height: 60px; opacity: .55; }
.milk-drop { position: absolute; width: 19px; height: 34px; border-radius: 50% 50% 55% 55%; background: #f5ffe9; }
.drop-a { right: 7%; top: 160px; transform: rotate(20deg); }.drop-b { right: 1%; top: 206px; width: 11px; height: 20px; transform: rotate(22deg); }
.hero-cow { position: absolute; z-index: 10; left: -38%; bottom: -55px; font-size: clamp(220px, 31vw, 460px); line-height: .8; opacity: .44; filter: drop-shadow(0 22px 10px rgba(0,0,0,.28)); transform: rotate(-4deg); pointer-events: none; }
.moo-cloud { position: absolute; z-index: 6; left: 8%; top: 34px; padding: 10px 18px 12px; border: 2px solid var(--amber); border-radius: 50%; background: var(--bone); color: var(--ink); font-size: 19px; font-weight: 900; letter-spacing: 1px; transform: rotate(-8deg); box-shadow: 5px 8px 0 rgba(0,0,0,.18); }
.moo-tail { position: absolute; left: 18px; bottom: -13px; width: 18px; height: 18px; border-left: 2px solid var(--amber); border-bottom: 2px solid var(--amber); background: var(--bone); transform: skew(-28deg) rotate(-28deg); }
.hero-fly { position: absolute; z-index: 7; display: grid; place-items: center; width: 22px; height: 22px; color: var(--amber-hi); font-size: 15px; font-weight: 900; text-shadow: 0 0 8px rgba(242,184,75,.7); will-change: transform; pointer-events: none; }
.hero-fly::after { content: ""; position: absolute; width: 4px; height: 4px; border-radius: 50%; background: var(--ink); box-shadow: -5px 1px 0 rgba(212,200,154,.75), 5px 1px 0 rgba(212,200,154,.75); }
.fly-cow-a { left: 10%; top: 25%; }.fly-cow-b { left: 18%; top: 32%; }.fly-cow-c { left: 25%; top: 40%; }.fly-cow-d { left: 4%; top: 46%; }.fly-cow-e { left: 14%; top: 53%; }.fly-cow-f { left: 28%; top: 58%; }.fly-cow-g { left: 9%; bottom: 18%; }.fly-cow-h { left: 22%; bottom: 25%; }.fly-cow-i { left: 35%; top: 27%; }
.fly-can-a { right: 18%; top: 11%; }.fly-can-b { right: 24%; top: 16%; }.fly-can-c { right: 12%; top: 23%; }.fly-can-d { right: 5%; top: 30%; }.fly-can-e { right: 30%; top: 31%; }.fly-can-f { right: 18%; top: 38%; }.fly-can-g { right: 36%; bottom: 16%; }.fly-can-h { right: 16%; bottom: 12%; }.fly-can-i { right: 1%; bottom: 7%; }
.word-bubbles { position: fixed; z-index: 40; inset: 0; overflow: hidden; pointer-events: none; }
.word-bubble { position: absolute; display: grid; place-items: center; width: clamp(118px, 16vw, 235px); aspect-ratio: 1; border: 1px solid rgba(242,184,75,.7); border-radius: 50%; background: radial-gradient(circle at 32% 25%, rgba(255,246,199,.28), rgba(212,135,10,.13) 45%, rgba(26,21,16,.08) 72%); color: var(--amber-hi); font-size: clamp(19px, 2.6vw, 38px); font-weight: 800; letter-spacing: 1px; text-shadow: 0 0 14px rgba(242,184,75,.42); box-shadow: inset 8px 8px 20px rgba(255,247,204,.09), 0 0 26px rgba(212,135,10,.12); opacity: .72; will-change: transform; }
.word-bubble::after { content: ""; position: absolute; inset: 10%; border: 1px solid rgba(255,246,199,.17); border-radius: 50%; transform: rotate(-24deg); }
.word-bubble-kaymak { left: 8vw; top: 28vh; animation: word-bubble-kaymak 19s ease-in-out infinite; }
.word-bubble-kajmak { right: 9vw; top: 62vh; animation: word-bubble-kajmak 23s ease-in-out -8s infinite; }
@keyframes word-bubble-kaymak { 0%,100% { transform: translate(-2vw, 2vh) rotate(-8deg) scale(.72); } 46% { transform: translate(13vw, -9vh) rotate(11deg) scale(1.22); } 72% { transform: translate(24vw, 4vh) rotate(4deg) scale(.91); } }
@keyframes word-bubble-kajmak { 0%,100% { transform: translate(2vw, -3vh) rotate(8deg) scale(.78); } 38% { transform: translate(-15vw, 8vh) rotate(-12deg) scale(1.18); } 70% { transform: translate(-27vw, -5vh) rotate(-3deg) scale(.88); } }
@media (prefers-reduced-motion: reduce) { .word-bubble { animation: none; } }
.compressor-grid { gap: 20px; }
.hit { border-color: rgba(217,255,98,.4); background: linear-gradient(145deg, rgba(42,79,61,.94), rgba(18,37,30,.96)); box-shadow: 0 10px 30px rgba(0,0,0,.2); }
.hit::before { background: linear-gradient(140deg, rgba(217,255,98,.16), transparent 30%); }.hit::after { background: linear-gradient(to right, var(--amber), transparent); }
.hit-name { color: var(--bone); }.hit-cat { color: var(--amber); }.hit-blurb { color: var(--bone-2); }
.btn { border-radius: 5px; }.btn-go { background: var(--amber); color: var(--ink); border-color: var(--amber); }.btn-go:hover { background: var(--amber-hi); color: var(--ink); }

@media (max-width: 960px) {
	#main { margin-left: 14px; margin-right: 14px; }
	.milk-hero { grid-template-columns: 1fr; min-height: auto; padding: 38px 24px 0; }
	.milk-art { height: 300px; transform: scale(.88); transform-origin: 50% 100%; margin-top: -12px; }
}
@media (max-width: 560px) {
	.milk-hero h1 { font-size: 48px; }.hero-lede { font-size: 11pt; }.milk-art { min-width: 290px; transform: scale(.74); margin-left: -25px; margin-right: -25px; }
}

/* ---------- section index: the list idiom this theme uses for everything ---------- */

ul.secindex {
	list-style: none;
	margin: 0;
	padding: 0;
}
ul.secindex li {
	padding: 9px 0;
	border-bottom: 1px solid var(--hair);
	line-height: 1.6;
}
ul.secindex li:last-child { border-bottom: none; }
ul.secindex a {
	letter-spacing: 1.4px;
	text-transform: uppercase;
}
ul.secindex .desc {
	display: block;
	color: var(--bone-3);
}
ul.secindex .ext { color: rgba(192,168,112,0.6); }

.visually-hidden {
	position: absolute !important;
	width: 1px; height: 1px;
	margin: -1px; padding: 0;
	overflow: hidden;
	clip: rect(0 0 0 0);
	white-space: nowrap;
	border: 0;
}

.ittvagyunk {
	color: var(--amber) !important;
	text-shadow: 0 0 12px rgba(212,135,10,0.55);
}

p {
	padding-top: 15px;
	padding-bottom: 10px;
	text-align: justify;
	line-height: 1.75;
}

/* the note under an h1 rule-bar, before the list it introduces */
p.note {
	max-width: 74ch;
	color: var(--bone-2);
}

ul li {
	line-height: 1.65;
	color: var(--bone-2);
}
ul li::marker { color: rgba(212,135,10,0.5); }

/* ---------- controls: one square amber part, in three states ---------- */

.btn {
	display: inline-block;
	font-family: inherit;
	font-size: 9.5pt;
	line-height: 1;
	letter-spacing: 1.4px;
	text-transform: uppercase;
	padding: 9px 14px;
	background: var(--wash);
	border: 1px solid var(--edge);
	border-radius: 999px;
	color: var(--link);
	cursor: pointer;
	text-decoration: none;
	white-space: nowrap;
	box-shadow: 0 6px 14px rgba(0,0,0,0.12);
}
.btn:hover {
	background: var(--wash-2);
	color: var(--amber-hi);
	text-decoration: none;
}
.btn-go {
	background: var(--wash-3);
	border-color: var(--edge-hot);
	color: var(--amber-hi);
	font-weight: bold;
}
.btn-go:hover {
	background: rgba(212,135,10,0.42);
	color: #fff0d0;
}
.btn[disabled] { opacity: 0.4; cursor: not-allowed; }
.btn-vat { font-weight: normal; letter-spacing: 1px; opacity: 0.7; }

/* Downloads and licence actions are temporarily unavailable. Keep the
   underlying flow intact so it can be re-enabled without rebuilding the cards. */
.download-control,
.licence-control { display: none !important; }
.beta-download-control { display: inline-flex !important; }

.btn:focus-visible,
.key-input:focus-visible,
.lic-field:focus-visible {
	outline: 1px dotted var(--amber-hi);
	outline-offset: 2px;
}

/* ---------- the released plugin ----------
   Given the masthead's own treatment — the layered gradient, the light-ray
   shafts and the glowing hairline. One product earns the site's loudest object;
   nothing else on the page may use it. */

.hit {
	position: relative;
	overflow: hidden;
	display: flex;
	flex-wrap: nowrap;
	align-items: stretch;
	gap: 24px;
	margin-top: 18px;
	padding: 22px 24px;
	border: 1px solid rgba(212,135,10,0.45);
	box-shadow: 0 2px 24px rgba(212,135,10,0.18);
	background:
		linear-gradient(160deg, rgba(212,135,10,0.28) 0%, rgba(212,135,10,0.06) 28%, transparent 55%),
		linear-gradient(to right, #1a1510 0%, #231a0e 38%, #1a1510 100%);
}
.hit::before {
	content: '';
	position: absolute;
	inset: 0;
	background:
		linear-gradient(158deg, rgba(242,184,75,0.20) 0%, transparent 14%),
		linear-gradient(164deg, rgba(242,184,75,0.10) 0%, transparent 18%),
		linear-gradient(149deg, rgba(242,184,75,0.06) 0%, transparent 24%);
	pointer-events: none;
}
.hit::after {
	content: '';
	position: absolute;
	bottom: 0; left: 0;
	width: 55%; height: 2px;
	background: linear-gradient(to right, rgba(242,184,75,0.7), transparent);
	pointer-events: none;
}
.hit-copy { position: relative; z-index: 2; flex: 1 1 52%; min-width: 0; }
.hit-side { position: relative; z-index: 2; flex: 1 1 48%; min-width: 0; display: flex; }

.hit-cat {
	font-size: 8.5pt;
	letter-spacing: 2.4px;
	text-transform: uppercase;
	color: var(--amber);
}
.hit-name {
	margin: 6px 0 2px;
	font-size: 26pt;
	font-weight: normal;
	letter-spacing: 4px;
	text-transform: uppercase;
	color: var(--amber-lit);
	text-shadow: 0 0 22px rgba(212,135,10,0.5);
}
.hit-slug {
	font-size: 9pt;
	letter-spacing: 2px;
	color: var(--bone-3);
}
.hit-blurb {
	padding: 14px 0 4px;
	max-width: 52ch;
	color: var(--bone-2);
	text-align: left;
}
.hit-buy {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 12px 0 4px;
}
.hit-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
}
.hit-details {
	display: grid;
	gap: 12px;
	padding-top: 8px;
}
.hit-details[hidden] { display: none !important; }
.hit-panel {
	display: grid;
	gap: 12px;
	padding: 14px 14px 12px;
	border: 1px solid rgba(212,135,10,0.28);
	border-radius: 14px;
	background: linear-gradient(to bottom, rgba(212,135,10,0.10), rgba(0,0,0,0.08));
	box-shadow: 0 10px 24px rgba(0,0,0,0.18);
}
.hit-mini {
	display: grid;
	gap: 8px;
	padding-top: 4px;
}
.hit-mini + .hit-mini {
	padding-top: 10px;
	border-top: 1px solid rgba(212,135,10,0.14);
}
.hit-input {
	width: 100%;
}
.hit-mini .key-label {
	margin-bottom: 0;
}
.hit-mini .key-row {
	gap: 10px;
}
.hit-mini .key-row .btn {
	flex: 0 0 auto;
}
.hit-mini .key-msg {
	margin-top: 4px;
}
.hit-mini .get-out {
	margin-top: 6px;
}
.hit-mini .lic-field {
	margin-bottom: 0;
}
.hit-meta {
	margin-top: 14px;
	padding-top: 11px;
	border-top: 1px solid var(--hair);
	display: flex;
	gap: 22px;
	flex-wrap: wrap;
	font-size: 8.5pt;
	letter-spacing: 1.6px;
	text-transform: uppercase;
	color: var(--bone-3);
}

/* the compressor rack: every released compressor now uses the same framed card
   treatment, laid out as a responsive deck instead of a text list */
.compressor-grid {
	margin-top: 18px;
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: 18px;
	align-items: stretch;
}
.compressor-grid .hit {
	margin-top: 0;
	height: 100%;
}

@media (max-width: 1100px) {
	.hit {
		flex-wrap: wrap;
	}
	.hit-copy,
	.hit-side {
		flex-basis: 100%;
	}
	.hit-side {
		min-height: 280px;
	}
}

/* ---------- the bundle ----------
   Deliberately QUIETER than .hit. The hero is the one plugin to start with; the
   bundle is an offer about the set, so it borrows the hit's shape and drops the
   lit-from-the-corner treatment — a second glowing panel directly under the first
   would read as a second hero and flatten the distinction the hero exists for. */

.bundle {
	position: relative;
	margin-top: 14px;
	padding: 18px 24px;
	border: 1px solid rgba(212,135,10,0.28);
	background: linear-gradient(to right, #17130e 0%, #1c1710 50%, #17130e 100%);
}
.bundle::after {
	content: '';
	position: absolute;
	bottom: 0; left: 0;
	width: 34%; height: 1px;
	background: linear-gradient(to right, rgba(242,184,75,0.45), transparent);
	pointer-events: none;
}
.bundle-copy { position: relative; z-index: 2; }
.bundle-name {
	margin: 2px 0 0;
	font-size: 17pt;
	letter-spacing: 1px;
	text-transform: uppercase;
	color: var(--bone-1);
}

/* ---------- the catalogue ----------
   Built like the publication list on zlatko.hu's text page: a floated code
   column, then the record. Not cards — this theme lists things. */

ul.plugz {
	list-style: none;
	margin: 0;
	padding: 0;
}
ul.plugz > li {
	padding: 11px 0;
	border-bottom: 1px solid var(--hair);
	line-height: 1.6;
	overflow: hidden;
}
ul.plugz > li:last-child { border-bottom: none; }

.cat {
	float: left;
	width: 58px;
	color: var(--amber);
	letter-spacing: 1px;
	font-size: 9.5pt;
}
.rec { display: block; margin-left: 74px; }

.pname {
	letter-spacing: 1.8px;
	text-transform: uppercase;
	color: var(--link);
}
.pslug {
	color: var(--bone-3);
	font-size: 8.5pt;
	letter-spacing: 1.4px;
	padding-left: 8px;
}
.pblurb {
	display: block;
	color: var(--bone-3);
	max-width: 78ch;
}
.ptags {
	display: block;
	margin-top: 3px;
	font-size: 8.5pt;
	letter-spacing: 1.4px;
	text-transform: uppercase;
	color: rgba(192,168,112,0.6);
}
.ptags .tag + .tag::before {
	content: "·";
	padding: 0 5px;
	color: rgba(212,135,10,0.45);
}

/* the row's right-hand end: state, tally, action */
.pfoot {
	display: flex;
	align-items: center;
	gap: 14px;
	flex-wrap: wrap;
	margin-top: 7px;
}

/* the two ends of the amber ramp, and the site's only status vocabulary */
.stamp {
	font-size: 8pt;
	letter-spacing: 1.8px;
	text-transform: uppercase;
	padding: 3px 7px;
	white-space: nowrap;
}
.stamp-live {
	background: var(--wash-3);
	border: 1px solid var(--edge-hot);
	color: var(--amber-hi);
}
.stamp-dev {
	background: none;
	border: 1px dashed rgba(212,135,10,0.35);
	color: var(--bone-3);
}

/* Which binaries exist, from the group's BUILDS folder. Deliberately quieter than
   .stamp: it is a fact about the build, not a second status — a plugin is
   "in development" or "released" and nothing else. */
.built {
	font-size: 8pt;
	letter-spacing: 1.6px;
	text-transform: uppercase;
	color: var(--bone-3);
	white-space: nowrap;
}

.count {
	font-size: 8.5pt;
	letter-spacing: 1.4px;
	text-transform: uppercase;
	color: var(--bone-3);
	font-variant-numeric: tabular-nums;
}
.count b {
	color: var(--amber);
	font-weight: normal;
}
.count-pending { opacity: 0.5; }

/* ---------- the register ----------
   The rest of the range, inside the one tab the masthead carries. A LARGE frame,
   because it holds thirty records and has to read as one object rather than as
   the compressors rack carrying on past its end.

   Quieter than .hit and quieter than .bundle, and that ordering is the whole
   design: the hero is what is finished, the bundle is an offer, and this is a
   list of things you cannot have yet. It gets a frame and a fill, and none of the
   lit-from-the-corner treatment. */

.register {
	position: relative;
	margin-top: 34px;
	padding: 20px 24px 6px;
	border: 1px solid rgba(212,135,10,0.30);
	background: linear-gradient(to bottom, rgba(29,23,16,0.75), rgba(23,19,14,0.45));
}
/* the banner's hairline sweep, along the top edge — the frame's one lit detail */
.register::before {
	content: '';
	position: absolute;
	top: 0; left: 0;
	width: 42%; height: 1px;
	background: linear-gradient(to right, rgba(242,184,75,0.5), transparent);
	pointer-events: none;
}

/* the fixed masthead again — an anchor jump to the frame must not land under it */
#main .register { scroll-margin-top: 250px; }

.register-title {
	margin: 0;
	font-size: 12pt;
	font-weight: normal;
	letter-spacing: 2.6px;
	text-transform: uppercase;
	color: var(--amber-lit);
}

/* the note sits directly under the title here, not under an h1 rule-bar */
.register > .note { padding-top: 8px; }

.reg-group { margin-top: 10px; }
.reg-group + .reg-group {
	margin-top: 22px;
	border-top: 1px solid var(--hair);
}
.reg-name {
	margin: 0;
	padding: 12px 0 4px;
	font-size: 9.5pt;
	font-weight: normal;
	letter-spacing: 2.2px;
	text-transform: uppercase;
	color: var(--bone-2);
}

@media (max-width: 960px) {
	.register { padding: 18px 16px 4px; }
}

/* ---------- demo ----------
   A YouTube facade: nothing is requested from youtube until the visitor clicks,
   so the page costs no third-party traffic and sets no cookies on load. */

.demo {
	position: relative;
	aspect-ratio: 16 / 9;
	width: 100%;
	flex: 1 1 auto;
	border: 1px solid var(--edge);
	background: rgba(0,0,0,0.35);
	overflow: hidden;
}
.demo iframe { width: 100%; height: 100%; border: 0; display: block; }
.demo-play {
	width: 100%;
	height: 100%;
	border: 0;
	background: transparent;
	color: var(--link);
	cursor: pointer;
	font-family: inherit;
	font-size: 9pt;
	letter-spacing: 2.4px;
	text-transform: uppercase;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 10px;
}
.demo-play:hover { background: rgba(212,135,10,0.08); color: var(--amber-hi); }
.demo-play .disc {
	width: 46px; height: 46px;
	border: 1px solid currentColor;
	border-radius: 50%;
	display: flex;
	align-items: center;
	justify-content: center;
}
.demo-play .disc::after {
	content: "";
	border-left: 12px solid currentColor;
	border-top: 7px solid transparent;
	border-bottom: 7px solid transparent;
	margin-left: 3px;
}
.demo-none {
	position: absolute;
	inset: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	color: var(--bone-3);
	font-size: 8.5pt;
	letter-spacing: 2.4px;
	text-transform: uppercase;
}

/* ---------- card-side download & licence flow ---------- */

.get-grid {
	display: flex;
	flex-wrap: wrap;
	gap: 20px;
	margin-top: 18px;
	align-items: flex-start;
}
.key {
	flex: 1 1 340px;
	min-width: 0;
	padding: 18px 20px;
	background: rgba(29,23,16,0.72);
	border: 1px solid var(--edge);
}
.key-label {
	display: block;
	font-size: 8.5pt;
	letter-spacing: 2.4px;
	text-transform: uppercase;
	color: var(--amber-lit);
	margin-bottom: 10px;
}
.key-row {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
}
/* step 2 stacks two rows (code, then machine id + button); match the flex gap */
.key-row + .key-row { margin-top: 8px; }
.key-input {
	flex: 1 1 200px;
	min-width: 0;
	font-family: inherit;
	font-size: 11pt;
	letter-spacing: 2px;
	padding: 9px 10px;
	background: rgba(0,0,0,0.35);
	border: 1px solid var(--edge);
	border-radius: 0;
	color: var(--amber-hi);
}
.key-input::placeholder { color: rgba(192,168,112,0.45); letter-spacing: 2px; }
.key-input:focus { border-color: var(--amber); outline: none; }

/* The product chooser. A <select> keeps its native chrome unless appearance is
   reset, which on a dark panel means a light-grey OS control in the middle of the
   form; the caret is drawn back on as a background image because removing the
   appearance removes that too. The options themselves are painted by the OS, so
   they get explicit colours — a dark-on-dark menu is unreadable in some browsers. */
select.key-input {
	appearance: none;
	-webkit-appearance: none;
	padding-right: 30px;
	text-transform: uppercase;
	cursor: pointer;
	background-image: linear-gradient(45deg, transparent 50%, var(--amber) 50%),
	                  linear-gradient(135deg, var(--amber) 50%, transparent 50%);
	background-position: calc(100% - 16px) 55%, calc(100% - 11px) 55%;
	background-size: 5px 5px, 5px 5px;
	background-repeat: no-repeat;
}
select.key-input option { background: #17130e; color: var(--amber-hi); }
.key-msg {
	margin: 12px 0 0;
	padding: 0;
	font-size: 9.5pt;
	line-height: 1.6;
	min-height: 1.4em;
	text-align: left;
}
.key-msg[data-tone="ok"]   { color: var(--amber-hi); }
.key-msg[data-tone="bad"]  { color: #e08a3a; }
.key-msg[data-tone="wait"] { color: var(--bone-3); }

/* Step 1 renders ONE link per plugin the code opens — a bundle code opens four —
   so this wraps instead of letting four nowrap buttons run off the column. The
   licence output (step 2) is a single stacked block, which is why the label and
   the textarea below are forced to full width rather than sitting in the flow. */
.get-out {
	margin-top: 14px;
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
}
.get-out .key-label,
.get-out .lic-field { flex: 0 0 100%; }
.get-out .key-label { margin-top: 4px; }

/* the issued licence — long, wrapped, read-only and copyable */
.lic-field {
	display: block;
	width: 100%;
	resize: vertical;
	margin-bottom: 10px;
	padding: 9px 10px;
	background: rgba(0,0,0,0.35);
	border: 1px solid var(--edge);
	border-radius: 0;
	color: var(--amber-hi);
	font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
	font-size: 9pt;
	line-height: 1.5;
	word-break: break-all;
}
.lic-field:focus { border-color: var(--amber); outline: none; }

/* ---------- foot ---------- */

.foot {
	margin-top: 44px;
	padding-top: 16px;
	border-top: 1px solid rgba(212,135,10,0.45);
	color: var(--bone-3);
	font-size: 9.5pt;
}
.foot p { padding: 3px 0; text-align: left; }
.foot .diamond {
	display: inline-block;
	width: 6px; height: 6px;
	margin-right: 10px;
	vertical-align: 1px;
	border: 1px solid rgba(212,135,10,0.5);
	transform: rotate(45deg);
}

/* ---------- payment overlay ----------
   The shared payment document (cymbal's /pay) framed over the page. The frame
   draws its own contents; everything here is the box around it. */

.pay-overlay {
	position: fixed;
	inset: 0;
	z-index: 200;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 24px;
	background: rgba(10,8,4,0.88);
}
.pay-box {
	width: 100%;
	max-width: 480px;
	padding: 16px;
	background: var(--panel);
	border: 1px solid rgba(212,135,10,0.45);
	box-shadow: 0 10px 44px rgba(0,0,0,0.8), 0 0 26px rgba(212,135,10,0.12);
}
.pay-box iframe { width: 100%; height: 460px; border: 0; display: block; }
.pay-msg {
	margin: 12px 0 0;
	font-size: 9.5pt;
	line-height: 1.6;
	min-height: 1.4em;
}
.pay-msg[data-tone="ok"]   { color: var(--amber-hi); }
.pay-msg[data-tone="bad"]  { color: #e08a3a; }
.pay-msg[data-tone="wait"] { color: var(--bone-3); }
.pay-cancel { margin-top: 12px; width: 100%; text-align: center; }

.print { display: none; }

@media print {
	@page { margin: 10%; }
	h1, h2, h3, h4, h5, h6 { page-break-after: avoid; page-break-inside: avoid; }
	ul, ol, dl { page-break-before: avoid; }
	h1 { color: #000; padding: 0 20px 0 0; }
	.noprint { display: none; }
	.print { display: inline !important; }
	#nav .sub, .sub-toggle { display: none !important; }
	/* beats html.js #navmob { display: flex } when printing a narrow window */
	#navmob { display: none !important; }
}

@media (prefers-reduced-motion: reduce) {
	* { animation: none !important; transition: none !important; }
}

/* Narrow viewports. Same 960px threshold as the block above, which is where the
   banner strip gives way to the horizontal lockup — the two are deliberately
   held together (see the note there). The masthead goes and #navmob carries the
   navigation in its two menus, and the no-JS path unpins the lockup the earlier
   block has already established.

   This block must stay last in the file — the base p { text-align: justify }
   would otherwise override the ragged-right rule below. */
@media (max-width: 960px) {
	body {
		margin-bottom: 40px;
		font-size: 11pt;
	}

	#main {
		margin-left: 14px;
		margin-right: 14px;
	}

	/* Keep the masthead and its original menu row at every width. The row is
	   intentionally non-wrapping, so narrowing the window cannot change its
	   structure or turn it into a different menu. */
	#main section, #main .key, #main .hit, #main .plugz > li { scroll-margin-top: 64px; }

	/* justification opens rivers at this measure */
	p { text-align: left; }

	.hit { padding: 16px 15px; gap: 18px; }
	.hit-name { font-size: 20pt; letter-spacing: 3px; }

	/* the floated code column costs more than it gives at this measure */
	.cat { float: none; width: auto; display: block; }
	.rec { margin-left: 0; }

	/* Keep the same masthead/menu row instead of swapping in the compact menu. */
	html.js body { margin-top: 72px; }
	html.js #head { display: block; height: 64px; }
	html.js #logo { display: none; }
	html.js #navmob { display: none; }

	/* no script: nothing has replaced the masthead, so unpin it and stack it
	   rather than leave the page with no navigation at all */
	html:not(.js) body { margin-top: 0; }

	/* already the horizontal lockup from the block above, which shares this
	   breakpoint; just unpin it and let it sit above the stacked masthead */
	html:not(.js) #logo {
		position: static;
		width: 210px;
		height: 60px;
		margin: 8px 0 0 14px;
	}

	html:not(.js) #head {
		position: static;
		left: 0;
		right: auto;
		height: auto;
		padding-bottom: 10px;
		box-shadow: none;
	}
	html:not(.js) #head::before,
	html:not(.js) #head::after { display: none; }

	html:not(.js) #headline {
		position: static;
		padding: 10px 12px 0;
	}

	html:not(.js) #navbar {
		position: static;
		left: 0;
		right: auto;
		top: 0;
		font-size: 12pt;
		padding: 8px 12px 0;
		text-shadow: 1px 1px 3px rgba(0,0,0,0.9);
	}
	html:not(.js) #nav { row-gap: 4px; }

	/* wrapped rows make the inline pipes read as stray characters */
	html:not(.js) #nav > li + li::before { display: none; }
	html:not(.js) #nav > li { margin-right: 14px; }
}

/* ---------- feral dropdowns ----------
   The catalogue is meant to feel sampled, not typeset. Keep the actual links
   and hit areas calm enough to use, then let the shell and display type wobble
   around them. The deliberately system-only stack means this still works when
   the page is viewed offline. */

#nav > li > a,
.sub-toggle,
.navmob-btn,
#nav .sub,
.navmob-list {
	font-family: Impact, Haettenschweiler, "Arial Black", sans-serif;
}

#nav > li > a {
	border: 0;
	border-radius: 2px 11px 3px 8px;
	padding: 10px 16px 8px;
	background: var(--amber);
	color: #000;
	font-size: 15pt;
	font-weight: 900;
	letter-spacing: 1px;
	text-shadow: 1px 1px 0 rgba(255,255,255,.18);
	box-shadow: 4px 4px 0 var(--ink), 7px 7px 0 rgba(217,255,98,.45);
	transform: rotate(-1.2deg);
}
#nav > li:nth-child(2n) > a { transform: rotate(1.4deg); }
#nav > li > a[href="#g-compressors"] { color: #32134f !important; }
#nav > li > a:hover,
#nav > li > a:focus-visible {
	background: var(--amber-hi);
	color: #000;
	transform: translate(-1px, -2px) rotate(-2deg);
}
#nav > li > a[href="#g-compressors"]:hover,
#nav > li > a[href="#g-compressors"]:focus-visible { color: #32134f !important; }

.sub-toggle {
	border: 0;
	border-radius: 50% 3px 45% 7px;
	padding: 7px 9px;
	background: var(--ink);
	color: var(--amber);
	font-size: 11pt;
	box-shadow: 2px 2px 0 var(--amber);
	transform: rotate(8deg) translate(-2px, 3px);
}
.sub-toggle:hover,
#nav > li[data-open] > .sub-toggle {
	background: var(--amber-hi);
	color: #000;
	border: 0;
	transform: rotate(-8deg) translate(-2px, 1px);
}

#nav .sub {
	top: calc(100% + 5px);
	left: -7px;
	min-width: 248px;
	margin-top: 0;
	padding: 13px 9px 11px;
	border: 0;
	border-radius: 3px 15px 5px 12px;
	background: var(--amber-hi);
	box-shadow: 6px 7px 0 var(--amber), 10px 12px 0 rgba(20,37,31,.9);
	clip-path: polygon(0 4%, 5% 0, 12% 3%, 20% 0, 29% 3%, 38% 0, 47% 3%, 56% 0, 65% 3%, 74% 0, 83% 3%, 91% 0, 100% 4%, 98% 14%, 100% 25%, 97% 38%, 100% 52%, 97% 64%, 100% 76%, 96% 88%, 100% 97%, 90% 100%, 80% 97%, 69% 100%, 58% 97%, 47% 100%, 36% 97%, 25% 100%, 14% 97%, 4% 100%, 0 91%, 3% 80%, 0 69%, 3% 57%, 0 45%, 3% 33%, 0 20%);
	font-size: 10.5pt;
	letter-spacing: .7px;
	text-transform: none;
	animation: menu-glitch-in .22s steps(3, end) both;
}

#nav .sub a {
	position: relative;
	margin: 2px 0;
	padding: 8px 12px 7px 18px;
	border: 1px solid transparent;
	border-radius: 2px 8px 3px 5px;
	color: #000;
	font-size: 11pt;
	font-weight: 700;
	letter-spacing: .6px;
	text-transform: none;
	transform: rotate(-.45deg);
}
#nav .sub li:nth-child(3n) a { transform: rotate(.65deg) translateX(3px); }
#nav .sub li:nth-child(4n) a { transform: rotate(-.8deg) translateX(-2px); }
#nav .sub a::before {
	content: "";
	position: absolute;
	left: 6px;
	top: 50%;
	width: 6px;
	height: 6px;
	background: var(--amber);
	transform: translateY(-50%) rotate(45deg);
}
#nav .sub a:hover,
#nav .sub a:focus {
	background: var(--amber);
	border-color: var(--amber-hi);
	color: #000;
	transform: rotate(-1.5deg) translateX(4px) scale(1.02);
}
#nav .sub .subcat { color: #000; opacity: .65; }

/* The compact bar gets the same language without letting the panel exceed the
   viewport. Its list remains a normal scrollable rectangle at phone widths. */
.navmob-btn {
	border: 0;
	border-radius: 3px 12px 4px 8px;
	background: var(--amber);
	color: #000;
	font-size: 12pt;
	font-weight: 900;
	letter-spacing: .7px;
	box-shadow: 3px 3px 0 var(--ink), 5px 5px 0 rgba(217,255,98,.45);
	transform: rotate(-.8deg);
}
.navmob-menu:nth-child(odd) .navmob-btn { transform: rotate(1deg); }
.navmob-menu[data-open] .navmob-btn,
.navmob-btn:hover { background: var(--amber-hi); color: #000; }
.navmob-list {
	margin: 5px 5px 0;
	padding: 11px 8px;
	border: 0;
	border-radius: 4px 14px 5px 10px;
	background: var(--amber-hi);
	box-shadow: 5px 6px 0 var(--amber);
	clip-path: polygon(0 3%, 12% 0, 24% 2%, 37% 0, 50% 2%, 63% 0, 76% 2%, 89% 0, 100% 4%, 98% 96%, 88% 100%, 75% 98%, 62% 100%, 49% 98%, 36% 100%, 23% 98%, 10% 100%, 0 96%);
	animation: menu-glitch-in .22s steps(3, end) both;
}
.navmob-list a {
	padding: 10px 12px 9px 27px;
	border-bottom: 0;
	border-radius: 2px 8px 3px 5px;
	color: #000;
	font-size: 11pt;
	font-weight: 700;
	letter-spacing: .5px;
	text-transform: none;
}
.navmob-list li:nth-child(3n) a { transform: rotate(.6deg) translateX(3px); }
.navmob-list li:nth-child(4n) a { transform: rotate(-.7deg); }
.navmob-list a:hover,
.navmob-list a:focus { background: var(--amber); color: #000; }
.navmob-list .subcat { color: #000; opacity: .65; }

@keyframes menu-glitch-in {
	0% { opacity: 0; transform: translateY(-6px) rotate(-2deg) skewX(4deg); }
	55% { opacity: 1; transform: translateY(2px) rotate(1deg) skewX(-2deg); }
	100% { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
	#nav .sub,
	.navmob-list { animation: none; }
}
