From c4793587f749023bb701ab2f921f569a3a9b0170 Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Fri, 16 Aug 2024 19:41:12 -0300 Subject: [PATCH] More visual changes for wow 11 --- Libs/DF/cooltip.lua | 36 ++++++--- core/control.lua | 50 +++++++++++-- frames/window_mythicplus/deprecated.lua | 95 ------------------------ functions/profiles.lua | 6 +- images/background83.png | Bin 0 -> 2289 bytes images/bar_background_dark_withline.tga | Bin 24620 -> 24620 bytes images/shadow_square.png | Bin 0 -> 5277 bytes 7 files changed, 70 insertions(+), 117 deletions(-) delete mode 100644 frames/window_mythicplus/deprecated.lua create mode 100644 images/background83.png create mode 100644 images/shadow_square.png diff --git a/Libs/DF/cooltip.lua b/Libs/DF/cooltip.lua index 15657d89..4eef0bad 100644 --- a/Libs/DF/cooltip.lua +++ b/Libs/DF/cooltip.lua @@ -20,7 +20,7 @@ local IsPassiveSpell = IsPassiveSpell --api locals local PixelUtil = PixelUtil or DFPixelUtil -local version = 27 +local version = 28 local CONST_MENU_TYPE_MAINMENU = "main" local CONST_MENU_TYPE_SUBMENU = "sub" @@ -150,8 +150,11 @@ function DF:CreateCoolTip() ["SubMenuIsTooltip"] = true, ["LeftBorderSize"] = true, --offset between the left border and the left icon, default: 10 + offset ["RightBorderSize"] = true, --offset between the right border and the right icon, default: -10 + offset + ["TopBorderSize"] = true, --offset between the top border and the top of the first line, default: -6 + offset ["HeighMod"] = true, ["HeighModSub"] = true, + ["TooltipFrameHeightOffset"] = true, + ["TooltipFrameHeightOffsetSub"] = true, ["IconBlendMode"] = true, ["IconBlendModeHover"] = true, ["SubFollowButton"] = true, @@ -1832,7 +1835,8 @@ function DF:CreateCoolTip() end --normalize height of all rows - local heightValue = -6 + spacing + (gameCooltip.OptionsTable.ButtonsYMod or 0) + local heightValue = (gameCooltip.OptionsTable.TopBorderSize or -6) + spacing + (gameCooltip.OptionsTable.ButtonsYMod or 0) + for i = 1, #LeftTextTableSub do local menuButton = frame2.Lines[i] @@ -1861,7 +1865,7 @@ function DF:CreateCoolTip() else menuButton:SetHeight(frame2.hHeight + (gameCooltip.OptionsTable.ButtonHeightMod or 0)) - menuButton:SetPoint("top", frame2, "top", 0, (((i-1) * frame2.hHeight) * -1) - 6 + (gameCooltip.OptionsTable.ButtonsYMod or 0) + spacing) + menuButton:SetPoint("top", frame2, "top", 0, (((i-1) * frame2.hHeight) * -1) + (gameCooltip.OptionsTable.TopBorderSize or -6) + (gameCooltip.OptionsTable.ButtonsYMod or 0) + spacing) end if (gameCooltip.OptionsTable.YSpacingMod and not gameCooltip.OptionsTable.IgnoreButtonAutoHeight) then @@ -1896,17 +1900,22 @@ function DF:CreateCoolTip() end end + local heightMod = gameCooltip.OptionsTable.TooltipFrameHeightOffsetSub or 0 + if (gameCooltip.OptionsTable.FixedHeight) then PixelUtil.SetHeight(frame2, gameCooltip.OptionsTable.FixedHeight) else if (gameCooltip.OptionsTable.AlignAsBlizzTooltip) then - PixelUtil.SetHeight(frame2, ((heightValue - 10) * -1) + (gameCooltip.OptionsTable.AlignAsBlizzTooltipFrameHeightOffset or 0)) + local newHeight = ((heightValue - 10) * -1) + (gameCooltip.OptionsTable.AlignAsBlizzTooltipFrameHeightOffset or 0) + PixelUtil.SetHeight(frame2, newHeight) elseif (gameCooltip.OptionsTable.IgnoreButtonAutoHeight) then - PixelUtil.SetHeight(frame2, (heightValue + spacing) * -1) + local newHeight = (heightValue + spacing) * -1 + PixelUtil.SetHeight(frame2, newHeight + heightMod) else - PixelUtil.SetHeight(frame2, max((frame2.hHeight * gameCooltip.Indexes) + 8 + ((gameCooltip.OptionsTable.ButtonsYMod or 0) * -1), 22)) + local newHeight = (frame2.hHeight * gameCooltip.Indexes) + 8 + ((gameCooltip.OptionsTable.ButtonsYMod or 0) * -1) + PixelUtil.SetHeight(frame2, max(newHeight + heightMod, 22)) end end @@ -2073,7 +2082,8 @@ function DF:CreateCoolTip() end --normalize height of all rows - local heightValue = -6 + spacing + (gameCooltip.OptionsTable.ButtonsYMod or 0) + local heightValue = (gameCooltip.OptionsTable.TopBorderSize or -6) + spacing + (gameCooltip.OptionsTable.ButtonsYMod or 0) + for i = 1, gameCooltip.Indexes do local menuButton = frame1.Lines[i] @@ -2099,10 +2109,9 @@ function DF:CreateCoolTip() menuButton:SetHeight(height) menuButton:SetPoint("top", frame1, "top", 0, heightValue) heightValue = heightValue + (height * -1) + spacing + (gameCooltip.OptionsTable.ButtonsYMod or 0) - else menuButton:SetHeight(frame1.hHeight + (gameCooltip.OptionsTable.ButtonHeightMod or 0)) - menuButton:SetPoint("top", frame1, "top", 0, (((i-1) * frame1.hHeight) * -1) - 6 + (gameCooltip.OptionsTable.ButtonsYMod or 0) + spacing) + menuButton:SetPoint("top", frame1, "top", 0, (((i-1) * frame1.hHeight) * -1) + (gameCooltip.OptionsTable.TopBorderSize or -6) + (gameCooltip.OptionsTable.ButtonsYMod or 0) + spacing) end if (gameCooltip.OptionsTable.YSpacingMod and not gameCooltip.OptionsTable.IgnoreButtonAutoHeight) then @@ -2137,6 +2146,8 @@ function DF:CreateCoolTip() end end + local heightMod = gameCooltip.OptionsTable.TooltipFrameHeightOffset or 0 + if (gameCooltip.OptionsTable.FixedHeight) then PixelUtil.SetHeight(frame1, gameCooltip.OptionsTable.FixedHeight) else @@ -2144,10 +2155,11 @@ function DF:CreateCoolTip() PixelUtil.SetHeight(frame1, ((heightValue - 10) * -1) + (gameCooltip.OptionsTable.AlignAsBlizzTooltipFrameHeightOffset or 0)) elseif (gameCooltip.OptionsTable.IgnoreButtonAutoHeight) then - PixelUtil.SetHeight(frame1, (heightValue + spacing) * -1) - + local newHeight = (heightValue + spacing) * -1 + PixelUtil.SetHeight(frame1, newHeight + heightMod) else - PixelUtil.SetHeight(frame1, max((frame1.hHeight * gameCooltip.Indexes) + 8 + ((gameCooltip.OptionsTable.ButtonsYMod or 0) * -1), 22)) + local newHeight = (frame1.hHeight * gameCooltip.Indexes) + 8 + ((gameCooltip.OptionsTable.ButtonsYMod or 0) * -1) + PixelUtil.SetHeight(frame1, max(newHeight + heightMod, 22)) end end diff --git a/core/control.lua b/core/control.lua index af667c9a..3f9967dd 100644 --- a/core/control.lua +++ b/core/control.lua @@ -1340,7 +1340,9 @@ end end - local bgColor, borderColor = {0, 0, 0, 0.8}, {0, 0, 0, 0} --{0.37, 0.37, 0.37, .75}, {.30, .30, .30, .3} + local bgColor, borderColor = {0, 0, 0, 0.8}, {0, 0, 0, 0.5} --{0.37, 0.37, 0.37, .75}, {.30, .30, .30, .3} + local backdrop = {bgFile = [[Interface\AddOns\Details\images\background83.png]], edgeFile = [[Interface\Buttons\WHITE8X8]], tile=true, + edgeSize = 1, tileSize = 64, insets = {left = 0, right = 0, top = 0, bottom = 0}} function Details:FormatCooltipForSpells() local GameCooltip = GameCooltip @@ -1348,8 +1350,8 @@ GameCooltip:Reset() GameCooltip:SetType("tooltip") - --GameCooltip:SetOption("StatusBarTexture", [[Interface\AddOns\Details\images\bar_background_dark_withline]]) - GameCooltip:SetOption("StatusBarTexture", [[Interface\AddOns\Details\images\bar_textures\bar_rounded]]) + GameCooltip:SetOption("StatusBarTexture", [[Interface\AddOns\Details\images\bar_background_dark_withline]]) + --GameCooltip:SetOption("StatusBarTexture", [[Interface\AddOns\Details\images\bar_textures\bar_rounded.png]]) GameCooltip:SetOption("TextSize", Details.tooltip.fontsize) GameCooltip:SetOption("TextFont", Details.tooltip.fontface) @@ -1358,16 +1360,21 @@ GameCooltip:SetOption("TextShadow", Details.tooltip.fontshadow and "OUTLINE") GameCooltip:SetOption("TextContour", Details.tooltip.fontcontour) - GameCooltip:SetOption("LeftBorderSize", -0) --offset between the left border and the left icon, default: 10 + offset - GameCooltip:SetOption("RightBorderSize", 0) --offset between the right border and the right icon, default: -10 + offset - GameCooltip:SetOption("VerticalOffset", 5) --amount of space to leave between the top border and the first line of the tooltip, default: 0 + GameCooltip:SetOption("LeftBorderSize", -4) --offset between the left border and the left icon, default: 10 + offset + GameCooltip:SetOption("RightBorderSize", 4) --offset between the right border and the right icon, default: -10 + offset + GameCooltip:SetOption("TopBorderSize", -1) --offset between the right border and the right icon, default: -10 + offset + + GameCooltip:SetOption("VerticalOffset", 5) --amount of space to offset each line from each other, default: 0, higher values = less space between GameCooltip:SetOption("RightTextMargin", 0) --offset between the right text to the right icon, default: -3 GameCooltip:SetOption("AlignAsBlizzTooltip", false) GameCooltip:SetOption("LineHeightSizeOffset", 4) GameCooltip:SetOption("VerticalPadding", -4) GameCooltip:SetOption("YSpacingMod", -6) + GameCooltip:SetOption("TooltipFrameHeightOffset", -6) + --IgnoreButtonAutoHeight is true - GameCooltip:SetBackdrop(1, Details.cooltip_preset2_backdrop, bgColor, borderColor) + --GameCooltip:SetBackdrop(1, Details.cooltip_preset2_backdrop, bgColor, borderColor) + GameCooltip:SetBackdrop(1, backdrop, {1, 1, 1, 1}, borderColor) end function Details:BuildInstanceBarTooltip(frame) @@ -1375,13 +1382,22 @@ Details:FormatCooltipForSpells() GameCooltip:SetOption("MinWidth", max(230, self.baseframe:GetWidth()*0.98)) + if (frame.GetActor) then + local actor = frame:GetActor() + if (actor) then + local class = actor:Class() + local classColor = RAID_CLASS_COLORS[class] + GameCooltip:SetBackdrop(1, backdrop, classColor, borderColor) + GameCooltip:SetColor(1, 0, 0, 0, 0.7) + end + end + local myPoint = Details.tooltip.anchor_point local anchorPoint = Details.tooltip.anchor_relative local x_Offset = Details.tooltip.anchor_offset[1] local y_Offset = Details.tooltip.anchor_offset[2] if (Details.tooltip.anchored_to == 1) then - GameCooltip:SetHost(frame, myPoint, anchorPoint, x_Offset, y_Offset) else GameCooltip:SetHost(DetailsTooltipAnchor, myPoint, anchorPoint, x_Offset, y_Offset) @@ -1445,7 +1461,25 @@ end Details:AddRoundedCornerToTooltip() + GameCooltip:ShowCooltip() + + if (not Details.GameCooltipFrame1Shadow) then + Details.GameCooltipFrame1Shadow = GameCooltipFrame1:CreateTexture(nil, "background") + Details.GameCooltipFrame1Shadow:SetTexture([[Interface\AddOns\Details\images\shadow_square.png]], nil, nil, "TRILINEAR") + local offset = 4 + Details.GameCooltipFrame1Shadow:SetPoint("topleft", GameCooltipFrame1, "topleft", -offset, offset) + Details.GameCooltipFrame1Shadow:SetPoint("bottomright", GameCooltipFrame1, "bottomright", offset, -offset) + GameCooltipFrame1:HookScript("OnHide", function(self) + Details.GameCooltipFrame1Shadow:Hide() + end) + end + + if (Details.tooltip.show_border_shadow) then + Details.GameCooltipFrame1Shadow:Show() + else + Details.GameCooltipFrame1Shadow:Hide() + end end end diff --git a/frames/window_mythicplus/deprecated.lua b/frames/window_mythicplus/deprecated.lua deleted file mode 100644 index 646f7fc6..00000000 --- a/frames/window_mythicplus/deprecated.lua +++ /dev/null @@ -1,95 +0,0 @@ - ---old small window for the end of mythic plus runs - -if (false and Details222.MythicPlus.Level and Details222.MythicPlus.Level < 28 and not Details.user_is_patreon_supporter) then - --create the panel - if (not mythicDungeonFrames.ReadyFrame) then - mythicDungeonFrames.ReadyFrame = CreateFrame("frame", "DetailsMythicDungeonReadyFrame", UIParent, "BackdropTemplate") - local readyFrame = mythicDungeonFrames.ReadyFrame - - local textColor = {1, 0.8196, 0, 1} - local textSize = 11 - - local roundedCornerTemplate = { - roundness = 6, - color = {.1, .1, .1, 0.98}, - border_color = {.05, .05, .05, 0.834}, - } - - detailsFramework:AddRoundedCornersToFrame(readyFrame, roundedCornerTemplate) - - local titleLabel = DetailsFramework:CreateLabel(readyFrame, "Details! Mythic Run Completed!", 12, "yellow") - titleLabel:SetPoint("top", readyFrame, "top", 0, -7) - titleLabel.textcolor = textColor - - local closeButton = detailsFramework:CreateCloseButton(readyFrame, "$parentCloseButton") - closeButton:SetPoint("topright", readyFrame, "topright", -2, -2) - closeButton:SetScale(1.4) - closeButton:SetAlpha(0.823) - - readyFrame:SetSize(255, 120) - readyFrame:SetPoint("center", UIParent, "center", 300, 0) - readyFrame:SetFrameStrata("LOW") - readyFrame:EnableMouse(true) - readyFrame:SetMovable(true) - --DetailsFramework:ApplyStandardBackdrop(readyFrame) - --DetailsFramework:CreateTitleBar (readyFrame, "Details! Mythic Run Completed!") - - readyFrame:Hide() - - --register to libwindow - local LibWindow = LibStub("LibWindow-1.1") - LibWindow.RegisterConfig(readyFrame, Details.mythic_plus.finished_run_frame) - LibWindow.RestorePosition(readyFrame) - LibWindow.MakeDraggable(readyFrame) - LibWindow.SavePosition(readyFrame) - - --show button - ---@type df_button - readyFrame.ShowChartButton = DetailsFramework:CreateButton(readyFrame, function() mythicDungeonCharts.ShowChart(); readyFrame:Hide() end, 80, 20, "Show Damage Graphic") - readyFrame.ShowChartButton:SetTemplate(DetailsFramework:GetTemplate("button", "DETAILS_PLUGIN_BUTTON_TEMPLATE")) - readyFrame.ShowChartButton:SetPoint("topleft", readyFrame, "topleft", 5, -30) - readyFrame.ShowChartButton:SetIcon([[Interface\AddOns\Details\images\icons2]], 16, 16, "overlay", {42/512, 75/512, 153/512, 187/512}, {.7, .7, .7, 1}, nil, 0, 0) - readyFrame.ShowChartButton.textcolor = textColor - - --disable feature check box (dont show this again) - local on_switch_enable = function(self, _, value) - Details.mythic_plus.show_damage_graphic = not value - end - - local notAgainSwitch, notAgainLabel = DetailsFramework:CreateSwitch(readyFrame, on_switch_enable, not Details.mythic_plus.show_damage_graphic, _, _, _, _, _, _, _, _, _, Loc ["STRING_MINITUTORIAL_BOOKMARK4"], DetailsFramework:GetTemplate("switch", "OPTIONS_CHECKBOX_BRIGHT_TEMPLATE"), "GameFontHighlightLeft") - notAgainSwitch:ClearAllPoints() - notAgainLabel:SetPoint("left", notAgainSwitch, "right", 2, 0) - notAgainSwitch:SetPoint("bottomleft", readyFrame, "bottomleft", 5, 5) - notAgainSwitch:SetAsCheckBox() - notAgainLabel.textSize = textSize - - local timeNotInCombatLabel = DetailsFramework:CreateLabel(readyFrame, "Time not in combat:", textSize, "orangered") - timeNotInCombatLabel:SetPoint("bottomleft", notAgainSwitch, "topleft", 0, 7) - local timeNotInCombatAmount = DetailsFramework:CreateLabel(readyFrame, "00:00", textSize, "orangered") - timeNotInCombatAmount:SetPoint("left", timeNotInCombatLabel, "left", 130, 0) - - local elapsedTimeLabel = DetailsFramework:CreateLabel(readyFrame, "Run Time:", textSize, textColor) - elapsedTimeLabel:SetPoint("bottomleft", timeNotInCombatLabel, "topleft", 0, 5) - local elapsedTimeAmount = DetailsFramework:CreateLabel(readyFrame, "00:00", textSize, textColor) - elapsedTimeAmount:SetPoint("left", elapsedTimeLabel, "left", 130, 0) - - readyFrame.TimeNotInCombatAmountLabel = timeNotInCombatAmount - readyFrame.ElapsedTimeAmountLabel = elapsedTimeAmount - end - - mythicDungeonFrames.ReadyFrame:Show() - - --update the run time and time not in combat - local elapsedTime = Details222.MythicPlus.time or 1507 - mythicDungeonFrames.ReadyFrame.ElapsedTimeAmountLabel.text = DetailsFramework:IntegerToTimer(elapsedTime) - - local overallMythicDungeonCombat = Details:GetCurrentCombat() - if (overallMythicDungeonCombat:GetCombatType() == DETAILS_SEGMENTTYPE_MYTHICDUNGEON_OVERALL) then - local combatTime = overallMythicDungeonCombat:GetCombatTime() - local notInCombat = elapsedTime - combatTime - mythicDungeonFrames.ReadyFrame.TimeNotInCombatAmountLabel.text = DetailsFramework:IntegerToTimer(notInCombat) .. " (" .. math.floor(notInCombat / elapsedTime * 100) .. "%)" - end - - return -end \ No newline at end of file diff --git a/functions/profiles.lua b/functions/profiles.lua index 0373f9b8..12a89f31 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -943,6 +943,8 @@ local default_profile = { --height used on tooltips at displays such as damage taken by spell line_height = 17, + + show_border_shadow = true, --from spell tooltips from the main window }, --new window system @@ -1451,7 +1453,7 @@ local default_global_data = { last_mythicrun_chart = {}, mythicrun_chart_frame = {}, mythicrun_chart_frame_minimized = {}, - finished_run_frame = {}, + finished_run_panel = {}, --save window position finished_run_frame_options = { orientation = "horizontal", grow_direction = "left", @@ -1861,7 +1863,7 @@ function Details:ImportProfile (profileString, newProfileName, bImportAutoRunCod mythicPlusSettings.last_mythicrun_chart = {} mythicPlusSettings.mythicrun_chart_frame = {} mythicPlusSettings.mythicrun_chart_frame_minimized = {} - mythicPlusSettings.finished_run_frame = {} + mythicPlusSettings.finished_run_panel = {} --make the max amount of segments be 25 Details.segments_amount = 25 diff --git a/images/background83.png b/images/background83.png new file mode 100644 index 0000000000000000000000000000000000000000..9be10c81fec437807241e58496fb8c4e3d6725e3 GIT binary patch literal 2289 zcmeHJ{cjU>7{3KO++d1`4)6yqw~&B(FTHMMJ$f5myEj;8*~Zo_ym;$<+n#HC(;dvjDLVXT)Xdm zKF{ZQp6~P0t#wtG=VVXLMi3;YvcgdVzuUFv=}h=}vWPo}Acn(2om+7`s~C?MBsgAd z280?6LmWY@#cG)Iv;YNd20kIgV*N*sW2nHhSVMu6a)#}|FI2=NP#deR^Tb*_79J}u z%C@Qu6bJ%^L)Bm)Br__D>ADR3TYF7ns7_H@Sj_Eop>|OMXaP|`P*_nmYL$2|Q{yNb zGKMD>^D9c2A<1YoN<>YBDEUaE#bO~TnxttQGH|&yq;M)8lJhi)xP}AB9!Ur*f*3+I zO|DstC@h9S9374<7*2?XT{Q4wXo_ym&#oMy;-5>CPqDWJ#C zdq@xfK@d`8$Ty}q0;({Qb4pkmk|wVR-Y3vCB#jPh<8&qhN|7JVIv7leM^;Lgz>6Cy z!ecGuy4EltYk(|9Bo8QE0`tn#?+$un>=NJ<;D8T{(G;DJQ-!$ETxXoYJeVnCE&a4-jx9_$EI zX}7y1(JKTXCfAggpp~U|v(aKU<1}H^xmw*Am!N`x+abWB%djU|%t#mh18sZ~s(Y`6 z!w6l(CAHczl|jx28U$YPkEo3RRUqU`L$n$NBHB>Q3kk5Qv>t+P?nOeDG`mC4Pz@1A;bfOn?jdSWLxv;N>C#1uJTXtHmdYkq}>KvXa__ z281CM{WL6NB~yG@^#*1t1X&TK)+D#JU~#Hjeb7-}X-@zpaw<(!er|^(i$RGq;SAy$y^}&Gx1j$$-z$Q#&Bbl^#_YA_Jm|jpYs0ny^|dS^r)l-dJ)Mi}4-MU!=WVVDw)~m7 z-5Zbge%-Uix=HT4(bmtt^Jbr+C4b+wd-YSU{bInaFDN*HAGz|1^4+OkYU}15`{a(Z z)0}s{&saC9Kl6Ok`M!rO3)b%3-`;6g=g;k4dAIBC?J`?IYr|*dXHShkapS~7CoyfQ zc698Uij|JP58^jzZ(}d&$*t9jUW7S@IscU zbX=~fY8-|xn6$ytgSNfRmu^_P2w%Q6a&{hHKYjawviHXtj_!D|Ggi|)``*s=uTDMq zX!+pY-DQ9NcIy+g>+^}HKNx)_x~<8)zRz=V&(>MzO!I$u>Hd%9)B_@RX#1gOzc^sX zy_|y|8@=h<3xhjPce$N!Joo9Yn!B;gfvGo-t?qp<*4H**S+?rtuBDf9ZcpiH-xB?> zZPf1Z{!w{nCVT~dH?zVOjWU7|dD@eqb`~#z6>?QNY<23EI~R=^2s*Zh>N(!EY+^}f z`SS+$ulB#?`UoeC>s!PEA64k;R#7O#i=n>`nZXG3Me^Go-AJkF@_( NDod*!`%7M5`8S&H_^$u} literal 0 HcmV?d00001 diff --git a/images/bar_background_dark_withline.tga b/images/bar_background_dark_withline.tga index 5b19db24521fdf9cae9ac573daed157408a6e7b1..ed2d834f9dea5b0161d33df72fd95dd94de64767 100644 GIT binary patch literal 24620 zcmeI*%MCz46hP5O6_(QgU5sQBA@PfLRmO@6?3`P|Y2ZfG@m8g1(j@`}2oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXFd?av+z>fu<8^Ahm Pc`r+u#`fsTkh{166KL?s literal 24620 zcmeI*%MCz46hP5O6_&HHq>GVEB8Xq~Ux^hJ*g3a^)4+|W5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U_(-4?fgcMzH-LRT P@>#YrPu(??G52u;Y=MRP diff --git a/images/shadow_square.png b/images/shadow_square.png new file mode 100644 index 0000000000000000000000000000000000000000..1abd3181a4ef76e4ed60bc335a5c558fdcf8cb17 GIT binary patch literal 5277 zcmeHLX;>3y9)F356c5x|XfIfQa?z z(k*N4qeeNZ)M8tKZh0z4grKfVEtgff$`O!4un2)dI3#5D4Jb-!_t|gzg%9)0yz~3t z*ZiM(KR9sbYO76F0D#rI{C)QVK!A?~U}*twW3u~?0a&i$hlEN)1Ky%Vqe4eE2R(>5 z%7kKw13+iW#O&x;L`pn}@c1GINvBeihw(V*k~$; z#PqbH%V$>#M|P%CsbnV#nL=@Z6b@LDNXnKuh_Edt z5pyzp5iDB57fbo5h-i|@K8VIk86*e(m&v<-L0V;vUK_6UZjeQ2~^6?3lpj^HHV%XlD-o#ygKJLy` zcXtPhqw_4SDQ~o3z6=qB`to7YF<6rflAAN-7iidTp|jfe!DfUi=0uuuOWP%6^N<64 zjx^?(v}eFuh={icG37`QZ)%Faiuf?Ab0*9(g+9ZelTJ?L=QM>a#!QVyq;sNaQodAx z%%0{N&r2YkJIx&hd{ej41Z)wHL6SLe5H34jASHQXF>op*vaq;#wgjP*O)Vd;<-|uLoY~Mr59Uw| zyhc>iTX zHIvW&_(HI+&yn}s_-7B_zZ>=O^2R8OFo(y6mo76pT}W>qY5IhC=wWkknpc4rwswQx z+PZo_hpk1UA;F}E-uBTl&AScVo!IsDx3^O(T33|Gy;dGiFTBvAp`{M0~R`}T~em8oe;;dA6<86zgx90V}*V|i)wZ>mcwj13#&PioQ9?X@I zX>4!vIOjU^9`lzEhV+3*!>aH8W-(PMG1|s{^yRl#zJCAT+xe6Y!zaoe8&9p@ckwlZ z)9N~nmlP!*YGHjYvi7by&z6rJ5nAt79UDnG^ztQ_uPSc@RGwBR5VquA)HS(IIKOeV z`=_g)-LmdVUXdJm|Ln#cd-lie*}hz7b7$Sr`gdc(3&*aMH%z(sUj6aQp{`*|iyyB= z_u8EB<>}8Y>s}7On=gp{!!Q6Gx0o(7*(GKI0ILkUe7!4x(gRb65JuRSi<#^3h$SXu6hH9Jpp?88!u z>Zda0?z)832bCEUbUQE^+mT(WGv0r(A+WtsZ{p)I%o<|=5Zs)Ra|^j1V`N@m zZ)%zw+!%6--GGSeFGLG{p-Gkjc4&-F+!;*eyWWJuMsr&w%LT_1>AWNGW!y9YmDG3SV4{PO= z<44oOy$tTU(rW-rUar@Ud~Q&7yk+d|?(Wtqr>2dS@eWnDY#j*i*cgR7L1bNRvqnBz zr!Fik^!yn&1Czz=?d`RRniLP0(ScfntLh%%40htMs;35!xrv2%u`(&iq^Ys7Q9eCb zf}i(^Xs>VEu`=5VDDsP6{f1T4qH1R*;E(kK*3s%TRx2BQ%M)Wh< z(aGJ4pz%y$+*hj&!o$}$Edy2eT8Y5U3l{PVD1!?06f1$Gb@GpwyHd*OjWq1_$cntX!0u41=t zf)G`_8W&Ep6Y>cnZb^ACfCiSGtG`f+xkZ89tEzvl4hL99-Z+D!T{O{?PFTeWg` z)dh83uP_j`>twy&kWzCzhfw;1PB(%6d>{p+=IjrH1Pd#LHge~hDiV2UX?{PEJPJ5K+DBGBZh84hg z*#S86Yyf`tCQZ?Jd&+n)Nt|+b=4+NF2J=*1$0h1SxOn8$kC3YL_i*=9&0&>maFsFw zwAYC~L4(S3mFHVmkF!qOD5+PrT|0O4lEuJzGhnBo9cius&DJ_~t?0C-mR+fSU!mVn zHC|QsX#Y5iNv9j+80J#MQbT>6T01RH0ESmYB2k}dU2V<&0_P_b&wPJ!rkE=KLbK-g za;ge@0nbvxfDRNF7YFhBPEoTCv_y85B+1V~Z#Ti+QZi%OcM+xmXSm?mO1!q#+GTXc zwrQv%`)%{mh#yL_M{#|3H#?jomOEVV!NG7d)$I(*^QcKXtF)UaDboH6`uL(@(6&&= zV)ftmSXF>p0D8f`QCUQFBI7tH?Lg6u7Ms(otK5f6+S=9~j-Q+!N&~XgrX5pFmMzEd zJnKiinn7VzQ7oa!lqBuIX zvO28i!I#Od{Xqu0Oa8Jb?597y=Li2Evhp|f literal 0 HcmV?d00001