-- Reference only. Do not add this file to GH3.toc.
-- This file shows a static GH3-themed GUI page built from the real art assets.

local PatternPage = {}

local Assets = {
    Cards = {
        Raid = {
            texture = "Interface\\AddOns\\GH3\\Media\\Cards\\Card_Gold-l.png",
            sourceWidth = 512,
            sourceHeight = 128,
            insets = { left = 36, right = 36, top = 10, bottom = 12 },
            icon = "Interface\\AddOns\\GH3\\Media\\Icons\\Icon_Raid-l.png",
            titleColor = { 0.96, 0.82, 0.46, 1 },
            valueColor = { 0.96, 0.93, 0.84, 1 },
        },
        Members = {
            texture = "Interface\\AddOns\\GH3\\Media\\Cards\\Card_Green-l.png",
            sourceWidth = 512,
            sourceHeight = 128,
            insets = { left = 36, right = 36, top = 10, bottom = 12 },
            icon = "Interface\\AddOns\\GH3\\Media\\Icons\\Icon_Roster-l.png",
            titleColor = { 0.56, 0.94, 0.42, 1 },
            valueColor = { 0.56, 0.94, 0.42, 1 },
        },
        Mythic = {
            texture = "Interface\\AddOns\\GH3\\Media\\Cards\\Card_Purple-l.png",
            sourceWidth = 512,
            sourceHeight = 128,
            insets = { left = 36, right = 36, top = 10, bottom = 12 },
            icon = "Interface\\AddOns\\GH3\\Media\\Icons\\Icon_MythicPlus-l.png",
            titleColor = { 0.84, 0.62, 1, 1 },
            valueColor = { 0.84, 0.62, 1, 1 },
        },
        News = {
            texture = "Interface\\AddOns\\GH3\\Media\\Cards\\Card_Blue-l.png",
            sourceWidth = 512,
            sourceHeight = 128,
            insets = { left = 36, right = 36, top = 10, bottom = 12 },
            icon = "Interface\\AddOns\\GH3\\Media\\Icons\\Icon_News-l.png",
            titleColor = { 0.38, 0.74, 1, 1 },
            valueColor = { 0.38, 0.74, 1, 1 },
        },
    },
    Panel = {
        texture = "Interface\\AddOns\\GH3\\Media\\Panels\\Panel_Large-l.png",
        sourceWidth = 512,
        sourceHeight = 512,
        insets = { left = 22, right = 22, top = 42, bottom = 42 },
        headerTexture = "Interface\\AddOns\\GH3\\Media\\Panels\\Panel_Header-l.png",
        headerHeight = 40,
        bodyOffsetY = 30,
    },
    Row = {
        texture = "Interface\\AddOns\\GH3\\Media\\Rows\\Row_Normal-l.png",
        sourceWidth = 512,
        sourceHeight = 48,
        insets = { left = 8, right = 8, top = 4, bottom = 4 },
    },
    Footer = {
        texture = "Interface\\AddOns\\GH3\\Media\\Panels\\Panel_Footer-l.png",
        sourceWidth = 512,
        sourceHeight = 128,
        insets = { left = 28, right = 28, top = 18, bottom = 14 },
        leftIcon = "Interface\\AddOns\\GH3\\Media\\Icons\\Footer_Left_Placeholder.png",
        rightIcon = "Interface\\AddOns\\GH3\\Media\\Icons\\Footer_Right_Placeholder.png",
    },
    Icons = {
        Ready = "Interface\\AddOns\\GH3\\Media\\Icons\\Icon_Ready-l.png",
        Warning = "Interface\\AddOns\\GH3\\Media\\Icons\\Icon_Warning-l.png",
        NeedGems = "Interface\\AddOns\\GH3\\Media\\Icons\\Icon_NeedGems-l.png",
        Tank = "Interface\\AddOns\\GH3\\Media\\Icons\\Icon_Role_Tank-l.png",
        Healer = "Interface\\AddOns\\GH3\\Media\\Icons\\Icon_Role_Healer-l.png",
        DPS = "Interface\\AddOns\\GH3\\Media\\Icons\\Icon_Role_DPS-l.png",
        EventMythic = "Interface\\AddOns\\GH3\\Media\\Icons\\Event_Mythic.png",
        EventAchievement = "Interface\\AddOns\\GH3\\Media\\Icons\\Event_Achievement.png",
        MythicBadge = "Interface\\AddOns\\GH3\\Media\\Icons\\MythicBadge-l.png",
    },
}

local function ApplyRect(frame, parent, rect)
    if not frame or not parent or not rect then
        return
    end

    frame:ClearAllPoints()
    frame:SetPoint("TOPLEFT", parent, "TOPLEFT", rect.x, rect.y)
    frame:SetSize(rect.w, rect.h)
end

local function CreateArtFrame(parent, rect, asset)
    local frame = CreateFrame("Frame", nil, parent, BackdropTemplateMixin and "BackdropTemplate" or nil)
    ApplyRect(frame, parent, rect)
    local hasAuthoredArt = type(asset) == "table" and type(asset.texture) == "string" and asset.texture ~= ""

    if frame.SetBackdrop then
        frame:SetBackdrop({
            bgFile = "Interface\\Buttons\\WHITE8X8",
            edgeFile = "Interface\\Buttons\\WHITE8X8",
            edgeSize = 1,
            insets = {
                left = 1,
                right = 1,
                top = 1,
                bottom = 1,
            },
        })
        frame:SetBackdropColor(hasAuthoredArt and 0 or 0.08, hasAuthoredArt and 0 or 0.08, hasAuthoredArt and 0 or 0.10, hasAuthoredArt and 0 or 0.92)
        frame:SetBackdropBorderColor(0.34, 0.34, 0.40, 1)
    end

    local texture = frame:CreateTexture(nil, hasAuthoredArt and "ARTWORK" or "BACKGROUND")
    texture:SetAllPoints(frame)
    if hasAuthoredArt then
        texture:SetTexture(asset.texture)
        texture:SetVertexColor(1, 1, 1, 1)
    else
        texture:SetColorTexture(0.12, 0.12, 0.14, 0.98)
    end
    frame.Texture = texture

    local sourceWidth = asset and tonumber(asset.sourceWidth) or rect.w or 1
    local sourceHeight = asset and tonumber(asset.sourceHeight) or rect.h or 1
    local insets = asset and asset.insets or {}
    local scaleX = (rect.w or 1) / math.max(1, sourceWidth)
    local scaleY = (rect.h or 1) / math.max(1, sourceHeight)
    local left = math.floor(((tonumber(insets.left) or 0) * scaleX) + 0.5)
    local right = math.floor(((tonumber(insets.right) or 0) * scaleX) + 0.5)
    local top = math.floor(((tonumber(insets.top) or 0) * scaleY) + 0.5)
    local bottom = math.floor(((tonumber(insets.bottom) or 0) * scaleY) + 0.5)

    local content = CreateFrame("Frame", nil, frame)
    content:SetPoint("TOPLEFT", frame, "TOPLEFT", left, -top)
    content:SetSize(
        math.max(1, (rect.w or 1) - left - right),
        math.max(1, (rect.h or 1) - top - bottom)
    )
    frame.Content = content
    return frame
end

local function CreateDecoratedFrame(parent, rect, spec)
    local frame = CreateArtFrame(parent, rect, spec and spec.frame or spec)
    local content = frame.Content
    local body = content

    if spec and spec.header then
        local header = frame:CreateTexture(nil, "ARTWORK")
        header:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -1)
        header:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -1, -1)
        header:SetHeight(tonumber(spec.header.height) or 32)
        if type(spec.header.texture) == "string" and spec.header.texture ~= "" then
            header:SetTexture(spec.header.texture)
            header:SetVertexColor(1, 1, 1, 0.96)
        else
            header:SetColorTexture(0.09, 0.08, 0.06, 0.82)
        end

        local title = content:CreateFontString(nil, "OVERLAY", "GameFontNormal")
        title:SetPoint("TOPLEFT", content, "TOPLEFT", 0, 0)
        title:SetText(spec.header.title or "Panel")
        frame.TitleText = title

        body = CreateFrame("Frame", nil, frame)
        body:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(tonumber(spec.header.bodyOffsetY) or 26))
        body:SetPoint("BOTTOMRIGHT", content, "BOTTOMRIGHT", 0, 0)
    end

    frame.Body = body
    return frame
end

local function CreateRow(parent, offsetY, asset, leftText, rightText, options)
    local row = CreateFrame("Frame", nil, parent)
    row:SetPoint("TOPLEFT", parent, "TOPLEFT", 0, offsetY)
    row:SetPoint("TOPRIGHT", parent, "TOPRIGHT", 0, offsetY)
    row:SetHeight(options and options.height or 24)

    local background = CreateArtFrame(parent, { x = 0, y = offsetY, w = parent:GetWidth() or 1, h = options and options.height or 24 }, asset)
    local content = background.Content

    local icon = nil
    if options and options.icon then
        icon = background:CreateTexture(nil, "OVERLAY")
        icon:SetSize(options.iconSize or 20, options.iconSize or 20)
        icon:SetPoint("LEFT", content, "LEFT", 0, 0)
        icon:SetTexture(options.icon)
        icon:SetVertexColor(1, 1, 1, 0.98)
    end

    local left = background:CreateFontString(nil, "OVERLAY", options and options.leftFont or "GameFontHighlight")
    left:SetPoint("LEFT", content, "LEFT", icon and ((options.iconSize or 20) + 6) or 0, 0)
    left:SetWidth(options and options.leftWidth or 220)
    left:SetWordWrap(false)
    left:SetJustifyH("LEFT")
    left:SetText(leftText)
    if options and options.leftColor then
        left:SetTextColor(options.leftColor[1], options.leftColor[2], options.leftColor[3], options.leftColor[4] or 1)
    end

    local right = background:CreateFontString(nil, "OVERLAY", options and options.rightFont or "GameFontHighlight")
    right:SetPoint("RIGHT", content, "RIGHT", 0, 0)
    right:SetWidth(options and options.rightWidth or 120)
    right:SetWordWrap(false)
    right:SetJustifyH("RIGHT")
    right:SetText(rightText)
    if options and options.rightColor then
        right:SetTextColor(options.rightColor[1], options.rightColor[2], options.rightColor[3], options.rightColor[4] or 1)
    end

    row.Background = background
    row.Content = content
    row.Icon = icon
    row.LeftText = left
    row.RightText = right
    return row
end

local function CreateCard(parent, rect, asset, titleText, valueText)
    local card = CreateArtFrame(parent, rect, asset)
    local content = card.Content

    local icon = card:CreateTexture(nil, "OVERLAY")
    icon:SetSize(56, 56)
    icon:SetPoint("LEFT", content, "LEFT", 0, -2)
    icon:SetTexture(asset.icon)
    icon:SetVertexColor(1, 1, 1, 0.98)

    local body = CreateFrame("Frame", nil, card)
    body:SetPoint("TOPLEFT", content, "TOPLEFT", 76, 0)
    body:SetPoint("BOTTOMRIGHT", content, "BOTTOMRIGHT", 0, 0)

    local title = card:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
    title:SetPoint("TOP", body, "TOP", 0, -2)
    title:SetWidth(220)
    title:SetJustifyH("CENTER")
    title:SetWordWrap(false)
    title:SetText(string.upper(titleText))
    title:SetTextColor(asset.titleColor[1], asset.titleColor[2], asset.titleColor[3], asset.titleColor[4] or 1)

    local value = card:CreateFontString(nil, "OVERLAY", "GameFontHighlightLarge")
    value:SetPoint("CENTER", body, "CENTER", 0, -2)
    value:SetWidth(220)
    value:SetJustifyH("CENTER")
    value:SetWordWrap(false)
    value:SetText(valueText)
    value:SetTextColor(asset.valueColor[1], asset.valueColor[2], asset.valueColor[3], asset.valueColor[4] or 1)

    card.Icon = icon
    card.Body = body
    card.TitleText = title
    card.ValueText = value
    return card
end

local function CreateFooterSection(parent, rect, labelText, valueText, iconPath, iconAlign, fillColor, fillPercent)
    local section = CreateFrame("Frame", nil, parent)
    ApplyRect(section, parent, rect)

    local content = CreateFrame("Frame", nil, section)
    content:SetAllPoints(section)

    local icon = nil
    local leftInset = 0
    local rightInset = 0
    if type(iconPath) == "string" and iconPath ~= "" then
        icon = section:CreateTexture(nil, "OVERLAY")
        icon:SetSize(30, 30)
        if iconAlign == "RIGHT" then
            icon:SetPoint("RIGHT", content, "RIGHT", 0, -1)
            rightInset = 38
        else
            icon:SetPoint("LEFT", content, "LEFT", 0, -1)
            leftInset = 38
        end
        icon:SetTexture(iconPath)
    end

    local label = section:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
    label:SetPoint("TOPLEFT", content, "TOPLEFT", leftInset, -2)
    label:SetText(labelText)

    local labelRule = section:CreateTexture(nil, "ARTWORK")
    labelRule:SetPoint("TOPLEFT", label, "BOTTOMLEFT", 0, -3)
    labelRule:SetPoint("TOPRIGHT", content, "TOPRIGHT", -rightInset, -3)
    labelRule:SetHeight(1)
    labelRule:SetColorTexture(0.58, 0.44, 0.16, 0.55)

    local value = section:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
    value:SetPoint("TOPLEFT", label, "BOTTOMLEFT", 0, -4)
    value:SetText(valueText)

    local barFrame = CreateArtFrame(section, { x = leftInset, y = -32, w = math.max(1, rect.w - leftInset - rightInset), h = 16 }, {
        texture = "Interface\\AddOns\\GH3\\Media\\StatusBars\\StatusBar_Frame-l.png",
        sourceWidth = 512,
        sourceHeight = 64,
        insets = { left = 18, right = 18, top = 10, bottom = 10 },
    })
    local fill = section:CreateTexture(nil, "OVERLAY")
    fill:SetPoint("LEFT", barFrame.Content, "LEFT", 0, 0)
    fill:SetPoint("TOP", barFrame.Content, "TOP", 0, 0)
    fill:SetPoint("BOTTOM", barFrame.Content, "BOTTOM", 0, 0)
    fill:SetWidth((tonumber(barFrame.Content:GetWidth()) or 0) * (fillPercent or 0))
    fill:SetColorTexture(fillColor[1], fillColor[2], fillColor[3], fillColor[4] or 1)

    section.Icon = icon
    section.LabelText = label
    section.ValueText = value
    section.BarFrame = barFrame
    section.BarFill = fill
    return section
end

local function RenderStaticReference(parent)
    local pageRect = { x = 0, y = 0, w = 1380, h = 742 }
    local root = CreateFrame("Frame", nil, parent)
    ApplyRect(root, parent, pageRect)

    local panelSpec = {
        frame = {
            texture = Assets.Panel.texture,
            sourceWidth = Assets.Panel.sourceWidth,
            sourceHeight = Assets.Panel.sourceHeight,
            insets = Assets.Panel.insets,
        },
        header = {
            texture = Assets.Panel.headerTexture,
            height = Assets.Panel.headerHeight,
            bodyOffsetY = Assets.Panel.bodyOffsetY,
        },
    }

    local cards = {
        CreateCard(root, { x = 20, y = -8, w = 320, h = 112 }, Assets.Cards.Raid, "Upcoming Raid", "Fri 8:00 PM"),
        CreateCard(root, { x = 360, y = -8, w = 320, h = 112 }, Assets.Cards.Members, "Members Online", "18"),
        CreateCard(root, { x = 700, y = -8, w = 320, h = 112 }, Assets.Cards.Mythic, "Mythic+ Runs", "12"),
        CreateCard(root, { x = 1040, y = -8, w = 320, h = 112 }, Assets.Cards.News, "Guild News", "3 New"),
    }

    local rosterPanel = CreateDecoratedFrame(root, { x = 20, y = -136, w = 660, h = 300 }, {
        frame = panelSpec.frame,
        header = {
            texture = panelSpec.header.texture,
            height = panelSpec.header.height,
            bodyOffsetY = panelSpec.header.bodyOffsetY,
            title = "Roster & Readiness",
        },
    })
    local eventsPanel = CreateDecoratedFrame(root, { x = 700, y = -136, w = 660, h = 300 }, {
        frame = panelSpec.frame,
        header = {
            texture = panelSpec.header.texture,
            height = panelSpec.header.height,
            bodyOffsetY = panelSpec.header.bodyOffsetY,
            title = "Weekly Events",
        },
    })
    local highlightsPanel = CreateDecoratedFrame(root, { x = 20, y = -454, w = 660, h = 204 }, {
        frame = panelSpec.frame,
        header = {
            texture = panelSpec.header.texture,
            height = panelSpec.header.height,
            bodyOffsetY = panelSpec.header.bodyOffsetY,
            title = "Mythic+ Highlights",
        },
    })
    local lootPanel = CreateDecoratedFrame(root, { x = 700, y = -454, w = 660, h = 204 }, {
        frame = panelSpec.frame,
        header = {
            texture = panelSpec.header.texture,
            height = panelSpec.header.height,
            bodyOffsetY = panelSpec.header.bodyOffsetY,
            title = "Recent Loot / Upgrades",
        },
    })

    local headerRow = CreateRow(rosterPanel.Body, 0, Assets.Row, "Player", "Status", {
        leftFont = "GameFontNormalSmall",
        rightFont = "GameFontNormalSmall",
        leftColor = { 0.92, 0.84, 0.62, 1 },
        rightColor = { 0.92, 0.84, 0.62, 1 },
        leftWidth = 300,
        rightWidth = 130,
        height = 20,
    })
    headerRow.Background.Texture:SetVertexColor(1, 1, 1, 0.8)

    CreateRow(rosterPanel.Body, -24, Assets.Row, "Aelthas", "Ready", {
        icon = Assets.Icons.Tank,
        leftColor = { 0.84, 0.62, 1, 1 },
        rightColor = { 0.56, 0.94, 0.42, 1 },
    })
    CreateRow(rosterPanel.Body, -48, Assets.Row, "Brewmasterx", "Ready", {
        icon = Assets.Icons.Healer,
        leftColor = { 0.96, 0.60, 0.16, 1 },
        rightColor = { 0.56, 0.94, 0.42, 1 },
    })
    CreateRow(rosterPanel.Body, -72, Assets.Row, "Lunarya", "Missing Enchant", {
        icon = Assets.Icons.DPS,
        leftColor = { 0.38, 0.74, 1, 1 },
        rightColor = { 0.96, 0.74, 0.24, 1 },
        rightWidth = 170,
    })
    CreateRow(rosterPanel.Body, -96, Assets.Row, "Doomscythe", "Needs Gems", {
        icon = Assets.Icons.DPS,
        leftColor = { 0.96, 0.40, 0.28, 1 },
        rightColor = { 0.96, 0.40, 0.28, 1 },
        rightWidth = 140,
    })
    CreateRow(rosterPanel.Body, -120, Assets.Row, "Valdrin", "Ready", {
        icon = Assets.Icons.Healer,
        leftColor = { 0.96, 0.82, 0.46, 1 },
        rightColor = { 0.56, 0.94, 0.42, 1 },
    })

    CreateRow(eventsPanel.Body, 0, Assets.Row, "Raid Night", "Fri 8:00 PM", {
        icon = Assets.Cards.Raid.icon,
        leftColor = { 0.96, 0.82, 0.46, 1 },
        rightColor = { 0.38, 0.74, 1, 1 },
        leftWidth = 360,
    })
    CreateRow(eventsPanel.Body, -24, Assets.Row, "Mythic+ Night", "Sat 7:30 PM", {
        icon = Assets.Icons.EventMythic,
        leftColor = { 0.96, 0.82, 0.46, 1 },
        rightColor = { 0.38, 0.74, 1, 1 },
        leftWidth = 360,
    })
    CreateRow(eventsPanel.Body, -48, Assets.Row, "Alt Run", "Sun 7:00 PM", {
        icon = Assets.Icons.DPS,
        leftColor = { 0.96, 0.82, 0.46, 1 },
        rightColor = { 0.38, 0.74, 1, 1 },
        leftWidth = 360,
    })
    CreateRow(eventsPanel.Body, -72, Assets.Row, "Guild Achievement Run", "Tue 6:30 PM", {
        icon = Assets.Icons.EventAchievement,
        leftColor = { 0.96, 0.82, 0.46, 1 },
        rightColor = { 0.38, 0.74, 1, 1 },
        leftWidth = 360,
    })

    local badge = highlightsPanel:CreateTexture(nil, "OVERLAY")
    badge:SetPoint("TOPLEFT", highlightsPanel.Body, "TOPLEFT", 8, -4)
    badge:SetSize(152, 152)
    badge:SetTexture(Assets.Icons.MythicBadge)

    local bestLabel = highlightsPanel:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
    bestLabel:SetPoint("TOPLEFT", highlightsPanel.Body, "TOPLEFT", 174, -2)
    bestLabel:SetText("This Week's Best")

    local dungeonText = highlightsPanel:CreateFontString(nil, "OVERLAY", "GameFontHighlightLarge")
    dungeonText:SetPoint("TOPLEFT", bestLabel, "BOTTOMLEFT", 0, -6)
    dungeonText:SetText("Halls of Infusion")
    dungeonText:SetTextColor(0.38, 0.74, 1, 1)

    local keyText = highlightsPanel:CreateFontString(nil, "OVERLAY", "GameFontHighlightLarge")
    keyText:SetPoint("TOPLEFT", dungeonText, "BOTTOMLEFT", 0, -20)
    keyText:SetText("+16")
    keyText:SetTextColor(0.84, 0.62, 1, 1)
    keyText:SetScale(1.8)

    local timedText = highlightsPanel:CreateFontString(nil, "OVERLAY", "GameFontNormal")
    timedText:SetPoint("LEFT", keyText, "RIGHT", 46, 10)
    timedText:SetText("Time 28:49")

    local deathsText = highlightsPanel:CreateFontString(nil, "OVERLAY", "GameFontNormal")
    deathsText:SetPoint("LEFT", timedText, "RIGHT", 34, 0)
    deathsText:SetText("Deaths 2")

    local runsLine = highlightsPanel:CreateTexture(nil, "ARTWORK")
    runsLine:SetPoint("BOTTOMLEFT", highlightsPanel.Body, "BOTTOMLEFT", 0, 18)
    runsLine:SetPoint("BOTTOMRIGHT", highlightsPanel.Body, "BOTTOMRIGHT", 0, 18)
    runsLine:SetHeight(1)
    runsLine:SetColorTexture(0.44, 0.34, 0.16, 0.45)

    local runsText = highlightsPanel:CreateFontString(nil, "OVERLAY", "GameFontNormal")
    runsText:SetPoint("BOTTOMLEFT", highlightsPanel.Body, "BOTTOMLEFT", 0, 0)
    runsText:SetText("Runs Completed: 12")

    CreateRow(lootPanel.Body, 0, Assets.Row, "Aelthas", "696", {
        icon = Assets.Cards.Raid.icon,
        leftColor = { 0.84, 0.62, 1, 1 },
        rightColor = { 0.96, 0.93, 0.84, 1 },
        leftWidth = 420,
    })
    CreateRow(lootPanel.Body, -24, Assets.Row, "Brewmasterx", "691", {
        icon = Assets.Cards.Members.icon,
        leftColor = { 0.96, 0.60, 0.16, 1 },
        rightColor = { 0.96, 0.93, 0.84, 1 },
        leftWidth = 420,
    })
    CreateRow(lootPanel.Body, -48, Assets.Row, "Lunarya", "688", {
        icon = Assets.Cards.News.icon,
        leftColor = { 0.38, 0.74, 1, 1 },
        rightColor = { 0.96, 0.93, 0.84, 1 },
        leftWidth = 420,
    })
    CreateRow(lootPanel.Body, -72, Assets.Row, "Valdrin", "685", {
        icon = Assets.Cards.Raid.icon,
        leftColor = { 0.96, 0.82, 0.46, 1 },
        rightColor = { 0.96, 0.93, 0.84, 1 },
        leftWidth = 420,
    })

    local footer = CreateArtFrame(root, { x = 20, y = -674, w = 1340, h = 56 }, Assets.Footer)
    local footerContent = footer.Content
    CreateFooterSection(footerContent, { x = 0, y = 0, w = 404, h = 48 }, "Guild Reputation", "Exalted", Assets.Footer.leftIcon, "LEFT", { 0.36, 0.86, 0.42, 1 }, 0.84)
    CreateFooterSection(footerContent, { x = 418, y = 0, w = 404, h = 48 }, "Guild Renown", "23", nil, nil, { 0.24, 0.62, 0.94, 1 }, 0.48)
    CreateFooterSection(footerContent, { x = 836, y = 0, w = 404, h = 48 }, "Next Reward", "24", Assets.Footer.rightIcon, "RIGHT", { 0.62, 0.48, 0.16, 1 }, 0)

    root.Cards = cards
    root.RosterPanel = rosterPanel
    root.EventsPanel = eventsPanel
    root.HighlightsPanel = highlightsPanel
    root.LootPanel = lootPanel
    root.Footer = footer
    return root
end

PatternPage.ApplyRect = ApplyRect
PatternPage.CreateArtFrame = CreateArtFrame
PatternPage.RenderStaticReference = RenderStaticReference

return PatternPage