<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://deadlock.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=~2026-ShivFlexAlchemical707</id>
	<title>The Deadlock Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://deadlock.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=~2026-ShivFlexAlchemical707"/>
	<link rel="alternate" type="text/html" href="https://deadlock.wiki/Special:Contributions/~2026-ShivFlexAlchemical707"/>
	<updated>2026-09-06T06:32:43Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98149</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98149"/>
		<updated>2026-07-21T00:58:43Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Give chance blocks a 120px min-height so sparse/empty panels stay substantial (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.sb-group {&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
}&lt;br /&gt;
.sb-group:first-child {&lt;br /&gt;
	margin-top: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-label {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-icons {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 4px 10px;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common {&lt;br /&gt;
	margin-top: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25BE&amp;quot;;&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
	opacity: 0.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common.mw-collapsed .sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25B8&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-body {&lt;br /&gt;
	line-height: 1.9;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tier layout: left side (High over Low) 35% | Middle 65% */&lt;br /&gt;
.sb-tier {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: stretch;&lt;br /&gt;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Left side: High chance on top, Low chance on the bottom.&lt;br /&gt;
   space-between keeps them pinned to top/bottom when the side is stretched taller. */&lt;br /&gt;
.sb-side {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	flex: 35 1 0;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-side .sb-col {&lt;br /&gt;
	flex: 0 0 auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex: 1 1 0;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	padding: 3px 8px;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-body {&lt;br /&gt;
	flex: 1;&lt;br /&gt;
	min-height: 120px;&lt;br /&gt;
	padding: 6px 8px;&lt;br /&gt;
	line-height: 1.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
	align-content: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Per-chance colour + tints (drive every theme) */&lt;br /&gt;
.sb-col-high {&lt;br /&gt;
	--chance: #4f8f36;&lt;br /&gt;
	--tint: rgba(90, 150, 60, 0.12);&lt;br /&gt;
	--tint-soft: rgba(90, 150, 60, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-normal {&lt;br /&gt;
	flex-grow: 65;&lt;br /&gt;
	--chance: #b28b28;&lt;br /&gt;
	--tint: rgba(190, 150, 45, 0.12);&lt;br /&gt;
	--tint-soft: rgba(190, 150, 45, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-low {&lt;br /&gt;
	--chance: #9c3f37;&lt;br /&gt;
	--tint: rgba(170, 65, 55, 0.12);&lt;br /&gt;
	--tint-soft: rgba(170, 65, 55, 0.07);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Default theme &amp;quot;Fill&amp;quot;: colored header bar + tinted body */&lt;br /&gt;
.sb-col {&lt;br /&gt;
	background: var(--tint);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	background: var(--chance);&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Border&amp;quot;: colored header bar + no body tint + colored border */&lt;br /&gt;
.sb-theme-border .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Heading&amp;quot;: label sits OUTSIDE the box as a plain uncolored subheading; the box (border + soft tint) is the body */&lt;br /&gt;
.sb-theme-head .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	overflow: visible;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: inherit;&lt;br /&gt;
	font-size: 1.05em;&lt;br /&gt;
	padding: 0 0 3px 2px;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-body {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Accent&amp;quot;: thick colored left stripe + soft tint + colored heading text */&lt;br /&gt;
.sb-theme-accent .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border-left: 4px solid var(--chance);&lt;br /&gt;
	border-radius: 0 6px 6px 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-accent .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
	.sb-tier {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98146</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98146"/>
		<updated>2026-07-21T00:55:14Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Mobile: keep the side stacked (High/Low/Middle straight down) instead of High|Low side by side (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.sb-group {&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
}&lt;br /&gt;
.sb-group:first-child {&lt;br /&gt;
	margin-top: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-label {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-icons {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 4px 10px;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common {&lt;br /&gt;
	margin-top: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25BE&amp;quot;;&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
	opacity: 0.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common.mw-collapsed .sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25B8&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-body {&lt;br /&gt;
	line-height: 1.9;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tier layout: left side (High over Low) 35% | Middle 65% */&lt;br /&gt;
.sb-tier {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: stretch;&lt;br /&gt;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Left side: High chance on top, Low chance on the bottom.&lt;br /&gt;
   space-between keeps them pinned to top/bottom when the side is stretched taller. */&lt;br /&gt;
.sb-side {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	flex: 35 1 0;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-side .sb-col {&lt;br /&gt;
	flex: 0 0 auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex: 1 1 0;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	padding: 3px 8px;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-body {&lt;br /&gt;
	flex: 1;&lt;br /&gt;
	padding: 6px 8px;&lt;br /&gt;
	line-height: 1.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
	align-content: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Per-chance colour + tints (drive every theme) */&lt;br /&gt;
.sb-col-high {&lt;br /&gt;
	--chance: #4f8f36;&lt;br /&gt;
	--tint: rgba(90, 150, 60, 0.12);&lt;br /&gt;
	--tint-soft: rgba(90, 150, 60, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-normal {&lt;br /&gt;
	flex-grow: 65;&lt;br /&gt;
	--chance: #b28b28;&lt;br /&gt;
	--tint: rgba(190, 150, 45, 0.12);&lt;br /&gt;
	--tint-soft: rgba(190, 150, 45, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-low {&lt;br /&gt;
	--chance: #9c3f37;&lt;br /&gt;
	--tint: rgba(170, 65, 55, 0.12);&lt;br /&gt;
	--tint-soft: rgba(170, 65, 55, 0.07);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Default theme &amp;quot;Fill&amp;quot;: colored header bar + tinted body */&lt;br /&gt;
.sb-col {&lt;br /&gt;
	background: var(--tint);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	background: var(--chance);&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Border&amp;quot;: colored header bar + no body tint + colored border */&lt;br /&gt;
.sb-theme-border .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Heading&amp;quot;: label sits OUTSIDE the box as a plain uncolored subheading; the box (border + soft tint) is the body */&lt;br /&gt;
.sb-theme-head .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	overflow: visible;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: inherit;&lt;br /&gt;
	font-size: 1.05em;&lt;br /&gt;
	padding: 0 0 3px 2px;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-body {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Accent&amp;quot;: thick colored left stripe + soft tint + colored heading text */&lt;br /&gt;
.sb-theme-accent .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border-left: 4px solid var(--chance);&lt;br /&gt;
	border-radius: 0 6px 6px 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-accent .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
	.sb-tier {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98145</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98145"/>
		<updated>2026-07-21T00:53:57Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Tier layout: left side (35%) stacks High/Low with space-between, Middle 65% on the right (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.sb-group {&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
}&lt;br /&gt;
.sb-group:first-child {&lt;br /&gt;
	margin-top: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-label {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-icons {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 4px 10px;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common {&lt;br /&gt;
	margin-top: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25BE&amp;quot;;&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
	opacity: 0.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common.mw-collapsed .sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25B8&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-body {&lt;br /&gt;
	line-height: 1.9;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Tier layout: left side (High over Low) 35% | Middle 65% */&lt;br /&gt;
.sb-tier {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: stretch;&lt;br /&gt;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Left side: High chance on top, Low chance on the bottom.&lt;br /&gt;
   space-between keeps them pinned to top/bottom when the side is stretched taller. */&lt;br /&gt;
.sb-side {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	flex: 35 1 0;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-side .sb-col {&lt;br /&gt;
	flex: 0 0 auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex: 1 1 0;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	padding: 3px 8px;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-body {&lt;br /&gt;
	flex: 1;&lt;br /&gt;
	padding: 6px 8px;&lt;br /&gt;
	line-height: 1.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
	align-content: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Per-chance colour + tints (drive every theme) */&lt;br /&gt;
.sb-col-high {&lt;br /&gt;
	--chance: #4f8f36;&lt;br /&gt;
	--tint: rgba(90, 150, 60, 0.12);&lt;br /&gt;
	--tint-soft: rgba(90, 150, 60, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-normal {&lt;br /&gt;
	flex-grow: 65;&lt;br /&gt;
	--chance: #b28b28;&lt;br /&gt;
	--tint: rgba(190, 150, 45, 0.12);&lt;br /&gt;
	--tint-soft: rgba(190, 150, 45, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-low {&lt;br /&gt;
	--chance: #9c3f37;&lt;br /&gt;
	--tint: rgba(170, 65, 55, 0.12);&lt;br /&gt;
	--tint-soft: rgba(170, 65, 55, 0.07);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Default theme &amp;quot;Fill&amp;quot;: colored header bar + tinted body */&lt;br /&gt;
.sb-col {&lt;br /&gt;
	background: var(--tint);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	background: var(--chance);&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Border&amp;quot;: colored header bar + no body tint + colored border */&lt;br /&gt;
.sb-theme-border .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Heading&amp;quot;: label sits OUTSIDE the box as a plain uncolored subheading; the box (border + soft tint) is the body */&lt;br /&gt;
.sb-theme-head .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	overflow: visible;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: inherit;&lt;br /&gt;
	font-size: 1.05em;&lt;br /&gt;
	padding: 0 0 3px 2px;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-body {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Accent&amp;quot;: thick colored left stripe + soft tint + colored heading text */&lt;br /&gt;
.sb-theme-accent .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border-left: 4px solid var(--chance);&lt;br /&gt;
	border-radius: 0 6px 6px 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-accent .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
	.sb-tier {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
	.sb-side {&lt;br /&gt;
		flex-direction: row;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=98144</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=98144"/>
		<updated>2026-07-21T00:53:04Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: p.tier: split into left side (High over Low) and right Middle for the new 35/65 layout (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local sb = mw.loadJsonData(&amp;quot;Data:StreetBrawlData.json&amp;quot;)[&amp;quot;item-buckets&amp;quot;]&lt;br /&gt;
local items = mw.loadJsonData(&amp;quot;Data:ItemData.json&amp;quot;)&lt;br /&gt;
local heroes = mw.loadJsonData(&amp;quot;Data:HeroData.json&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Slot display order: Weapon -&amp;gt; Vitality (Armor) -&amp;gt; Spirit (Tech)&lt;br /&gt;
local SLOT_RANK = { Weapon = 1, Armor = 2, Tech = 3 }&lt;br /&gt;
-- Default card scale passed to ItemBox (tier columns and counter cards).&lt;br /&gt;
local CARD_SIZE = &amp;quot;0.875&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local NAME_TO_KEY, KEY_TO_NAME, RELEASED = {}, {}, {}&lt;br /&gt;
for key, h in pairs(heroes) do&lt;br /&gt;
	if type(h) == &amp;quot;table&amp;quot; and h.Name then&lt;br /&gt;
		KEY_TO_NAME[key] = h.Name&lt;br /&gt;
		NAME_TO_KEY[mw.ustring.lower(h.Name)] = key&lt;br /&gt;
		if not h.InDevelopment and not h.IsDisabled then RELEASED[key] = true end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_key(input)&lt;br /&gt;
	if not input then return nil end&lt;br /&gt;
	input = mw.text.trim(input)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if heroes[input] then return input end&lt;br /&gt;
	return NAME_TO_KEY[mw.ustring.lower(input)]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function iname(code) local it = items[code]; return it and it.Name or nil end&lt;br /&gt;
-- A &amp;quot;real&amp;quot; item: exists, has a display name, and is not disabled/removed.&lt;br /&gt;
local function iok(code)&lt;br /&gt;
	local it = items[code]&lt;br /&gt;
	return it ~= nil and it.Name ~= nil and it.IsDisabled ~= true&lt;br /&gt;
end&lt;br /&gt;
local function itier(code)&lt;br /&gt;
	local it = items[code]; if not it then return nil end&lt;br /&gt;
	if it.StreetBrawl == true then return 5 end&lt;br /&gt;
	return it.Tier&lt;br /&gt;
end&lt;br /&gt;
local function islot(code) local it = items[code]; return it and it.Slot end&lt;br /&gt;
local function icost(code)&lt;br /&gt;
	local it = items[code]; local c = it and it.Cost&lt;br /&gt;
	return type(c) == &amp;quot;number&amp;quot; and c or math.huge&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Sort order: slot (Weapon -&amp;gt; Armor -&amp;gt; Tech), then cost ascending, then name.&lt;br /&gt;
local function item_less(a, b)&lt;br /&gt;
	local ra = SLOT_RANK[islot(a)] or 99&lt;br /&gt;
	local rb = SLOT_RANK[islot(b)] or 99&lt;br /&gt;
	if ra ~= rb then return ra &amp;lt; rb end&lt;br /&gt;
	local ca, cb = icost(a), icost(b)&lt;br /&gt;
	if ca ~= cb then return ca &amp;lt; cb end&lt;br /&gt;
	return (iname(a) or a) &amp;lt; (iname(b) or b)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function render_item(frame, code, style, size)&lt;br /&gt;
	local name = iname(code); if not name then return nil end&lt;br /&gt;
	if style == &amp;quot;icon&amp;quot; then return frame:expandTemplate{title = &amp;quot;ItemIcon&amp;quot;, args = {name}} end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;ItemBox&amp;quot;, args = {name, showTierTag = &amp;quot;true&amp;quot;, size = size or CARD_SIZE}}&lt;br /&gt;
end&lt;br /&gt;
local function render_hero(frame, key)&lt;br /&gt;
	local name = KEY_TO_NAME[key]; if not name then return nil end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;HeroIcon&amp;quot;, args = {name}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Lays rendered members out in a container with the given class (styled via CSS).&lt;br /&gt;
local function classdiv(parts, class)&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. class .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(parts) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_sets(hkey)&lt;br /&gt;
	local favored, unfavored, special, counter = {}, {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Hero == hkey then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then favored[o.Item] = true; special[o.Item] = true&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unfavored[o.Item] = true; special[o.Item] = true end&lt;br /&gt;
			if o.Counter ~= nil then counter[#counter + 1] = o.Item end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return favored, unfavored, special, counter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function item_code(input)&lt;br /&gt;
	input = mw.text.trim(input or &amp;quot;&amp;quot;)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if items[input] then return input end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input and v.IsDisabled ~= true then return k end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input then return k end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero|HERO|GROUP|TIER|label=..|collapse=yes|style=card|icon}}&lt;br /&gt;
-- GROUP = favored | unfavored | common   (use hero_counter for counters)&lt;br /&gt;
-- Legacy: superseded by p.tier, kept for reference.&lt;br /&gt;
function p.hero(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
	local tier = tonumber(frame.args[3])&lt;br /&gt;
	local style = frame.args.style&lt;br /&gt;
	if not style or style == &amp;quot;&amp;quot; then style = (group == &amp;quot;common&amp;quot;) and &amp;quot;icon&amp;quot; or &amp;quot;card&amp;quot; end&lt;br /&gt;
	local collapse = (frame.args.collapse == &amp;quot;yes&amp;quot; or frame.args.collapse == &amp;quot;true&amp;quot;)&lt;br /&gt;
	local label = frame.args.label or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local favored, unfavored, special = hero_sets(hkey)&lt;br /&gt;
	local pred&lt;br /&gt;
	if group == &amp;quot;favored&amp;quot; then pred = function(c) return favored[c] end&lt;br /&gt;
	elseif group == &amp;quot;unfavored&amp;quot; then pred = function(c) return unfavored[c] end&lt;br /&gt;
	elseif group == &amp;quot;common&amp;quot; then pred = function(c) return not special[c] end&lt;br /&gt;
	else return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) and pred(c) then codes[#codes + 1] = c end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, style); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	if collapse then&lt;br /&gt;
		local id = &amp;quot;sbcommon-&amp;quot; .. hkey .. &amp;quot;-&amp;quot; .. tostring(tier or 0)&lt;br /&gt;
		local head = (label ~= &amp;quot;&amp;quot; and label) or &amp;quot;Common&amp;quot;&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-common mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-head mw-customtoggle-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039; .. head .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-body mw-collapsible-content&amp;quot;&amp;gt;&#039; .. table.concat(parts, &amp;quot; · &amp;quot;) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local row_class = (style == &amp;quot;icon&amp;quot;) and &amp;quot;sb-icons&amp;quot; or &amp;quot;sb-cards&amp;quot;&lt;br /&gt;
	local out = &#039;&amp;lt;div class=&amp;quot;sb-group&amp;quot;&amp;gt;&#039;&lt;br /&gt;
	if label ~= &amp;quot;&amp;quot; then out = out .. &#039;&amp;lt;div class=&amp;quot;sb-label&amp;quot;&amp;gt;&#039; .. label .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
	return out .. classdiv(parts, row_class) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|tier|HERO|TIER|style=icon|card|size=..|theme=..|high=..|middle=..|low=..}}&lt;br /&gt;
-- Renders one tier: a left side stacking High chance (favored, top) over Low chance&lt;br /&gt;
-- (unfavored, bottom), beside Middle chance (the leftover pool). Empty columns still render.&lt;br /&gt;
function p.tier(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local tier = tonumber(frame.args[2])&lt;br /&gt;
	local style = (frame.args.style == &amp;quot;card&amp;quot;) and &amp;quot;card&amp;quot; or &amp;quot;icon&amp;quot;&lt;br /&gt;
	local size = frame.args.size&lt;br /&gt;
	local theme = frame.args.theme or &amp;quot;&amp;quot;&lt;br /&gt;
	local favored, unfavored = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local high, normal, low = {}, {}, {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) then&lt;br /&gt;
			if favored[c] then high[#high + 1] = c&lt;br /&gt;
			elseif unfavored[c] then low[#low + 1] = c&lt;br /&gt;
			else normal[#normal + 1] = c end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(high, item_less)&lt;br /&gt;
	table.sort(normal, item_less)&lt;br /&gt;
	table.sort(low, item_less)&lt;br /&gt;
&lt;br /&gt;
	local body_class = (style == &amp;quot;card&amp;quot;) and &amp;quot;sb-col-body sb-col-cards&amp;quot; or &amp;quot;sb-col-body&amp;quot;&lt;br /&gt;
	local sep = (style == &amp;quot;card&amp;quot;) and &amp;quot;&amp;quot; or &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local function col(codes, cls, head)&lt;br /&gt;
		local parts = {}&lt;br /&gt;
		for _, c in ipairs(codes) do local r = render_item(frame, c, style, size); if r then parts[#parts + 1] = r end end&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-col &#039; .. cls .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-col-head&amp;quot;&amp;gt;&#039; .. head .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;&#039; .. body_class .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(parts, sep) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local hi = frame.args.high or &amp;quot;High chance&amp;quot;&lt;br /&gt;
	local mid = frame.args.middle or &amp;quot;Middle chance&amp;quot;&lt;br /&gt;
	local lo = frame.args.low or &amp;quot;Low chance&amp;quot;&lt;br /&gt;
	local cls = &amp;quot;sb-tier&amp;quot;&lt;br /&gt;
	if theme ~= &amp;quot;&amp;quot; then cls = cls .. &amp;quot; &amp;quot; .. theme end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. cls .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
		.. &#039;&amp;lt;div class=&amp;quot;sb-side&amp;quot;&amp;gt;&#039;&lt;br /&gt;
		.. col(high, &amp;quot;sb-col-high&amp;quot;, hi)&lt;br /&gt;
		.. col(low, &amp;quot;sb-col-low&amp;quot;, lo)&lt;br /&gt;
		.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
		.. col(normal, &amp;quot;sb-col-normal&amp;quot;, mid)&lt;br /&gt;
		.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero_counter|HERO|heading=..|note=..}}&lt;br /&gt;
-- Returns the whole counter block (heading + note + cards), or &amp;quot;&amp;quot; when empty.&lt;br /&gt;
function p.hero_counter(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local _, _, _, counter = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(counter) do if iok(c) then codes[#codes + 1] = c end end&lt;br /&gt;
	if #codes == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, &amp;quot;card&amp;quot;); if r then parts[#parts + 1] = r end end&lt;br /&gt;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local heading = frame.args.heading&lt;br /&gt;
	if heading and heading ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;=== &amp;quot; .. heading .. &amp;quot; ===&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;quot; end&lt;br /&gt;
	out[#out + 1] = classdiv(parts, &amp;quot;sb-cards&amp;quot;)&lt;br /&gt;
	return table.concat(out, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item|ITEM|GROUP|label=..|note=..}}&lt;br /&gt;
-- GROUP = favored | unfavored | counter&lt;br /&gt;
function p.item(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local fav, unf, ctr = {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Item == code and RELEASED[o.Hero] then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then fav[#fav + 1] = o.Hero&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unf[#unf + 1] = o.Hero end&lt;br /&gt;
			if o.Counter ~= nil then ctr[#ctr + 1] = o.Hero end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local list = (group == &amp;quot;favored&amp;quot; and fav) or (group == &amp;quot;unfavored&amp;quot; and unf) or (group == &amp;quot;counter&amp;quot; and ctr)&lt;br /&gt;
	if not list then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(list, function(a, b) return (KEY_TO_NAME[a] or a) &amp;lt; (KEY_TO_NAME[b] or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, k in ipairs(list) do local r = render_hero(frame, k); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local pre = &amp;quot;&amp;quot;&lt;br /&gt;
	local label = frame.args.label&lt;br /&gt;
	if label and label ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	return pre .. classdiv(parts, &amp;quot;sb-icons&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item_in_pool|ITEM}} -&amp;gt; &amp;quot;1&amp;quot; if in the Street Brawl pool, else &amp;quot;&amp;quot;&lt;br /&gt;
function p.item_in_pool(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do if c == code then return &amp;quot;1&amp;quot; end end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98143</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98143"/>
		<updated>2026-07-21T00:41:43Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Weight column widths 30/60/10 (High/Middle/Low chance) (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.sb-group {&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
}&lt;br /&gt;
.sb-group:first-child {&lt;br /&gt;
	margin-top: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-label {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-icons {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 4px 10px;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common {&lt;br /&gt;
	margin-top: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25BE&amp;quot;;&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
	opacity: 0.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common.mw-collapsed .sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25B8&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-body {&lt;br /&gt;
	line-height: 1.9;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Three-column tier layout: High / Middle / Low chance */&lt;br /&gt;
.sb-tier {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: stretch;&lt;br /&gt;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex: 1 1 0;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	padding: 3px 8px;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-body {&lt;br /&gt;
	flex: 1;&lt;br /&gt;
	padding: 6px 8px;&lt;br /&gt;
	line-height: 1.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
	align-content: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Per-chance colour + tints (drive every theme). flex-grow sets the 30/60/10 width split. */&lt;br /&gt;
.sb-col-high {&lt;br /&gt;
	flex-grow: 30;&lt;br /&gt;
	--chance: #4f8f36;&lt;br /&gt;
	--tint: rgba(90, 150, 60, 0.12);&lt;br /&gt;
	--tint-soft: rgba(90, 150, 60, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-normal {&lt;br /&gt;
	flex-grow: 60;&lt;br /&gt;
	--chance: #b28b28;&lt;br /&gt;
	--tint: rgba(190, 150, 45, 0.12);&lt;br /&gt;
	--tint-soft: rgba(190, 150, 45, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-low {&lt;br /&gt;
	flex-grow: 10;&lt;br /&gt;
	--chance: #9c3f37;&lt;br /&gt;
	--tint: rgba(170, 65, 55, 0.12);&lt;br /&gt;
	--tint-soft: rgba(170, 65, 55, 0.07);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Default theme &amp;quot;Fill&amp;quot;: colored header bar + tinted body */&lt;br /&gt;
.sb-col {&lt;br /&gt;
	background: var(--tint);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	background: var(--chance);&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Border&amp;quot;: colored header bar + no body tint + colored border */&lt;br /&gt;
.sb-theme-border .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Heading&amp;quot;: label sits OUTSIDE the box as a plain uncolored subheading; the box (border + soft tint) is the body */&lt;br /&gt;
.sb-theme-head .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	overflow: visible;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: inherit;&lt;br /&gt;
	font-size: 1.05em;&lt;br /&gt;
	padding: 0 0 3px 2px;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-body {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Accent&amp;quot;: thick colored left stripe + soft tint + colored heading text */&lt;br /&gt;
.sb-theme-accent .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border-left: 4px solid var(--chance);&lt;br /&gt;
	border-radius: 0 6px 6px 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-accent .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
	.sb-tier {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems?diff=98142</id>
		<title>Template:HeroStreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems?diff=98142"/>
		<updated>2026-07-21T00:34:29Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Adopt three-column High/Middle/Low chance tier layout (Heading theme, ItemBoxes); update intro; retire favored/unfavored/common groups (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;templatestyles src=&amp;quot;Template:HeroStreetBrawl/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
In [[Street Brawl]], every hero draws items from a shared pool, but some items are weighted to appear more often for a given hero and others less often. For each tier below, that tier&#039;s items are grouped by how likely they are to be offered to {{{1}}} — &#039;&#039;&#039;High&#039;&#039;&#039;, &#039;&#039;&#039;Middle&#039;&#039;&#039;, or &#039;&#039;&#039;Low&#039;&#039;&#039; chance.&lt;br /&gt;
&lt;br /&gt;
=== Tier 1 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|{{{1}}}|1|theme=sb-theme-head|style=card}}&lt;br /&gt;
&lt;br /&gt;
=== Tier 2 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|{{{1}}}|2|theme=sb-theme-head|style=card}}&lt;br /&gt;
&lt;br /&gt;
=== Tier 3 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|{{{1}}}|3|theme=sb-theme-head|style=card}}&lt;br /&gt;
&lt;br /&gt;
=== Tier 4 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|{{{1}}}|4|theme=sb-theme-head|style=card}}&lt;br /&gt;
&lt;br /&gt;
=== Legendary ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|{{{1}}}|5|theme=sb-theme-head|style=card}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero_counter|{{{1}}}|heading=Counter items|note=When facing {{{1}}} in Street Brawl, the enemy team is more likely to be offered these items as counters.}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=98141</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=98141"/>
		<updated>2026-07-21T00:34:03Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Default card size to 0.875 so counter cards match the tier columns (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local sb = mw.loadJsonData(&amp;quot;Data:StreetBrawlData.json&amp;quot;)[&amp;quot;item-buckets&amp;quot;]&lt;br /&gt;
local items = mw.loadJsonData(&amp;quot;Data:ItemData.json&amp;quot;)&lt;br /&gt;
local heroes = mw.loadJsonData(&amp;quot;Data:HeroData.json&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Slot display order: Weapon -&amp;gt; Vitality (Armor) -&amp;gt; Spirit (Tech)&lt;br /&gt;
local SLOT_RANK = { Weapon = 1, Armor = 2, Tech = 3 }&lt;br /&gt;
-- Default card scale passed to ItemBox (tier columns and counter cards).&lt;br /&gt;
local CARD_SIZE = &amp;quot;0.875&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local NAME_TO_KEY, KEY_TO_NAME, RELEASED = {}, {}, {}&lt;br /&gt;
for key, h in pairs(heroes) do&lt;br /&gt;
	if type(h) == &amp;quot;table&amp;quot; and h.Name then&lt;br /&gt;
		KEY_TO_NAME[key] = h.Name&lt;br /&gt;
		NAME_TO_KEY[mw.ustring.lower(h.Name)] = key&lt;br /&gt;
		if not h.InDevelopment and not h.IsDisabled then RELEASED[key] = true end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_key(input)&lt;br /&gt;
	if not input then return nil end&lt;br /&gt;
	input = mw.text.trim(input)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if heroes[input] then return input end&lt;br /&gt;
	return NAME_TO_KEY[mw.ustring.lower(input)]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function iname(code) local it = items[code]; return it and it.Name or nil end&lt;br /&gt;
-- A &amp;quot;real&amp;quot; item: exists, has a display name, and is not disabled/removed.&lt;br /&gt;
local function iok(code)&lt;br /&gt;
	local it = items[code]&lt;br /&gt;
	return it ~= nil and it.Name ~= nil and it.IsDisabled ~= true&lt;br /&gt;
end&lt;br /&gt;
local function itier(code)&lt;br /&gt;
	local it = items[code]; if not it then return nil end&lt;br /&gt;
	if it.StreetBrawl == true then return 5 end&lt;br /&gt;
	return it.Tier&lt;br /&gt;
end&lt;br /&gt;
local function islot(code) local it = items[code]; return it and it.Slot end&lt;br /&gt;
local function icost(code)&lt;br /&gt;
	local it = items[code]; local c = it and it.Cost&lt;br /&gt;
	return type(c) == &amp;quot;number&amp;quot; and c or math.huge&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Sort order: slot (Weapon -&amp;gt; Armor -&amp;gt; Tech), then cost ascending, then name.&lt;br /&gt;
local function item_less(a, b)&lt;br /&gt;
	local ra = SLOT_RANK[islot(a)] or 99&lt;br /&gt;
	local rb = SLOT_RANK[islot(b)] or 99&lt;br /&gt;
	if ra ~= rb then return ra &amp;lt; rb end&lt;br /&gt;
	local ca, cb = icost(a), icost(b)&lt;br /&gt;
	if ca ~= cb then return ca &amp;lt; cb end&lt;br /&gt;
	return (iname(a) or a) &amp;lt; (iname(b) or b)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function render_item(frame, code, style, size)&lt;br /&gt;
	local name = iname(code); if not name then return nil end&lt;br /&gt;
	if style == &amp;quot;icon&amp;quot; then return frame:expandTemplate{title = &amp;quot;ItemIcon&amp;quot;, args = {name}} end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;ItemBox&amp;quot;, args = {name, showTierTag = &amp;quot;true&amp;quot;, size = size or CARD_SIZE}}&lt;br /&gt;
end&lt;br /&gt;
local function render_hero(frame, key)&lt;br /&gt;
	local name = KEY_TO_NAME[key]; if not name then return nil end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;HeroIcon&amp;quot;, args = {name}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Lays rendered members out in a container with the given class (styled via CSS).&lt;br /&gt;
local function classdiv(parts, class)&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. class .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(parts) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_sets(hkey)&lt;br /&gt;
	local favored, unfavored, special, counter = {}, {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Hero == hkey then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then favored[o.Item] = true; special[o.Item] = true&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unfavored[o.Item] = true; special[o.Item] = true end&lt;br /&gt;
			if o.Counter ~= nil then counter[#counter + 1] = o.Item end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return favored, unfavored, special, counter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function item_code(input)&lt;br /&gt;
	input = mw.text.trim(input or &amp;quot;&amp;quot;)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if items[input] then return input end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input and v.IsDisabled ~= true then return k end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input then return k end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero|HERO|GROUP|TIER|label=..|collapse=yes|style=card|icon}}&lt;br /&gt;
-- GROUP = favored | unfavored | common   (use hero_counter for counters)&lt;br /&gt;
-- Legacy: superseded by p.tier, kept for reference.&lt;br /&gt;
function p.hero(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
	local tier = tonumber(frame.args[3])&lt;br /&gt;
	local style = frame.args.style&lt;br /&gt;
	if not style or style == &amp;quot;&amp;quot; then style = (group == &amp;quot;common&amp;quot;) and &amp;quot;icon&amp;quot; or &amp;quot;card&amp;quot; end&lt;br /&gt;
	local collapse = (frame.args.collapse == &amp;quot;yes&amp;quot; or frame.args.collapse == &amp;quot;true&amp;quot;)&lt;br /&gt;
	local label = frame.args.label or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local favored, unfavored, special = hero_sets(hkey)&lt;br /&gt;
	local pred&lt;br /&gt;
	if group == &amp;quot;favored&amp;quot; then pred = function(c) return favored[c] end&lt;br /&gt;
	elseif group == &amp;quot;unfavored&amp;quot; then pred = function(c) return unfavored[c] end&lt;br /&gt;
	elseif group == &amp;quot;common&amp;quot; then pred = function(c) return not special[c] end&lt;br /&gt;
	else return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) and pred(c) then codes[#codes + 1] = c end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, style); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	if collapse then&lt;br /&gt;
		local id = &amp;quot;sbcommon-&amp;quot; .. hkey .. &amp;quot;-&amp;quot; .. tostring(tier or 0)&lt;br /&gt;
		local head = (label ~= &amp;quot;&amp;quot; and label) or &amp;quot;Common&amp;quot;&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-common mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-head mw-customtoggle-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039; .. head .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-body mw-collapsible-content&amp;quot;&amp;gt;&#039; .. table.concat(parts, &amp;quot; · &amp;quot;) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local row_class = (style == &amp;quot;icon&amp;quot;) and &amp;quot;sb-icons&amp;quot; or &amp;quot;sb-cards&amp;quot;&lt;br /&gt;
	local out = &#039;&amp;lt;div class=&amp;quot;sb-group&amp;quot;&amp;gt;&#039;&lt;br /&gt;
	if label ~= &amp;quot;&amp;quot; then out = out .. &#039;&amp;lt;div class=&amp;quot;sb-label&amp;quot;&amp;gt;&#039; .. label .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
	return out .. classdiv(parts, row_class) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|tier|HERO|TIER|style=icon|card|size=..|theme=..|high=..|middle=..|low=..}}&lt;br /&gt;
-- Renders one tier as three columns: High chance (favored), Middle chance&lt;br /&gt;
-- (the leftover pool), Low chance (unfavored). Empty columns still render.&lt;br /&gt;
function p.tier(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local tier = tonumber(frame.args[2])&lt;br /&gt;
	local style = (frame.args.style == &amp;quot;card&amp;quot;) and &amp;quot;card&amp;quot; or &amp;quot;icon&amp;quot;&lt;br /&gt;
	local size = frame.args.size&lt;br /&gt;
	local theme = frame.args.theme or &amp;quot;&amp;quot;&lt;br /&gt;
	local favored, unfavored = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local high, normal, low = {}, {}, {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) then&lt;br /&gt;
			if favored[c] then high[#high + 1] = c&lt;br /&gt;
			elseif unfavored[c] then low[#low + 1] = c&lt;br /&gt;
			else normal[#normal + 1] = c end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(high, item_less)&lt;br /&gt;
	table.sort(normal, item_less)&lt;br /&gt;
	table.sort(low, item_less)&lt;br /&gt;
&lt;br /&gt;
	local body_class = (style == &amp;quot;card&amp;quot;) and &amp;quot;sb-col-body sb-col-cards&amp;quot; or &amp;quot;sb-col-body&amp;quot;&lt;br /&gt;
	local sep = (style == &amp;quot;card&amp;quot;) and &amp;quot;&amp;quot; or &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local function col(codes, cls, head)&lt;br /&gt;
		local parts = {}&lt;br /&gt;
		for _, c in ipairs(codes) do local r = render_item(frame, c, style, size); if r then parts[#parts + 1] = r end end&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-col &#039; .. cls .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-col-head&amp;quot;&amp;gt;&#039; .. head .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;&#039; .. body_class .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(parts, sep) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local hi = frame.args.high or &amp;quot;High chance&amp;quot;&lt;br /&gt;
	local mid = frame.args.middle or &amp;quot;Middle chance&amp;quot;&lt;br /&gt;
	local lo = frame.args.low or &amp;quot;Low chance&amp;quot;&lt;br /&gt;
	local cls = &amp;quot;sb-tier&amp;quot;&lt;br /&gt;
	if theme ~= &amp;quot;&amp;quot; then cls = cls .. &amp;quot; &amp;quot; .. theme end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. cls .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
		.. col(high, &amp;quot;sb-col-high&amp;quot;, hi)&lt;br /&gt;
		.. col(normal, &amp;quot;sb-col-normal&amp;quot;, mid)&lt;br /&gt;
		.. col(low, &amp;quot;sb-col-low&amp;quot;, lo)&lt;br /&gt;
		.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero_counter|HERO|heading=..|note=..}}&lt;br /&gt;
-- Returns the whole counter block (heading + note + cards), or &amp;quot;&amp;quot; when empty.&lt;br /&gt;
function p.hero_counter(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local _, _, _, counter = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(counter) do if iok(c) then codes[#codes + 1] = c end end&lt;br /&gt;
	if #codes == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, &amp;quot;card&amp;quot;); if r then parts[#parts + 1] = r end end&lt;br /&gt;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local heading = frame.args.heading&lt;br /&gt;
	if heading and heading ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;=== &amp;quot; .. heading .. &amp;quot; ===&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;quot; end&lt;br /&gt;
	out[#out + 1] = classdiv(parts, &amp;quot;sb-cards&amp;quot;)&lt;br /&gt;
	return table.concat(out, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item|ITEM|GROUP|label=..|note=..}}&lt;br /&gt;
-- GROUP = favored | unfavored | counter&lt;br /&gt;
function p.item(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local fav, unf, ctr = {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Item == code and RELEASED[o.Hero] then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then fav[#fav + 1] = o.Hero&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unf[#unf + 1] = o.Hero end&lt;br /&gt;
			if o.Counter ~= nil then ctr[#ctr + 1] = o.Hero end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local list = (group == &amp;quot;favored&amp;quot; and fav) or (group == &amp;quot;unfavored&amp;quot; and unf) or (group == &amp;quot;counter&amp;quot; and ctr)&lt;br /&gt;
	if not list then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(list, function(a, b) return (KEY_TO_NAME[a] or a) &amp;lt; (KEY_TO_NAME[b] or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, k in ipairs(list) do local r = render_hero(frame, k); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local pre = &amp;quot;&amp;quot;&lt;br /&gt;
	local label = frame.args.label&lt;br /&gt;
	if label and label ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	return pre .. classdiv(parts, &amp;quot;sb-icons&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item_in_pool|ITEM}} -&amp;gt; &amp;quot;1&amp;quot; if in the Street Brawl pool, else &amp;quot;&amp;quot;&lt;br /&gt;
function p.item_in_pool(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do if c == code then return &amp;quot;1&amp;quot; end end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Vergir?diff=98140</id>
		<title>User:Vergir</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Vergir?diff=98140"/>
		<updated>2026-07-21T00:22:37Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Add Warden per-tier style test (ItemBoxes 0.875, one theme per tier) (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Abrams =&lt;br /&gt;
{{HeroStreetBrawl|Abrams}}&lt;br /&gt;
&lt;br /&gt;
= Holliday =&lt;br /&gt;
{{HeroStreetBrawl|Holliday}}&lt;br /&gt;
&lt;br /&gt;
= Doorman =&lt;br /&gt;
{{HeroStreetBrawl|The Doorman}}&lt;br /&gt;
&lt;br /&gt;
= Vindicta =&lt;br /&gt;
{{HeroStreetBrawl|Vindicta}}&lt;br /&gt;
&lt;br /&gt;
= McGinnis =&lt;br /&gt;
{{HeroStreetBrawl|McGinnis}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;templatestyles src=&amp;quot;Template:HeroStreetBrawl/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
= Street Brawl tier layout bake-off (Holliday, Tier 1) =&lt;br /&gt;
&lt;br /&gt;
== Fill (current) ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.845, flush 4-per-row)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|style=card|size=0.875}}&lt;br /&gt;
&lt;br /&gt;
== Border ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-border}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.845, flush 4-per-row)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-border|style=card|size=0.875}}&lt;br /&gt;
&lt;br /&gt;
== Heading ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-head}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.845, flush 4-per-row)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-head|style=card|size=0.875}}&lt;br /&gt;
&lt;br /&gt;
== Accent ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-accent}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.845, flush 4-per-row)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-accent|style=card|size=0.875}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;templatestyles src=&amp;quot;Template:HeroStreetBrawl/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
== Warden — one style per tier (ItemBoxes, 0.875) ==&lt;br /&gt;
&lt;br /&gt;
=== Tier 1 — Fill ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Warden|1|style=card|size=0.875}}&lt;br /&gt;
&lt;br /&gt;
=== Tier 2 — Border ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Warden|2|theme=sb-theme-border|style=card|size=0.875}}&lt;br /&gt;
&lt;br /&gt;
=== Tier 3 — Heading ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Warden|3|theme=sb-theme-head|style=card|size=0.875}}&lt;br /&gt;
&lt;br /&gt;
=== Tier 4 — Accent ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Warden|4|theme=sb-theme-accent|style=card|size=0.875}}&lt;br /&gt;
&lt;br /&gt;
=== Legendary — Fill ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Warden|5|style=card|size=0.875}}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98138</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98138"/>
		<updated>2026-07-21T00:09:06Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Card columns: pack wrapped rows to the top (align-content) so stretched columns do not spread rows apart (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.sb-group {&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
}&lt;br /&gt;
.sb-group:first-child {&lt;br /&gt;
	margin-top: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-label {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-icons {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 4px 10px;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common {&lt;br /&gt;
	margin-top: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25BE&amp;quot;;&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
	opacity: 0.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common.mw-collapsed .sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25B8&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-body {&lt;br /&gt;
	line-height: 1.9;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Three-column tier layout: High / Middle / Low chance */&lt;br /&gt;
.sb-tier {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: stretch;&lt;br /&gt;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex: 1 1 0;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	padding: 3px 8px;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-body {&lt;br /&gt;
	flex: 1;&lt;br /&gt;
	padding: 6px 8px;&lt;br /&gt;
	line-height: 1.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
	align-content: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Per-chance colour + tints (drive every theme) */&lt;br /&gt;
.sb-col-high {&lt;br /&gt;
	--chance: #4f8f36;&lt;br /&gt;
	--tint: rgba(90, 150, 60, 0.12);&lt;br /&gt;
	--tint-soft: rgba(90, 150, 60, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-normal {&lt;br /&gt;
	--chance: #b28b28;&lt;br /&gt;
	--tint: rgba(190, 150, 45, 0.12);&lt;br /&gt;
	--tint-soft: rgba(190, 150, 45, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-low {&lt;br /&gt;
	--chance: #9c3f37;&lt;br /&gt;
	--tint: rgba(170, 65, 55, 0.12);&lt;br /&gt;
	--tint-soft: rgba(170, 65, 55, 0.07);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Default theme &amp;quot;Fill&amp;quot;: colored header bar + tinted body */&lt;br /&gt;
.sb-col {&lt;br /&gt;
	background: var(--tint);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	background: var(--chance);&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Border&amp;quot;: colored header bar + no body tint + colored border */&lt;br /&gt;
.sb-theme-border .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Heading&amp;quot;: label sits OUTSIDE the box as a plain uncolored subheading; the box (border + soft tint) is the body */&lt;br /&gt;
.sb-theme-head .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	overflow: visible;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: inherit;&lt;br /&gt;
	font-size: 1.05em;&lt;br /&gt;
	padding: 0 0 3px 2px;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-body {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Accent&amp;quot;: thick colored left stripe + soft tint + colored heading text */&lt;br /&gt;
.sb-theme-accent .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border-left: 4px solid var(--chance);&lt;br /&gt;
	border-radius: 0 6px 6px 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-accent .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
	.sb-tier {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Vergir?diff=98122</id>
		<title>User:Vergir</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Vergir?diff=98122"/>
		<updated>2026-07-20T23:32:28Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Clean sandbox (remove old prototype/probe/variant scratch); set bake-off ItemBoxes to flush 0.845 (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Abrams =&lt;br /&gt;
{{HeroStreetBrawl|Abrams}}&lt;br /&gt;
&lt;br /&gt;
= Holliday =&lt;br /&gt;
{{HeroStreetBrawl|Holliday}}&lt;br /&gt;
&lt;br /&gt;
= Doorman =&lt;br /&gt;
{{HeroStreetBrawl|The Doorman}}&lt;br /&gt;
&lt;br /&gt;
= Vindicta =&lt;br /&gt;
{{HeroStreetBrawl|Vindicta}}&lt;br /&gt;
&lt;br /&gt;
= McGinnis =&lt;br /&gt;
{{HeroStreetBrawl|McGinnis}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;templatestyles src=&amp;quot;Template:HeroStreetBrawl/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
= Street Brawl tier layout bake-off (Holliday, Tier 1) =&lt;br /&gt;
&lt;br /&gt;
== Fill (current) ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.845, flush 4-per-row)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|style=card|size=0.845}}&lt;br /&gt;
&lt;br /&gt;
== Border ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-border}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.845, flush 4-per-row)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-border|style=card|size=0.845}}&lt;br /&gt;
&lt;br /&gt;
== Heading ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-head}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.845, flush 4-per-row)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-head|style=card|size=0.845}}&lt;br /&gt;
&lt;br /&gt;
== Accent ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-accent}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.845, flush 4-per-row)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-accent|style=card|size=0.845}}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98104</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98104"/>
		<updated>2026-07-20T22:47:28Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Heading theme: move label outside the box as an uncolored subheading; bodies stretch to equal height (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.sb-group {&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
}&lt;br /&gt;
.sb-group:first-child {&lt;br /&gt;
	margin-top: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-label {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-icons {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 4px 10px;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common {&lt;br /&gt;
	margin-top: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25BE&amp;quot;;&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
	opacity: 0.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common.mw-collapsed .sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25B8&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-body {&lt;br /&gt;
	line-height: 1.9;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Three-column tier layout: High / Middle / Low chance */&lt;br /&gt;
.sb-tier {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: stretch;&lt;br /&gt;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex: 1 1 0;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	padding: 3px 8px;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-body {&lt;br /&gt;
	flex: 1;&lt;br /&gt;
	padding: 6px 8px;&lt;br /&gt;
	line-height: 1.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Per-chance colour + tints (drive every theme) */&lt;br /&gt;
.sb-col-high {&lt;br /&gt;
	--chance: #4f8f36;&lt;br /&gt;
	--tint: rgba(90, 150, 60, 0.12);&lt;br /&gt;
	--tint-soft: rgba(90, 150, 60, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-normal {&lt;br /&gt;
	--chance: #b28b28;&lt;br /&gt;
	--tint: rgba(190, 150, 45, 0.12);&lt;br /&gt;
	--tint-soft: rgba(190, 150, 45, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-low {&lt;br /&gt;
	--chance: #9c3f37;&lt;br /&gt;
	--tint: rgba(170, 65, 55, 0.12);&lt;br /&gt;
	--tint-soft: rgba(170, 65, 55, 0.07);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Default theme &amp;quot;Fill&amp;quot;: colored header bar + tinted body */&lt;br /&gt;
.sb-col {&lt;br /&gt;
	background: var(--tint);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	background: var(--chance);&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Border&amp;quot;: colored header bar + no body tint + colored border */&lt;br /&gt;
.sb-theme-border .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Heading&amp;quot;: label sits OUTSIDE the box as a plain uncolored subheading; the box (border + soft tint) is the body */&lt;br /&gt;
.sb-theme-head .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	overflow: visible;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: inherit;&lt;br /&gt;
	font-size: 1.05em;&lt;br /&gt;
	padding: 0 0 3px 2px;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-body {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Accent&amp;quot;: thick colored left stripe + soft tint + colored heading text */&lt;br /&gt;
.sb-theme-accent .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border-left: 4px solid var(--chance);&lt;br /&gt;
	border-radius: 0 6px 6px 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-accent .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
	.sb-tier {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Vergir?diff=98097</id>
		<title>User:Vergir</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Vergir?diff=98097"/>
		<updated>2026-07-20T22:01:21Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Add tier layout bake-off: Holliday T1 in Fill/Border/Heading/Accent x list/boxes (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Template:HeroStreetBrawl/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;THREE-COLUMN TIER PROTOTYPE&#039;&#039;&#039; (High / Normal / Low chance)&lt;br /&gt;
&lt;br /&gt;
Holliday — Tier 1&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1}}&lt;br /&gt;
&lt;br /&gt;
Holliday — Legendary&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|5}}&lt;br /&gt;
&lt;br /&gt;
McGinnis — Tier 2 (biggest Normal column)&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|McGinnis|2}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
MAXROWS: {{#invoke:StreetBrawlItems|debug_counts}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;COMMON LABEL VARIANTS&#039;&#039;&#039; — test only, inline styles, sample items. Click each to expand. (Delete this block + the old PROBE block when done.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Plain bold label (current — matches Favored/Unfavored, no affordance)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv1&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;Common&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv1&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Bold label + trailing caret&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv2&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;Common &amp;lt;span style=&amp;quot;font-size:0.8em;color:#888;&amp;quot;&amp;gt;&amp;amp;#9662;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv2&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Bold label + leading caret&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv3&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:0.8em;color:#888;&amp;quot;&amp;gt;&amp;amp;#9656;&amp;lt;/span&amp;gt; Common&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv3&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Bold label + faint (show)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv4&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;Common &amp;lt;span style=&amp;quot;font-weight:normal;font-size:0.85em;color:#888;&amp;quot;&amp;gt;(show)&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv4&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Bold label + automatic [Expand]/[Collapse] link (flips on click)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;Common&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6. Grey header bar (original wikitable style)&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Common&lt;br /&gt;
|-&lt;br /&gt;
| {{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;PROBE — Holliday Legendary (favored + common)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|Holliday|favored|5|label=Favored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|Holliday|common|5|label=Common|collapse=yes}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
= Abrams =&lt;br /&gt;
{{HeroStreetBrawl|Abrams}}&lt;br /&gt;
&lt;br /&gt;
= Holliday =&lt;br /&gt;
{{HeroStreetBrawl|Holliday}}&lt;br /&gt;
&lt;br /&gt;
= Doorman =&lt;br /&gt;
{{HeroStreetBrawl|The Doorman}}&lt;br /&gt;
&lt;br /&gt;
= Vindicta =&lt;br /&gt;
{{HeroStreetBrawl|Vindicta}}&lt;br /&gt;
&lt;br /&gt;
= McGinnis =&lt;br /&gt;
{{HeroStreetBrawl|McGinnis}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;templatestyles src=&amp;quot;Template:HeroStreetBrawl/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
= Street Brawl tier layout bake-off (Holliday, Tier 1) =&lt;br /&gt;
&lt;br /&gt;
== Fill (current) ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.75)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|style=card|size=0.75}}&lt;br /&gt;
&lt;br /&gt;
== Border ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-border}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.75)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-border|style=card|size=0.75}}&lt;br /&gt;
&lt;br /&gt;
== Heading ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-head}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.75)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-head|style=card|size=0.75}}&lt;br /&gt;
&lt;br /&gt;
== Accent ==&lt;br /&gt;
&#039;&#039;&#039;Item list&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-accent}}&lt;br /&gt;
&#039;&#039;&#039;ItemBoxes (0.75)&#039;&#039;&#039;&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-accent|style=card|size=0.75}}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=98096</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=98096"/>
		<updated>2026-07-20T22:00:00Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: p.tier: support style=icon|card, size, theme class, Middle-chance label (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local sb = mw.loadJsonData(&amp;quot;Data:StreetBrawlData.json&amp;quot;)[&amp;quot;item-buckets&amp;quot;]&lt;br /&gt;
local items = mw.loadJsonData(&amp;quot;Data:ItemData.json&amp;quot;)&lt;br /&gt;
local heroes = mw.loadJsonData(&amp;quot;Data:HeroData.json&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Slot display order: Weapon -&amp;gt; Vitality (Armor) -&amp;gt; Spirit (Tech)&lt;br /&gt;
local SLOT_RANK = { Weapon = 1, Armor = 2, Tech = 3 }&lt;br /&gt;
-- Card scale passed to ItemBox for favored/unfavored/counter cards.&lt;br /&gt;
local CARD_SIZE = &amp;quot;0.8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local NAME_TO_KEY, KEY_TO_NAME, RELEASED = {}, {}, {}&lt;br /&gt;
for key, h in pairs(heroes) do&lt;br /&gt;
	if type(h) == &amp;quot;table&amp;quot; and h.Name then&lt;br /&gt;
		KEY_TO_NAME[key] = h.Name&lt;br /&gt;
		NAME_TO_KEY[mw.ustring.lower(h.Name)] = key&lt;br /&gt;
		if not h.InDevelopment and not h.IsDisabled then RELEASED[key] = true end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_key(input)&lt;br /&gt;
	if not input then return nil end&lt;br /&gt;
	input = mw.text.trim(input)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if heroes[input] then return input end&lt;br /&gt;
	return NAME_TO_KEY[mw.ustring.lower(input)]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function iname(code) local it = items[code]; return it and it.Name or nil end&lt;br /&gt;
-- A &amp;quot;real&amp;quot; item: exists, has a display name, and is not disabled/removed.&lt;br /&gt;
local function iok(code)&lt;br /&gt;
	local it = items[code]&lt;br /&gt;
	return it ~= nil and it.Name ~= nil and it.IsDisabled ~= true&lt;br /&gt;
end&lt;br /&gt;
local function itier(code)&lt;br /&gt;
	local it = items[code]; if not it then return nil end&lt;br /&gt;
	if it.StreetBrawl == true then return 5 end&lt;br /&gt;
	return it.Tier&lt;br /&gt;
end&lt;br /&gt;
local function islot(code) local it = items[code]; return it and it.Slot end&lt;br /&gt;
local function icost(code)&lt;br /&gt;
	local it = items[code]; local c = it and it.Cost&lt;br /&gt;
	return type(c) == &amp;quot;number&amp;quot; and c or math.huge&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Sort order: slot (Weapon -&amp;gt; Armor -&amp;gt; Tech), then cost ascending, then name.&lt;br /&gt;
local function item_less(a, b)&lt;br /&gt;
	local ra = SLOT_RANK[islot(a)] or 99&lt;br /&gt;
	local rb = SLOT_RANK[islot(b)] or 99&lt;br /&gt;
	if ra ~= rb then return ra &amp;lt; rb end&lt;br /&gt;
	local ca, cb = icost(a), icost(b)&lt;br /&gt;
	if ca ~= cb then return ca &amp;lt; cb end&lt;br /&gt;
	return (iname(a) or a) &amp;lt; (iname(b) or b)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function render_item(frame, code, style, size)&lt;br /&gt;
	local name = iname(code); if not name then return nil end&lt;br /&gt;
	if style == &amp;quot;icon&amp;quot; then return frame:expandTemplate{title = &amp;quot;ItemIcon&amp;quot;, args = {name}} end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;ItemBox&amp;quot;, args = {name, showTierTag = &amp;quot;true&amp;quot;, size = size or CARD_SIZE}}&lt;br /&gt;
end&lt;br /&gt;
local function render_hero(frame, key)&lt;br /&gt;
	local name = KEY_TO_NAME[key]; if not name then return nil end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;HeroIcon&amp;quot;, args = {name}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Lays rendered members out in a container with the given class (styled via CSS).&lt;br /&gt;
local function classdiv(parts, class)&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. class .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(parts) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_sets(hkey)&lt;br /&gt;
	local favored, unfavored, special, counter = {}, {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Hero == hkey then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then favored[o.Item] = true; special[o.Item] = true&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unfavored[o.Item] = true; special[o.Item] = true end&lt;br /&gt;
			if o.Counter ~= nil then counter[#counter + 1] = o.Item end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return favored, unfavored, special, counter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function item_code(input)&lt;br /&gt;
	input = mw.text.trim(input or &amp;quot;&amp;quot;)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if items[input] then return input end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input and v.IsDisabled ~= true then return k end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input then return k end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero|HERO|GROUP|TIER|label=..|collapse=yes|style=card|icon}}&lt;br /&gt;
-- GROUP = favored | unfavored | common   (use hero_counter for counters)&lt;br /&gt;
function p.hero(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
	local tier = tonumber(frame.args[3])&lt;br /&gt;
	local style = frame.args.style&lt;br /&gt;
	if not style or style == &amp;quot;&amp;quot; then style = (group == &amp;quot;common&amp;quot;) and &amp;quot;icon&amp;quot; or &amp;quot;card&amp;quot; end&lt;br /&gt;
	local collapse = (frame.args.collapse == &amp;quot;yes&amp;quot; or frame.args.collapse == &amp;quot;true&amp;quot;)&lt;br /&gt;
	local label = frame.args.label or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local favored, unfavored, special = hero_sets(hkey)&lt;br /&gt;
	local pred&lt;br /&gt;
	if group == &amp;quot;favored&amp;quot; then pred = function(c) return favored[c] end&lt;br /&gt;
	elseif group == &amp;quot;unfavored&amp;quot; then pred = function(c) return unfavored[c] end&lt;br /&gt;
	elseif group == &amp;quot;common&amp;quot; then pred = function(c) return not special[c] end&lt;br /&gt;
	else return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) and pred(c) then codes[#codes + 1] = c end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, style); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	if collapse then&lt;br /&gt;
		-- Common: a div collapsible with the label inside as a custom toggle (no native&lt;br /&gt;
		-- toggle -&amp;gt; no brackets). The caret flips off the container&#039;s mw-collapsed state.&lt;br /&gt;
		local id = &amp;quot;sbcommon-&amp;quot; .. hkey .. &amp;quot;-&amp;quot; .. tostring(tier or 0)&lt;br /&gt;
		local head = (label ~= &amp;quot;&amp;quot; and label) or &amp;quot;Common&amp;quot;&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-common mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-head mw-customtoggle-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039; .. head .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-body mw-collapsible-content&amp;quot;&amp;gt;&#039; .. table.concat(parts, &amp;quot; · &amp;quot;) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local row_class = (style == &amp;quot;icon&amp;quot;) and &amp;quot;sb-icons&amp;quot; or &amp;quot;sb-cards&amp;quot;&lt;br /&gt;
	local out = &#039;&amp;lt;div class=&amp;quot;sb-group&amp;quot;&amp;gt;&#039;&lt;br /&gt;
	if label ~= &amp;quot;&amp;quot; then out = out .. &#039;&amp;lt;div class=&amp;quot;sb-label&amp;quot;&amp;gt;&#039; .. label .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
	return out .. classdiv(parts, row_class) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|tier|HERO|TIER|style=icon|card|size=..|theme=..|high=..|middle=..|low=..}}&lt;br /&gt;
-- Renders one tier as three columns: High chance (favored), Middle chance&lt;br /&gt;
-- (the leftover pool), Low chance (unfavored). Empty columns still render.&lt;br /&gt;
function p.tier(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local tier = tonumber(frame.args[2])&lt;br /&gt;
	local style = (frame.args.style == &amp;quot;card&amp;quot;) and &amp;quot;card&amp;quot; or &amp;quot;icon&amp;quot;&lt;br /&gt;
	local size = frame.args.size&lt;br /&gt;
	local theme = frame.args.theme or &amp;quot;&amp;quot;&lt;br /&gt;
	local favored, unfavored = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local high, normal, low = {}, {}, {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) then&lt;br /&gt;
			if favored[c] then high[#high + 1] = c&lt;br /&gt;
			elseif unfavored[c] then low[#low + 1] = c&lt;br /&gt;
			else normal[#normal + 1] = c end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(high, item_less)&lt;br /&gt;
	table.sort(normal, item_less)&lt;br /&gt;
	table.sort(low, item_less)&lt;br /&gt;
&lt;br /&gt;
	local body_class = (style == &amp;quot;card&amp;quot;) and &amp;quot;sb-col-body sb-col-cards&amp;quot; or &amp;quot;sb-col-body&amp;quot;&lt;br /&gt;
	local sep = (style == &amp;quot;card&amp;quot;) and &amp;quot;&amp;quot; or &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local function col(codes, cls, head)&lt;br /&gt;
		local parts = {}&lt;br /&gt;
		for _, c in ipairs(codes) do local r = render_item(frame, c, style, size); if r then parts[#parts + 1] = r end end&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-col &#039; .. cls .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-col-head&amp;quot;&amp;gt;&#039; .. head .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;&#039; .. body_class .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(parts, sep) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local hi = frame.args.high or &amp;quot;High chance&amp;quot;&lt;br /&gt;
	local mid = frame.args.middle or &amp;quot;Middle chance&amp;quot;&lt;br /&gt;
	local lo = frame.args.low or &amp;quot;Low chance&amp;quot;&lt;br /&gt;
	local cls = &amp;quot;sb-tier&amp;quot;&lt;br /&gt;
	if theme ~= &amp;quot;&amp;quot; then cls = cls .. &amp;quot; &amp;quot; .. theme end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. cls .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
		.. col(high, &amp;quot;sb-col-high&amp;quot;, hi)&lt;br /&gt;
		.. col(normal, &amp;quot;sb-col-normal&amp;quot;, mid)&lt;br /&gt;
		.. col(low, &amp;quot;sb-col-low&amp;quot;, lo)&lt;br /&gt;
		.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero_counter|HERO|heading=..|note=..}}&lt;br /&gt;
-- Returns the whole counter block (heading + note + cards), or &amp;quot;&amp;quot; when empty.&lt;br /&gt;
function p.hero_counter(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local _, _, _, counter = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(counter) do if iok(c) then codes[#codes + 1] = c end end&lt;br /&gt;
	if #codes == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, &amp;quot;card&amp;quot;); if r then parts[#parts + 1] = r end end&lt;br /&gt;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local heading = frame.args.heading&lt;br /&gt;
	if heading and heading ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;=== &amp;quot; .. heading .. &amp;quot; ===&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;quot; end&lt;br /&gt;
	out[#out + 1] = classdiv(parts, &amp;quot;sb-cards&amp;quot;)&lt;br /&gt;
	return table.concat(out, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item|ITEM|GROUP|label=..|note=..}}&lt;br /&gt;
-- GROUP = favored | unfavored | counter&lt;br /&gt;
function p.item(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local fav, unf, ctr = {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Item == code and RELEASED[o.Hero] then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then fav[#fav + 1] = o.Hero&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unf[#unf + 1] = o.Hero end&lt;br /&gt;
			if o.Counter ~= nil then ctr[#ctr + 1] = o.Hero end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local list = (group == &amp;quot;favored&amp;quot; and fav) or (group == &amp;quot;unfavored&amp;quot; and unf) or (group == &amp;quot;counter&amp;quot; and ctr)&lt;br /&gt;
	if not list then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(list, function(a, b) return (KEY_TO_NAME[a] or a) &amp;lt; (KEY_TO_NAME[b] or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, k in ipairs(list) do local r = render_hero(frame, k); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local pre = &amp;quot;&amp;quot;&lt;br /&gt;
	local label = frame.args.label&lt;br /&gt;
	if label and label ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	return pre .. classdiv(parts, &amp;quot;sb-icons&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item_in_pool|ITEM}} -&amp;gt; &amp;quot;1&amp;quot; if in the Street Brawl pool, else &amp;quot;&amp;quot;&lt;br /&gt;
function p.item_in_pool(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do if c == code then return &amp;quot;1&amp;quot; end end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98095</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98095"/>
		<updated>2026-07-20T21:58:58Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Tier columns: per-chance color vars, add Border/Heading/Accent themes and card body layout (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.sb-group {&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
}&lt;br /&gt;
.sb-group:first-child {&lt;br /&gt;
	margin-top: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-label {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-icons {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 4px 10px;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common {&lt;br /&gt;
	margin-top: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25BE&amp;quot;;&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
	opacity: 0.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common.mw-collapsed .sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25B8&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-body {&lt;br /&gt;
	line-height: 1.9;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Three-column tier layout: High / Middle / Low chance */&lt;br /&gt;
.sb-tier {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: stretch;&lt;br /&gt;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col {&lt;br /&gt;
	flex: 1 1 0;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	padding: 3px 8px;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-body {&lt;br /&gt;
	padding: 6px 8px;&lt;br /&gt;
	line-height: 1.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Per-chance colour + tints (drive every theme) */&lt;br /&gt;
.sb-col-high {&lt;br /&gt;
	--chance: #4f8f36;&lt;br /&gt;
	--tint: rgba(90, 150, 60, 0.12);&lt;br /&gt;
	--tint-soft: rgba(90, 150, 60, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-normal {&lt;br /&gt;
	--chance: #b28b28;&lt;br /&gt;
	--tint: rgba(190, 150, 45, 0.12);&lt;br /&gt;
	--tint-soft: rgba(190, 150, 45, 0.07);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-low {&lt;br /&gt;
	--chance: #9c3f37;&lt;br /&gt;
	--tint: rgba(170, 65, 55, 0.12);&lt;br /&gt;
	--tint-soft: rgba(170, 65, 55, 0.07);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Default theme &amp;quot;Fill&amp;quot;: colored header bar + tinted body */&lt;br /&gt;
.sb-col {&lt;br /&gt;
	background: var(--tint);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	background: var(--chance);&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Border&amp;quot;: colored header bar + no body tint + colored border */&lt;br /&gt;
.sb-theme-border .sb-col {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Heading&amp;quot;: header like an h3/h4 (colored text, no bar) + bordered soft-tint body */&lt;br /&gt;
.sb-theme-head .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border: 1px solid var(--chance);&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-head .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: var(--chance);&lt;br /&gt;
	font-size: 1.05em;&lt;br /&gt;
	padding: 4px 8px 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Theme &amp;quot;Accent&amp;quot;: thick colored left stripe + soft tint + colored heading text */&lt;br /&gt;
.sb-theme-accent .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border-left: 4px solid var(--chance);&lt;br /&gt;
	border-radius: 0 6px 6px 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-accent .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
	.sb-tier {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Vergir?diff=98092</id>
		<title>User:Vergir</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Vergir?diff=98092"/>
		<updated>2026-07-20T21:33:16Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Prototype: three-column High/Normal/Low tier layout for review (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Template:HeroStreetBrawl/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;THREE-COLUMN TIER PROTOTYPE&#039;&#039;&#039; (High / Normal / Low chance)&lt;br /&gt;
&lt;br /&gt;
Holliday — Tier 1&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1}}&lt;br /&gt;
&lt;br /&gt;
Holliday — Legendary&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|5}}&lt;br /&gt;
&lt;br /&gt;
McGinnis — Tier 2 (biggest Normal column)&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|McGinnis|2}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
MAXROWS: {{#invoke:StreetBrawlItems|debug_counts}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;COMMON LABEL VARIANTS&#039;&#039;&#039; — test only, inline styles, sample items. Click each to expand. (Delete this block + the old PROBE block when done.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Plain bold label (current — matches Favored/Unfavored, no affordance)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv1&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;Common&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv1&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Bold label + trailing caret&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv2&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;Common &amp;lt;span style=&amp;quot;font-size:0.8em;color:#888;&amp;quot;&amp;gt;&amp;amp;#9662;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv2&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Bold label + leading caret&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv3&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:0.8em;color:#888;&amp;quot;&amp;gt;&amp;amp;#9656;&amp;lt;/span&amp;gt; Common&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv3&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Bold label + faint (show)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv4&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;Common &amp;lt;span style=&amp;quot;font-weight:normal;font-size:0.85em;color:#888;&amp;quot;&amp;gt;(show)&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv4&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Bold label + automatic [Expand]/[Collapse] link (flips on click)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;Common&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6. Grey header bar (original wikitable style)&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Common&lt;br /&gt;
|-&lt;br /&gt;
| {{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;PROBE — Holliday Legendary (favored + common)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|Holliday|favored|5|label=Favored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|Holliday|common|5|label=Common|collapse=yes}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
= Abrams =&lt;br /&gt;
{{HeroStreetBrawl|Abrams}}&lt;br /&gt;
&lt;br /&gt;
= Holliday =&lt;br /&gt;
{{HeroStreetBrawl|Holliday}}&lt;br /&gt;
&lt;br /&gt;
= Doorman =&lt;br /&gt;
{{HeroStreetBrawl|The Doorman}}&lt;br /&gt;
&lt;br /&gt;
= Vindicta =&lt;br /&gt;
{{HeroStreetBrawl|Vindicta}}&lt;br /&gt;
&lt;br /&gt;
= McGinnis =&lt;br /&gt;
{{HeroStreetBrawl|McGinnis}}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98091</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98091"/>
		<updated>2026-07-20T21:32:08Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Add three-column tier layout styles (High/Normal/Low chance blocks) (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.sb-group {&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
}&lt;br /&gt;
.sb-group:first-child {&lt;br /&gt;
	margin-top: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-label {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
	font-size: 1.1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-cards {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: flex-start;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-icons {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 4px 10px;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common {&lt;br /&gt;
	margin-top: 0.75em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head {&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	cursor: pointer;&lt;br /&gt;
	margin-bottom: 0.25em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25BE&amp;quot;;&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
	opacity: 0.6;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common.mw-collapsed .sb-common-head::after {&lt;br /&gt;
	content: &amp;quot; \25B8&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-common-body {&lt;br /&gt;
	line-height: 1.9;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Three-column tier layout: High / Normal / Low chance */&lt;br /&gt;
.sb-tier {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	align-items: stretch;&lt;br /&gt;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col {&lt;br /&gt;
	flex: 1 1 0;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-head {&lt;br /&gt;
	padding: 3px 8px;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-body {&lt;br /&gt;
	padding: 6px 8px;&lt;br /&gt;
	line-height: 1.8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-high {&lt;br /&gt;
	background: rgba(90, 150, 60, 0.12);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-high .sb-col-head {&lt;br /&gt;
	background: #4f8f36;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-normal {&lt;br /&gt;
	background: rgba(190, 150, 45, 0.12);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-normal .sb-col-head {&lt;br /&gt;
	background: #b28b28;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.sb-col-low {&lt;br /&gt;
	background: rgba(170, 65, 55, 0.12);&lt;br /&gt;
}&lt;br /&gt;
.sb-col-low .sb-col-head {&lt;br /&gt;
	background: #9c3f37;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 720px) {&lt;br /&gt;
	.sb-tier {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=98090</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=98090"/>
		<updated>2026-07-20T21:31:39Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Add p.tier: three-column High/Normal/Low chance layout for a tier (prototype) (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local sb = mw.loadJsonData(&amp;quot;Data:StreetBrawlData.json&amp;quot;)[&amp;quot;item-buckets&amp;quot;]&lt;br /&gt;
local items = mw.loadJsonData(&amp;quot;Data:ItemData.json&amp;quot;)&lt;br /&gt;
local heroes = mw.loadJsonData(&amp;quot;Data:HeroData.json&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Slot display order: Weapon -&amp;gt; Vitality (Armor) -&amp;gt; Spirit (Tech)&lt;br /&gt;
local SLOT_RANK = { Weapon = 1, Armor = 2, Tech = 3 }&lt;br /&gt;
-- Card scale passed to ItemBox for favored/unfavored/counter cards.&lt;br /&gt;
local CARD_SIZE = &amp;quot;0.8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local NAME_TO_KEY, KEY_TO_NAME, RELEASED = {}, {}, {}&lt;br /&gt;
for key, h in pairs(heroes) do&lt;br /&gt;
	if type(h) == &amp;quot;table&amp;quot; and h.Name then&lt;br /&gt;
		KEY_TO_NAME[key] = h.Name&lt;br /&gt;
		NAME_TO_KEY[mw.ustring.lower(h.Name)] = key&lt;br /&gt;
		if not h.InDevelopment and not h.IsDisabled then RELEASED[key] = true end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_key(input)&lt;br /&gt;
	if not input then return nil end&lt;br /&gt;
	input = mw.text.trim(input)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if heroes[input] then return input end&lt;br /&gt;
	return NAME_TO_KEY[mw.ustring.lower(input)]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function iname(code) local it = items[code]; return it and it.Name or nil end&lt;br /&gt;
-- A &amp;quot;real&amp;quot; item: exists, has a display name, and is not disabled/removed.&lt;br /&gt;
local function iok(code)&lt;br /&gt;
	local it = items[code]&lt;br /&gt;
	return it ~= nil and it.Name ~= nil and it.IsDisabled ~= true&lt;br /&gt;
end&lt;br /&gt;
local function itier(code)&lt;br /&gt;
	local it = items[code]; if not it then return nil end&lt;br /&gt;
	if it.StreetBrawl == true then return 5 end&lt;br /&gt;
	return it.Tier&lt;br /&gt;
end&lt;br /&gt;
local function islot(code) local it = items[code]; return it and it.Slot end&lt;br /&gt;
local function icost(code)&lt;br /&gt;
	local it = items[code]; local c = it and it.Cost&lt;br /&gt;
	return type(c) == &amp;quot;number&amp;quot; and c or math.huge&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Sort order: slot (Weapon -&amp;gt; Armor -&amp;gt; Tech), then cost ascending, then name.&lt;br /&gt;
local function item_less(a, b)&lt;br /&gt;
	local ra = SLOT_RANK[islot(a)] or 99&lt;br /&gt;
	local rb = SLOT_RANK[islot(b)] or 99&lt;br /&gt;
	if ra ~= rb then return ra &amp;lt; rb end&lt;br /&gt;
	local ca, cb = icost(a), icost(b)&lt;br /&gt;
	if ca ~= cb then return ca &amp;lt; cb end&lt;br /&gt;
	return (iname(a) or a) &amp;lt; (iname(b) or b)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function render_item(frame, code, style)&lt;br /&gt;
	local name = iname(code); if not name then return nil end&lt;br /&gt;
	if style == &amp;quot;icon&amp;quot; then return frame:expandTemplate{title = &amp;quot;ItemIcon&amp;quot;, args = {name}} end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;ItemBox&amp;quot;, args = {name, showTierTag = &amp;quot;true&amp;quot;, size = CARD_SIZE}}&lt;br /&gt;
end&lt;br /&gt;
local function render_hero(frame, key)&lt;br /&gt;
	local name = KEY_TO_NAME[key]; if not name then return nil end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;HeroIcon&amp;quot;, args = {name}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Lays rendered members out in a container with the given class (styled via CSS).&lt;br /&gt;
local function classdiv(parts, class)&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. class .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(parts) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_sets(hkey)&lt;br /&gt;
	local favored, unfavored, special, counter = {}, {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Hero == hkey then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then favored[o.Item] = true; special[o.Item] = true&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unfavored[o.Item] = true; special[o.Item] = true end&lt;br /&gt;
			if o.Counter ~= nil then counter[#counter + 1] = o.Item end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return favored, unfavored, special, counter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function item_code(input)&lt;br /&gt;
	input = mw.text.trim(input or &amp;quot;&amp;quot;)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if items[input] then return input end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input and v.IsDisabled ~= true then return k end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input then return k end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero|HERO|GROUP|TIER|label=..|collapse=yes|style=card|icon}}&lt;br /&gt;
-- GROUP = favored | unfavored | common   (use hero_counter for counters)&lt;br /&gt;
function p.hero(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
	local tier = tonumber(frame.args[3])&lt;br /&gt;
	local style = frame.args.style&lt;br /&gt;
	if not style or style == &amp;quot;&amp;quot; then style = (group == &amp;quot;common&amp;quot;) and &amp;quot;icon&amp;quot; or &amp;quot;card&amp;quot; end&lt;br /&gt;
	local collapse = (frame.args.collapse == &amp;quot;yes&amp;quot; or frame.args.collapse == &amp;quot;true&amp;quot;)&lt;br /&gt;
	local label = frame.args.label or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local favored, unfavored, special = hero_sets(hkey)&lt;br /&gt;
	local pred&lt;br /&gt;
	if group == &amp;quot;favored&amp;quot; then pred = function(c) return favored[c] end&lt;br /&gt;
	elseif group == &amp;quot;unfavored&amp;quot; then pred = function(c) return unfavored[c] end&lt;br /&gt;
	elseif group == &amp;quot;common&amp;quot; then pred = function(c) return not special[c] end&lt;br /&gt;
	else return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) and pred(c) then codes[#codes + 1] = c end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, style); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	if collapse then&lt;br /&gt;
		-- Common: a div collapsible with the label inside as a custom toggle (no native&lt;br /&gt;
		-- toggle -&amp;gt; no brackets). The caret flips off the container&#039;s mw-collapsed state.&lt;br /&gt;
		local id = &amp;quot;sbcommon-&amp;quot; .. hkey .. &amp;quot;-&amp;quot; .. tostring(tier or 0)&lt;br /&gt;
		local head = (label ~= &amp;quot;&amp;quot; and label) or &amp;quot;Common&amp;quot;&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-common mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-head mw-customtoggle-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039; .. head .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-body mw-collapsible-content&amp;quot;&amp;gt;&#039; .. table.concat(parts, &amp;quot; · &amp;quot;) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local row_class = (style == &amp;quot;icon&amp;quot;) and &amp;quot;sb-icons&amp;quot; or &amp;quot;sb-cards&amp;quot;&lt;br /&gt;
	local out = &#039;&amp;lt;div class=&amp;quot;sb-group&amp;quot;&amp;gt;&#039;&lt;br /&gt;
	if label ~= &amp;quot;&amp;quot; then out = out .. &#039;&amp;lt;div class=&amp;quot;sb-label&amp;quot;&amp;gt;&#039; .. label .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
	return out .. classdiv(parts, row_class) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|tier|HERO|TIER|high=..|normal=..|low=..}}&lt;br /&gt;
-- Renders one tier as three columns: High chance (favored), Normal chance&lt;br /&gt;
-- (the leftover pool), Low chance (unfavored). Empty columns still render.&lt;br /&gt;
function p.tier(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local tier = tonumber(frame.args[2])&lt;br /&gt;
	local favored, unfavored = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local high, normal, low = {}, {}, {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) then&lt;br /&gt;
			if favored[c] then high[#high + 1] = c&lt;br /&gt;
			elseif unfavored[c] then low[#low + 1] = c&lt;br /&gt;
			else normal[#normal + 1] = c end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(high, item_less)&lt;br /&gt;
	table.sort(normal, item_less)&lt;br /&gt;
	table.sort(low, item_less)&lt;br /&gt;
&lt;br /&gt;
	local function col(codes, cls, head)&lt;br /&gt;
		local parts = {}&lt;br /&gt;
		for _, c in ipairs(codes) do local r = render_item(frame, c, &amp;quot;icon&amp;quot;); if r then parts[#parts + 1] = r end end&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-col &#039; .. cls .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-col-head&amp;quot;&amp;gt;&#039; .. head .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-col-body&amp;quot;&amp;gt;&#039; .. table.concat(parts, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local hi = frame.args.high or &amp;quot;High chance&amp;quot;&lt;br /&gt;
	local no = frame.args.normal or &amp;quot;Normal chance&amp;quot;&lt;br /&gt;
	local lo = frame.args.low or &amp;quot;Low chance&amp;quot;&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;sb-tier&amp;quot;&amp;gt;&#039;&lt;br /&gt;
		.. col(high, &amp;quot;sb-col-high&amp;quot;, hi)&lt;br /&gt;
		.. col(normal, &amp;quot;sb-col-normal&amp;quot;, no)&lt;br /&gt;
		.. col(low, &amp;quot;sb-col-low&amp;quot;, lo)&lt;br /&gt;
		.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero_counter|HERO|heading=..|note=..}}&lt;br /&gt;
-- Returns the whole counter block (heading + note + cards), or &amp;quot;&amp;quot; when empty.&lt;br /&gt;
function p.hero_counter(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local _, _, _, counter = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(counter) do if iok(c) then codes[#codes + 1] = c end end&lt;br /&gt;
	if #codes == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, &amp;quot;card&amp;quot;); if r then parts[#parts + 1] = r end end&lt;br /&gt;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local heading = frame.args.heading&lt;br /&gt;
	if heading and heading ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;=== &amp;quot; .. heading .. &amp;quot; ===&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;quot; end&lt;br /&gt;
	out[#out + 1] = classdiv(parts, &amp;quot;sb-cards&amp;quot;)&lt;br /&gt;
	return table.concat(out, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item|ITEM|GROUP|label=..|note=..}}&lt;br /&gt;
-- GROUP = favored | unfavored | counter&lt;br /&gt;
function p.item(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local fav, unf, ctr = {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Item == code and RELEASED[o.Hero] then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then fav[#fav + 1] = o.Hero&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unf[#unf + 1] = o.Hero end&lt;br /&gt;
			if o.Counter ~= nil then ctr[#ctr + 1] = o.Hero end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local list = (group == &amp;quot;favored&amp;quot; and fav) or (group == &amp;quot;unfavored&amp;quot; and unf) or (group == &amp;quot;counter&amp;quot; and ctr)&lt;br /&gt;
	if not list then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(list, function(a, b) return (KEY_TO_NAME[a] or a) &amp;lt; (KEY_TO_NAME[b] or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, k in ipairs(list) do local r = render_hero(frame, k); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local pre = &amp;quot;&amp;quot;&lt;br /&gt;
	local label = frame.args.label&lt;br /&gt;
	if label and label ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	return pre .. classdiv(parts, &amp;quot;sb-icons&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item_in_pool|ITEM}} -&amp;gt; &amp;quot;1&amp;quot; if in the Street Brawl pool, else &amp;quot;&amp;quot;&lt;br /&gt;
function p.item_in_pool(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do if c == code then return &amp;quot;1&amp;quot; end end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=98017</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=98017"/>
		<updated>2026-07-20T19:20:55Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Remove temporary max-row counter (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local sb = mw.loadJsonData(&amp;quot;Data:StreetBrawlData.json&amp;quot;)[&amp;quot;item-buckets&amp;quot;]&lt;br /&gt;
local items = mw.loadJsonData(&amp;quot;Data:ItemData.json&amp;quot;)&lt;br /&gt;
local heroes = mw.loadJsonData(&amp;quot;Data:HeroData.json&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Slot display order: Weapon -&amp;gt; Vitality (Armor) -&amp;gt; Spirit (Tech)&lt;br /&gt;
local SLOT_RANK = { Weapon = 1, Armor = 2, Tech = 3 }&lt;br /&gt;
-- Card scale passed to ItemBox for favored/unfavored/counter cards.&lt;br /&gt;
local CARD_SIZE = &amp;quot;0.8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local NAME_TO_KEY, KEY_TO_NAME, RELEASED = {}, {}, {}&lt;br /&gt;
for key, h in pairs(heroes) do&lt;br /&gt;
	if type(h) == &amp;quot;table&amp;quot; and h.Name then&lt;br /&gt;
		KEY_TO_NAME[key] = h.Name&lt;br /&gt;
		NAME_TO_KEY[mw.ustring.lower(h.Name)] = key&lt;br /&gt;
		if not h.InDevelopment and not h.IsDisabled then RELEASED[key] = true end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_key(input)&lt;br /&gt;
	if not input then return nil end&lt;br /&gt;
	input = mw.text.trim(input)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if heroes[input] then return input end&lt;br /&gt;
	return NAME_TO_KEY[mw.ustring.lower(input)]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function iname(code) local it = items[code]; return it and it.Name or nil end&lt;br /&gt;
-- A &amp;quot;real&amp;quot; item: exists, has a display name, and is not disabled/removed.&lt;br /&gt;
local function iok(code)&lt;br /&gt;
	local it = items[code]&lt;br /&gt;
	return it ~= nil and it.Name ~= nil and it.IsDisabled ~= true&lt;br /&gt;
end&lt;br /&gt;
local function itier(code)&lt;br /&gt;
	local it = items[code]; if not it then return nil end&lt;br /&gt;
	if it.StreetBrawl == true then return 5 end&lt;br /&gt;
	return it.Tier&lt;br /&gt;
end&lt;br /&gt;
local function islot(code) local it = items[code]; return it and it.Slot end&lt;br /&gt;
local function icost(code)&lt;br /&gt;
	local it = items[code]; local c = it and it.Cost&lt;br /&gt;
	return type(c) == &amp;quot;number&amp;quot; and c or math.huge&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Sort order: slot (Weapon -&amp;gt; Armor -&amp;gt; Tech), then cost ascending, then name.&lt;br /&gt;
local function item_less(a, b)&lt;br /&gt;
	local ra = SLOT_RANK[islot(a)] or 99&lt;br /&gt;
	local rb = SLOT_RANK[islot(b)] or 99&lt;br /&gt;
	if ra ~= rb then return ra &amp;lt; rb end&lt;br /&gt;
	local ca, cb = icost(a), icost(b)&lt;br /&gt;
	if ca ~= cb then return ca &amp;lt; cb end&lt;br /&gt;
	return (iname(a) or a) &amp;lt; (iname(b) or b)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function render_item(frame, code, style)&lt;br /&gt;
	local name = iname(code); if not name then return nil end&lt;br /&gt;
	if style == &amp;quot;icon&amp;quot; then return frame:expandTemplate{title = &amp;quot;ItemIcon&amp;quot;, args = {name}} end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;ItemBox&amp;quot;, args = {name, showTierTag = &amp;quot;true&amp;quot;, size = CARD_SIZE}}&lt;br /&gt;
end&lt;br /&gt;
local function render_hero(frame, key)&lt;br /&gt;
	local name = KEY_TO_NAME[key]; if not name then return nil end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;HeroIcon&amp;quot;, args = {name}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Lays rendered members out in a container with the given class (styled via CSS).&lt;br /&gt;
local function classdiv(parts, class)&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. class .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(parts) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_sets(hkey)&lt;br /&gt;
	local favored, unfavored, special, counter = {}, {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Hero == hkey then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then favored[o.Item] = true; special[o.Item] = true&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unfavored[o.Item] = true; special[o.Item] = true end&lt;br /&gt;
			if o.Counter ~= nil then counter[#counter + 1] = o.Item end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return favored, unfavored, special, counter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function item_code(input)&lt;br /&gt;
	input = mw.text.trim(input or &amp;quot;&amp;quot;)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if items[input] then return input end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input and v.IsDisabled ~= true then return k end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input then return k end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero|HERO|GROUP|TIER|label=..|collapse=yes|style=card|icon}}&lt;br /&gt;
-- GROUP = favored | unfavored | common   (use hero_counter for counters)&lt;br /&gt;
function p.hero(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
	local tier = tonumber(frame.args[3])&lt;br /&gt;
	local style = frame.args.style&lt;br /&gt;
	if not style or style == &amp;quot;&amp;quot; then style = (group == &amp;quot;common&amp;quot;) and &amp;quot;icon&amp;quot; or &amp;quot;card&amp;quot; end&lt;br /&gt;
	local collapse = (frame.args.collapse == &amp;quot;yes&amp;quot; or frame.args.collapse == &amp;quot;true&amp;quot;)&lt;br /&gt;
	local label = frame.args.label or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local favored, unfavored, special = hero_sets(hkey)&lt;br /&gt;
	local pred&lt;br /&gt;
	if group == &amp;quot;favored&amp;quot; then pred = function(c) return favored[c] end&lt;br /&gt;
	elseif group == &amp;quot;unfavored&amp;quot; then pred = function(c) return unfavored[c] end&lt;br /&gt;
	elseif group == &amp;quot;common&amp;quot; then pred = function(c) return not special[c] end&lt;br /&gt;
	else return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) and pred(c) then codes[#codes + 1] = c end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, style); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	if collapse then&lt;br /&gt;
		-- Common: a div collapsible with the label inside as a custom toggle (no native&lt;br /&gt;
		-- toggle -&amp;gt; no brackets). The caret flips off the container&#039;s mw-collapsed state.&lt;br /&gt;
		local id = &amp;quot;sbcommon-&amp;quot; .. hkey .. &amp;quot;-&amp;quot; .. tostring(tier or 0)&lt;br /&gt;
		local head = (label ~= &amp;quot;&amp;quot; and label) or &amp;quot;Common&amp;quot;&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-common mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-head mw-customtoggle-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039; .. head .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-body mw-collapsible-content&amp;quot;&amp;gt;&#039; .. table.concat(parts, &amp;quot; · &amp;quot;) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local row_class = (style == &amp;quot;icon&amp;quot;) and &amp;quot;sb-icons&amp;quot; or &amp;quot;sb-cards&amp;quot;&lt;br /&gt;
	local out = &#039;&amp;lt;div class=&amp;quot;sb-group&amp;quot;&amp;gt;&#039;&lt;br /&gt;
	if label ~= &amp;quot;&amp;quot; then out = out .. &#039;&amp;lt;div class=&amp;quot;sb-label&amp;quot;&amp;gt;&#039; .. label .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
	return out .. classdiv(parts, row_class) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero_counter|HERO|heading=..|note=..}}&lt;br /&gt;
-- Returns the whole counter block (heading + note + cards), or &amp;quot;&amp;quot; when empty.&lt;br /&gt;
function p.hero_counter(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local _, _, _, counter = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(counter) do if iok(c) then codes[#codes + 1] = c end end&lt;br /&gt;
	if #codes == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, &amp;quot;card&amp;quot;); if r then parts[#parts + 1] = r end end&lt;br /&gt;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local heading = frame.args.heading&lt;br /&gt;
	if heading and heading ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;=== &amp;quot; .. heading .. &amp;quot; ===&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;quot; end&lt;br /&gt;
	out[#out + 1] = classdiv(parts, &amp;quot;sb-cards&amp;quot;)&lt;br /&gt;
	return table.concat(out, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item|ITEM|GROUP|label=..|note=..}}&lt;br /&gt;
-- GROUP = favored | unfavored | counter&lt;br /&gt;
function p.item(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local fav, unf, ctr = {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Item == code and RELEASED[o.Hero] then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then fav[#fav + 1] = o.Hero&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unf[#unf + 1] = o.Hero end&lt;br /&gt;
			if o.Counter ~= nil then ctr[#ctr + 1] = o.Hero end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local list = (group == &amp;quot;favored&amp;quot; and fav) or (group == &amp;quot;unfavored&amp;quot; and unf) or (group == &amp;quot;counter&amp;quot; and ctr)&lt;br /&gt;
	if not list then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(list, function(a, b) return (KEY_TO_NAME[a] or a) &amp;lt; (KEY_TO_NAME[b] or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, k in ipairs(list) do local r = render_hero(frame, k); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local pre = &amp;quot;&amp;quot;&lt;br /&gt;
	local label = frame.args.label&lt;br /&gt;
	if label and label ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	return pre .. classdiv(parts, &amp;quot;sb-icons&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item_in_pool|ITEM}} -&amp;gt; &amp;quot;1&amp;quot; if in the Street Brawl pool, else &amp;quot;&amp;quot;&lt;br /&gt;
function p.item_in_pool(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do if c == code then return &amp;quot;1&amp;quot; end end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Vergir?diff=98014</id>
		<title>User:Vergir</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Vergir?diff=98014"/>
		<updated>2026-07-20T19:15:21Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Temporary: read max favored/unfavored row size (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MAXROWS: {{#invoke:StreetBrawlItems|debug_counts}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;COMMON LABEL VARIANTS&#039;&#039;&#039; — test only, inline styles, sample items. Click each to expand. (Delete this block + the old PROBE block when done.)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Plain bold label (current — matches Favored/Unfavored, no affordance)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv1&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;Common&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv1&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Bold label + trailing caret&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv2&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;Common &amp;lt;span style=&amp;quot;font-size:0.8em;color:#888;&amp;quot;&amp;gt;&amp;amp;#9662;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv2&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Bold label + leading caret&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv3&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;font-size:0.8em;color:#888;&amp;quot;&amp;gt;&amp;amp;#9656;&amp;lt;/span&amp;gt; Common&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv3&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Bold label + faint (show)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-customtoggle-cv4&amp;quot; style=&amp;quot;font-weight:bold;cursor:pointer;&amp;quot;&amp;gt;Common &amp;lt;span style=&amp;quot;font-weight:normal;font-size:0.85em;color:#888;&amp;quot;&amp;gt;(show)&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;mw-customcollapsible-cv4&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Bold label + automatic [Expand]/[Collapse] link (flips on click)&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;Common&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;{{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6. Grey header bar (original wikitable style)&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Common&lt;br /&gt;
|-&lt;br /&gt;
| {{ItemIcon|Extended Magazine}} | {{ItemIcon|Headshot Booster}} | {{ItemIcon|Extra Health}} | {{ItemIcon|Grit}} | {{ItemIcon|Rapid Rounds}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;&#039;PROBE — Holliday Legendary (favored + common)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|Holliday|favored|5|label=Favored}}&lt;br /&gt;
{{#invoke:StreetBrawlItems|hero|Holliday|common|5|label=Common|collapse=yes}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
= Abrams =&lt;br /&gt;
{{HeroStreetBrawl|Abrams}}&lt;br /&gt;
&lt;br /&gt;
= Holliday =&lt;br /&gt;
{{HeroStreetBrawl|Holliday}}&lt;br /&gt;
&lt;br /&gt;
= Doorman =&lt;br /&gt;
{{HeroStreetBrawl|The Doorman}}&lt;br /&gt;
&lt;br /&gt;
= Vindicta =&lt;br /&gt;
{{HeroStreetBrawl|Vindicta}}&lt;br /&gt;
&lt;br /&gt;
= McGinnis =&lt;br /&gt;
{{HeroStreetBrawl|McGinnis}}&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=98013</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=98013"/>
		<updated>2026-07-20T19:15:02Z</updated>

		<summary type="html">&lt;p&gt;~2026-ShivFlexAlchemical707: Street Brawl cards: pass size=0.8 to ItemBox; add temporary max-row counter for sizing (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local sb = mw.loadJsonData(&amp;quot;Data:StreetBrawlData.json&amp;quot;)[&amp;quot;item-buckets&amp;quot;]&lt;br /&gt;
local items = mw.loadJsonData(&amp;quot;Data:ItemData.json&amp;quot;)&lt;br /&gt;
local heroes = mw.loadJsonData(&amp;quot;Data:HeroData.json&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Slot display order: Weapon -&amp;gt; Vitality (Armor) -&amp;gt; Spirit (Tech)&lt;br /&gt;
local SLOT_RANK = { Weapon = 1, Armor = 2, Tech = 3 }&lt;br /&gt;
-- Card scale passed to ItemBox for favored/unfavored/counter cards.&lt;br /&gt;
local CARD_SIZE = &amp;quot;0.8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local NAME_TO_KEY, KEY_TO_NAME, RELEASED = {}, {}, {}&lt;br /&gt;
for key, h in pairs(heroes) do&lt;br /&gt;
	if type(h) == &amp;quot;table&amp;quot; and h.Name then&lt;br /&gt;
		KEY_TO_NAME[key] = h.Name&lt;br /&gt;
		NAME_TO_KEY[mw.ustring.lower(h.Name)] = key&lt;br /&gt;
		if not h.InDevelopment and not h.IsDisabled then RELEASED[key] = true end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_key(input)&lt;br /&gt;
	if not input then return nil end&lt;br /&gt;
	input = mw.text.trim(input)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if heroes[input] then return input end&lt;br /&gt;
	return NAME_TO_KEY[mw.ustring.lower(input)]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function iname(code) local it = items[code]; return it and it.Name or nil end&lt;br /&gt;
-- A &amp;quot;real&amp;quot; item: exists, has a display name, and is not disabled/removed.&lt;br /&gt;
local function iok(code)&lt;br /&gt;
	local it = items[code]&lt;br /&gt;
	return it ~= nil and it.Name ~= nil and it.IsDisabled ~= true&lt;br /&gt;
end&lt;br /&gt;
local function itier(code)&lt;br /&gt;
	local it = items[code]; if not it then return nil end&lt;br /&gt;
	if it.StreetBrawl == true then return 5 end&lt;br /&gt;
	return it.Tier&lt;br /&gt;
end&lt;br /&gt;
local function islot(code) local it = items[code]; return it and it.Slot end&lt;br /&gt;
local function icost(code)&lt;br /&gt;
	local it = items[code]; local c = it and it.Cost&lt;br /&gt;
	return type(c) == &amp;quot;number&amp;quot; and c or math.huge&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Sort order: slot (Weapon -&amp;gt; Armor -&amp;gt; Tech), then cost ascending, then name.&lt;br /&gt;
local function item_less(a, b)&lt;br /&gt;
	local ra = SLOT_RANK[islot(a)] or 99&lt;br /&gt;
	local rb = SLOT_RANK[islot(b)] or 99&lt;br /&gt;
	if ra ~= rb then return ra &amp;lt; rb end&lt;br /&gt;
	local ca, cb = icost(a), icost(b)&lt;br /&gt;
	if ca ~= cb then return ca &amp;lt; cb end&lt;br /&gt;
	return (iname(a) or a) &amp;lt; (iname(b) or b)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function render_item(frame, code, style)&lt;br /&gt;
	local name = iname(code); if not name then return nil end&lt;br /&gt;
	if style == &amp;quot;icon&amp;quot; then return frame:expandTemplate{title = &amp;quot;ItemIcon&amp;quot;, args = {name}} end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;ItemBox&amp;quot;, args = {name, showTierTag = &amp;quot;true&amp;quot;, size = CARD_SIZE}}&lt;br /&gt;
end&lt;br /&gt;
local function render_hero(frame, key)&lt;br /&gt;
	local name = KEY_TO_NAME[key]; if not name then return nil end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;HeroIcon&amp;quot;, args = {name}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Lays rendered members out in a container with the given class (styled via CSS).&lt;br /&gt;
local function classdiv(parts, class)&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. class .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(parts) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hero_sets(hkey)&lt;br /&gt;
	local favored, unfavored, special, counter = {}, {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Hero == hkey then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then favored[o.Item] = true; special[o.Item] = true&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unfavored[o.Item] = true; special[o.Item] = true end&lt;br /&gt;
			if o.Counter ~= nil then counter[#counter + 1] = o.Item end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return favored, unfavored, special, counter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function item_code(input)&lt;br /&gt;
	input = mw.text.trim(input or &amp;quot;&amp;quot;)&lt;br /&gt;
	if input == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	if items[input] then return input end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input and v.IsDisabled ~= true then return k end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(items) do&lt;br /&gt;
		if type(v) == &amp;quot;table&amp;quot; and v.Name == input then return k end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero|HERO|GROUP|TIER|label=..|collapse=yes|style=card|icon}}&lt;br /&gt;
-- GROUP = favored | unfavored | common   (use hero_counter for counters)&lt;br /&gt;
function p.hero(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
	local tier = tonumber(frame.args[3])&lt;br /&gt;
	local style = frame.args.style&lt;br /&gt;
	if not style or style == &amp;quot;&amp;quot; then style = (group == &amp;quot;common&amp;quot;) and &amp;quot;icon&amp;quot; or &amp;quot;card&amp;quot; end&lt;br /&gt;
	local collapse = (frame.args.collapse == &amp;quot;yes&amp;quot; or frame.args.collapse == &amp;quot;true&amp;quot;)&lt;br /&gt;
	local label = frame.args.label or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local favored, unfavored, special = hero_sets(hkey)&lt;br /&gt;
	local pred&lt;br /&gt;
	if group == &amp;quot;favored&amp;quot; then pred = function(c) return favored[c] end&lt;br /&gt;
	elseif group == &amp;quot;unfavored&amp;quot; then pred = function(c) return unfavored[c] end&lt;br /&gt;
	elseif group == &amp;quot;common&amp;quot; then pred = function(c) return not special[c] end&lt;br /&gt;
	else return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
		if iok(c) and (tier == nil or itier(c) == tier) and pred(c) then codes[#codes + 1] = c end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, style); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	if collapse then&lt;br /&gt;
		-- Common: a div collapsible with the label inside as a custom toggle (no native&lt;br /&gt;
		-- toggle -&amp;gt; no brackets). The caret flips off the container&#039;s mw-collapsed state.&lt;br /&gt;
		local id = &amp;quot;sbcommon-&amp;quot; .. hkey .. &amp;quot;-&amp;quot; .. tostring(tier or 0)&lt;br /&gt;
		local head = (label ~= &amp;quot;&amp;quot; and label) or &amp;quot;Common&amp;quot;&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-common mw-collapsible mw-collapsed&amp;quot; id=&amp;quot;mw-customcollapsible-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-head mw-customtoggle-&#039; .. id .. &#039;&amp;quot;&amp;gt;&#039; .. head .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;div class=&amp;quot;sb-common-body mw-collapsible-content&amp;quot;&amp;gt;&#039; .. table.concat(parts, &amp;quot; · &amp;quot;) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local row_class = (style == &amp;quot;icon&amp;quot;) and &amp;quot;sb-icons&amp;quot; or &amp;quot;sb-cards&amp;quot;&lt;br /&gt;
	local out = &#039;&amp;lt;div class=&amp;quot;sb-group&amp;quot;&amp;gt;&#039;&lt;br /&gt;
	if label ~= &amp;quot;&amp;quot; then out = out .. &#039;&amp;lt;div class=&amp;quot;sb-label&amp;quot;&amp;gt;&#039; .. label .. &#039;&amp;lt;/div&amp;gt;&#039; end&lt;br /&gt;
	return out .. classdiv(parts, row_class) .. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero_counter|HERO|heading=..|note=..}}&lt;br /&gt;
-- Returns the whole counter block (heading + note + cards), or &amp;quot;&amp;quot; when empty.&lt;br /&gt;
function p.hero_counter(frame)&lt;br /&gt;
	local hkey = hero_key(frame.args[1]); if not hkey then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local _, _, _, counter = hero_sets(hkey)&lt;br /&gt;
&lt;br /&gt;
	local codes = {}&lt;br /&gt;
	for _, c in ipairs(counter) do if iok(c) then codes[#codes + 1] = c end end&lt;br /&gt;
	if #codes == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(codes, item_less)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, c in ipairs(codes) do local r = render_item(frame, c, &amp;quot;card&amp;quot;); if r then parts[#parts + 1] = r end end&lt;br /&gt;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local heading = frame.args.heading&lt;br /&gt;
	if heading and heading ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;=== &amp;quot; .. heading .. &amp;quot; ===&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then out[#out + 1] = &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;quot; end&lt;br /&gt;
	out[#out + 1] = classdiv(parts, &amp;quot;sb-cards&amp;quot;)&lt;br /&gt;
	return table.concat(out, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item|ITEM|GROUP|label=..|note=..}}&lt;br /&gt;
-- GROUP = favored | unfavored | counter&lt;br /&gt;
function p.item(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local group = mw.text.trim(frame.args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	local fav, unf, ctr = {}, {}, {}&lt;br /&gt;
	for _, o in ipairs(sb.Outliers) do&lt;br /&gt;
		if o.Item == code and RELEASED[o.Hero] then&lt;br /&gt;
			if o.Bucket == &amp;quot;Good&amp;quot; then fav[#fav + 1] = o.Hero&lt;br /&gt;
			elseif type(o.Weight) == &amp;quot;number&amp;quot; and o.Weight &amp;lt; 1 then unf[#unf + 1] = o.Hero end&lt;br /&gt;
			if o.Counter ~= nil then ctr[#ctr + 1] = o.Hero end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local list = (group == &amp;quot;favored&amp;quot; and fav) or (group == &amp;quot;unfavored&amp;quot; and unf) or (group == &amp;quot;counter&amp;quot; and ctr)&lt;br /&gt;
	if not list then return &amp;quot;&amp;quot; end&lt;br /&gt;
	table.sort(list, function(a, b) return (KEY_TO_NAME[a] or a) &amp;lt; (KEY_TO_NAME[b] or b) end)&lt;br /&gt;
&lt;br /&gt;
	local parts = {}&lt;br /&gt;
	for _, k in ipairs(list) do local r = render_hero(frame, k); if r then parts[#parts + 1] = r end end&lt;br /&gt;
	if #parts == 0 then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	local pre = &amp;quot;&amp;quot;&lt;br /&gt;
	local label = frame.args.label&lt;br /&gt;
	if label and label ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&#039;&amp;quot; .. label .. &amp;quot;&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	local note = frame.args.note&lt;br /&gt;
	if note and note ~= &amp;quot;&amp;quot; then pre = pre .. &amp;quot;&#039;&#039;&amp;quot; .. note .. &amp;quot;&#039;&#039;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	return pre .. classdiv(parts, &amp;quot;sb-icons&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|item_in_pool|ITEM}} -&amp;gt; &amp;quot;1&amp;quot; if in the Street Brawl pool, else &amp;quot;&amp;quot;&lt;br /&gt;
function p.item_in_pool(frame)&lt;br /&gt;
	local code = item_code(frame.args[1]); if not code then return &amp;quot;&amp;quot; end&lt;br /&gt;
	for _, c in ipairs(sb.AvailableItems) do if c == code then return &amp;quot;1&amp;quot; end end&lt;br /&gt;
	return &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- TEMPORARY: report the largest favored / unfavored group across released heroes.&lt;br /&gt;
function p.debug_counts(frame)&lt;br /&gt;
	local maxfav, favwho = 0, &amp;quot;&amp;quot;&lt;br /&gt;
	local maxunf, unfwho = 0, &amp;quot;&amp;quot;&lt;br /&gt;
	for hkey in pairs(RELEASED) do&lt;br /&gt;
		local favored, unfavored = hero_sets(hkey)&lt;br /&gt;
		for tier = 1, 5 do&lt;br /&gt;
			local fc, uc = 0, 0&lt;br /&gt;
			for _, c in ipairs(sb.AvailableItems) do&lt;br /&gt;
				if iok(c) and itier(c) == tier then&lt;br /&gt;
					if favored[c] then fc = fc + 1 end&lt;br /&gt;
					if unfavored[c] then uc = uc + 1 end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if fc &amp;gt; maxfav then maxfav = fc; favwho = (KEY_TO_NAME[hkey] or hkey) .. &amp;quot; T&amp;quot; .. tier end&lt;br /&gt;
			if uc &amp;gt; maxunf then maxunf = uc; unfwho = (KEY_TO_NAME[hkey] or hkey) .. &amp;quot; T&amp;quot; .. tier end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &amp;quot;maxFavored=&amp;quot; .. maxfav .. &amp;quot; (&amp;quot; .. favwho .. &amp;quot;); maxUnfavored=&amp;quot; .. maxunf .. &amp;quot; (&amp;quot; .. unfwho .. &amp;quot;)&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>~2026-ShivFlexAlchemical707</name></author>
	</entry>
</feed>