ImageButton.defaultProps={BackgroundTransparency=1;BorderSizePixel=0,Size=UDim2.new(1,0,1,0),Image=""}function ImageButton.render(u)local W=Support.CloneTable(u.props)local O=u.state if W.AspectRatio then local u=new("\085\073\065\115\112\101\099\116\082\097\116\105\111\067\111\110\115\116\114\097\105\110\116",{AspectRatio=W.AspectRatio})W[Roact.Children]=Support.Merge({AspectRatio=u},W[Roact.Children]or{})if W.DominantAxis=="\087\105\100\116\104"then W.SizeConstraint="\082\101\108\097\116\105\118\101\088\088"if typeof(W.Width)=="\085\068\105\109"then W.Height=UDim.new(W.Width.Scale/W.AspectRatio,0)else W.Size=UDim2.new(W.Size.X,UDim.new(W.Size.X.Scale/W.AspectRatio,0))end elseif W.DominantAxis=="\072\101\105\103\104\116"then W.SizeConstraint="\082\101\108\097\116\105\118\101\089\089"if typeof(W.Height)=="\085\068\105\109"then W.Width=UDim.new(W.Height.Scale*W.AspectRatio,0)else W.Size=UDim2.new(UDim.new(W.Size.Y.Scale*W.AspectRatio,0),W.Size.Y)end end end if W.Layout=="\076\105\115\116"then local O=new("\085\073\076\105\115\116\076\097\121\111\117\116",{FillDirection=W.LayoutDirection;Padding=W.LayoutPadding,HorizontalAlignment=W.HorizontalAlignment,VerticalAlignment=W.VerticalAlignment,SortOrder=W.SortOrder or"\076\097\121\111\117\116\079\114\100\101\114";[Roact.Ref]=function(W)u:UpdateContentSize(W)end;[Roact.Change.AbsoluteContentSize]=function(W)u:UpdateContentSize(W)end})W.Size=u:GetSize()W[Roact.Children]=Support.Merge({Layout=O},W[Roact.Children])end if type(W.ImageColor)=="\115\116\114\105\110\103"then local u,O,Q=(W.ImageColor:lower()):match("\035\063\040\046\046\041\040\046\046\041\040\046\046\041")W.ImageColor3=Color3.fromRGB(tonumber(u,16),tonumber(O,16),tonumber(Q,16))end W.AspectRatio=nil W.DominantAxis=nil W.Layout=nil W.LayoutDirection=nil W.LayoutPadding=nil W.HorizontalAlignment=nil W.VerticalAlignment=nil W.HorizontalPadding=nil W.VerticalPadding=nil W.SortOrder=nil W.Width=nil W.Height=nil W.ImageColor=nil return new("\073\109\097\103\101\066\117\116\116\111\110",W)end function ImageButton.GetSize(W,u)local O=W.props local Q=O.Size=="\087\082\065\080\095\067\079\078\084\069\078\084"or O.Width=="\087\082\065\080\095\067\079\078\084\069\078\084"local v=O.Size=="\087\082\065\080\095\067\079\078\084\069\078\084"or O.Height=="\087\082\065\080\095\067\079\078\084\069\078\084"local Z=Q or v local l=UDim2.new(0,O.HorizontalPadding or 0,0,O.VerticalPadding or 0)return l+UDim2.new((u and Q)and UDim.new(0,u.X)or typeof(O.Width)=="\085\068\105\109"and O.Width or O.Size.X,(u and v)and UDim.new(0,u.Y)or typeof(O.Height)=="\085\068\105\109"and O.Height or O.Size.Y)end function ImageButton.UpdateContentSize(W,u)if not(u and u.Parent)then return end u.Parent.Size=W:GetSize(u.AbsoluteContentSize)end return ImageButton

ImageButton.defaultProps = {
    BackgroundTransparency = 1,
    BorderSizePixel = 0,
    Size = UDim2.new(1, 0, 1, 0),
    Image = ''
}

function ImageButton:render()
    local props = Support.CloneTable(self.props)
    local state = self.state

    -- Include aspect ratio constraint if specified
    if props.AspectRatio then
        local Constraint = new('UIAspectRatioConstraint', {
            AspectRatio = props.AspectRatio
        })

        -- Insert constraint into children
        props[Roact.Children] = Support.Merge(
            { AspectRatio = Constraint },
            props[Roact.Children] or {}
        )

        -- Base height off width using the aspect ratio
        if props.DominantAxis == 'Width' then
            props.SizeConstraint = 'RelativeXX'
            if typeof(props.Width) == 'UDim' then
                props.Height = UDim.new(props.Width.Scale / props.AspectRatio, 0)
            else
                props.Size = UDim2.new(
                    props.Size.X,
                    UDim.new(props.Size.X.Scale / props.AspectRatio, 0)
                )
            end

        -- Base width off height using the aspect ratio
        elseif props.DominantAxis == 'Height' then
            props.SizeConstraint = 'RelativeYY'
            if typeof(props.Height) == 'UDim' then
                props.Width = UDim.new(props.Height.Scale * props.AspectRatio, 0)
            else
                props.Size = UDim2.new(
                    UDim.new(props.Size.Y.Scale * props.AspectRatio, 0),
                    props.Size.Y
                )
            end
        end
    end

    -- Include list layout if specified
    if props.Layout == 'List' then
        local Layout = new('UIListLayout', {
            FillDirection = props.LayoutDirection,
            Padding = props.LayoutPadding,
            HorizontalAlignment = props.HorizontalAlignment,
            VerticalAlignment = props.VerticalAlignment,
            SortOrder = props.SortOrder or 'LayoutOrder',
            [Roact.Ref] = function (rbx)
                self:UpdateContentSize(rbx)
            end,
            [Roact.Change.AbsoluteContentSize] = function (rbx)
                self:UpdateContentSize(rbx)
            end
        })

        -- Update size
        props.Size = self:GetSize()

        -- Insert layout into children
        props[Roact.Children] = Support.Merge(
            { Layout = Layout },
            props[Roact.Children]
        )
    end

    -- Parse hex colors
    if type(props.ImageColor) == 'string' then
        local R, G, B = props.ImageColor:lower():match('#?(..)(..)(..)')
        props.ImageColor3 = Color3.fromRGB(tonumber(R, 16), tonumber(G, 16), tonumber(B, 16))
    end

    -- Filter out custom properties
    props.AspectRatio = nil
    props.DominantAxis = nil
    props.Layout = nil
    props.LayoutDirection = nil
    props.LayoutPadding = nil
    props.HorizontalAlignment = nil
    props.VerticalAlignment = nil
    props.HorizontalPadding = nil
    props.VerticalPadding = nil
    props.SortOrder = nil
    props.Width = nil
    props.Height = nil
    props.ImageColor = nil

    -- Display component in wrapper
    return new('ImageButton', props)

end

function ImageButton:GetSize(ContentSize)
    local props = self.props
    
    -- Determine dynamic dimensions
    local DynamicWidth = props.Size == 'WRAP_CONTENT' or
        props.Width == 'WRAP_CONTENT'
    local DynamicHeight = props.Size == 'WRAP_CONTENT' or
        props.Height == 'WRAP_CONTENT'
    local DynamicSize = DynamicWidth or DynamicHeight

    -- Get padding from props
    local Padding = UDim2.new(
        0, props.HorizontalPadding or 0,
        0, props.VerticalPadding or 0
    )
    
    -- Calculate size based on content if dynamic
    return Padding + UDim2.new(
        (ContentSize and DynamicWidth) and UDim.new(0, ContentSize.X) or
            (typeof(props.Width) == 'UDim' and props.Width or props.Size.X),
        (ContentSize and DynamicHeight) and UDim.new(0, ContentSize.Y) or
            (typeof(props.Height) == 'UDim' and props.Height or props.Size.Y)
    )
end

function ImageButton:UpdateContentSize(Layout)
    if not (Layout and Layout.Parent) then
        return
    end

    -- Set container size based on content
    Layout.Parent.Size = self:GetSize(Layout.AbsoluteContentSize)
end

return ImageButton
