From c25f52690795bc7a3da5fea6151d76467debf149 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 27 Mar 2026 16:39:36 +0900 Subject: [PATCH 01/26] create legend widget --- lua/wikis/commons/Widget/Legend.lua | 64 +++++++++++++++++++++++++++++ stylesheets/commons/Legend.scss | 63 ++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 lua/wikis/commons/Widget/Legend.lua create mode 100644 stylesheets/commons/Legend.scss diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua new file mode 100644 index 00000000000..bcc03ecae19 --- /dev/null +++ b/lua/wikis/commons/Widget/Legend.lua @@ -0,0 +1,64 @@ +--- +-- @Liquipedia +-- page=Module:Widget/Legend +-- +-- Please see https://github.com/Liquipedia/Lua-Modules to contribute +-- + +local Lua = require('Module:Lua') + +local Array = Lua.import('Module:Array') +local Class = Lua.import('Module:Class') +local Logic = Lua.import('Module:Logic') + +local Widget = Lua.import('Module:Widget') +local ChevronToggle = Lua.import('Module:Widget/Participants/Team/ChevronToggle') +local GeneralCollapsible = Lua.import('Module:Widget/GeneralCollapsible/Default') +local HtmlWidgets = Lua.import('Module:Widget/Html/All') +local Icon = Lua.import('Module:Widget/Image/Icon/Fontawesome') + +---@class LegendWidget: Widget +---@operator call(table): LegendWidget +local LegendWidget = Class.new(Widget) + +---@return Renderable|Renderable[]? +function LegendWidget:render() + return GeneralCollapsible{ + shouldCollapse = true, + collapseAreaClasses = {}, + classes = {'legend'}, + titleWidget = self:_createHeader(), + children = Array.mapIndexes(function (index) + local sectionContent = self.props['section' .. index] + if Logic.isEmpty(sectionContent) then + return + end + return HtmlWidgets.Div{ + classes = {'legend-section'}, + children = self.props['section' .. index] + } + end) + } +end + +---@private +---@return Widget +function LegendWidget:_createHeader() + return HtmlWidgets.Div{ + classes = {'legend-header'}, + attributes = {['data-collapsible-click-region'] = 'true'}, + children = { + HtmlWidgets.Div{ + classes = {}, + children = { + Icon{iconName = 'general-info'}, + ' Legend' + } + }, + ChevronToggle{} + } + } +end + +return LegendWidget + diff --git a/stylesheets/commons/Legend.scss b/stylesheets/commons/Legend.scss new file mode 100644 index 00000000000..33610b464fb --- /dev/null +++ b/stylesheets/commons/Legend.scss @@ -0,0 +1,63 @@ +.legend { + display: flex; + flex-direction: column; + gap: 0.5rem; + min-width: 200px; + width: fit-content; + max-width: 100%; + border: 0.25rem var( --clr-on-surface-light-primary-12 ); + border-radius: 0.5rem; + padding: 0.5rem; + background-color: var( --clr-primary-100 ); + font-size: 0.75rem; + + .theme--dark & { + border-color: var( --clr-on-surface-dark-primary-8 ); + background-color: var( --clr-on-surface-dark-primary-8 ); + } + + &-header { + display: grid; + grid-template-columns: repeat( 2, auto ); + align-items: center; + align-content: center; + gap: 0.25rem; + font-weight: bold; + color: var( --clr-secondary-16 ); + + .theme--dark & { + color: var( --clr-secondary-90 ); + } + + .general-collapsible-default-toggle { + min-width: unset; + } + + .general-collapsible-expand-button, + .general-collapsible-collapse-button { + outline: unset; + color: var( --clr-secondary-7 ); + + .theme--dark & { + color: var( --clr-secondary-90 ); + } + } + } + + &-section { + & + &::before { + display: block; + content: ""; + width: 100%; + border: 0; + border-top: 0.125rem solid var( --clr-on-surface-light-primary-8 ); + padding: 0; + position: relative; + top: -0.25rem; + + .theme--dark & { + border-color: var( --clr-on-surface-dark-primary-8 ); + } + } + } +} From 1e4e9c4e5396ae665fbc2a3b86007c00136dc36c Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 27 Mar 2026 18:01:29 +0900 Subject: [PATCH 02/26] use same flex container --- stylesheets/commons/Legend.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stylesheets/commons/Legend.scss b/stylesheets/commons/Legend.scss index 33610b464fb..0aefbe02792 100644 --- a/stylesheets/commons/Legend.scss +++ b/stylesheets/commons/Legend.scss @@ -60,4 +60,8 @@ } } } + + &:not( .collapsed ) .should-collapse { + display: contents; + } } From ec917136260876b3f9c4650d54066becacb82a7c Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Thu, 2 Apr 2026 15:43:40 +0900 Subject: [PATCH 03/26] add mobile breakpoint --- stylesheets/commons/Legend.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stylesheets/commons/Legend.scss b/stylesheets/commons/Legend.scss index 0aefbe02792..c5c54e855d0 100644 --- a/stylesheets/commons/Legend.scss +++ b/stylesheets/commons/Legend.scss @@ -16,6 +16,10 @@ background-color: var( --clr-on-surface-dark-primary-8 ); } + @media ( max-width: 435px ) { + width: 100% !important; + } + &-header { display: grid; grid-template-columns: repeat( 2, auto ); From de4db67ea6ae05cbbfea3b079821f0c0f9a26bba Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 11:29:35 +0900 Subject: [PATCH 04/26] update min width --- stylesheets/commons/Legend.scss | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/stylesheets/commons/Legend.scss b/stylesheets/commons/Legend.scss index c5c54e855d0..dd39a0dfe52 100644 --- a/stylesheets/commons/Legend.scss +++ b/stylesheets/commons/Legend.scss @@ -2,7 +2,7 @@ display: flex; flex-direction: column; gap: 0.5rem; - min-width: 200px; + min-width: 16.5rem; width: fit-content; max-width: 100%; border: 0.25rem var( --clr-on-surface-light-primary-12 ); @@ -49,6 +49,10 @@ } &-section { + display: grid; + grid-template-columns: min-content auto; + column-gap: 0.25rem; + & + &::before { display: block; content: ""; @@ -65,6 +69,12 @@ } } + &-item { + display: grid; + grid-column: 1 / -1; + grid-template-columns: subgrid; + } + &:not( .collapsed ) .should-collapse { display: contents; } From f812d9fd132119603c6afd05dc467cddb38cba21 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 11:29:41 +0900 Subject: [PATCH 05/26] fix border --- stylesheets/commons/Legend.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stylesheets/commons/Legend.scss b/stylesheets/commons/Legend.scss index dd39a0dfe52..6343bcfc848 100644 --- a/stylesheets/commons/Legend.scss +++ b/stylesheets/commons/Legend.scss @@ -5,7 +5,7 @@ min-width: 16.5rem; width: fit-content; max-width: 100%; - border: 0.25rem var( --clr-on-surface-light-primary-12 ); + border: 1px solid var( --clr-on-surface-light-primary-12 ); border-radius: 0.5rem; padding: 0.5rem; background-color: var( --clr-primary-100 ); From 742eb9d54ed602e483dc5372271065cccb49669e Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 11:31:24 +0900 Subject: [PATCH 06/26] add color section --- lua/wikis/commons/Widget/Legend.lua | 45 ++++++++++++++++++++++------- stylesheets/commons/Colours.scss | 28 ++++++++++++++++++ 2 files changed, 63 insertions(+), 10 deletions(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index bcc03ecae19..59fb2e9dd86 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -9,6 +9,7 @@ local Lua = require('Module:Lua') local Array = Lua.import('Module:Array') local Class = Lua.import('Module:Class') +local Json = Lua.import('Module:Json') local Logic = Lua.import('Module:Logic') local Widget = Lua.import('Module:Widget') @@ -16,6 +17,9 @@ local ChevronToggle = Lua.import('Module:Widget/Participants/Team/ChevronToggle' local GeneralCollapsible = Lua.import('Module:Widget/GeneralCollapsible/Default') local HtmlWidgets = Lua.import('Module:Widget/Html/All') local Icon = Lua.import('Module:Widget/Image/Icon/Fontawesome') +local WidgetUtil = Lua.import('Module:Widget/Util') + +local LABEL_COLORS = {'byeup', 'seedup', 'up', 'stayup', 'stay', 'staydown', 'down'} ---@class LegendWidget: Widget ---@operator call(table): LegendWidget @@ -28,16 +32,9 @@ function LegendWidget:render() collapseAreaClasses = {}, classes = {'legend'}, titleWidget = self:_createHeader(), - children = Array.mapIndexes(function (index) - local sectionContent = self.props['section' .. index] - if Logic.isEmpty(sectionContent) then - return - end - return HtmlWidgets.Div{ - classes = {'legend-section'}, - children = self.props['section' .. index] - } - end) + children = WidgetUtil.collect( + self:_createColorSection() + ) } end @@ -60,5 +57,33 @@ function LegendWidget:_createHeader() } end +---@private +---@return Widget? +function LegendWidget:_createColorSection() + local sectionData = Json.parseIfString(self.props.color) + if Logic.isEmpty(sectionData) then + return + end + return HtmlWidgets.Div{ + classes = {'legend-section'}, + children = Array.map(LABEL_COLORS, function (labelColor) + local labelText = sectionData[labelColor] + if Logic.isEmpty(labelText) then + return + end + return HtmlWidgets.Div{ + classes = {'legend-item'}, + children = { + HtmlWidgets.Span{ + classes = {labelColor .. '-text'}, + children = '●' + }, + HtmlWidgets.Span{children = labelText} + } + } + end) + } +end + return LegendWidget diff --git a/stylesheets/commons/Colours.scss b/stylesheets/commons/Colours.scss index 9ed6cd95bf1..33bb5f798b5 100644 --- a/stylesheets/commons/Colours.scss +++ b/stylesheets/commons/Colours.scss @@ -802,3 +802,31 @@ ul.nav-tabs li.game-wiiu, .bg-byeup { background-color: var( --position-byeup-background-color ) !important; } + +.byeup-text { + color: var( --position-byeup-color ); +} + +.seedup-text { + color: var( --position-seedup-color ); +} + +.up-text { + color: var( --position-up-color ); +} + +.stayup-text { + color: var( --position-stayup-color ); +} + +.stay-text { + color: var( --position-stay-color ); +} + +.staydown-text { + color: var( --position-staydown-color ); +} + +.down-text { + color: var( --position-down-color ); +} From 3205563bac3cd622f1de99d32fed38a4f34f0212 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 11:49:27 +0900 Subject: [PATCH 07/26] adjust title impl --- lua/wikis/commons/Widget/Legend.lua | 14 +++++++------- stylesheets/commons/Legend.scss | 26 ++++++++++++++++++-------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index 59fb2e9dd86..0926d16392f 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -24,6 +24,9 @@ local LABEL_COLORS = {'byeup', 'seedup', 'up', 'stayup', 'stay', 'staydown', 'do ---@class LegendWidget: Widget ---@operator call(table): LegendWidget local LegendWidget = Class.new(Widget) +LegendWidget.defaultProps = { + title = 'Legend', +} ---@return Renderable|Renderable[]? function LegendWidget:render() @@ -45,13 +48,10 @@ function LegendWidget:_createHeader() classes = {'legend-header'}, attributes = {['data-collapsible-click-region'] = 'true'}, children = { - HtmlWidgets.Div{ - classes = {}, - children = { - Icon{iconName = 'general-info'}, - ' Legend' - } - }, + HtmlWidgets.Div{children = { + Icon{iconName = 'general-info'}, + HtmlWidgets.Span{children = self.props.title} + }}, ChevronToggle{} } } diff --git a/stylesheets/commons/Legend.scss b/stylesheets/commons/Legend.scss index 6343bcfc848..907309d0ac0 100644 --- a/stylesheets/commons/Legend.scss +++ b/stylesheets/commons/Legend.scss @@ -22,7 +22,7 @@ &-header { display: grid; - grid-template-columns: repeat( 2, auto ); + grid-template-columns: min-content auto min-content; align-items: center; align-content: center; gap: 0.25rem; @@ -33,17 +33,27 @@ color: var( --clr-secondary-90 ); } + > :first-child { + grid-column: 1 / -2; + display: grid; + grid-template-columns: subgrid; + margin-left: 0.5rem; + align-items: center; + } + .general-collapsible-default-toggle { min-width: unset; - } - .general-collapsible-expand-button, - .general-collapsible-collapse-button { - outline: unset; - color: var( --clr-secondary-7 ); + .general-collapsible-expand-button, + .general-collapsible-expand-button:visited, + .general-collapsible-collapse-button, + .general-collapsible-collapse-button:visited { + outline: unset; + color: var( --clr-secondary-7 ); - .theme--dark & { - color: var( --clr-secondary-90 ); + .theme--dark & { + color: var( --clr-secondary-90 ); + } } } } From f1e2a5deb2cf799cd058bf4d8e08454c2b583424 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 11:57:51 +0900 Subject: [PATCH 08/26] fix section divider --- stylesheets/commons/Legend.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/stylesheets/commons/Legend.scss b/stylesheets/commons/Legend.scss index 907309d0ac0..e6ac5236354 100644 --- a/stylesheets/commons/Legend.scss +++ b/stylesheets/commons/Legend.scss @@ -65,6 +65,7 @@ & + &::before { display: block; + grid-column: 1 / -1; content: ""; width: 100%; border: 0; From b89063caa6d04ceb07720c9261fd1cd559b67dca Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 11:58:44 +0900 Subject: [PATCH 09/26] add points section --- lua/wikis/commons/Widget/Legend.lua | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index 0926d16392f..11f17c731b2 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -36,7 +36,8 @@ function LegendWidget:render() classes = {'legend'}, titleWidget = self:_createHeader(), children = WidgetUtil.collect( - self:_createColorSection() + self:_createColorSection(), + self:_createPointsSection() ) } end @@ -85,5 +86,31 @@ function LegendWidget:_createColorSection() } end +---@private +---@return Widget? +function LegendWidget:_createPointsSection() + local sectionData = Json.parseIfString(self.props.points) + if not sectionData then + return + end + local pointsText = sectionData[1] or sectionData.points + if Logic.isEmpty(pointsText) then + return + end + return HtmlWidgets.Div{ + classes = {'legend-section'}, + children = HtmlWidgets.Div{ + classes = {'legend-item'}, + children = { + HtmlWidgets.Span{ + css = {['font-weight'] = 'bold'}, + children = 'Pts' + }, + HtmlWidgets.Span{children = pointsText} + } + } + } +end + return LegendWidget From 2dff8911d2b1c433afbc11a6651520bfb004bc87 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 12:03:17 +0900 Subject: [PATCH 10/26] better color section handle --- lua/wikis/commons/Widget/Legend.lua | 38 +++++++++++++++++------------ 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index 11f17c731b2..20d910c8b8f 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -65,24 +65,30 @@ function LegendWidget:_createColorSection() if Logic.isEmpty(sectionData) then return end + local labels = Array.map(LABEL_COLORS, function (labelColor) + local labelText = sectionData[labelColor] + if Logic.isEmpty(labelText) then + return + end + return HtmlWidgets.Div{ + classes = {'legend-item'}, + children = { + HtmlWidgets.Span{ + classes = {labelColor .. '-text'}, + children = '●' + }, + HtmlWidgets.Span{children = labelText} + } + } + end) + + if Logic.isEmpty(labels) then + return + end + return HtmlWidgets.Div{ classes = {'legend-section'}, - children = Array.map(LABEL_COLORS, function (labelColor) - local labelText = sectionData[labelColor] - if Logic.isEmpty(labelText) then - return - end - return HtmlWidgets.Div{ - classes = {'legend-item'}, - children = { - HtmlWidgets.Span{ - classes = {labelColor .. '-text'}, - children = '●' - }, - HtmlWidgets.Span{children = labelText} - } - } - end) + children = labels } end From d5ff5d135efdeece9e3d408fc43d89bbc4fa0f4d Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 12:58:50 +0900 Subject: [PATCH 11/26] add number section --- lua/wikis/commons/Widget/Legend.lua | 60 ++++++++++++++++++++++++++++- stylesheets/commons/Label.scss | 36 +++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index 20d910c8b8f..b892d20d0c9 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -17,6 +17,7 @@ local ChevronToggle = Lua.import('Module:Widget/Participants/Team/ChevronToggle' local GeneralCollapsible = Lua.import('Module:Widget/GeneralCollapsible/Default') local HtmlWidgets = Lua.import('Module:Widget/Html/All') local Icon = Lua.import('Module:Widget/Image/Icon/Fontawesome') +local LabelWidget = Lua.import('Module:Widget/Basic/Label') local WidgetUtil = Lua.import('Module:Widget/Util') local LABEL_COLORS = {'byeup', 'seedup', 'up', 'stayup', 'stay', 'staydown', 'down'} @@ -26,6 +27,8 @@ local LABEL_COLORS = {'byeup', 'seedup', 'up', 'stayup', 'stay', 'staydown', 'do local LegendWidget = Class.new(Widget) LegendWidget.defaultProps = { title = 'Legend', + showConfirmed = true, + showUndecided = true, } ---@return Renderable|Renderable[]? @@ -37,7 +40,8 @@ function LegendWidget:render() titleWidget = self:_createHeader(), children = WidgetUtil.collect( self:_createColorSection(), - self:_createPointsSection() + self:_createPointsSection(), + self:_createNumberSection() ) } end @@ -118,5 +122,59 @@ function LegendWidget:_createPointsSection() } end +---@private +---@return Widget? +function LegendWidget:_createNumberSection() + local props = self.props + if not Logic.readBool(props.showNumberSection) then + return + end + + local labels = WidgetUtil.collect( + Logic.readBool(props.showConfirmed) and HtmlWidgets.Div{ + classes = {'legend-item'}, + children = { + LabelWidget{ + labelScheme = 'placement', + labelType = 'legend-confirmed', + children = 1 + }, + HtmlWidgets.Span{children = 'Placement confirmed'} + } + } or nil, + Logic.readBool(props.showMinimum) and HtmlWidgets.Div{ + classes = {'legend-item'}, + children = { + LabelWidget{ + labelScheme = 'placement', + labelType = 'legend-minimum', + children = 1 + }, + HtmlWidgets.Span{children = 'Minimum placement reached'} + } + } or nil, + Logic.readBool(props.showUndecided) and HtmlWidgets.Div{ + classes = {'legend-item'}, + children = { + LabelWidget{ + labelScheme = 'placement', + labelType = 'legend-undecided', + children = 1 + }, + HtmlWidgets.Span{children = 'Placement undecided'} + } + } or nil + ) + + if Logic.isEmpty(labels) then + return + end + + return HtmlWidgets.Div{ + classes = {'legend-section'}, + children = labels + } +end + return LegendWidget diff --git a/stylesheets/commons/Label.scss b/stylesheets/commons/Label.scss index 1984bbeef80..09dea195861 100644 --- a/stylesheets/commons/Label.scss +++ b/stylesheets/commons/Label.scss @@ -135,6 +135,42 @@ } } + &[ data-label-type|="legend" ] { + --label-scale: 0.75; + } + + &[ data-label-type="legend-confirmed" ] { + --placement-solid-color: var( --clr-secondary-25 ); + --placement-text-color: var( --clr-secondary-100 ); + + .theme--dark & { + --placement-solid-color: var( --clr-secondary-90 ); + --placement-text-color: var( --clr-secondary-25 ); + } + } + + &[ data-label-type="legend-minimum" ] { + color: var( --clr-secondary-25 ); + background-color: var( --clr-on-surface-light-primary-12 ); + box-shadow: 0 0 0 0.0625rem var( --clr-secondary-25 ) inset; + + .theme--dark & { + color: var( --clr-secondary-100 ); + background-color: var( --clr-on-surface-dark-primary-12 ); + box-shadow: 0 0 0 0.0625rem var( --clr-secondary-80 ) inset; + } + } + + &[ data-label-type="legend-undecided" ] { + --placement-solid-color: var( --clr-on-surface-light-primary-12 ); + --placement-text-color: var( --clr-secondary-25 ); + + .theme--dark & { + --placement-solid-color: var( --clr-on-surface-dark-primary-12 ); + --placement-text-color: var( --clr-secondary-100 ); + } + } + &[ data-placement-type="byeup" ] { --placement-solid-color: var( --position-byeup-color ); } From f2b996104c35b22dcefe061dda8d07b4ff4ab708 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 13:04:35 +0900 Subject: [PATCH 12/26] add Legend.scss to main.scss --- stylesheets/Main.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/stylesheets/Main.scss b/stylesheets/Main.scss index 6b492cf170f..8dda35a0607 100644 --- a/stylesheets/Main.scss +++ b/stylesheets/Main.scss @@ -29,6 +29,7 @@ @use "commons/Jquery"; @use "commons/Dialog"; @use "commons/Label"; +@use "commons/Legend"; @use "commons/Mainpage"; @use "commons/Matchseries"; @use "commons/MatchTable"; From 34451fc7a95a5d0b70503bc537d2998a50527f61 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 13:09:22 +0900 Subject: [PATCH 13/26] switch internal components to widget3 --- lua/wikis/commons/Widget/Legend.lua | 50 ++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index b892d20d0c9..2e56a4a4646 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -15,7 +15,7 @@ local Logic = Lua.import('Module:Logic') local Widget = Lua.import('Module:Widget') local ChevronToggle = Lua.import('Module:Widget/Participants/Team/ChevronToggle') local GeneralCollapsible = Lua.import('Module:Widget/GeneralCollapsible/Default') -local HtmlWidgets = Lua.import('Module:Widget/Html/All') +local Html = Lua.import('Module:Widget/Html') local Icon = Lua.import('Module:Widget/Image/Icon/Fontawesome') local LabelWidget = Lua.import('Module:Widget/Basic/Label') local WidgetUtil = Lua.import('Module:Widget/Util') @@ -47,15 +47,15 @@ function LegendWidget:render() end ---@private ----@return Widget +---@return VNode function LegendWidget:_createHeader() - return HtmlWidgets.Div{ + return Html.Div{ classes = {'legend-header'}, attributes = {['data-collapsible-click-region'] = 'true'}, children = { - HtmlWidgets.Div{children = { + Html.Div{children = { Icon{iconName = 'general-info'}, - HtmlWidgets.Span{children = self.props.title} + Html.Span{children = self.props.title} }}, ChevronToggle{} } @@ -63,7 +63,7 @@ function LegendWidget:_createHeader() end ---@private ----@return Widget? +---@return VNode? function LegendWidget:_createColorSection() local sectionData = Json.parseIfString(self.props.color) if Logic.isEmpty(sectionData) then @@ -74,14 +74,14 @@ function LegendWidget:_createColorSection() if Logic.isEmpty(labelText) then return end - return HtmlWidgets.Div{ + return Html.Div{ classes = {'legend-item'}, children = { - HtmlWidgets.Span{ + Html.Span{ classes = {labelColor .. '-text'}, - children = '●' + children = {'●'} }, - HtmlWidgets.Span{children = labelText} + Html.Span{children = labelText} } } end) @@ -90,14 +90,14 @@ function LegendWidget:_createColorSection() return end - return HtmlWidgets.Div{ + return Html.Div{ classes = {'legend-section'}, children = labels } end ---@private ----@return Widget? +---@return VNode? function LegendWidget:_createPointsSection() local sectionData = Json.parseIfString(self.props.points) if not sectionData then @@ -107,23 +107,23 @@ function LegendWidget:_createPointsSection() if Logic.isEmpty(pointsText) then return end - return HtmlWidgets.Div{ + return Html.Div{ classes = {'legend-section'}, - children = HtmlWidgets.Div{ + children = Html.Div{ classes = {'legend-item'}, children = { - HtmlWidgets.Span{ + Html.Span{ css = {['font-weight'] = 'bold'}, - children = 'Pts' + children = {'Pts'} }, - HtmlWidgets.Span{children = pointsText} + Html.Span{children = pointsText} } } } end ---@private ----@return Widget? +---@return VNode? function LegendWidget:_createNumberSection() local props = self.props if not Logic.readBool(props.showNumberSection) then @@ -131,7 +131,7 @@ function LegendWidget:_createNumberSection() end local labels = WidgetUtil.collect( - Logic.readBool(props.showConfirmed) and HtmlWidgets.Div{ + Logic.readBool(props.showConfirmed) and Html.Div{ classes = {'legend-item'}, children = { LabelWidget{ @@ -139,10 +139,10 @@ function LegendWidget:_createNumberSection() labelType = 'legend-confirmed', children = 1 }, - HtmlWidgets.Span{children = 'Placement confirmed'} + Html.Span{children = {'Placement confirmed'}} } } or nil, - Logic.readBool(props.showMinimum) and HtmlWidgets.Div{ + Logic.readBool(props.showMinimum) and Html.Div{ classes = {'legend-item'}, children = { LabelWidget{ @@ -150,10 +150,10 @@ function LegendWidget:_createNumberSection() labelType = 'legend-minimum', children = 1 }, - HtmlWidgets.Span{children = 'Minimum placement reached'} + Html.Span{children = {'Minimum placement reached'}} } } or nil, - Logic.readBool(props.showUndecided) and HtmlWidgets.Div{ + Logic.readBool(props.showUndecided) and Html.Div{ classes = {'legend-item'}, children = { LabelWidget{ @@ -161,7 +161,7 @@ function LegendWidget:_createNumberSection() labelType = 'legend-undecided', children = 1 }, - HtmlWidgets.Span{children = 'Placement undecided'} + Html.Span{children = {'Placement undecided'}} } } or nil ) @@ -170,7 +170,7 @@ function LegendWidget:_createNumberSection() return end - return HtmlWidgets.Div{ + return Html.Div{ classes = {'legend-section'}, children = labels } From c1b7e6bb172077a3216cb69f1ef6ce2f3510381b Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 13:56:16 +0900 Subject: [PATCH 14/26] move the rest to widget3 --- lua/wikis/commons/Widget/Legend.lua | 54 +++++++++++++++-------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index 2e56a4a4646..005771907c6 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -8,11 +8,10 @@ local Lua = require('Module:Lua') local Array = Lua.import('Module:Array') -local Class = Lua.import('Module:Class') local Json = Lua.import('Module:Json') local Logic = Lua.import('Module:Logic') -local Widget = Lua.import('Module:Widget') +local Component = Lua.import('Module:Widget/Component') local ChevronToggle = Lua.import('Module:Widget/Participants/Team/ChevronToggle') local GeneralCollapsible = Lua.import('Module:Widget/GeneralCollapsible/Default') local Html = Lua.import('Module:Widget/Html') @@ -22,40 +21,36 @@ local WidgetUtil = Lua.import('Module:Widget/Util') local LABEL_COLORS = {'byeup', 'seedup', 'up', 'stayup', 'stay', 'staydown', 'down'} ----@class LegendWidget: Widget ----@operator call(table): LegendWidget -local LegendWidget = Class.new(Widget) -LegendWidget.defaultProps = { - title = 'Legend', - showConfirmed = true, - showUndecided = true, -} - ----@return Renderable|Renderable[]? -function LegendWidget:render() +---@class LegendComponent +local LegendComponent = {} + +---@param props table +---@return Widget +function LegendComponent.render(props) + mw.logObject(props, props) return GeneralCollapsible{ shouldCollapse = true, collapseAreaClasses = {}, classes = {'legend'}, - titleWidget = self:_createHeader(), + titleWidget = LegendComponent._createHeader(props), children = WidgetUtil.collect( - self:_createColorSection(), - self:_createPointsSection(), - self:_createNumberSection() + LegendComponent._createColorSection(props), + LegendComponent._createPointsSection(props), + LegendComponent._createNumberSection(props) ) } end ---@private ---@return VNode -function LegendWidget:_createHeader() +function LegendComponent._createHeader(props) return Html.Div{ classes = {'legend-header'}, attributes = {['data-collapsible-click-region'] = 'true'}, children = { Html.Div{children = { Icon{iconName = 'general-info'}, - Html.Span{children = self.props.title} + Html.Span{children = props.title} }}, ChevronToggle{} } @@ -64,8 +59,9 @@ end ---@private ---@return VNode? -function LegendWidget:_createColorSection() - local sectionData = Json.parseIfString(self.props.color) +function LegendComponent._createColorSection(props) + mw.log('LegendComponent._createColorSection') + local sectionData = Json.parseIfString(props.color) if Logic.isEmpty(sectionData) then return end @@ -98,8 +94,8 @@ end ---@private ---@return VNode? -function LegendWidget:_createPointsSection() - local sectionData = Json.parseIfString(self.props.points) +function LegendComponent._createPointsSection(props) + local sectionData = Json.parseIfString(props.points) if not sectionData then return end @@ -124,8 +120,7 @@ end ---@private ---@return VNode? -function LegendWidget:_createNumberSection() - local props = self.props +function LegendComponent._createNumberSection(props) if not Logic.readBool(props.showNumberSection) then return end @@ -176,5 +171,12 @@ function LegendWidget:_createNumberSection() } end -return LegendWidget +return Component.component( + LegendComponent.render, + { + title = 'Legend', + showConfirmed = true, + showUndecided = true, + } +) From ba748ad05faebf786bfe9771b168785ee0c605b2 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 13:58:22 +0900 Subject: [PATCH 15/26] extract default props --- lua/wikis/commons/Widget/Legend.lua | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index 005771907c6..1a3145adb97 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -23,6 +23,11 @@ local LABEL_COLORS = {'byeup', 'seedup', 'up', 'stayup', 'stay', 'staydown', 'do ---@class LegendComponent local LegendComponent = {} +LegendComponent.defaultProps = { + title = 'Legend', + showConfirmed = true, + showUndecided = true, +} ---@param props table ---@return Widget @@ -171,12 +176,4 @@ function LegendComponent._createNumberSection(props) } end -return Component.component( - LegendComponent.render, - { - title = 'Legend', - showConfirmed = true, - showUndecided = true, - } -) - +return Component.component(LegendComponent.render, LegendComponent.defaultProps) From b92de41721fb41bca430bed437650ef95fa25fda Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 14:04:12 +0900 Subject: [PATCH 16/26] workaround --- lua/wikis/commons/Widget/Legend.lua | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index 1a3145adb97..aa6e43144d4 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -23,6 +23,8 @@ local LABEL_COLORS = {'byeup', 'seedup', 'up', 'stayup', 'stay', 'staydown', 'do ---@class LegendComponent local LegendComponent = {} + +--TODO: pass defaultProps directly to Component.component LegendComponent.defaultProps = { title = 'Legend', showConfirmed = true, @@ -32,7 +34,6 @@ LegendComponent.defaultProps = { ---@param props table ---@return Widget function LegendComponent.render(props) - mw.logObject(props, props) return GeneralCollapsible{ shouldCollapse = true, collapseAreaClasses = {}, @@ -55,7 +56,7 @@ function LegendComponent._createHeader(props) children = { Html.Div{children = { Icon{iconName = 'general-info'}, - Html.Span{children = props.title} + Html.Span{children = {Logic.emptyOr(props.title, LegendComponent.defaultProps.title)}} }}, ChevronToggle{} } @@ -65,7 +66,6 @@ end ---@private ---@return VNode? function LegendComponent._createColorSection(props) - mw.log('LegendComponent._createColorSection') local sectionData = Json.parseIfString(props.color) if Logic.isEmpty(sectionData) then return @@ -131,7 +131,10 @@ function LegendComponent._createNumberSection(props) end local labels = WidgetUtil.collect( - Logic.readBool(props.showConfirmed) and Html.Div{ + Logic.nilOr( + Logic.readBoolOrNil(props.showConfirmed), + LegendComponent.defaultProps.showConfirmed + ) and Html.Div{ classes = {'legend-item'}, children = { LabelWidget{ @@ -153,7 +156,10 @@ function LegendComponent._createNumberSection(props) Html.Span{children = {'Minimum placement reached'}} } } or nil, - Logic.readBool(props.showUndecided) and Html.Div{ + Logic.nilOr( + Logic.readBoolOrNil(props.showUndecided), + LegendComponent.defaultProps.showUndecided + ) and Html.Div{ classes = {'legend-item'}, children = { LabelWidget{ @@ -176,4 +182,4 @@ function LegendComponent._createNumberSection(props) } end -return Component.component(LegendComponent.render, LegendComponent.defaultProps) +return Component.component(LegendComponent.render) From 75338aee7e1888a9a652a0e6b1b6eff1e8b93dd3 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 14:19:09 +0900 Subject: [PATCH 17/26] add issue reference --- lua/wikis/commons/Widget/Legend.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index aa6e43144d4..6a7849ad146 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -24,7 +24,7 @@ local LABEL_COLORS = {'byeup', 'seedup', 'up', 'stayup', 'stay', 'staydown', 'do ---@class LegendComponent local LegendComponent = {} ---TODO: pass defaultProps directly to Component.component +--TODO: pass defaultProps directly to Component.component (see #7476) LegendComponent.defaultProps = { title = 'Legend', showConfirmed = true, From 8a2d993a67a813f6968dcf500a584c683d6349b8 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 14:20:43 +0900 Subject: [PATCH 18/26] lint --- lua/wikis/commons/Widget/Legend.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index 6a7849ad146..54930ba65b4 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -24,7 +24,7 @@ local LABEL_COLORS = {'byeup', 'seedup', 'up', 'stayup', 'stay', 'staydown', 'do ---@class LegendComponent local LegendComponent = {} ---TODO: pass defaultProps directly to Component.component (see #7476) +--TODO: pass defaultProps directly to Component.component (see #7476) LegendComponent.defaultProps = { title = 'Legend', showConfirmed = true, From abc65076feceeaf1456972e42dd3166b59bbb9db Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 14:27:43 +0900 Subject: [PATCH 19/26] make collapsing configurable --- lua/wikis/commons/Widget/Legend.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index 54930ba65b4..06021ebe3ed 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -35,7 +35,7 @@ LegendComponent.defaultProps = { ---@return Widget function LegendComponent.render(props) return GeneralCollapsible{ - shouldCollapse = true, + shouldCollapse = Logic.readBool(props.shouldCollapse), collapseAreaClasses = {}, classes = {'legend'}, titleWidget = LegendComponent._createHeader(props), From 4ec0cf600ec5fe90db3d9b614639352c96cb6274 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 14:49:12 +0900 Subject: [PATCH 20/26] fix chevrontoggle import --- lua/wikis/commons/Widget/Legend.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/wikis/commons/Widget/Legend.lua b/lua/wikis/commons/Widget/Legend.lua index 06021ebe3ed..1d31ecc54bd 100644 --- a/lua/wikis/commons/Widget/Legend.lua +++ b/lua/wikis/commons/Widget/Legend.lua @@ -12,7 +12,7 @@ local Json = Lua.import('Module:Json') local Logic = Lua.import('Module:Logic') local Component = Lua.import('Module:Widget/Component') -local ChevronToggle = Lua.import('Module:Widget/Participants/Team/ChevronToggle') +local ChevronToggle = Lua.import('Module:Widget/GeneralCollapsible/ChevronToggle') local GeneralCollapsible = Lua.import('Module:Widget/GeneralCollapsible/Default') local Html = Lua.import('Module:Widget/Html') local Icon = Lua.import('Module:Widget/Image/Icon/Fontawesome') From 65e44c4dac883c4ec8d9ff52b4ac117eada561a3 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 17:44:59 +0900 Subject: [PATCH 21/26] add golden --- lua/spec/standings_legend_spec.lua | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 lua/spec/standings_legend_spec.lua diff --git a/lua/spec/standings_legend_spec.lua b/lua/spec/standings_legend_spec.lua new file mode 100644 index 00000000000..8d7ee31951e --- /dev/null +++ b/lua/spec/standings_legend_spec.lua @@ -0,0 +1,20 @@ +--- Triple Comment to Enable our LLS Plugin +insulate('Widget/Legend', function() + it('integration', function() + local LegendComponent = require('Module:Widget/Legend') + + GoldenTest('standings_legend', tostring(LegendComponent{ + color = { + byeup = 'Lorem ipsum', + seedup = 'Lorem ipsum', + up = 'Lorem ipsum', + stayup = 'Lorem ipsum', + stay = 'Lorem ipsum', + staydown = 'Lorem ipsum', + down = 'Lorem ipsum', + }, + points = {'Lorem ipsum'}, + showMinimum = true, + })) + end) +end) From 23c7864a30f0353e25c6e57ceb881deb74d85150 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Fri, 8 May 2026 17:50:57 +0900 Subject: [PATCH 22/26] update golden props --- lua/spec/standings_legend_spec.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/spec/standings_legend_spec.lua b/lua/spec/standings_legend_spec.lua index 8d7ee31951e..402369c831e 100644 --- a/lua/spec/standings_legend_spec.lua +++ b/lua/spec/standings_legend_spec.lua @@ -15,6 +15,7 @@ insulate('Widget/Legend', function() }, points = {'Lorem ipsum'}, showMinimum = true, + showNumberSection = true, })) end) end) From 14e41a489bc1d14dd10c79338df0f86965815f8b Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Mon, 11 May 2026 09:26:58 +0900 Subject: [PATCH 23/26] apply suggestion from feedback --- lua/spec/standings_legend_spec.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lua/spec/standings_legend_spec.lua b/lua/spec/standings_legend_spec.lua index 402369c831e..c3028b7420c 100644 --- a/lua/spec/standings_legend_spec.lua +++ b/lua/spec/standings_legend_spec.lua @@ -5,15 +5,15 @@ insulate('Widget/Legend', function() GoldenTest('standings_legend', tostring(LegendComponent{ color = { - byeup = 'Lorem ipsum', - seedup = 'Lorem ipsum', - up = 'Lorem ipsum', - stayup = 'Lorem ipsum', - stay = 'Lorem ipsum', - staydown = 'Lorem ipsum', - down = 'Lorem ipsum', + byeup = 'Lorem ipsum byeup', + seedup = 'Lorem ipsum seedup', + up = 'Lorem ipsum up', + stayup = 'Lorem ipsum stayup', + stay = 'Lorem ipsum stay', + staydown = 'Lorem ipsum staydown', + down = 'Lorem ipsum down', }, - points = {'Lorem ipsum'}, + points = {'Lorem ipsum points'}, showMinimum = true, showNumberSection = true, })) From 7cba767d03fc708aa18668d19f8b0f83670ccb54 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Mon, 11 May 2026 00:29:53 +0000 Subject: [PATCH 24/26] chore: update visual snapshots --- lua/spec/snapshots/standings_legend.png | Bin 0 -> 25136 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lua/spec/snapshots/standings_legend.png diff --git a/lua/spec/snapshots/standings_legend.png b/lua/spec/snapshots/standings_legend.png new file mode 100644 index 0000000000000000000000000000000000000000..6e4e1e3f8428e8d10f372d4d63cfec6139cb8151 GIT binary patch literal 25136 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 PD8k_B>gTe~DWM4fu+rjp literal 0 HcmV?d00001 From e9c48795c44ab4b73690693a43a2b4cc486992e4 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Mon, 11 May 2026 19:09:36 +0900 Subject: [PATCH 25/26] clean up some duplicate --- stylesheets/commons/Label.scss | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/stylesheets/commons/Label.scss b/stylesheets/commons/Label.scss index 09dea195861..6a4dd82a239 100644 --- a/stylesheets/commons/Label.scss +++ b/stylesheets/commons/Label.scss @@ -150,14 +150,17 @@ } &[ data-label-type="legend-minimum" ] { - color: var( --clr-secondary-25 ); - background-color: var( --clr-on-surface-light-primary-12 ); - box-shadow: 0 0 0 0.0625rem var( --clr-secondary-25 ) inset; + color: var( --placement-solid-color ); + background-color: var( --placement-background-color ); + box-shadow: 0 0 0 0.0625rem var( --placement-border-color, var( --placement-solid-color ) ) inset; + + --placement-solid-color: var( --clr-secondary-25 ); + --placement-background-color: var( --clr-on-surface-light-primary-12 ); .theme--dark & { - color: var( --clr-secondary-100 ); - background-color: var( --clr-on-surface-dark-primary-12 ); - box-shadow: 0 0 0 0.0625rem var( --clr-secondary-80 ) inset; + --placement-solid-color: var( --clr-secondary-100 ); + --placement-background-color: var( --clr-on-surface-dark-primary-12 ); + --placement-border-color: var( --clr-secondary-80 ); } } From 166b88234955e582dbbdb27c5ae79d5680fe6f45 Mon Sep 17 00:00:00 2001 From: ElectricalBoy <15651807+ElectricalBoy@users.noreply.github.com> Date: Mon, 11 May 2026 13:05:53 +0000 Subject: [PATCH 26/26] chore: update visual snapshots --- lua/spec/snapshots/standings_legend.png | Bin 25136 -> 25101 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lua/spec/snapshots/standings_legend.png b/lua/spec/snapshots/standings_legend.png index 6e4e1e3f8428e8d10f372d4d63cfec6139cb8151..a6b06d35b8b0edef1f8dbbae94d275abae532a7e 100644 GIT binary patch literal 25101 zcmeFZcUV*Fx;={BB?1fSBCr${rHb?tP!SN3P6!D|x+#0E%TD!odV7J3U!sS1Qh z2@oKmN$3d>AoSb>*V^Umy-&OMx##yhzw-|>B$;34{N^{`@xEh>cZO+es?uG!e1V3B zhEDC#LtPr0GnAJnzn?!z+1%rKe1eANR~og4_w{{KS1`1mdLu6v4%2R;98#8Y79WXm z<JX*5^B=zx;mk>fF22N+(0E zv*&+#vnN{r6c<#JR9`dT<${ZfQ{pN?{dVDDf+#g4>4OLtk^OL z2oyUd$Qr?M_T)~Z7&()VJ0^v^nZ3MMQX8}-x#c8<@%%vD^Nu{-mCv>`2lE7RFk`Q6 zWq;G}g9Uo|M?^(3k@A~+d#jQ}o)@Pn-+W`i?125QX@fUeghEMrVmNvUt_wc;f6BA3z{JEYm!^jmcek) ziGHwFacR(25!6@l=JDQ2r(#z_c{=NNh1}zJm)H73d8h%4rtLe8#p})KP@YSlKO5mn z+d_F5KU3cRTqb^x2Dtp&4$VFE*;klKfSX^d1GO$_nsEk0@n1Oa0sw0-C*K z&->hdy{`2}MxljXZ;Kmthi}`PBZIr7w&d%!Zw07oapv+sGMgPFVAdz(BIUSfXny|^ z$MBTb^Jz!;*oP)$ad!A)b)FvX{(W(8XGFId*NC{+@z;I@U45|y3v7t)=##IktKf^` zR8&A(1Bj0&TAV;Bl5fKzAI&DKp%r4f5&#Zn*6q@OU2MId1Gm;#UA+@)4AF06_`20z z>pTChWO;C)4`RDxRxB{Rs<9r@;Gbne7~Op%^F2Yv_1jB);tS8CP3UsaT>_sMnWROX zv=^Q*Pa4khd!Qc^gT9}<55qemM#R%VDgB?h;L<-AmF+L=Mnh!

xHAS}&9Bh1F?QD$ur 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 literal 25136 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 PD8k_B>gTe~DWM4fu+rjp