<?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-ChargeOrbActive711</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-ChargeOrbActive711"/>
	<link rel="alternate" type="text/html" href="https://deadlock.wiki/Special:Contributions/~2026-ChargeOrbActive711"/>
	<updated>2026-09-06T06:29:19Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://deadlock.wiki/Template:ItemBox/styles.css?diff=98280</id>
		<title>Template:ItemBox/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:ItemBox/styles.css?diff=98280"/>
		<updated>2026-07-21T15:06:29Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: Fix mobile name overflow: reset inherited overflow-wrap/word-break on the item name so long words (e.g. Expansion) stay whole and wrap like desktop instead of breaking mid-word onto a clipped third line (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
/* The whole card scales off one knob: font-size on .itembox (1em = 10px base) */&lt;br /&gt;
.itembox,&lt;br /&gt;
.itembox * {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    border: 0;&lt;br /&gt;
    box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
.itembox {&lt;br /&gt;
    --itembox-ink: #10130D;&lt;br /&gt;
    --itembox-weapon: #EC981a;&lt;br /&gt;
    --itembox-vitality: #7CBB1E;&lt;br /&gt;
    --itembox-spirit: #CE91FF;&lt;br /&gt;
    --itembox-imbue-fg: #E8C9FF;&lt;br /&gt;
    --itembox-imbue-bg: #623585;&lt;br /&gt;
    --itembox-font: &#039;Retail Demo&#039;, sans-serif;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    font-size: 10px;&lt;br /&gt;
    width: 8em;&lt;br /&gt;
    height: 12.5em;&lt;br /&gt;
    border-radius: 0.6em;&lt;br /&gt;
    box-shadow: 0.2em 0.2em 1.2em #00000097;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    transition-duration: 0.1s;&lt;br /&gt;
    transition-property: opacity, transform, filter;&lt;br /&gt;
}&lt;br /&gt;
.itembox-background {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
.itembox-card {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background-size: cover;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-tier-1.itembox-weapon .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/3/3e/Weapon_Card_T1.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-2.itembox-weapon .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/9/96/Weapon_Card_T2.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-3.itembox-weapon .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/5/5d/Weapon_Card_T3.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4.itembox-weapon .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/a/a6/Weapon_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-5.itembox-weapon .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/a/a6/Weapon_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-1.itembox-vitality .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/7/75/Armor_Card_T1.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-2.itembox-vitality .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/0/05/Armor_Card_T2.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-3.itembox-vitality .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/7/7c/Armor_Card_T3.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4.itembox-vitality .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/1/18/Armor_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-5.itembox-vitality .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/1/18/Armor_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-1.itembox-spirit .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/a/af/Tech_Card_T1.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-2.itembox-spirit .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/a/ac/Tech_Card_T2.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-3.itembox-spirit .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/6/67/Tech_Card_T3.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4.itembox-spirit .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/f/f5/Tech_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-5.itembox-spirit .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/f/f5/Tech_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-icon-area {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    aspect-ratio: 1 / 1;&lt;br /&gt;
}&lt;br /&gt;
.itembox-icon {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    background-size: cover;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    mask-size: cover;&lt;br /&gt;
    mask-repeat: no-repeat;&lt;br /&gt;
    mask-mode: luminance;&lt;br /&gt;
}&lt;br /&gt;
.itembox-icon &amp;gt; span,&lt;br /&gt;
.itembox-icon &amp;gt; span &amp;gt; span,&lt;br /&gt;
.itembox-icon picture {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
.itembox-icon img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    max-width: 100%;&lt;br /&gt;
    max-height: 100%;&lt;br /&gt;
    object-fit: cover;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-icon-v1 .itembox-icon {&lt;br /&gt;
    mask-image: url(&#039;/images/1/10/Icon_mask01.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-icon-v2 .itembox-icon {&lt;br /&gt;
    mask-image: url(&#039;/images/6/6f/Icon_mask02.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-icon-v3 .itembox-icon {&lt;br /&gt;
    mask-image: url(&#039;/images/9/96/Icon_mask03.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-tier-badge {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    width: 2.8em;&lt;br /&gt;
    height: 2.8em;&lt;br /&gt;
    transform: scale(1.4);&lt;br /&gt;
    transform-origin: top right;&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
.itembox-show-tier .itembox-tier-badge {&lt;br /&gt;
    visibility: visible;&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-badge-fill {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    mask-size: 2.2em;&lt;br /&gt;
    mask-repeat: no-repeat;&lt;br /&gt;
    mask-position: right 0;&lt;br /&gt;
    mask-image: url(&#039;/images/6/61/Tier_corner_cap.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-badge-shadow {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background-size: 2.2em;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-position: right 0;&lt;br /&gt;
    background-image: url(&#039;/images/6/61/Tier_corner_cap.svg&#039;);&lt;br /&gt;
    filter: drop-shadow(-0.4em 0 0.6em #000000ff);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-weapon .itembox-tier-badge-fill {&lt;br /&gt;
    background-color: var(--itembox-weapon);&lt;br /&gt;
}&lt;br /&gt;
.itembox-vitality .itembox-tier-badge-fill {&lt;br /&gt;
    background-color: var(--itembox-vitality);&lt;br /&gt;
}&lt;br /&gt;
.itembox-spirit .itembox-tier-badge-fill {&lt;br /&gt;
    background-color: var(--itembox-spirit);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-tier-badge-number {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    top: 0.3em;&lt;br /&gt;
    height: 0.8em;&lt;br /&gt;
    mask-size: 100% 100%;&lt;br /&gt;
    background-color: var(--itembox-ink);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-1 .itembox-tier-badge-number {&lt;br /&gt;
    width: 0.5em;&lt;br /&gt;
    right: 0.4em;&lt;br /&gt;
    mask-image: url(&#039;/images/2/24/Tier_numbers_small_01.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-2 .itembox-tier-badge-number {&lt;br /&gt;
    width: 0.7em;&lt;br /&gt;
    right: 0.3em;&lt;br /&gt;
    mask-image: url(&#039;/images/7/74/Tier_numbers_small_02.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-3 .itembox-tier-badge-number {&lt;br /&gt;
    width: 0.9em;&lt;br /&gt;
    right: 0.2em;&lt;br /&gt;
    mask-image: url(&#039;/images/5/54/Tier_numbers_small_03.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4 .itembox-tier-badge-number {&lt;br /&gt;
    width: 1.1em;&lt;br /&gt;
    mask-image: url(&#039;/images/c/c6/Tier_numbers_small_04.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-5 .itembox-tier-badge-number {&lt;br /&gt;
    width: 1.1em;&lt;br /&gt;
    right: 0.1em;&lt;br /&gt;
    mask-image: url(&#039;/images/8/81/Tier_numbers_small_05.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-imbue-tag {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: fit-content;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-family: var(--itembox-font);&lt;br /&gt;
    line-height: normal;&lt;br /&gt;
    letter-spacing: 0.1em;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    padding: 0 0.3em;&lt;br /&gt;
    color: var(--itembox-imbue-fg);&lt;br /&gt;
    background-color: var(--itembox-imbue-bg);&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
.itembox-imbue .itembox-imbue-tag {&lt;br /&gt;
    visibility: visible;&lt;br /&gt;
}&lt;br /&gt;
.itembox-active.itembox-imbue .itembox-imbue-tag {&lt;br /&gt;
    justify-content: start;&lt;br /&gt;
    height: 2.2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-name-area {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 4.5em;&lt;br /&gt;
    padding: 0.5em 0.4em;&lt;br /&gt;
}&lt;br /&gt;
.itembox-name {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    line-height: 1.2;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 1.5em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-family: var(--itembox-font);&lt;br /&gt;
    color: var(--itembox-ink);&lt;br /&gt;
    overflow-wrap: normal;&lt;br /&gt;
    word-break: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-tier-4.itembox-weapon .itembox-name,&lt;br /&gt;
.itembox-tier-5.itembox-weapon .itembox-name {&lt;br /&gt;
    color: #e4c5a1;&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4.itembox-vitality .itembox-name,&lt;br /&gt;
.itembox-tier-5.itembox-vitality .itembox-name {&lt;br /&gt;
    color: #c2e7cd;&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4.itembox-spirit .itembox-name,&lt;br /&gt;
.itembox-tier-5.itembox-spirit .itembox-name {&lt;br /&gt;
    color: #e3d4f2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-wear {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    opacity: 0.7;&lt;br /&gt;
    mask-size: 100% 100%;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
}&lt;br /&gt;
.itembox-wear-v1 .itembox-wear {&lt;br /&gt;
    mask-image: url(&#039;/images/8/8f/Card_PaperWear_1.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-wear-v2 .itembox-wear {&lt;br /&gt;
    mask-image: url(&#039;/images/1/11/Card_PaperWear_2.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-wear-v3 .itembox-wear {&lt;br /&gt;
    mask-image: url(&#039;/images/8/89/Card_PaperWear_3.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-wear-v4 .itembox-wear {&lt;br /&gt;
    mask-image: url(&#039;/images/5/52/Card_PaperWear_4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-tier-1.itembox-vitality .itembox-wear {&lt;br /&gt;
    opacity: 1;&lt;br /&gt;
    background-color: #f4e2cd;&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-1.itembox-spirit .itembox-wear {&lt;br /&gt;
    opacity: 1;&lt;br /&gt;
    background-color: rgb(247, 232, 213);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-2 .itembox-wear {&lt;br /&gt;
    background-color: rgb(230, 209, 191);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-3 .itembox-wear {&lt;br /&gt;
    background-color: rgb(206, 173, 155);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4 .itembox-wear,&lt;br /&gt;
.itembox-tier-5 .itembox-wear {&lt;br /&gt;
    background-color: rgb(105, 97, 92);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-texture {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background-size: 100% 100%;&lt;br /&gt;
    mix-blend-mode: multiply;&lt;br /&gt;
}&lt;br /&gt;
.itembox-texture-v1 .itembox-texture {&lt;br /&gt;
    background-image: url(&#039;/images/9/97/Shopitem_papertexture01.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-texture-v2 .itembox-texture {&lt;br /&gt;
    background-image: url(&#039;/images/b/bf/Shopitem_papertexture02.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-texture-v3 .itembox-texture {&lt;br /&gt;
    background-image: url(&#039;/images/9/95/Shopitem_papertexture03.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-bevel {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    border-left: 0.1em solid #ffcc6622;&lt;br /&gt;
    border-top: 0.1em solid #ffcc6622;&lt;br /&gt;
    background-size: 100% 100%;&lt;br /&gt;
    mix-blend-mode: screen;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-active-tag {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    bottom: 3.5em;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    align-self: center;&lt;br /&gt;
    width: fit-content;&lt;br /&gt;
    height: fit-content;&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-family: var(--itembox-font);&lt;br /&gt;
    line-height: normal;&lt;br /&gt;
    letter-spacing: 0;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    padding: 0.1em 0.6em;&lt;br /&gt;
    box-shadow: 0 0 3em #000000ff;&lt;br /&gt;
    color: #ffefd7b3;&lt;br /&gt;
    background-color: #171717;&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
.itembox-active .itembox-active-tag {&lt;br /&gt;
    visibility: visible;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox .item-link-wrapper,&lt;br /&gt;
.itembox .item-link-wrapper &amp;gt; a {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    display: block;&lt;br /&gt;
    inset: 0;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:ItemBox/styles.css?diff=98260</id>
		<title>Template:ItemBox/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:ItemBox/styles.css?diff=98260"/>
		<updated>2026-07-21T14:50:31Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: Fix mobile icon overflow: clip the icon box and constrain the MediaWiki image wrapper chain (span/picture/img) so the icon fills its slot instead of rendering at native size and spilling over the card (with help from vergir-bot LLM)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
/* The whole card scales off one knob: font-size on .itembox (1em = 10px base) */&lt;br /&gt;
.itembox,&lt;br /&gt;
.itembox * {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    border: 0;&lt;br /&gt;
    box-sizing: border-box;&lt;br /&gt;
}&lt;br /&gt;
.itembox {&lt;br /&gt;
    --itembox-ink: #10130D;&lt;br /&gt;
    --itembox-weapon: #EC981a;&lt;br /&gt;
    --itembox-vitality: #7CBB1E;&lt;br /&gt;
    --itembox-spirit: #CE91FF;&lt;br /&gt;
    --itembox-imbue-fg: #E8C9FF;&lt;br /&gt;
    --itembox-imbue-bg: #623585;&lt;br /&gt;
    --itembox-font: &#039;Retail Demo&#039;, sans-serif;&lt;br /&gt;
    position: relative;&lt;br /&gt;
    display: inline-block;&lt;br /&gt;
    font-size: 10px;&lt;br /&gt;
    width: 8em;&lt;br /&gt;
    height: 12.5em;&lt;br /&gt;
    border-radius: 0.6em;&lt;br /&gt;
    box-shadow: 0.2em 0.2em 1.2em #00000097;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    transition-duration: 0.1s;&lt;br /&gt;
    transition-property: opacity, transform, filter;&lt;br /&gt;
}&lt;br /&gt;
.itembox-background {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    pointer-events: none;&lt;br /&gt;
}&lt;br /&gt;
.itembox-card {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background-size: cover;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-tier-1.itembox-weapon .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/3/3e/Weapon_Card_T1.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-2.itembox-weapon .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/9/96/Weapon_Card_T2.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-3.itembox-weapon .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/5/5d/Weapon_Card_T3.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4.itembox-weapon .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/a/a6/Weapon_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-5.itembox-weapon .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/a/a6/Weapon_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-1.itembox-vitality .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/7/75/Armor_Card_T1.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-2.itembox-vitality .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/0/05/Armor_Card_T2.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-3.itembox-vitality .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/7/7c/Armor_Card_T3.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4.itembox-vitality .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/1/18/Armor_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-5.itembox-vitality .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/1/18/Armor_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-1.itembox-spirit .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/a/af/Tech_Card_T1.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-2.itembox-spirit .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/a/ac/Tech_Card_T2.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-3.itembox-spirit .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/6/67/Tech_Card_T3.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4.itembox-spirit .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/f/f5/Tech_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-5.itembox-spirit .itembox-card {&lt;br /&gt;
    background-image: url(&#039;/images/f/f5/Tech_Card_T4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-icon-area {&lt;br /&gt;
    position: relative;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    aspect-ratio: 1 / 1;&lt;br /&gt;
}&lt;br /&gt;
.itembox-icon {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    background-size: cover;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    mask-size: cover;&lt;br /&gt;
    mask-repeat: no-repeat;&lt;br /&gt;
    mask-mode: luminance;&lt;br /&gt;
}&lt;br /&gt;
.itembox-icon &amp;gt; span,&lt;br /&gt;
.itembox-icon &amp;gt; span &amp;gt; span,&lt;br /&gt;
.itembox-icon picture {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
.itembox-icon img {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    max-width: 100%;&lt;br /&gt;
    max-height: 100%;&lt;br /&gt;
    object-fit: cover;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-icon-v1 .itembox-icon {&lt;br /&gt;
    mask-image: url(&#039;/images/1/10/Icon_mask01.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-icon-v2 .itembox-icon {&lt;br /&gt;
    mask-image: url(&#039;/images/6/6f/Icon_mask02.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-icon-v3 .itembox-icon {&lt;br /&gt;
    mask-image: url(&#039;/images/9/96/Icon_mask03.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-tier-badge {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    width: 2.8em;&lt;br /&gt;
    height: 2.8em;&lt;br /&gt;
    transform: scale(1.4);&lt;br /&gt;
    transform-origin: top right;&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
.itembox-show-tier .itembox-tier-badge {&lt;br /&gt;
    visibility: visible;&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-badge-fill {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    mask-size: 2.2em;&lt;br /&gt;
    mask-repeat: no-repeat;&lt;br /&gt;
    mask-position: right 0;&lt;br /&gt;
    mask-image: url(&#039;/images/6/61/Tier_corner_cap.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-badge-shadow {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background-size: 2.2em;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
    background-position: right 0;&lt;br /&gt;
    background-image: url(&#039;/images/6/61/Tier_corner_cap.svg&#039;);&lt;br /&gt;
    filter: drop-shadow(-0.4em 0 0.6em #000000ff);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-weapon .itembox-tier-badge-fill {&lt;br /&gt;
    background-color: var(--itembox-weapon);&lt;br /&gt;
}&lt;br /&gt;
.itembox-vitality .itembox-tier-badge-fill {&lt;br /&gt;
    background-color: var(--itembox-vitality);&lt;br /&gt;
}&lt;br /&gt;
.itembox-spirit .itembox-tier-badge-fill {&lt;br /&gt;
    background-color: var(--itembox-spirit);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-tier-badge-number {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    right: 0;&lt;br /&gt;
    top: 0.3em;&lt;br /&gt;
    height: 0.8em;&lt;br /&gt;
    mask-size: 100% 100%;&lt;br /&gt;
    background-color: var(--itembox-ink);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-1 .itembox-tier-badge-number {&lt;br /&gt;
    width: 0.5em;&lt;br /&gt;
    right: 0.4em;&lt;br /&gt;
    mask-image: url(&#039;/images/2/24/Tier_numbers_small_01.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-2 .itembox-tier-badge-number {&lt;br /&gt;
    width: 0.7em;&lt;br /&gt;
    right: 0.3em;&lt;br /&gt;
    mask-image: url(&#039;/images/7/74/Tier_numbers_small_02.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-3 .itembox-tier-badge-number {&lt;br /&gt;
    width: 0.9em;&lt;br /&gt;
    right: 0.2em;&lt;br /&gt;
    mask-image: url(&#039;/images/5/54/Tier_numbers_small_03.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4 .itembox-tier-badge-number {&lt;br /&gt;
    width: 1.1em;&lt;br /&gt;
    mask-image: url(&#039;/images/c/c6/Tier_numbers_small_04.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-5 .itembox-tier-badge-number {&lt;br /&gt;
    width: 1.1em;&lt;br /&gt;
    right: 0.1em;&lt;br /&gt;
    mask-image: url(&#039;/images/8/81/Tier_numbers_small_05.svg&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-imbue-tag {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: fit-content;&lt;br /&gt;
    font-size: 1.2em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-family: var(--itembox-font);&lt;br /&gt;
    line-height: normal;&lt;br /&gt;
    letter-spacing: 0.1em;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    padding: 0 0.3em;&lt;br /&gt;
    color: var(--itembox-imbue-fg);&lt;br /&gt;
    background-color: var(--itembox-imbue-bg);&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
.itembox-imbue .itembox-imbue-tag {&lt;br /&gt;
    visibility: visible;&lt;br /&gt;
}&lt;br /&gt;
.itembox-active.itembox-imbue .itembox-imbue-tag {&lt;br /&gt;
    justify-content: start;&lt;br /&gt;
    height: 2.2em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-name-area {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 4.5em;&lt;br /&gt;
    padding: 0.5em 0.4em;&lt;br /&gt;
}&lt;br /&gt;
.itembox-name {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    line-height: 1.2;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    font-size: 1.5em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-family: var(--itembox-font);&lt;br /&gt;
    color: var(--itembox-ink);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-tier-4.itembox-weapon .itembox-name,&lt;br /&gt;
.itembox-tier-5.itembox-weapon .itembox-name {&lt;br /&gt;
    color: #e4c5a1;&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4.itembox-vitality .itembox-name,&lt;br /&gt;
.itembox-tier-5.itembox-vitality .itembox-name {&lt;br /&gt;
    color: #c2e7cd;&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4.itembox-spirit .itembox-name,&lt;br /&gt;
.itembox-tier-5.itembox-spirit .itembox-name {&lt;br /&gt;
    color: #e3d4f2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-wear {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    opacity: 0.7;&lt;br /&gt;
    mask-size: 100% 100%;&lt;br /&gt;
    background-color: white;&lt;br /&gt;
}&lt;br /&gt;
.itembox-wear-v1 .itembox-wear {&lt;br /&gt;
    mask-image: url(&#039;/images/8/8f/Card_PaperWear_1.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-wear-v2 .itembox-wear {&lt;br /&gt;
    mask-image: url(&#039;/images/1/11/Card_PaperWear_2.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-wear-v3 .itembox-wear {&lt;br /&gt;
    mask-image: url(&#039;/images/8/89/Card_PaperWear_3.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-wear-v4 .itembox-wear {&lt;br /&gt;
    mask-image: url(&#039;/images/5/52/Card_PaperWear_4.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-tier-1.itembox-vitality .itembox-wear {&lt;br /&gt;
    opacity: 1;&lt;br /&gt;
    background-color: #f4e2cd;&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-1.itembox-spirit .itembox-wear {&lt;br /&gt;
    opacity: 1;&lt;br /&gt;
    background-color: rgb(247, 232, 213);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-2 .itembox-wear {&lt;br /&gt;
    background-color: rgb(230, 209, 191);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-3 .itembox-wear {&lt;br /&gt;
    background-color: rgb(206, 173, 155);&lt;br /&gt;
}&lt;br /&gt;
.itembox-tier-4 .itembox-wear,&lt;br /&gt;
.itembox-tier-5 .itembox-wear {&lt;br /&gt;
    background-color: rgb(105, 97, 92);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-texture {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background-size: 100% 100%;&lt;br /&gt;
    mix-blend-mode: multiply;&lt;br /&gt;
}&lt;br /&gt;
.itembox-texture-v1 .itembox-texture {&lt;br /&gt;
    background-image: url(&#039;/images/9/97/Shopitem_papertexture01.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-texture-v2 .itembox-texture {&lt;br /&gt;
    background-image: url(&#039;/images/b/bf/Shopitem_papertexture02.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
.itembox-texture-v3 .itembox-texture {&lt;br /&gt;
    background-image: url(&#039;/images/9/95/Shopitem_papertexture03.png&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-bevel {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    border-left: 0.1em solid #ffcc6622;&lt;br /&gt;
    border-top: 0.1em solid #ffcc6622;&lt;br /&gt;
    background-size: 100% 100%;&lt;br /&gt;
    mix-blend-mode: screen;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox-active-tag {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    bottom: 3.5em;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    align-self: center;&lt;br /&gt;
    width: fit-content;&lt;br /&gt;
    height: fit-content;&lt;br /&gt;
    font-size: 1.1em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    font-family: var(--itembox-font);&lt;br /&gt;
    line-height: normal;&lt;br /&gt;
    letter-spacing: 0;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    border-radius: 0.2em;&lt;br /&gt;
    padding: 0.1em 0.6em;&lt;br /&gt;
    box-shadow: 0 0 3em #000000ff;&lt;br /&gt;
    color: #ffefd7b3;&lt;br /&gt;
    background-color: #171717;&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
.itembox-active .itembox-active-tag {&lt;br /&gt;
    visibility: visible;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.itembox .item-link-wrapper,&lt;br /&gt;
.itembox .item-link-wrapper &amp;gt; a {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    display: block;&lt;br /&gt;
    inset: 0;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98238</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98238"/>
		<updated>2026-07-21T12:23:30Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: Cards justify-content center; narrow Low wraps naturally (drop forced column direction) (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 columns. Widths are set per case by sb-w-* classes from the module. */&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;
	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;
	justify-content: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Column width cases */&lt;br /&gt;
.sb-w-high {&lt;br /&gt;
	flex: 0 0 35%;&lt;br /&gt;
}&lt;br /&gt;
.sb-w-fill {&lt;br /&gt;
	flex: 1 1 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-low-narrow,&lt;br /&gt;
.sb-low-wide {&lt;br /&gt;
	flex: 0 0 auto;&lt;br /&gt;
}&lt;br /&gt;
/* Low without High: sized to fit all its cards on one line */&lt;br /&gt;
.sb-low-wide .sb-col-cards {&lt;br /&gt;
	flex-wrap: nowrap;&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; (top): colored top border + soft tint + colored heading text */&lt;br /&gt;
.sb-theme-accent .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border-top: 3px solid var(--chance);&lt;br /&gt;
	border-radius: 6px;&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;
/* Theme &amp;quot;Accent bottom&amp;quot;: colored bottom border */&lt;br /&gt;
.sb-theme-accent-bottom .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border-bottom: 3px solid var(--chance);&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-accent-bottom .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* layout=grid: one wrapping grid; each card framed by a chance-colored outline */&lt;br /&gt;
.sb-grid {&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;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip {&lt;br /&gt;
	display: inline-flex;&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	border: 2px solid var(--chance);&lt;br /&gt;
	border-radius: 9px;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-high {&lt;br /&gt;
	--chance: #4f8f36;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-normal {&lt;br /&gt;
	--chance: #b28b28;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-low {&lt;br /&gt;
	--chance: #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;
	.sb-w-high,&lt;br /&gt;
	.sb-low-narrow,&lt;br /&gt;
	.sb-low-wide {&lt;br /&gt;
		flex: 1 1 auto;&lt;br /&gt;
	}&lt;br /&gt;
	.sb-low-wide .sb-col-cards {&lt;br /&gt;
		flex-wrap: wrap;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=98237</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=98237"/>
		<updated>2026-07-21T12:23:05Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: No tier badge on Legendary (tier 5) cards; p.tiers uses === headings === (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.75&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;
	local args = { name, size = size or CARD_SIZE }&lt;br /&gt;
	-- Legendary (tier 5) cards omit the tier badge; it is redundant in the Legendary tier.&lt;br /&gt;
	if itier(code) ~= 5 then args.showTierTag = &amp;quot;true&amp;quot; end&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;ItemBox&amp;quot;, args = args}&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;
-- Returns sorted high (favored), normal (pool), low (unfavored) item-code lists for a tier.&lt;br /&gt;
local function collect(hkey, tier)&lt;br /&gt;
	local favored, unfavored = hero_sets(hkey)&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;
	return high, normal, low&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;
-- Builds one tier as conditional columns:&lt;br /&gt;
--   High chance (favored) 35% and Middle chance (pool) fill the rest.&lt;br /&gt;
--   Low chance (unfavored) is dropped when empty; a narrow one-card column on the right&lt;br /&gt;
--   when High is present; a fit-content column on the right when High is absent.&lt;br /&gt;
local function tier_columns(frame, hkey, tier, style, size, theme, hi, mid, lo)&lt;br /&gt;
	local high, normal, low = collect(hkey, tier)&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 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;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
	if #high &amp;gt; 0 then&lt;br /&gt;
		out[#out + 1] = col(high, &amp;quot;sb-col-high sb-w-high&amp;quot;, hi)&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = col(normal, &amp;quot;sb-col-normal sb-w-fill&amp;quot;, mid)&lt;br /&gt;
	if #low &amp;gt; 0 then&lt;br /&gt;
		local low_w = (#high &amp;gt; 0) and &amp;quot;sb-low-narrow&amp;quot; or &amp;quot;sb-low-wide&amp;quot;&lt;br /&gt;
		out[#out + 1] = col(low, &amp;quot;sb-col-low &amp;quot; .. low_w, lo)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. cls .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039;&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;
-- 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 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;
	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=..|layout=grid|high=..|middle=..|low=..}}&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 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;
&lt;br /&gt;
	if frame.args.layout == &amp;quot;grid&amp;quot; then&lt;br /&gt;
		local high, normal, low = collect(hkey, tier)&lt;br /&gt;
		local function chips(codes, chance)&lt;br /&gt;
			local out = {}&lt;br /&gt;
			for _, c in ipairs(codes) do&lt;br /&gt;
				local r = render_item(frame, c, &amp;quot;card&amp;quot;, size)&lt;br /&gt;
				if r then out[#out + 1] = &#039;&amp;lt;span class=&amp;quot;sb-chip &#039; .. chance .. &#039;&amp;quot;&amp;gt;&#039; .. r .. &#039;&amp;lt;/span&amp;gt;&#039; end&lt;br /&gt;
			end&lt;br /&gt;
			return table.concat(out)&lt;br /&gt;
		end&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-grid&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. chips(high, &amp;quot;sb-chip-high&amp;quot;)&lt;br /&gt;
			.. chips(normal, &amp;quot;sb-chip-normal&amp;quot;)&lt;br /&gt;
			.. chips(low, &amp;quot;sb-chip-low&amp;quot;)&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tier_columns(frame, hkey, tier, style, size, theme, hi, mid, lo)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|tiers|HERO|style=..|size=..|theme=..}} -&amp;gt; all five tiers, each with a heading.&lt;br /&gt;
function p.tiers(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 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 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;
&lt;br /&gt;
	local labels = { &amp;quot;Tier 1&amp;quot;, &amp;quot;Tier 2&amp;quot;, &amp;quot;Tier 3&amp;quot;, &amp;quot;Tier 4&amp;quot;, &amp;quot;Legendary&amp;quot; }&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for t = 1, 5 do&lt;br /&gt;
		out[#out + 1] = &amp;quot;=== &amp;quot; .. labels[t] .. &amp;quot; ===\n&amp;quot; .. tier_columns(frame, hkey, t, style, size, theme, hi, mid, lo)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(out, &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero_counter|HERO|heading=..|note=..}}&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;
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-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Vergir?diff=98236</id>
		<title>User:Vergir</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Vergir?diff=98236"/>
		<updated>2026-07-21T12:07:07Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: Rebuild as clean design comparison: Fill/Border/Heading/Accent-top/Accent-bottom, Holliday all tiers, ItemBoxes (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;
Street Brawl layout design comparison — Holliday, all tiers, ItemBoxes @0.75.&lt;br /&gt;
&lt;br /&gt;
= Fill =&lt;br /&gt;
{{#invoke:StreetBrawlItems|tiers|Holliday|style=card}}&lt;br /&gt;
&lt;br /&gt;
= Border =&lt;br /&gt;
{{#invoke:StreetBrawlItems|tiers|Holliday|style=card|theme=sb-theme-border}}&lt;br /&gt;
&lt;br /&gt;
= Heading =&lt;br /&gt;
{{#invoke:StreetBrawlItems|tiers|Holliday|style=card|theme=sb-theme-head}}&lt;br /&gt;
&lt;br /&gt;
= Accent (top) =&lt;br /&gt;
{{#invoke:StreetBrawlItems|tiers|Holliday|style=card|theme=sb-theme-accent}}&lt;br /&gt;
&lt;br /&gt;
= Accent (bottom) =&lt;br /&gt;
{{#invoke:StreetBrawlItems|tiers|Holliday|style=card|theme=sb-theme-accent-bottom}}&lt;/div&gt;</summary>
		<author><name>~2026-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98235</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98235"/>
		<updated>2026-07-21T12:05:02Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: Cards: space-evenly (distribute leftover, center); Accent moved to top border + add bottom-border variant (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 columns. Widths are set per case by sb-w-* classes from the module. */&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;
	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;
	justify-content: space-evenly;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Column width cases */&lt;br /&gt;
.sb-w-high {&lt;br /&gt;
	flex: 0 0 35%;&lt;br /&gt;
}&lt;br /&gt;
.sb-w-fill {&lt;br /&gt;
	flex: 1 1 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-low-narrow,&lt;br /&gt;
.sb-low-wide {&lt;br /&gt;
	flex: 0 0 auto;&lt;br /&gt;
}&lt;br /&gt;
/* Low beside High: one card wide, cards stacked vertically, packed to the top */&lt;br /&gt;
.sb-low-narrow .sb-col-cards {&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex-wrap: nowrap;&lt;br /&gt;
	justify-content: flex-start;&lt;br /&gt;
}&lt;br /&gt;
/* Low without High: sized to fit all its cards on one line */&lt;br /&gt;
.sb-low-wide .sb-col-cards {&lt;br /&gt;
	flex-wrap: nowrap;&lt;br /&gt;
	justify-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; (top): colored top border + soft tint + colored heading text */&lt;br /&gt;
.sb-theme-accent .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border-top: 3px solid var(--chance);&lt;br /&gt;
	border-radius: 6px;&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;
/* Theme &amp;quot;Accent bottom&amp;quot;: colored bottom border */&lt;br /&gt;
.sb-theme-accent-bottom .sb-col {&lt;br /&gt;
	background: var(--tint-soft);&lt;br /&gt;
	border-bottom: 3px solid var(--chance);&lt;br /&gt;
	border-radius: 6px;&lt;br /&gt;
}&lt;br /&gt;
.sb-theme-accent-bottom .sb-col-head {&lt;br /&gt;
	background: transparent;&lt;br /&gt;
	color: var(--chance);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* layout=grid: one wrapping grid; each card framed by a chance-colored outline */&lt;br /&gt;
.sb-grid {&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;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip {&lt;br /&gt;
	display: inline-flex;&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	border: 2px solid var(--chance);&lt;br /&gt;
	border-radius: 9px;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-high {&lt;br /&gt;
	--chance: #4f8f36;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-normal {&lt;br /&gt;
	--chance: #b28b28;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-low {&lt;br /&gt;
	--chance: #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;
	.sb-w-high,&lt;br /&gt;
	.sb-low-narrow,&lt;br /&gt;
	.sb-low-wide {&lt;br /&gt;
		flex: 1 1 auto;&lt;br /&gt;
	}&lt;br /&gt;
	.sb-low-narrow .sb-col-cards,&lt;br /&gt;
	.sb-low-wide .sb-col-cards {&lt;br /&gt;
		flex-direction: row;&lt;br /&gt;
		flex-wrap: wrap;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=98234</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=98234"/>
		<updated>2026-07-21T12:04:30Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: Card size 0.75; extract tier logic; add p.tiers (all tiers for a hero) (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.75&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;
-- Returns sorted high (favored), normal (pool), low (unfavored) item-code lists for a tier.&lt;br /&gt;
local function collect(hkey, tier)&lt;br /&gt;
	local favored, unfavored = hero_sets(hkey)&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;
	return high, normal, low&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;
-- Builds one tier as conditional columns:&lt;br /&gt;
--   High chance (favored) 35% and Middle chance (pool) fill the rest.&lt;br /&gt;
--   Low chance (unfavored) is dropped when empty; a narrow one-card column on the right&lt;br /&gt;
--   when High is present; a fit-content column on the right when High is absent.&lt;br /&gt;
local function tier_columns(frame, hkey, tier, style, size, theme, hi, mid, lo)&lt;br /&gt;
	local high, normal, low = collect(hkey, tier)&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 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;
&lt;br /&gt;
	local out = {}&lt;br /&gt;
	if #high &amp;gt; 0 then&lt;br /&gt;
		out[#out + 1] = col(high, &amp;quot;sb-col-high sb-w-high&amp;quot;, hi)&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = col(normal, &amp;quot;sb-col-normal sb-w-fill&amp;quot;, mid)&lt;br /&gt;
	if #low &amp;gt; 0 then&lt;br /&gt;
		local low_w = (#high &amp;gt; 0) and &amp;quot;sb-low-narrow&amp;quot; or &amp;quot;sb-low-wide&amp;quot;&lt;br /&gt;
		out[#out + 1] = col(low, &amp;quot;sb-col-low &amp;quot; .. low_w, lo)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. cls .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#039;&amp;lt;/div&amp;gt;&#039;&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;
-- 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;
	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=..|layout=grid|high=..|middle=..|low=..}}&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 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;
&lt;br /&gt;
	if frame.args.layout == &amp;quot;grid&amp;quot; then&lt;br /&gt;
		local high, normal, low = collect(hkey, tier)&lt;br /&gt;
		local function chips(codes, chance)&lt;br /&gt;
			local out = {}&lt;br /&gt;
			for _, c in ipairs(codes) do&lt;br /&gt;
				local r = render_item(frame, c, &amp;quot;card&amp;quot;, size)&lt;br /&gt;
				if r then out[#out + 1] = &#039;&amp;lt;span class=&amp;quot;sb-chip &#039; .. chance .. &#039;&amp;quot;&amp;gt;&#039; .. r .. &#039;&amp;lt;/span&amp;gt;&#039; end&lt;br /&gt;
			end&lt;br /&gt;
			return table.concat(out)&lt;br /&gt;
		end&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-grid&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. chips(high, &amp;quot;sb-chip-high&amp;quot;)&lt;br /&gt;
			.. chips(normal, &amp;quot;sb-chip-normal&amp;quot;)&lt;br /&gt;
			.. chips(low, &amp;quot;sb-chip-low&amp;quot;)&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tier_columns(frame, hkey, tier, style, size, theme, hi, mid, lo)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|tiers|HERO|style=..|size=..|theme=..}} -&amp;gt; all five tiers stacked.&lt;br /&gt;
function p.tiers(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 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 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;
&lt;br /&gt;
	local labels = { &amp;quot;Tier 1&amp;quot;, &amp;quot;Tier 2&amp;quot;, &amp;quot;Tier 3&amp;quot;, &amp;quot;Tier 4&amp;quot;, &amp;quot;Legendary&amp;quot; }&lt;br /&gt;
	local out = {}&lt;br /&gt;
	for t = 1, 5 do&lt;br /&gt;
		out[#out + 1] = &amp;quot;&#039;&#039;&#039;&amp;quot; .. labels[t] .. &amp;quot;&#039;&#039;&#039;\n&amp;quot; .. tier_columns(frame, hkey, t, style, size, theme, hi, mid, lo)&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(out, &amp;quot;\n\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- {{#invoke:StreetBrawlItems|hero_counter|HERO|heading=..|note=..}}&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;
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-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Vergir?diff=98227</id>
		<title>User:Vergir</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Vergir?diff=98227"/>
		<updated>2026-07-21T11:46:14Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: Temp layout check: case A (no Low) and case B (narrow Low) (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;br /&gt;
&lt;br /&gt;
&amp;lt;templatestyles src=&amp;quot;Template:HeroStreetBrawl/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
= Grid layout prototype (outline = chance) =&lt;br /&gt;
&#039;&#039;&#039;Outline colour:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:#4f8f36&amp;quot;&amp;gt;■ green = High chance&amp;lt;/span&amp;gt; · &amp;lt;span style=&amp;quot;color:#b28b28&amp;quot;&amp;gt;■ amber = Middle&amp;lt;/span&amp;gt; · &amp;lt;span style=&amp;quot;color:#9c3f37&amp;quot;&amp;gt;■ red = Low&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Holliday (grid) ==&lt;br /&gt;
=== Tier 1 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|layout=grid|size=0.875}}&lt;br /&gt;
=== Tier 2 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|2|layout=grid|size=0.875}}&lt;br /&gt;
=== Tier 3 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|3|layout=grid|size=0.875}}&lt;br /&gt;
=== Tier 4 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|4|layout=grid|size=0.875}}&lt;br /&gt;
=== Legendary ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|5|layout=grid|size=0.875}}&lt;br /&gt;
&lt;br /&gt;
== Warden — Tier 2, favored-heavy (grid) ==&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Warden|2|layout=grid|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;
= Layout check =&lt;br /&gt;
== Abrams T1 (High + Middle, no Low) ==&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Abrams|1|theme=sb-theme-head|style=card}}&lt;br /&gt;
== Holliday T1 (High + Middle + narrow Low) ==&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|theme=sb-theme-head|style=card}}&lt;/div&gt;</summary>
		<author><name>~2026-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98226</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98226"/>
		<updated>2026-07-21T11:45:33Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: Conditional column widths: High 35%, Middle fills, narrow one-card Low / fit-content Low; drop fixed 25/50/25 (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 columns. Widths are set per case by sb-w-* classes from the module. */&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;
	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;
/* Column width cases */&lt;br /&gt;
.sb-w-high {&lt;br /&gt;
	flex: 0 0 35%;&lt;br /&gt;
}&lt;br /&gt;
.sb-w-fill {&lt;br /&gt;
	flex: 1 1 0;&lt;br /&gt;
}&lt;br /&gt;
.sb-low-narrow,&lt;br /&gt;
.sb-low-wide {&lt;br /&gt;
	flex: 0 0 auto;&lt;br /&gt;
}&lt;br /&gt;
/* Low beside High: one card wide, cards stacked vertically */&lt;br /&gt;
.sb-low-narrow .sb-col-cards {&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex-wrap: nowrap;&lt;br /&gt;
}&lt;br /&gt;
/* Low without High: sized to fit all its cards on one line */&lt;br /&gt;
.sb-low-wide .sb-col-cards {&lt;br /&gt;
	flex-wrap: nowrap;&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;
/* layout=grid: one wrapping grid; each card framed by a chance-colored outline */&lt;br /&gt;
.sb-grid {&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;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip {&lt;br /&gt;
	display: inline-flex;&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	border: 2px solid var(--chance);&lt;br /&gt;
	border-radius: 9px;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-high {&lt;br /&gt;
	--chance: #4f8f36;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-normal {&lt;br /&gt;
	--chance: #b28b28;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-low {&lt;br /&gt;
	--chance: #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;
	.sb-w-high,&lt;br /&gt;
	.sb-low-narrow,&lt;br /&gt;
	.sb-low-wide {&lt;br /&gt;
		flex: 1 1 auto;&lt;br /&gt;
	}&lt;br /&gt;
	.sb-low-narrow .sb-col-cards,&lt;br /&gt;
	.sb-low-wide .sb-col-cards {&lt;br /&gt;
		flex-direction: row;&lt;br /&gt;
		flex-wrap: wrap;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>~2026-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=98225</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=98225"/>
		<updated>2026-07-21T11:44:58Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: p.tier columns: conditional widths (drop empty Low; 35/65; narrow one-card Low when High present, fit-content Low when High absent); card size 0.8 (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.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;
-- 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=..|layout=grid|high=..|middle=..|low=..}}&lt;br /&gt;
-- Default: conditional columns. High chance (favored) 35% and Middle chance (pool) fill&lt;br /&gt;
-- the rest. Low chance (unfavored) is dropped when empty; when present alongside High it&lt;br /&gt;
-- becomes a narrow one-card column on the right; when High is absent it sits on the right&lt;br /&gt;
-- sized to fit its cards on one line. layout=grid: one grid, cards outlined by chance.&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;
	-- layout=grid: single wrapping grid, cards outlined by chance (High, then Middle, then Low).&lt;br /&gt;
	if frame.args.layout == &amp;quot;grid&amp;quot; then&lt;br /&gt;
		local function chips(codes, chance)&lt;br /&gt;
			local out = {}&lt;br /&gt;
			for _, c in ipairs(codes) do&lt;br /&gt;
				local r = render_item(frame, c, &amp;quot;card&amp;quot;, size)&lt;br /&gt;
				if r then out[#out + 1] = &#039;&amp;lt;span class=&amp;quot;sb-chip &#039; .. chance .. &#039;&amp;quot;&amp;gt;&#039; .. r .. &#039;&amp;lt;/span&amp;gt;&#039; end&lt;br /&gt;
			end&lt;br /&gt;
			return table.concat(out)&lt;br /&gt;
		end&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-grid&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. chips(high, &amp;quot;sb-chip-high&amp;quot;)&lt;br /&gt;
			.. chips(normal, &amp;quot;sb-chip-normal&amp;quot;)&lt;br /&gt;
			.. chips(low, &amp;quot;sb-chip-low&amp;quot;)&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&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;
&lt;br /&gt;
	-- Conditional columns per the presence of High and Low.&lt;br /&gt;
	local out = {}&lt;br /&gt;
	if #high &amp;gt; 0 then&lt;br /&gt;
		out[#out + 1] = col(high, &amp;quot;sb-col-high sb-w-high&amp;quot;, hi)&lt;br /&gt;
	end&lt;br /&gt;
	out[#out + 1] = col(normal, &amp;quot;sb-col-normal sb-w-fill&amp;quot;, mid)&lt;br /&gt;
	if #low &amp;gt; 0 then&lt;br /&gt;
		local low_w = (#high &amp;gt; 0) and &amp;quot;sb-low-narrow&amp;quot; or &amp;quot;sb-low-wide&amp;quot;&lt;br /&gt;
		out[#out + 1] = col(low, &amp;quot;sb-col-low &amp;quot; .. low_w, lo)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&amp;lt;div class=&amp;quot;&#039; .. cls .. &#039;&amp;quot;&amp;gt;&#039; .. table.concat(out) .. &#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-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/User:Vergir?diff=98195</id>
		<title>User:Vergir</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/User:Vergir?diff=98195"/>
		<updated>2026-07-21T09:53:16Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: Add grid-layout prototype (chance-outlined cards) for review (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;br /&gt;
&lt;br /&gt;
&amp;lt;templatestyles src=&amp;quot;Template:HeroStreetBrawl/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
= Grid layout prototype (outline = chance) =&lt;br /&gt;
&#039;&#039;&#039;Outline colour:&#039;&#039;&#039; &amp;lt;span style=&amp;quot;color:#4f8f36&amp;quot;&amp;gt;■ green = High chance&amp;lt;/span&amp;gt; · &amp;lt;span style=&amp;quot;color:#b28b28&amp;quot;&amp;gt;■ amber = Middle&amp;lt;/span&amp;gt; · &amp;lt;span style=&amp;quot;color:#9c3f37&amp;quot;&amp;gt;■ red = Low&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Holliday (grid) ==&lt;br /&gt;
=== Tier 1 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|1|layout=grid|size=0.875}}&lt;br /&gt;
=== Tier 2 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|2|layout=grid|size=0.875}}&lt;br /&gt;
=== Tier 3 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|3|layout=grid|size=0.875}}&lt;br /&gt;
=== Tier 4 ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|4|layout=grid|size=0.875}}&lt;br /&gt;
=== Legendary ===&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Holliday|5|layout=grid|size=0.875}}&lt;br /&gt;
&lt;br /&gt;
== Warden — Tier 2, favored-heavy (grid) ==&lt;br /&gt;
{{#invoke:StreetBrawlItems|tier|Warden|2|layout=grid|size=0.875}}&lt;/div&gt;</summary>
		<author><name>~2026-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98194</id>
		<title>Template:HeroStreetBrawlItems/styles.css</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Template:HeroStreetBrawlItems/styles.css?diff=98194"/>
		<updated>2026-07-21T09:52:50Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: Add grid + chance-outlined chip styles for layout=grid (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 25% | Middle 50% | Low 25% */&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;
	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). flex-grow sets the 25/50/25 width split. */&lt;br /&gt;
.sb-col-high {&lt;br /&gt;
	flex-grow: 25;&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: 50;&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: 25;&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;
/* layout=grid: one wrapping grid; each card framed by a chance-colored outline */&lt;br /&gt;
.sb-grid {&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;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip {&lt;br /&gt;
	display: inline-flex;&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	border: 2px solid var(--chance);&lt;br /&gt;
	border-radius: 9px;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-high {&lt;br /&gt;
	--chance: #4f8f36;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-normal {&lt;br /&gt;
	--chance: #b28b28;&lt;br /&gt;
}&lt;br /&gt;
.sb-chip-low {&lt;br /&gt;
	--chance: #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-ChargeOrbActive711</name></author>
	</entry>
	<entry>
		<id>https://deadlock.wiki/Module:StreetBrawlItems?diff=98193</id>
		<title>Module:StreetBrawlItems</title>
		<link rel="alternate" type="text/html" href="https://deadlock.wiki/Module:StreetBrawlItems?diff=98193"/>
		<updated>2026-07-21T09:52:26Z</updated>

		<summary type="html">&lt;p&gt;~2026-ChargeOrbActive711: p.tier: add layout=grid mode (one wrapping grid, cards outlined by chance) (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=..|layout=grid|high=..|middle=..|low=..}}&lt;br /&gt;
-- Default: three columns High chance (favored) | Middle chance (pool) | Low chance (unfavored).&lt;br /&gt;
-- layout=grid: one wrapping grid of the whole tier, each card outlined by its chance.&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;
	-- layout=grid: single wrapping grid, cards outlined by chance (High, then Middle, then Low).&lt;br /&gt;
	if frame.args.layout == &amp;quot;grid&amp;quot; then&lt;br /&gt;
		local function chips(codes, chance)&lt;br /&gt;
			local out = {}&lt;br /&gt;
			for _, c in ipairs(codes) do&lt;br /&gt;
				local r = render_item(frame, c, &amp;quot;card&amp;quot;, size)&lt;br /&gt;
				if r then out[#out + 1] = &#039;&amp;lt;span class=&amp;quot;sb-chip &#039; .. chance .. &#039;&amp;quot;&amp;gt;&#039; .. r .. &#039;&amp;lt;/span&amp;gt;&#039; end&lt;br /&gt;
			end&lt;br /&gt;
			return table.concat(out)&lt;br /&gt;
		end&lt;br /&gt;
		return &#039;&amp;lt;div class=&amp;quot;sb-grid&amp;quot;&amp;gt;&#039;&lt;br /&gt;
			.. chips(high, &amp;quot;sb-chip-high&amp;quot;)&lt;br /&gt;
			.. chips(normal, &amp;quot;sb-chip-normal&amp;quot;)&lt;br /&gt;
			.. chips(low, &amp;quot;sb-chip-low&amp;quot;)&lt;br /&gt;
			.. &#039;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	end&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-ChargeOrbActive711</name></author>
	</entry>
</feed>