--[[

██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████
█░░░░░░██████████░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░░░███░░░░░░░░░░░░░░█░░░░░░██░░░░░░█░░░░░░░░░░░░░░░░███░░░░░░░░██░░░░░░░░█
█░░▄▀░░░░░░░░░░░░░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀▄▀░░███░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░██░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀▄▀░░███░░▄▀▄▀░░██░░▄▀▄▀░░█
█░░▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░░░░░░░░░█░░▄▀░░░░░░░░▄▀░░███░░▄▀░░░░░░░░░░█░░▄▀░░██░░▄▀░░█░░▄▀░░░░░░░░▄▀░░███░░░░▄▀░░██░░▄▀░░░░█
█░░▄▀░░░░░░▄▀░░░░░░▄▀░░█░░▄▀░░█████████░░▄▀░░████░░▄▀░░███░░▄▀░░█████████░░▄▀░░██░░▄▀░░█░░▄▀░░████░░▄▀░░█████░░▄▀▄▀░░▄▀▄▀░░███
█░░▄▀░░██░░▄▀░░██░░▄▀░░█░░▄▀░░░░░░░░░░█░░▄▀░░░░░░░░▄▀░░███░░▄▀░░█████████░░▄▀░░██░░▄▀░░█░░▄▀░░░░░░░░▄▀░░█████░░░░▄▀▄▀▄▀░░░░███
█░░▄▀░░██░░▄▀░░██░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀▄▀░░███░░▄▀░░█████████░░▄▀░░██░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀▄▀░░███████░░░░▄▀░░░░█████
█░░▄▀░░██░░░░░░██░░▄▀░░█░░▄▀░░░░░░░░░░█░░▄▀░░yue<3▀░░░░███░░▄▀░░█████████░░▄▀░░██░░▄▀░░█░░▄▀░░░░░░▄▀░░░░█████████░░▄▀░░███████
█░░▄▀░░██████████░░▄▀░░█░░▄▀░░█████████░░▄▀░░██░░▄▀░░█████░░▄▀░░█████████░░▄▀░░██░░▄▀░░█░░▄▀░░██░░▄▀░░███████████░░▄▀░░███████
█░░▄▀░░██████████░░▄▀░░█░░▄▀░░░░░░░░░░█░░▄▀░░██░░▄▀░░░░░░█░░▄▀░░░░░░░░░░█░░▄▀░░░░░░▄▀░░█░░▄▀░░██░░▄▀░░░░░░███████░░▄▀░░███████
█░░▄▀░░██████████░░▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░██░░▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░██░░▄▀▄▀▄▀░░███████░░▄▀░░███████
█░░░░░░██████████░░░░░░█░░░░░░░░░░░░░░█░░░░░░██░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█░░░░░░██░░░░░░░░░░███████░░░░░░███████
██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████

edited: 1/26
developers:
v3rm AbstractPoo	discord Abstract#8007
v3rm 0xDEITY		discord Deity#0228

]]

local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
local Mouse = LocalPlayer:GetMouse()
local HTTPService = game:GetService("HttpService")

local Library = {
	Themes = {
		Legacy = {
			Main = Color3.fromHSV(262/360, 60/255, 34/255),
			Secondary = Color3.fromHSV(240/360, 40/255, 63/255),
			Tertiary = Color3.fromHSV(260/360, 60/255, 148/255),

			StrongText = Color3.fromHSV(0, 0, 1),		
			WeakText = Color3.fromHSV(0, 0, 172/255)
		},
		Serika = {
			Main = Color3.fromRGB(50, 52, 55),
			Secondary = Color3.fromRGB(80, 82, 85),
			Tertiary = Color3.fromRGB(226, 183, 20),

			StrongText = Color3.fromHSV(0, 0, 1),		
			WeakText = Color3.fromHSV(0, 0, 172/255)
		},
		Dark = {
			Main = Color3.fromRGB(30, 30, 35),
			Secondary = Color3.fromRGB(50, 50, 55),
			Tertiary = Color3.fromRGB(70, 130, 180),

			StrongText = Color3.fromHSV(0, 0, 1),		
			WeakText = Color3.fromHSV(0, 0, 172/255)
		},
		Rust = {
			Main = Color3.fromRGB(37, 35, 33),
			Secondary = Color3.fromRGB(65, 63, 63),
			Tertiary = Color3.fromRGB(237, 94, 38),

			StrongText = Color3.fromHSV(0, 0, 1),		
			WeakText = Color3.fromHSV(0, 0, 172/255)
		},
		Aqua = {
			Main = Color3.fromRGB(19, 21, 21),
			Secondary = Color3.fromRGB(65, 63, 63),
			Tertiary = Color3.fromRGB(51, 153, 137),

			StrongText = Color3.fromHSV(0, 0, 1),        
			WeakText = Color3.fromHSV(0, 0, 172/255)
		},
		Vaporwave = {},
		OperaGX = {},
		VisualStudio = {}
	},
	ColorPickerStyles = {
		Legacy = 0,
		Modern = 1
	},
	Toggled = true,
	ThemeObjects = {
		Main = {},
		Secondary = {},
		Tertiary = {},

		StrongText = {},
		WeakText = {}
	},
	WelcomeText = nil,
	DisplayName = nil,
	DragSpeed = 0.06,
	LockDragging = false,
	ToggleKey = Enum.KeyCode.Home,
	UrlLabel = nil,
	Url = nil

}
Library.__index = Library

local selectedTab

Library._promptExists = false
Library._colorPickerExists = false

local GlobalTweenInfo = TweenInfo.new(0.2, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut)

function Library:set_defaults(defaults, options)
	defaults = defaults or {}
	options = options or {}
	for option, value in next, options do
		defaults[option] = value
	end
	return defaults
end

function Library:change_theme(toTheme)
	Library.CurrentTheme = toTheme
	local c = self:lighten(toTheme.Tertiary, 20)
	Library.DisplayName.Text = "Welcome, <font color='rgb(" ..  math.floor(c.R*255) .. "," .. math.floor(c.G*255) .. "," .. math.floor(c.B*255) .. ")'> <b>" .. LocalPlayer.DisplayName .. "</b> </font>"
	for color, objects in next, Library.ThemeObjects do
		local themeColor = Library.CurrentTheme[color]
		for _, obj in next, objects do
			local element, property, theme, colorAlter = obj[1], obj[2], obj[3], obj[4] or 0
			local themeColor = Library.CurrentTheme[theme]
			local modifiedColor = themeColor
			if colorAlter < 0 then
				modifiedColor = Library:darken(themeColor, -1 * colorAlter)
			elseif colorAlter > 0 then
				modifiedColor = Library:lighten(themeColor, colorAlter)
			end
			element:tween{[property] = modifiedColor}
		end
	end
end

function Library:object(class, properties)
	local localObject = Instance.new(class)

	local forcedProps = {
		BorderSizePixel = 0,
		AutoButtonColor = false,
		Font = Enum.Font.SourceSans,
		Text = ""
	}

	for property, value in next, forcedProps do
		pcall(function()
			localObject[property] = value
		end)
	end

	local methods = {}

	methods.AbsoluteObject = localObject

	function methods:tween(options, callback)
		local options = Library:set_defaults({
			Length = 0.2,
			Style = Enum.EasingStyle.Linear,
			Direction = Enum.EasingDirection.InOut
		}, options)
		callback = callback or function() return end


		local ti = TweenInfo.new(options.Length, options.Style, options.Direction)
		options.Length = nil
		options.Style = nil 
		options.Direction = nil

		local tween = TweenService:Create(localObject, ti, options); tween:Play()

		tween.Completed:Connect(function()
			callback()
		end)

		return tween
	end

	function methods:round(radius)
		radius = radius or 6
		Library:object("UICorner", {
			Parent = localObject,
			CornerRadius = UDim.new(0, radius)
		})
		return methods
	end

	function methods:object(class, properties)
		local properties = properties or {}
		properties.Parent = localObject
		return Library:object(class, properties)
	end

	function methods:crossfade(p2, length)
		length = length or .2
		self:tween({ImageTransparency = 1})
		p2:tween({ImageTransparency = 0})
	end

	function methods:fade(state, colorOverride, length, instant)
		length = length or 0.2
		if not rawget(self, "fadeFrame") then
			local frame = self:object("Frame", {
				BackgroundColor3 = colorOverride or self.BackgroundColor3,
				BackgroundTransparency = (state and 1) or 0,
				Size = UDim2.fromScale(1, 1),
				Centered = true,
				ZIndex = 999
			}):round(self.AbsoluteObject:FindFirstChildOfClass("UICorner") and self.AbsoluteObject:FindFirstChildOfClass("UICorner").CornerRadius.Offset or 0)
			rawset(self, "fadeFrame", frame)
		else
			self.fadeFrame.BackgroundColor3 = colorOverride or self.BackgroundColor3
		end

		if instant then
			if state then
				self.fadeFrame.BackgroundTransparency = 0
				self.fadeFrame.Visible = true
			else
				self.fadeFrame.BackgroundTransparency = 1
				self.fadeFrame.Visible = false
			end
		else
			if state then
				self.fadeFrame.BackgroundTransparency = 1
				self.fadeFrame.Visible = true
				self.fadeFrame:tween{BackgroundTransparency = 0, Length = length}
			else
				self.fadeFrame.BackgroundTransparency = 0
				self.fadeFrame:tween({BackgroundTransparency = 1, Length = length}, function()
					self.fadeFrame.Visible = false
				end)
			end
		end	
	end

	function methods:stroke(color, thickness, strokeMode)

		thickness = thickness or 1
		strokeMode = strokeMode or Enum.ApplyStrokeMode.Border
		local stroke = self:object("UIStroke", {
			ApplyStrokeMode = strokeMode,
			Thickness = thickness
		})

		if type(color) == "table" then
			local theme, colorAlter = color[1], color[2] or 0
			local themeColor = Library.CurrentTheme[theme]
			local modifiedColor = themeColor
			if colorAlter < 0 then
				modifiedColor = Library:darken(themeColor, -1 * colorAlter)
			elseif colorAlter > 0 then
				modifiedColor = Library:lighten(themeColor, colorAlter)
			end
			stroke.Color = modifiedColor
			table.insert(Library.ThemeObjects[theme], {stroke, "Color", theme, colorAlter})
		elseif type(color) == "string" then
			local themeColor = Library.CurrentTheme[color]
			stroke.Color = themeColor
			table.insert(Library.ThemeObjects[color], {stroke, "Color", color, 0})
		else
			stroke.Color = color
		end

		return methods
	end

	function methods:tooltip(text)
		local tooltipContainer = methods:object("TextLabel", {
			Theme = {
				BackgroundColor3 = {"Main", 10},
				TextColor3 = {"WeakText"}
			},
			TextSize = 16,
			Text = text,
			Position = UDim2.new(0.5, 0, 0, -8),
			TextXAlignment = Enum.TextXAlignment.Center,
			TextYAlignment = Enum.TextYAlignment.Center,
			AnchorPoint = Vector2.new(0.5, 1),
			BackgroundTransparency = 1,
			TextTransparency = 1
		}):round(5)
		tooltipContainer.Size = UDim2.fromOffset(tooltipContainer.TextBounds.X + 16, tooltipContainer.TextBounds.Y + 8)

		local tooltipArrow = tooltipContainer:object("ImageLabel", {
			Image = "http://www.roblox.com/asset/?id=4292970642",
			Theme = {ImageColor3 = {"Main", 10}},
			AnchorPoint = Vector2.new(0.5, 0),
			Rotation = 180,
			Position = UDim2.fromScale(0.5, 1),
			Size = UDim2.fromOffset(10, 6),
			BackgroundTransparency = 1,
			ImageTransparency = 1
		})

		local hovered = false

		methods.MouseEnter:connect(function()
			hovered = true
			wait(0.2)
			if hovered then
				tooltipContainer:tween{BackgroundTransparency = 0.2, TextTransparency = 0.2}
				tooltipArrow:tween{ImageTransparency = 0.2}
			end
		end)

		methods.MouseLeave:connect(function()
			hovered = false
			tooltipContainer:tween{BackgroundTransparency = 1, TextTransparency = 1}
			tooltipArrow:tween{ImageTransparency = 1}
		end)

		return methods
	end

	local customHandlers = {
		Centered = function(value)
			if value then
				localObject.AnchorPoint = Vector2.new(0.5, 0.5)
				localObject.Position = UDim2.fromScale(0.5, 0.5)
			end	
		end,
		Theme = function(value)
			for property, obj in next, value do
				if type(obj) == "table" then
					local theme, colorAlter = obj[1], obj[2] or 0
					local themeColor = Library.CurrentTheme[theme]
					local modifiedColor = themeColor
					if colorAlter < 0 then
						modifiedColor = Library:darken(themeColor, -1 * colorAlter)
					elseif colorAlter > 0 then
						modifiedColor = Library:lighten(themeColor, colorAlter)
					end
					localObject[property] = modifiedColor
					table.insert(self.ThemeObjects[theme], {methods, property, theme, colorAlter})
				else
					local themeColor = Library.CurrentTheme[obj]
					localObject[property] = themeColor
					table.insert(self.ThemeObjects[obj], {methods, property, obj, 0})
				end
			end
		end,
	}

	for property, value in next, properties do
		if customHandlers[property] then
			customHandlers[property](value)
		else
			localObject[property] = value
		end
	end

	return setmetatable(methods, {
		__index = function(_, property)
			return localObject[property]
		end,
		__newindex = function(_, property, value)
			localObject[property] = value
		end,
	})
end

function Library:show(state)
	self.Toggled = state
	self.mainFrame.ClipsDescendants = true
	if state then
		self.mainFrame:tween({Size = self.mainFrame.oldSize, Length = 0.25}, function()
			rawset(self.mainFrame, "oldSize", (state and self.mainFrame.oldSize) or self.mainFrame.Size)
			self.mainFrame.ClipsDescendants = false
		end)
		wait(0.15)
		self.mainFrame:fade(not state, self.mainFrame.BackgroundColor3, 0.15)
	else		
		self.mainFrame:fade(not state, self.mainFrame.BackgroundColor3, 0.15)
		wait(0.1)
		self.mainFrame:tween{Size = UDim2.new(), Length = 0.25}
	end
end

function Library:darken(color, f)
	local h, s, v = Color3.toHSV(color)
	f = 1 - ((f or 15) / 80)
	return Color3.fromHSV(h, math.clamp(s/f, 0, 1), math.clamp(v*f, 0, 1))
end

function Library:lighten(color, f)
	local h, s, v = Color3.toHSV(color)
	f = 1 - ((f or 15) / 80)
	return Color3.fromHSV(h, math.clamp(s*f, 0, 1), math.clamp(v/f, 0, 1))
end

--[[ old lighten/darken functions, may revert if contrast gets fucked up

	function Library:darken(color, f)
		local h, s, v = Color3.toHSV(color)
		f = f or 15
		return Color3.fromHSV(h, s, math.clamp(v - (f/255), 0, 1))
	end

	function Library:lighten(color, f)
		local h, s, v = Color3.toHSV(color)
		f = f or 15
		return Color3.fromHSV(h, s, math.clamp(v + (f/255), 0, 1))
	end
	
]]

local updateSettings = function() end

function Library:set_status(txt)
	self.statusText.Text = txt
end

function Library:create(options)

	local settings = {
		Theme = "Dark"
	}

	if readfile and writefile and isfile then
		if not isfile("MercurySettings.json") then
			writefile("MercurySettings.json", HTTPService:JSONEncode(settings))
		end
		settings = HTTPService:JSONDecode(readfile("MercurySettings.json"))
		Library.CurrentTheme = Library.Themes[settings.Theme]
		updateSettings = function(property, value)
			settings[property] = value
			writefile("MercurySettings.json", HTTPService:JSONEncode(settings))
		end
	end

	options = self:set_defaults({
		Name = "Mercury",
		Size = UDim2.fromOffset(600, 400),
		Theme = self.Themes[settings.Theme],
		Link = "https://github.com/deeeity/mercury-lib"
	}, options)

	if getgenv and getgenv().MercuryUI then
		getgenv():MercuryUI()
		getgenv().MercuryUI = nil
	end



	if options.Link:sub(-1, -1) == "/" then
		options.Link = options.Link:sub(1, -2)
	end

	if options.Theme.Light then
		self.darken, self.lighten = self.lighten, self.darken
	end

	self.CurrentTheme = options.Theme

	local gui = self:object("ScreenGui", {
		Parent = (RunService:IsStudio() and LocalPlayer.PlayerGui) or game:GetService("CoreGui"),
		ZIndexBehavior = Enum.ZIndexBehavior.Global
	})

	local notificationHolder = gui:object("Frame", {
		AnchorPoint = Vector2.new(1, 1),
		BackgroundTransparency = 1,
		Position = UDim2.new(1, -30,1, -30),
		Size = UDim2.new(0, 300, 1, -60)
	})

	local _notiHolderList = notificationHolder:object("UIListLayout", {
		Padding = UDim.new(0, 20),
		VerticalAlignment = Enum.VerticalAlignment.Bottom
	})

	local core = gui:object("Frame", {
		Size = UDim2.new(),
		Theme = {BackgroundColor3 = "Main"},
		Centered = true,
		ClipsDescendants = true		
	}):round(10)

	core:fade(true, nil, 0.2, true)


	core:fade(false, nil, 0.4)
	core:tween({Size = options.Size, Length = 0.3}, function()
		core.ClipsDescendants = false
	end)

	do
		local S, Event = pcall(function()
			return core.MouseEnter
		end)

		if S then
			core.Active = true;

			Event:connect(function()
				local Input = core.InputBegan:connect(function(Key)
					if Key.UserInputType == Enum.UserInputType.MouseButton1 then
						local ObjectPosition = Vector2.new(Mouse.X - core.AbsolutePosition.X, Mouse.Y - core.AbsolutePosition.Y)
						while RunService.RenderStepped:wait() and UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) do

							if Library.LockDragging then
								local FrameX, FrameY = math.clamp(Mouse.X - ObjectPosition.X, 0, gui.AbsoluteSize.X - core.AbsoluteSize.X), math.clamp(Mouse.Y - ObjectPosition.Y, 0, gui.AbsoluteSize.Y - core.AbsoluteSize.Y)
								core:tween{
									Position = UDim2.fromOffset(FrameX + (core.Size.X.Offset * core.AnchorPoint.X), FrameY + (core.Size.Y.Offset * core.AnchorPoint.Y)),
									Length = Library.DragSpeed
								}
							else
								core:tween{
									Position = UDim2.fromOffset(Mouse.X - ObjectPosition.X + (core.Size.X.Offset * core.AnchorPoint.X), Mouse.Y - ObjectPosition.Y + (core.Size.Y.Offset * core.AnchorPoint.Y)),
									Length = Library.DragSpeed	
								}
							end	
							--[[core.AbsoluteObject:TweenPosition(
								UDim2.new(0, Mouse.X - ObjectPosition.X + (core.Size.X.Offset * core.AnchorPoint.X), 0, Mouse.Y - ObjectPosition.Y + (core.Size.Y.Offset * core.AnchorPoint.Y)),           
								Enum.EasingDirection.In,
								Enum.EasingStyle.Sine,
								Library.DragSpeed,
								true
								
								--
								core:tween{
								Position = UDim2.new(0, Mouse.X - ObjectPosition.X + (core.Size.X.Offset * core.AnchorPoint.X), 0, Mouse.Y - ObjectPosition.Y + (core.Size.Y.Offset * core.AnchorPoint.Y)),
								Direction = Enum.EasingDirection.Out,
								Style = Enum.EasingStyle.Quad,
								Length = Library.DragSpeed
							}
							)]]
						end
					end
				end)

				local Leave
				Leave = core.MouseLeave:connect(function()
					Input:disconnect()
					Leave:disconnect()
				end)
			end)
		end
	end

	rawset(core, "oldSize", options.Size)

	self.mainFrame = core

	local tabButtons = core:object("ScrollingFrame", {
		Size = UDim2.new(1, -40, 0, 25),
		Position = UDim2.fromOffset(5, 5),
		BackgroundTransparency = 1,
		ClipsDescendants = true,
		ScrollBarThickness = 0,
		ScrollingDirection = Enum.ScrollingDirection.X,
		AutomaticCanvasSize = Enum.AutomaticSize.X
	})

	tabButtons:object("UIListLayout", {
		FillDirection = Enum.FillDirection.Horizontal,
		HorizontalAlignment = Enum.HorizontalAlignment.Left,
		SortOrder = Enum.SortOrder.LayoutOrder,
		Padding = UDim.new(0, 4)
	})

	local closeButton = core:object("ImageButton", {
		BackgroundTransparency = 1,
		Size = UDim2.fromOffset(14, 14),
		Position = UDim2.new(1, -11, 0, 11),
		Theme = {ImageColor3 = "StrongText"},
		Image = "http://www.roblox.com/asset/?id=8497487650",
		AnchorPoint = Vector2.new(1)
	})

	closeButton.MouseEnter:connect(function()
		closeButton:tween{ImageColor3 = Color3.fromRGB(255, 124, 142)}
	end)

	closeButton.MouseLeave:connect(function()
		closeButton:tween{ImageColor3 = Library.CurrentTheme.StrongText}
	end)

	local function closeUI()
		core.ClipsDescendants = true
		core:fade(true)
		wait(0.1)
		core:tween({Size = UDim2.new()}, function()
			gui.AbsoluteObject:Destroy()
		end)
	end

	if getgenv then
		getgenv().MercuryUI = closeUI
	end

	closeButton.MouseButton1Click:connect(function()
		closeUI()
	end)

	local urlBar = core:object("Frame", {
		Size = UDim2.new(1, -10, 0, 25),
		Position = UDim2.new(0, 5,0, 35),
		Theme = {BackgroundColor3 = "Secondary"}
	}):round(5)

	local searchIcon = urlBar:object("ImageLabel", {
		AnchorPoint = Vector2.new(0, .5),
		Position = UDim2.new(0, 5,0.5, 0);
		Theme = {ImageColor3 = "Tertiary"},
		Size = UDim2.fromOffset(16, 16),
		Image = "http://www.roblox.com/asset/?id=8497489946",
		BackgroundTransparency = 1
	})

	local link = urlBar:object("TextLabel", {
		AnchorPoint = Vector2.new(0, 0.5),
		Position = UDim2.new(0, 26, 0.5, 0),
		BackgroundTransparency = 1,
		Size = UDim2.new(1, -30, .6, 0),
		Text = options.Link .. "/home",
		Theme = {TextColor3 = "WeakText"},
		TextSize = 14,
		TextScaled = false,
		TextXAlignment = Enum.TextXAlignment.Left
	})

	Library.UrlLabel = link
	Library.Url = options.Link

	local shadowHolder = core:object("Frame", {
		BackgroundTransparency = 1,
		Size = UDim2.fromScale(1, 1),
		ZIndex = 0
	})

	local shadow = shadowHolder:object("ImageLabel", {
		Centered = true,
		BackgroundTransparency = 1,
		Size = UDim2.new(1, 47,1, 47),
		ZIndex = 0,
		Image = "rbxassetid://6015897843",
		ImageColor3 = Color3.new(0, 0, 0),
		ImageTransparency = .6,
		SliceCenter = Rect.new(47, 47, 450, 450),
		ScaleType = Enum.ScaleType.Slice,
		SliceScale = 1
	})

	local content = core:object("Frame", {
		Theme = {BackgroundColor3 = {"Secondary", -10}},
		AnchorPoint = Vector2.new(0.5, 1),
		Position = UDim2.new(0.5, 0, 1, -20),
		Size = UDim2.new(1, -10, 1, -86)
	}):round(7) -- Sept

	local status = core:object("TextLabel", {
		AnchorPoint = Vector2.new(0, 1),
		BackgroundTransparency = 1,
		Position = UDim2.new(0, 5, 1, -6),
		Size = UDim2.new(0.2, 0, 0, 10),
		Font = Enum.Font.SourceSans,
		Text = "Status | Idle",
		Theme = {TextColor3 = "Tertiary"},
		TextSize = 14,
		TextXAlignment = Enum.TextXAlignment.Left
	})

	local homeButton = tabButtons:object("TextButton", {
		Name = "hehehe siuuuuuuuuu",
		BackgroundTransparency = 0,
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(0, 125, 0, 25)
	}):round(5)

	local homeButtonText = homeButton:object("TextLabel", {
		Theme = {TextColor3 = "StrongText"},
		AnchorPoint = Vector2.new(0, .5),
		BackgroundTransparency = 1,
		TextSize = 14,
		Text = options.Name,
		Position = UDim2.new(0, 25, 0.5, 0),
		TextXAlignment = Enum.TextXAlignment.Left,
		Size = UDim2.new(1, -45, 0.5, 0),
		Font = Enum.Font.SourceSans,
		TextTruncate = Enum.TextTruncate.AtEnd
	})

	local homeButtonIcon = homeButton:object("ImageLabel", {
		AnchorPoint = Vector2.new(0, 0.5),
		BackgroundTransparency = 1,
		Position = UDim2.new(0, 5, 0.5, 0),
		Size = UDim2.new(0, 15, 0, 15),
		Image = "http://www.roblox.com/asset/?id=8569322835",
		Theme = {ImageColor3 = "StrongText"}
	})

	local homePage = content:object("Frame", {
		Size = UDim2.fromScale(1, 1),
		Centered = true,
		BackgroundTransparency = 1
	})

	local tabs = {}
	selectedTab = homeButton

	tabs[#tabs+1] = {homePage, homeButton}

	do
		local down = false
		local hovered = false

		homeButton.MouseEnter:connect(function()
			hovered = true
			homeButton:tween{BackgroundTransparency = ((selectedTab == homeButton) and 0.15) or 0.3}
		end)

		homeButton.MouseLeave:connect(function()
			hovered = false
			homeButton:tween{BackgroundTransparency = ((selectedTab == homeButton) and 0.15) or 1}
		end)

		homeButton.MouseButton1Down:connect(function()
			down = true
			homeButton:tween{BackgroundTransparency = 0}
		end)

		UserInputService.InputEnded:connect(function(key)
			if key.UserInputType == Enum.UserInputType.MouseButton1 then
				down = false
				homeButton:tween{BackgroundTransparency = ((selectedTab == homeButton) and 0.15) or (hovered and 0.3) or 1}
			end

		end)

		homeButton.MouseButton1Click:Connect(function()
			for _, tabInfo in next, tabs do
				local page = tabInfo[1]
				local button = tabInfo[2]
				page.Visible = false
			end
			selectedTab:tween{BackgroundTransparency = ((selectedTab == homeButton) and 0.15) or 1}
			selectedTab = homeButton
			homePage.Visible = true
			homeButton.BackgroundTransparency = 0
			Library.UrlLabel.Text = Library.Url .. "/home"
		end)
	end

	self.SelectedTabButton = homeButton

	local homePageLayout = homePage:object("UIListLayout", {
		Padding = UDim.new(0, 10),
		FillDirection = Enum.FillDirection.Vertical,
		HorizontalAlignment = Enum.HorizontalAlignment.Center
	})

	local homePagePadding = homePage:object("UIPadding", {
		PaddingTop = UDim.new(0, 10)
	})

	local profile = homePage:object("Frame", {
		AnchorPoint = Vector2.new(0, .5),
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(1, -20, 0, 100)
	}):round(7)

	local profilePictureContainer = profile:object("ImageLabel", {
		Image = Players:GetUserThumbnailAsync(LocalPlayer.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size100x100),
		Theme = {BackgroundColor3 = {"Secondary", 10}},
		AnchorPoint = Vector2.new(0, 0.5),
		Position = UDim2.new(0, 10, 0.5),
		Size = UDim2.fromOffset(80, 80)
	}):round(100)

	local displayName; do
		local h, s, v = Color3.toHSV(options.Theme.Tertiary)
		local c = self:lighten(options.Theme.Tertiary, 20)

		local displayName = profile:object("TextLabel", {
			RichText = true,
			Text = "Welcome, <font color='rgb(" ..  math.floor(c.R*255) .. "," .. math.floor(c.G*255) .. "," .. math.floor(c.B*255) .. ")'> <b>" .. LocalPlayer.DisplayName .. "</b> </font>",
			TextScaled = true,
			Position = UDim2.new(0, 105,0, 10),
			Theme = {TextColor3 = {"Tertiary", 10}},
			Size = UDim2.new(0, 400,0, 40),
			BackgroundTransparency = 1,
			TextXAlignment = Enum.TextXAlignment.Left
		})
		Library.DisplayName = displayName
	end

	local profileName = profile:object("TextLabel", {
		Text = "@" .. LocalPlayer.Name,
		TextScaled = true,
		Position = UDim2.new(0, 105,0, 47),
		Theme = {TextColor3 = "Tertiary"},
		Size = UDim2.new(0, 400,0, 20),
		BackgroundTransparency = 1,
		TextXAlignment = Enum.TextXAlignment.Left
	})

	local timeDisplay = profile:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.new(0, 105, 1, -10),
		Size = UDim2.new(0, 400,0, 20),
		AnchorPoint = Vector2.new(0, 1),
		Theme = {TextColor3 = {"WeakText", -20}},
		TextScaled = true,
		TextXAlignment = Enum.TextXAlignment.Left,
		Text = tostring(os.date("%X")):sub(1, os.date("%X"):len()-3)
	})

	do
		local desiredInterval = 1
		local counter = 0
		RunService.Heartbeat:Connect(function(step)
			counter += step  
			if counter >= desiredInterval then
				counter -= desiredInterval
				local date = tostring(os.date("%X"))
				timeDisplay.Text = date:sub(1, date:len()-3)
			end
		end)
	end

	local settingsTabIcon = profile:object("ImageButton", {
		BackgroundTransparency = 1,
		Theme = {ImageColor3 = "WeakText"},
		Size = UDim2.fromOffset(24, 24),
		Position = UDim2.new(1, -10, 1, -10),
		AnchorPoint = Vector2.new(1, 1),
		Image = "http://www.roblox.com/asset/?id=8559790237"
	}):tooltip("settings")

	local creditsTabIcon = profile:object("ImageButton", {
		BackgroundTransparency = 1,
		Theme = {ImageColor3 = "WeakText"},
		Size = UDim2.fromOffset(24, 24),
		Position = UDim2.new(1, -44, 1, -10),
		AnchorPoint = Vector2.new(1, 1),
		Image = "http://www.roblox.com/asset/?id=8577523456"
	}):tooltip("credits")

	local quickAccess = homePage:object("Frame", {
		BackgroundTransparency = 1,
		Size = UDim2.new(1, -20, 0, 180)
	})

	quickAccess:object("UIGridLayout", {
		CellPadding = UDim2.fromOffset(10, 10),
		CellSize = UDim2.fromOffset(55, 55),
		HorizontalAlignment = Enum.HorizontalAlignment.Center,
		VerticalAlignment = Enum.VerticalAlignment.Center
	})

	quickAccess:object("UIPadding", {
		PaddingBottom = UDim.new(0, 10),
		PaddingLeft = UDim.new(0, 70),
		PaddingRight = UDim.new(0, 70),
		PaddingTop = UDim.new(0, 5)
	})


	local mt = setmetatable({
		core = core,
		notifs = notificationHolder,
		statusText = status,
		container = content,
		navigation = tabButtons,
		Theme = options.Theme,
		Tabs = tabs,
		quickAccess = quickAccess,
		homeButton = homeButton,
		homePage = homePage,
		nilFolder = core:object("Folder"),
	}, Library)

	local settingsTab = Library.tab(mt, {
		Name = "Settings",
		Internal = settingsTabIcon,
		Icon = "rbxassetid://8559790237"
	})

	settingsTab:_theme_selector()

	settingsTab:keybind{
		Name = "Toggle Key",
		Description = "Key to show/hide the UI.",
		Keybind = Enum.KeyCode.Delete,
		Callback = function()
			self.Toggled = not self.Toggled
			Library:show(self.Toggled)
		end,
	}

	settingsTab:toggle{
		Name = "Lock Dragging",
		Description = "Makes sure you can't drag the UI outside of the window.",
		StartingState = true,
		Callback = function(state)
			Library.LockDragging = state
		end,
	}

	settingsTab:slider{
		Name = "UI Drag Speed",
		Description = "How smooth the dragging looks.",
		Max = 20,
		Default = 14,
		Callback = function(value)
			Library.DragSpeed = (20 - value)/100
		end,
	}

	local creditsTab = Library.tab(mt, {
		Name = "Credits",
		Internal = creditsTabIcon,
		Icon = "http://www.roblox.com/asset/?id=8577523456"
	})

	rawset(mt, "creditsContainer", creditsTab.container)

	creditsTab:credit{Name = "Abstract", Description = "UI Library Developer", Discord = "Abstract#8007", V3rmillion = "AbstractPoo"}
	creditsTab:credit{Name = "Deity", Description = "UI Library Developer", Discord = "Deity#0228", V3rmillion = "0xDEITY"}
	creditsTab:credit{Name = "Repository", Description = "UI Library Repository", Github="https://github.com/deeeity/mercury-lib/blob/master/src.lua"}

	return mt
end

function Library:notification(options)
	options = self:set_defaults({
		Title = "Notification",
		Text = "Your character has been reset.",
		Duration = 3,
		Callback = function() end
	}, options)

	local fadeOut;

	local noti = self.notifs:object("Frame", {
		BackgroundTransparency = 1,
		Theme = {BackgroundColor3 = "Main"},
		Size = UDim2.new(0, 300,0, 0)
	}):round(10)

	local _notiPadding = noti:object("UIPadding", {
		PaddingBottom = UDim.new(0, 11),
		PaddingTop = UDim.new(0, 11),
		PaddingLeft = UDim.new(0, 11),
		PaddingRight = UDim.new(0, 11)
	})

	local dropShadow = noti:object("Frame", {
		ZIndex = 0,
		BackgroundTransparency = 1,
		Size = UDim2.fromScale(1, 1)
	})

	local _shadow = dropShadow:object("ImageLabel", {
		Centered = true,
		Position = UDim2.fromScale(.5, .5),
		BackgroundTransparency = 1,
		Size = UDim2.new(1, 70,1, 70),
		ZIndex = 0,
		Image = "rbxassetid://6014261993",
		ImageColor3 = Color3.fromRGB(0,0,0),
		ImageTransparency = 1,
		ScaleType = Enum.ScaleType.Slice,
		SliceCenter = Rect.new(49, 49, 450, 450)
	})

	local durationHolder = noti:object("Frame", {
		BackgroundTransparency = 1,
		Theme = {BackgroundColor3 = "Secondary"},
		AnchorPoint = Vector2.new(0, 1),
		Position = UDim2.fromScale(0, 1),
		Size = UDim2.new(1, 0,0, 4)
	}):round(100)

	local length = durationHolder:object("Frame", {
		BackgroundTransparency = 1,
		Theme = {BackgroundColor3 = "Tertiary"},
		Size = UDim2.fromScale(1, 1)
	}):round(100)

	local icon = noti:object("ImageLabel", {
		BackgroundTransparency = 1,
		ImageTransparency = 1,
		Position = UDim2.fromOffset(1, 1),
		Size = UDim2.fromOffset(18, 18),
		Image = "rbxassetid://8628681683",
		Theme = {ImageColor3 = "Tertiary"}
	})

	local exit = noti:object("ImageButton", {
		Image = "http://www.roblox.com/asset/?id=8497487650",
		AnchorPoint = Vector2.new(1, 0),
		ImageColor3 = Color3.fromRGB(255, 255, 255),
		Position = UDim2.new(1, -3,0, 3),
		Size = UDim2.fromOffset(14, 14),
		BackgroundTransparency = 1,
		ImageTransparency = 1
	})

	exit.MouseButton1Click:Connect(function()
		fadeOut()
	end)

	local text = noti:object("TextLabel", {
		BackgroundTransparency = 1,
		Text = options.Text,
		Position = UDim2.new(0, 0,0, 23),
		Size = UDim2.new(1, 0, 100, 0),
		TextSize = 16,
		TextTransparency = 1,
		TextWrapped = true,
		TextColor3 = Color3.fromRGB(255, 255, 255),
		TextXAlignment = Enum.TextXAlignment.Left,
		TextYAlignment = Enum.TextYAlignment.Top,
		TextTransparency = 1
	})

	text:tween({Size = UDim2.new(1, 0, 0, text.TextBounds.Y)})

	local title = noti:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.fromOffset(23, 0),
		Size = UDim2.new(1, -60,0, 20),
		Font = Enum.Font.SourceSansBold,
		Text = options.Title,
		Theme = {TextColor3 = "Tertiary"},
		TextSize = 17,
		TextXAlignment = Enum.TextXAlignment.Left,
		TextWrapped = true,
		TextTruncate = Enum.TextTruncate.AtEnd,
		TextTransparency = 1
	})

	fadeOut = function()
		task.delay(0.3, function()
			noti.AbsoluteObject:Destroy()
			options.Callback()
		end)

		icon:tween({ImageTransparency = 1, Length = 0.2})
		exit:tween({ImageTransparency = 1, Length = 0.2})
		durationHolder:tween({BackgroundTransparency = 1, Length = 0.2})
		length:tween({BackgroundTransparency = 1, Length = 0.2})
		text:tween({TextTransparency = 1, Length = 0.2})
		title:tween({TextTransparency = 1, Length = 0.2}, function()
			_shadow:tween({ImageTransparency = 1, Length = 0.2})
			noti:tween({BackgroundTransparency = 1, Length = 0.2, Size = UDim2.fromOffset(300, 0)})
		end)

	end

	_shadow:tween({ImageTransparency = .6, Length = 0.2})
	noti:tween({BackgroundTransparency = 0, Length = 0.2, Size = UDim2.fromOffset(300, text.TextBounds.Y + 63)}, function()
		icon:tween({ImageTransparency = 0, Length = 0.2})
		exit:tween({ImageTransparency = 0, Length = 0.2})
		durationHolder:tween({BackgroundTransparency = 0, Length = 0.2})
		length:tween({BackgroundTransparency = 0, Length = 0.2})
		text:tween({TextTransparency = 0, Length = 0.2})
		title:tween({TextTransparency = 0, Length = 0.2})
	end)

	length:tween({Size = UDim2.fromScale(0, 1), Length = options.Duration}, function()
		fadeOut()
	end)
end

function Library:tab(options)
	options = self:set_defaults({
		Name = "New Tab",
		Icon = "rbxassetid://8569322835"
	}, options)

	local tab = self.container:object("ScrollingFrame", {
		AnchorPoint = Vector2.new(0, 1),
		Visible = false,
		BackgroundTransparency = 1,
		Position = UDim2.fromScale(0, 1),
		Size = UDim2.fromScale(1, 1),
		ScrollBarThickness = 0,
		ScrollingDirection = Enum.ScrollingDirection.Y
	})

	local quickAccessButton
	local quickAccessIcon

	if not options.Internal then
		quickAccessButton = self.quickAccess:object("TextButton", {
			Theme = {BackgroundColor3 = "Secondary"}
		}):round(5):tooltip(options.Name)

		quickAccessIcon = quickAccessButton:object("ImageLabel", {
			BackgroundTransparency = 1,
			Theme = {ImageColor3 = "StrongText"},
			Image = options.Icon,
			Size = UDim2.fromScale(0.5, 0.5),
			Centered = true
		})
	else
		quickAccessButton = options.Internal
	end

	local layout = tab:object("UIListLayout", {
		Padding = UDim.new(0, 10),
		HorizontalAlignment = Enum.HorizontalAlignment.Center
	})

	tab:object("UIPadding", {
		PaddingTop = UDim.new(0, 10)
	})

	local tabButton = Library:object("TextButton", {
		BackgroundTransparency = 1,
		Parent = self.nilFolder.AbsoluteObject,
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(0, 125, 0, 25),
		Visible = false
	}):round(5)

	self.Tabs[#self.Tabs+1] = {tab, tabButton, options.Name}

	do
		local down = false
		local hovered = false

		tabButton.MouseEnter:connect(function()
			hovered = true
			tabButton:tween{BackgroundTransparency = ((selectedTab == tabButton) and 0.15) or 0.3}
		end)

		tabButton.MouseLeave:connect(function()
			hovered = false
			tabButton:tween{BackgroundTransparency = ((selectedTab == tabButton) and 0.15) or 1}
		end)

		tabButton.MouseButton1Down:connect(function()
			down = true
			tabButton:tween{BackgroundTransparency = 0}
		end)

		UserInputService.InputEnded:connect(function(key)
			if key.UserInputType == Enum.UserInputType.MouseButton1 then
				down = false
				tabButton:tween{BackgroundTransparency = ((selectedTab == tabButton) and 0.15) or (hovered and 0.3) or 1}
			end

		end)

		tabButton.MouseButton1Click:Connect(function()
			for _, tabInfo in next, self.Tabs do
				local page = tabInfo[1]
				local button = tabInfo[2]
				page.Visible = false
			end
			selectedTab:tween{BackgroundTransparency = ((selectedTab == tabButton) and 0.15) or 1}
			selectedTab = tabButton
			tab.Visible = true
			tabButton.BackgroundTransparency = 0
			Library.UrlLabel.Text = Library.Url .. "/" .. options.Name:lower()
		end)

		quickAccessButton.MouseEnter:connect(function()
			quickAccessButton:tween{BackgroundColor3 = Library.CurrentTheme.Tertiary}
		end)

		quickAccessButton.MouseLeave:connect(function()
			quickAccessButton:tween{BackgroundColor3 = Library.CurrentTheme.Secondary}
		end)

		quickAccessButton.MouseButton1Click:connect(function()
			if not tabButton.Visible then
				tabButton.Parent = self.navigation.AbsoluteObject
				tabButton.Size = UDim2.new(0, 50, tabButton.Size.Y.Scale, tabButton.Size.Y.Offset)
				tabButton.Visible = true
				tabButton:fade(false, Library.CurrentTheme.Main, 0.1)			
				tabButton:tween({Size = UDim2.new(0, 125, tabButton.Size.Y.Scale, tabButton.Size.Y.Offset), Length = 0.1})
				for _, tabInfo in next, self.Tabs do
					local page = tabInfo[1]
					local button = tabInfo[2]
					page.Visible = false
				end
				selectedTab:tween{BackgroundTransparency = ((selectedTab == tabButton) and 0.15) or 1}
				selectedTab = tabButton
				tab.Visible = true
				tabButton.BackgroundTransparency = 0
				Library.UrlLabel.Text = Library.Url .. "/" .. options.Name:lower()
			end
		end)
	end

	local tabButtonText = tabButton:object("TextLabel", {
		Theme = {TextColor3 = "StrongText"},
		AnchorPoint = Vector2.new(0, .5),
		BackgroundTransparency = 1,
		TextSize = 14,
		Text = options.Name,
		Position = UDim2.new(0, 25, 0.5, 0),
		TextXAlignment = Enum.TextXAlignment.Left,
		Size = UDim2.new(1, -45, 0.5, 0),
		Font = Enum.Font.SourceSans,
		TextTruncate = Enum.TextTruncate.AtEnd
	})

	local tabButtonIcon = tabButton:object("ImageLabel", {
		AnchorPoint = Vector2.new(0, 0.5),
		BackgroundTransparency = 1,
		Position = UDim2.new(0, 5, 0.5, 0),
		Size = UDim2.new(0, 15, 0, 15),
		Image = options.Icon,
		Theme = {ImageColor3 = "StrongText"}
	})

	local tabButtonClose = tabButton:object("ImageButton", {
		AnchorPoint = Vector2.new(1, 0.5),
		BackgroundTransparency = 1,
		Position = UDim2.new(1, -5, 0.5, 0),
		Size = UDim2.fromOffset(14, 14),
		Image = "rbxassetid://8497487650",
		Theme = {ImageColor3 = "StrongText"}
	})

	tabButtonClose.MouseButton1Click:connect(function()
		tabButton:fade(true, Library.CurrentTheme.Main, 0.1)
		tabButton:tween({Size = UDim2.new(0, 50, tabButton.Size.Y.Scale, tabButton.Size.Y.Offset), Length = 0.1}, function()
			tabButton.Visible = false
			tab.Visible = false
			tabButton.Parent = self.nilFolder.AbsoluteObject
			wait()
		end)

		local visible = {}
		for _, tab in next, self.Tabs do
			if not tab[2] == selectedTab then tab[1].Visible = false end
			if tab[2].Visible then
				visible[#visible+1] = tab
			end
		end

		local lastTab = visible[#visible]

		if selectedTab == self.homeButton then
			tab.Visible = false
		elseif #visible == 2 then
			selectedTab.Visible = false
			tab.Visible = false
			self.homePage.Visible = true
			self.homeButton:tween{BackgroundTransparency = 0.15}
			selectedTab = self.homeButton
			Library.UrlLabel.Text = Library.Url .. "/home"	
		elseif tabButton == lastTab[2] then
			lastTab = visible[#visible-1]
			tab.Visible = false
			lastTab[2]:tween{BackgroundTransparency = 0.15}
			lastTab[1].Visible = true
			selectedTab = lastTab[2]
			Library.UrlLabel.Text = Library.Url .. "/" .. lastTab[3]:lower()
		else
			tab.Visible = false
			lastTab[2]:tween{BackgroundTransparency = 0.15}
			lastTab[1].Visible = true
			selectedTab = lastTab[2]
			Library.UrlLabel.Text = Library.Url .. "/" .. lastTab[3]:lower()
		end
	end)

	return setmetatable({
		statusText = self.statusText,
		container = tab,
		Theme = self.Theme,
		core = self.core,
		layout = layout
	}, Library)
end

function Library:_resize_tab()
	if self.container.ClassName == "ScrollingFrame" then
		self.container.CanvasSize = UDim2.fromOffset(0, self.layout.AbsoluteContentSize.Y + 20)
	else
		self.sectionContainer.Size = UDim2.new(1, -24, 0, self.layout.AbsoluteContentSize.Y + 20)
		self.parentContainer.CanvasSize = UDim2.fromOffset(0, self.parentLayout.AbsoluteContentSize.Y + 20)
	end
end

function Library:toggle(options)
	options = self:set_defaults({
		Name = "Toggle",
		StartingState = false,
		Description = nil,
		Callback = function(state) end
	}, options)

	local toggleContainer = self.container:object("TextButton", {
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(1, -20, 0, 52)
	}):round(7)

	local on = "http://www.roblox.com/asset/?id=8498709213"
	local off = "http://www.roblox.com/asset/?id=8498691125"

	local toggled = options.StartingState

	local onIcon = toggleContainer:object("ImageLabel", {
		AnchorPoint = Vector2.new(1, .5),
		BackgroundTransparency = 1,
		Position = UDim2.new(1, -11,0.5, 0),
		Size = UDim2.new(0, 26,0, 26),
		Image = on,
		Theme = {ImageColor3 = "Tertiary"},
		ImageTransparency = (toggled and 0) or 1
	})

	local offIcon = toggleContainer:object("ImageLabel", {
		AnchorPoint = Vector2.new(1, .5),
		BackgroundTransparency = 1,
		Position = UDim2.new(1, -11,0.5, 0),
		Size = UDim2.new(0, 26,0, 26),
		Image = off,
		Theme = {ImageColor3 = "WeakText"},
		ImageTransparency = (toggled and 1) or 0
	})

	local text = toggleContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.fromOffset(10, (options.Description and 5) or 0),
		Size = (options.Description and UDim2.new(0.5, -10, 0, 22)) or UDim2.new(0.5, -10, 1, 0),
		Text = options.Name,
		TextSize = 22,
		Theme = {TextColor3 = "StrongText"},
		TextXAlignment = Enum.TextXAlignment.Left
	})

	if options.Description then
		local description = toggleContainer:object("TextLabel", {
			BackgroundTransparency = 1,
			Position = UDim2.fromOffset(10, 27),
			Size = UDim2.new(0.5, -10, 0, 20),
			Text = options.Description,
			TextSize = 18,
			Theme = {TextColor3 = "WeakText"},
			TextXAlignment = Enum.TextXAlignment.Left
		})
	end

	local function toggle()
		toggled = not toggled
		if toggled then
			offIcon:crossfade(onIcon, 0.1)
		else
			onIcon:crossfade(offIcon, 0.1)
		end
		options.Callback(toggled)
	end

	do
		local hovered = false
		local down = false

		toggleContainer.MouseEnter:connect(function()
			hovered = true
			toggleContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 10)}
		end)

		toggleContainer.MouseLeave:connect(function()
			hovered = false
			if not down then
				toggleContainer:tween{BackgroundColor3 = Library.CurrentTheme.Secondary}
			end
		end)

		toggleContainer.MouseButton1Down:connect(function()
			toggleContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 20)}
		end)

		UserInputService.InputEnded:connect(function(key)
			if key.UserInputType == Enum.UserInputType.MouseButton1 then
				toggleContainer:tween{BackgroundColor3 = (hovered and self:lighten(Library.CurrentTheme.Secondary)) or Library.CurrentTheme.Secondary}
			end
		end)

		toggleContainer.MouseButton1Click:connect(function()
			toggle()
		end)
	end
	self:_resize_tab()

	local methods = {}

	function methods:Toggle()
		toggle()
	end

	function methods:SetState(state)
		toggled = state
		if toggled then
			offIcon:crossfade(onIcon, 0.1)
		else
			onIcon:crossfade(offIcon, 0.1)
		end
		task.spawn(function() options.Callback(toggled) end)
	end

	if options.StartingState then methods:SetState(true) end

	return methods
end

function Library:dropdown(options)
	options = self:set_defaults({
		Name = "Dropdown",
		StartingText = "Select...",
		Items = {},
		Callback = function(item) return end
	}, options)


	local newSize = 0
	local open = false

	local dropdownContainer = self.container:object("TextButton", {
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(1, -20, 0, 52)
	}):round(7)

	local text = dropdownContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.fromOffset(10, (options.Description and 5) or 15),
		Size = UDim2.new(0.5, -10, 0, 22),
		Text = options.Name,
		TextSize = 22,
		Theme = {TextColor3 = "StrongText"},
		TextXAlignment = Enum.TextXAlignment.Left
	})

	if options.Description then
		local description = dropdownContainer:object("TextLabel", {
			BackgroundTransparency = 1,
			Position = UDim2.fromOffset(10, 27),
			Size = UDim2.new(0.5, -10, 0, 20),
			Text = options.Description,
			TextSize = 18,
			Theme = {TextColor3 = "WeakText"},
			TextXAlignment = Enum.TextXAlignment.Left
		})
	end

	local icon = dropdownContainer:object("ImageLabel", {
		AnchorPoint = Vector2.new(1, 0),
		BackgroundTransparency = 1,
		Position = UDim2.new(1, -11, 0, 12),
		Size = UDim2.fromOffset(26, 26),
		Image = "rbxassetid://8498840035",
		Theme = {ImageColor3 = "Tertiary"}
	})

	local selectedText = dropdownContainer:object("TextLabel", {
		AnchorPoint = Vector2.new(1, 0),
		Theme = {
			BackgroundColor3 = {"Secondary", -20},
			TextColor3 = "WeakText"
		},
		Position = UDim2.new(1, -50, 0, 16),
		Size = UDim2.fromOffset(200, 20),
		TextSize = 14,
		Text = options.StartingText
	}):round(5):stroke("Tertiary")

	local itemContainer = dropdownContainer:object("Frame", {
		BackgroundTransparency = 1,
		Position = UDim2.new(0, 5,0, 55),
		Size = UDim2.new(1, -10, 0, 0),
		ClipsDescendants = true
	})

	selectedText.Size = UDim2.fromOffset(selectedText.TextBounds.X + 20, 20)

	local _gridItemContainer = itemContainer:object("UIGridLayout", {
		CellPadding = UDim2.fromOffset(0, 5),
		CellSize = UDim2.new(1, 0, 0, 20),
		FillDirection = Enum.FillDirection.Horizontal,
		HorizontalAlignment = Enum.HorizontalAlignment.Left,
		VerticalAlignment = Enum.VerticalAlignment.Top
	})

	local layout = self.layout
	local container = self.container


	local items = setmetatable({}, {
		__newindex = function(self, i, v)
			rawset(self, i, v)
			if v ~= nil then
				newSize = (25 * #self) + 5
				itemContainer.Size = UDim2.new(1, -10, 0, newSize)
			end
		end
	})

	for i, v in next, options.Items do
		if typeof(v) == "table" then
			items[i] = v
		else
			items[i] = {tostring(v), v}
		end
	end

	local toggle;

	for i, item in next, items do
		local label = item[1]
		local value = item[2]

		local newItem = itemContainer:object("TextButton", {
			Theme = {
				BackgroundColor3 = {"Secondary", 25},
				TextColor3 = {"StrongText", 25}
			},
			Text = label,
			TextSize = 14
		}):round(5)

		items[i] = {{label, value}, newItem} 

		do
			local hovered = false
			local down = false

			newItem.MouseEnter:connect(function()
				hovered = true
				newItem:tween{BackgroundColor3 = Library.CurrentTheme.Tertiary}
			end)

			newItem.MouseLeave:connect(function()
				hovered = false
				if not down then
					newItem:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 25)}
				end
			end)

			newItem.MouseButton1Down:connect(function()
				newItem:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Tertiary, 10)}
			end)

			UserInputService.InputEnded:connect(function(key)
				if key.UserInputType == Enum.UserInputType.MouseButton1 then
					newItem:tween{BackgroundColor3 = (hovered and self:lighten(Library.CurrentTheme.Tertiary, 5)) or self:lighten(Library.CurrentTheme.Secondary, 25)}
				end
			end)

			newItem.MouseButton1Click:connect(function()
				toggle()
				selectedText.Text = newItem.Text
				selectedText:tween{Size = UDim2.fromOffset(selectedText.TextBounds.X + 20, 20), Length = 0.05}
				options.Callback(value)
			end)
		end
	end

	do
		local hovered = false
		local down = false

		newSize = (25 * #items) + 5
		itemContainer.Size = (not open and UDim2.new(1, -10, 0, 0)) or UDim2.new(1, -10, 0, newSize)

		toggle = function()
			newSize = (25 * #items) + 5
			open = not open
			if open then
				itemContainer:tween{Size = UDim2.new(1, -10, 0, newSize)}
				dropdownContainer:tween({Size = UDim2.new(1, -20, 0, 52 + newSize)}, function()
					self:_resize_tab()
				end)
				icon:tween{Rotation = 180, Position = UDim2.new(1, -11, 0, 15)}
			else
				itemContainer:tween{Size = UDim2.new(1, -10, 0, 0)}
				dropdownContainer:tween({Size = UDim2.new(1, -20, 0, 52)}, function()
					self:_resize_tab()
				end)
				icon:tween{Rotation = 0, Position = UDim2.new(1, -11, 0, 12)}
			end
		end

		dropdownContainer.MouseEnter:connect(function()
			hovered = true
			dropdownContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 10)}
		end)

		dropdownContainer.MouseLeave:connect(function()
			hovered = false
			if not down then
				dropdownContainer:tween{BackgroundColor3 = Library.CurrentTheme.Secondary}
			end
		end)

		dropdownContainer.MouseButton1Down:connect(function()
			dropdownContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 20)}
		end)

		UserInputService.InputEnded:connect(function(key)
			if key.UserInputType == Enum.UserInputType.MouseButton1 then
				dropdownContainer:tween{BackgroundColor3 = (hovered and self:lighten(Library.CurrentTheme.Secondary)) or Library.CurrentTheme.Secondary}
			end
		end)

		dropdownContainer.MouseButton1Click:connect(function()
			toggle()
		end)
	end
	self:_resize_tab()

	local methods = {}

	function methods:Set(text)
		selectedText.Text = text
		selectedText:tween{Size = UDim2.fromOffset(selectedText.TextBounds.X + 20, 20), Length = 0.05}
	end

	function methods:RemoveItems(fitems)
		for _, v in next, fitems do
			for _2, v2 in next, items do
				local label = v2[1][1]
				if label:lower() == tostring(v):lower() then
					v2[2].AbsoluteObject:Destroy()
					items[_2] = nil
					table.remove(items, _2)
					newSize = (25 * #items) + 5
					itemContainer:tween{Size = (not open and UDim2.new(1, -10, 0, 0)) or UDim2.new(1, -10, 0, newSize)}
					dropdownContainer:tween({Size = (not open and UDim2.new(1, -20, 0, 52)) or UDim2.new(1, -20, 0, 52 + newSize)})
				end
			end
		end
	end

	function methods:Clear()
		table.clear(items)
		itemContainer:tween{Size = UDim2.new(1, -10, 0, 0)}
		dropdownContainer:tween({Size = UDim2.new(1, -20, 0, 52)}, function()
			for i, v in next, itemContainer.AbsoluteObject:GetChildren() do
				if v.ClassName == "TextButton" then
					v:Destroy()
				end
			end
		end)
		if open then toggle() end
	end

	function methods:AddItems(fitems)
		for i, v in next, fitems do
			if typeof(v) == "table" then
				items[#items+1] = v
			else
				items[#items+1] = {tostring(v), v}
			end
		end

		newSize = (25 * #items) + 5
		itemContainer:tween{Size = (not open and UDim2.new(1, -10, 0, 0)) or UDim2.new(1, -10, 0, newSize)}
		dropdownContainer:tween({Size = (not open and UDim2.new(1, -20, 0, 52)) or UDim2.new(1, -20, 0, 52 + newSize)})

		for i, item in next, items do
			local label = item[1]
			local value = item[2]

			if type(label) == "table" then continue end

			local newItem = itemContainer:object("TextButton", {
				Theme = {
					BackgroundColor3 = {"Secondary", 25},
					TextColor3 = {"StrongText", 25}
				},
				Text = label,
				TextSize = 14
			}):round(5)

			items[i] = {{label, value}, newItem}

			do
				local hovered = false
				local down = false

				newItem.MouseEnter:connect(function()
					hovered = true
					newItem:tween{BackgroundColor3 = Library.CurrentTheme.Tertiary}
				end)

				newItem.MouseLeave:connect(function()
					hovered = false
					if not down then
						newItem:tween{BackgroundColor3 = Library:lighten(Library.CurrentTheme.Secondary, 25)}
					end
				end)

				newItem.MouseButton1Down:connect(function()
					newItem:tween{BackgroundColor3 = Library:lighten(Library.CurrentTheme.Tertiary, 10)}
				end)

				UserInputService.InputEnded:connect(function(key)
					if key.UserInputType == Enum.UserInputType.MouseButton1 then
						newItem:tween{BackgroundColor3 = (hovered and Library:lighten(Library.CurrentTheme.Tertiary, 5)) or Library:lighten(Library.CurrentTheme.Secondary, 25)}
					end
				end)

				newItem.MouseButton1Click:connect(function()
					toggle()
					selectedText.Text = newItem.Text
					selectedText:tween{Size = UDim2.fromOffset(selectedText.TextBounds.X + 20, 20), Length = 0.05}
					options.Callback(value)
				end)
			end		
		end

		Library._resize_tab({
			container = container,
			layout = layout
		})
	end

	return methods
end

function Library:section(options)
	options = self:set_defaults({
		Name = "Section"
	}, options)

	local sectionContainer = self.container:object("TextButton", {
		BackgroundTransparency = 1,
		Size = UDim2.new(1, -24, 0, 52)
	}):round(7):stroke("Secondary", 2)

	local text = sectionContainer:object("TextLabel", {
		Position = UDim2.new(0.5),
		Text = options.Name,
		TextSize = 18,
		Theme = {
			TextColor3 = "StrongText",
			BackgroundColor3 = {"Secondary", -10}
		},
		TextXAlignment = Enum.TextXAlignment.Center,
		AnchorPoint = Vector2.new(0.5, 0.5)
	})
	text.Size = UDim2.fromOffset(text.TextBounds.X + 4, text.TextBounds.Y)


	local functionContainer = sectionContainer:object("Frame", {
		Size = UDim2.fromScale(1, 1),
		BackgroundTransparency = 1
	})


	local layout = functionContainer:object("UIListLayout", {
		Padding = UDim.new(0, 10),
		HorizontalAlignment = Enum.HorizontalAlignment.Center
	})

	functionContainer:object("UIPadding", {
		PaddingTop = UDim.new(0, 10)
	})

	return setmetatable({
		statusText = self.statusText,
		container = functionContainer,
		sectionContainer = sectionContainer,
		parentContainer = self.container,
		Theme = self.Theme,
		core = self.core,
		parentLayout = self.layout,
		layout = layout
	}, Library)
end

function Library:button(options)
	options = self:set_defaults({
		Name = "Button",
		Description = nil,
		Callback = function() end
	}, options)

	local buttonContainer = self.container:object("TextButton", {
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(1, -20, 0, 52)
	}):round(7)

	local text = buttonContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.fromOffset(10, (options.Description and 5) or 0),
		Size = (options.Description and UDim2.new(0.5, -10, 0, 22)) or UDim2.new(0.5, -10, 1, 0),
		Text = options.Name,
		TextSize = 22,
		Theme = {TextColor3 = "StrongText"},
		TextXAlignment = Enum.TextXAlignment.Left
	})

	if options.Description then
		local description = buttonContainer:object("TextLabel", {
			BackgroundTransparency = 1,
			Position = UDim2.fromOffset(10, 27),
			Size = UDim2.new(0.5, -10, 0, 20),
			Text = options.Description,
			TextSize = 18,
			Theme = {TextColor3 = "WeakText"},
			TextXAlignment = Enum.TextXAlignment.Left
		})
	end

	local icon = buttonContainer:object("ImageLabel", {
		AnchorPoint = Vector2.new(1, 0.5),
		BackgroundTransparency = 1,
		Position = UDim2.new(1, -11, 0.5, 0),
		Size = UDim2.fromOffset(26, 26),
		Image = "rbxassetid://8498776661",
		Theme = {ImageColor3 = "Tertiary"}
	})

	do
		local hovered = false
		local down = false

		buttonContainer.MouseEnter:connect(function()
			hovered = true
			buttonContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 10)}
		end)

		buttonContainer.MouseLeave:connect(function()
			hovered = false
			if not down then
				buttonContainer:tween{BackgroundColor3 = Library.CurrentTheme.Secondary}
			end
		end)

		buttonContainer.MouseButton1Down:connect(function()
			buttonContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 20)}
		end)

		UserInputService.InputEnded:connect(function(key)
			if key.UserInputType == Enum.UserInputType.MouseButton1 then
				buttonContainer:tween{BackgroundColor3 = (hovered and self:lighten(Library.CurrentTheme.Secondary)) or Library.CurrentTheme.Secondary}
			end
		end)

		buttonContainer.MouseButton1Click:connect(function()
			options.Callback()
		end)
	end
	self:_resize_tab()

	local methods = {}

	function methods:Fire()
		options.Callback()
	end

	function methods:SetText(txt)
		text.Text = txt
	end

	return methods
end

function Library:color_picker(options)
	options = self:set_defaults({
		Name = "Color Picker",
		Description = nil,
		Style = Library.ColorPickerStyles.Legacy,
		Followup = false,
		Callback = function(color) end
	}, options)

	local buttonContainer = self.container:object("TextButton", {
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(1, -20, 0, 52)
	}):round(7)

	local text = buttonContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.fromOffset(10, (options.Description and 5) or 0),
		Size = (options.Description and UDim2.new(0.5, -10, 0, 22)) or UDim2.new(0.5, -10, 1, 0),
		Text = options.Name,
		TextSize = 22,
		Theme = {TextColor3 = "StrongText"},
		TextXAlignment = Enum.TextXAlignment.Left
	})

	if options.Description then
		local description = buttonContainer:object("TextLabel", {
			BackgroundTransparency = 1,
			Position = UDim2.fromOffset(10, 27),
			Size = UDim2.new(0.5, -10, 0, 20),
			Text = options.Description,
			TextSize = 18,
			Theme = {TextColor3 = "WeakText"},
			TextXAlignment = Enum.TextXAlignment.Left
		})
	end

	local icon = buttonContainer:object("ImageLabel", {
		AnchorPoint = Vector2.new(1, 0.5),
		BackgroundTransparency = 1,
		Position = UDim2.new(1, -11, 0.5, 0),
		Size = UDim2.fromOffset(26, 26),
		Image = "rbxassetid://8604555937",
		ImageColor3 = Library.CurrentTheme.Tertiary
	})

	do
		local hovered = false
		local down = false

		buttonContainer.MouseEnter:connect(function()
			hovered = true
			buttonContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 10)}
		end)

		buttonContainer.MouseLeave:connect(function()
			hovered = false
			if not down then
				buttonContainer:tween{BackgroundColor3 = Library.CurrentTheme.Secondary}
			end
		end)

		buttonContainer.MouseButton1Down:connect(function()
			buttonContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 20)}
		end)

		UserInputService.InputEnded:connect(function(key)
			if key.UserInputType == Enum.UserInputType.MouseButton1 then
				buttonContainer:tween{BackgroundColor3 = (hovered and self:lighten(Library.CurrentTheme.Secondary)) or Library.CurrentTheme.Secondary}
			end
		end)

		buttonContainer.MouseButton1Click:connect(function()
			if Library._colorPickerExists then return end
			Library._colorPickerExists = true
			local hue, sat, val;
			local updatePicker, updateHue;

			local fadeOut;

			local selectedColor = Color3.fromRGB(255, 0, 0);

			local darkener = self.core:object("Frame", {
				BackgroundColor3 = Color3.fromRGB(0, 0, 0),
				BackgroundTransparency = 1,
				Size = UDim2.fromScale(1, 1),
				ZIndex = 2
			}):round(10)


			if options.Style == 1 then
				do
					local arrow = darkener:object("ImageLabel", {
						BackgroundTransparency = 1,
						Position = UDim2.new(0, 365,0, 102),
						Size = UDim2.new(0, 56,0, 48),
						ZIndex = 10,
						Image = "rbxassetid://8579148508",
						ImageColor3 = selectedColor,
						ImageTransparency = 1,
						Rotation = 180
					})

					local text = darkener:object("ImageLabel", {
						BackgroundTransparency = 1,
						Position = UDim2.new(0, 364,0, 158),
						Rotation = -4,
						Size = UDim2.new(0, 141,0, 37),
						ZIndex = 10,
						Image = "rbxassetid://8579166120",
						ImageColor3 = selectedColor,
						ImageTransparency = 0
					})

					local cpHolder = darkener:object("Frame", {
						AnchorPoint = Vector2.new(.5, .5),
						BackgroundTransparency = 1,
						Position = UDim2.new(0.5, -50,0.5, 0),
						Size = UDim2.fromOffset(160, 240),
						ZIndex = 12
					})

					local _cpShadowHolder = cpHolder:object("Frame", {
						BackgroundTransparency = 1,
						Size = UDim2.fromScale(1, 1),
						ZIndex = 11
					})

					local _cpShadow = _cpShadowHolder:object("ImageLabel", {
						Centered = true,
						BackgroundTransparency = 1,
						Size = UDim2.new(1, 47,1, 47),
						ZIndex = 11,
						Image = "rbxassetid://6015897843",
						ImageColor3 = Color3.new(0, 0, 0),
						ImageTransparency = 1,
						SliceCenter = Rect.new(49, 49, 450, 450),
						ScaleType = Enum.ScaleType.Slice,
						SliceScale = 1
					})

					local btnHolder = cpHolder:object("Frame", {
						AnchorPoint = Vector2.new(1, 1),
						BackgroundColor3 = Color3.new(0, 0, 0),
						BackgroundTransparency = 1,
						Position = UDim2.fromScale(1, 1),
						Size = UDim2.new(1, -5,0, 50),
						ZIndex = 12
					})

					local button = btnHolder:object("TextButton", {
						Centered = true,
						BackgroundTransparency = 1,
						TextTransparency = 1,
						Size = UDim2.fromOffset(80, 20),
						ZIndex = 12,
						Text = "SELECT",
						TextSize = 13,
						Theme = {TextColor3 = {"Tertiary", -10}, BackgroundColor3 = {"Tertiary", -10}}
					}):round(8):stroke({"Tertiary", -10})

					do
						local hovered = false
						local down = false

						button.MouseEnter:connect(function()
							hovered = true
							button:tween{BackgroundTransparency = 0, TextColor3 = self:lighten(Library.CurrentTheme.StrongText, 15)}
						end)

						button.MouseLeave:connect(function()
							hovered = false
							if not down then
								button:tween{BackgroundTransparency = 1, TextColor3 = self:darken(Library.CurrentTheme.Tertiary, 10)}
							end
						end)

						button.MouseButton1Down:connect(function()
							button:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Tertiary, 20)}
						end)

						UserInputService.InputEnded:connect(function(key)
							if key.UserInputType == Enum.UserInputType.MouseButton1 then
								button:tween{BackgroundTransparency = (hovered and 0) or 1}
								if hovered then
									button:tween{BackgroundColor3 = Library.CurrentTheme.Tertiary}
								end
							end
						end)

						button.MouseButton1Click:connect(function()
							fadeOut()
							icon:tween({ImageColor3 = selectedColor})
							options.Callback(selectedColor)
							task.delay(0.35, function()
								Library._colorPickerExists = false
							end)
						end)
					end

					local hueBar = cpHolder:object("TextButton", {
						BackgroundColor3 = Color3.new(255, 255, 255),
						BorderSizePixel = 0,
						Text = "",
						Size = UDim2.new(0, 5, 1, 0),
						ZIndex = 12,
						ClipsDescendants = true,
						BackgroundTransparency = 1
					})

					local _hueBarGradient = hueBar:object("UIGradient", {
						Color = ColorSequence.new{
							ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 0, 0)),
							ColorSequenceKeypoint.new(0.167, Color3.fromRGB(255, 255, 0)),
							ColorSequenceKeypoint.new(0.333, Color3.fromRGB(0, 255, 0)),
							ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0, 255, 255)),
							ColorSequenceKeypoint.new(0.667, Color3.fromRGB(0, 0, 255)),
							ColorSequenceKeypoint.new(0.833, Color3.fromRGB(255, 0, 255)),
							ColorSequenceKeypoint.new(1, Color3.fromRGB(255, 0, 0))
						},
						Rotation = 90
					})

					local hueDraggable = hueBar:object("ImageButton", {
						BackgroundTransparency = 1,
						ImageTransparency = 1,
						Position = UDim2.new(-2, 3,0, -10),
						Size = UDim2.fromOffset(20, 20),
						ZIndex = 12,
						Image = "rbxassetid://8579244616"
					})

					local pickerArea = cpHolder:object("TextButton", {
						Text = "",
						AnchorPoint = Vector2.new(1, 0),
						BackgroundTransparency = 1,
						Position = UDim2.fromScale(1, 0),
						Size = UDim2.new(1, -5,1, -50),
						ZIndex = 12,
						ClipsDescendants = true
					})

					local color = pickerArea:object("Frame", {
						Size = UDim2.fromScale(1, 1),
						ZIndex = 13,
						BackgroundColor3 = selectedColor,
						BackgroundTransparency = 1,
						BorderSizePixel = 0
					})

					local brightness = pickerArea:object("Frame", {
						Size = UDim2.fromScale(1, 1),
						ZIndex = 14,
						BackgroundColor3 = Color3.fromRGB(255, 255, 255),
						BackgroundTransparency = 1,
						BorderSizePixel = 0
					})

					local _brightness = brightness:object("UIGradient", {
						Color = ColorSequence.new{
							ColorSequenceKeypoint.new(0, Color3.fromRGB(255 ,255, 255)),
							ColorSequenceKeypoint.new(1, Color3.fromRGB(255 ,255, 255))
						},
						Transparency = NumberSequence.new{
							NumberSequenceKeypoint.new(0, 0),
							NumberSequenceKeypoint.new(1, 1),
						}
					})

					local black = pickerArea:object("Frame", {
						Size = UDim2.fromScale(1, 1),
						ZIndex = 16,
						BackgroundColor3 = Color3.fromRGB(255, 255, 255),
						BorderSizePixel = 0,
						BackgroundTransparency = 1
					})

					local _black = black:object("UIGradient", {
						Color = ColorSequence.new{
							ColorSequenceKeypoint.new(0, Color3.fromRGB(0, 0, 0)),
							ColorSequenceKeypoint.new(1, Color3.fromRGB(0, 0, 0))
						},
						Transparency = NumberSequence.new{
							NumberSequenceKeypoint.new(0, 0),
							NumberSequenceKeypoint.new(1, 1),
						},
						Rotation = -90
					})

					local colorPickerDraggable = pickerArea:object("TextButton", {
						Text = "",
						AnchorPoint = Vector2.new(.5, .5),
						BackgroundTransparency = 1,
						Size = UDim2.fromOffset(6, 6),
						Position = UDim2.new(0, 152, 0, 3),
						ZIndex = 20
					}):round(100)

					local _colorPickerDraggableStroke = colorPickerDraggable:object("UIStroke", {
						Color = Color3.fromRGB(255, 255 ,255),
						Thickness = 1.6,
						ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
						Transparency = 1
					})

					-- HUE
					do
						updateHue = function()
							hue = math.clamp((Mouse.Y - hueBar.AbsolutePosition.Y) / (hueBar.AbsoluteSize.Y), 0, 1)
							local tempVal = math.clamp((Mouse.Y - pickerArea.AbsolutePosition.Y) / (pickerArea.AbsoluteSize.Y), 0, 1)
							local newYPos = math.clamp((Mouse.Y - hueBar.AbsolutePosition.Y) / (hueBar.AbsoluteSize.Y) * hueBar.AbsoluteSize.Y, 0, hueBar.AbsoluteSize.Y)
							selectedColor = Color3.fromHSV(hue, sat, val)
							color:tween({Length = 0.05, BackgroundColor3 = Color3.fromHSV(hue, 1, 1)})
							text:tween({ImageColor3 = selectedColor, Length = 0.05})
							arrow:tween({ImageColor3 = selectedColor, Length = 0.05})
							hueDraggable:tween({Length = 0.05, Position = UDim2.new(-2, 3, 0, math.clamp(newYPos - 10, -10, hueBar.AbsoluteSize.Y + 10)), ImageColor3 = Color3.fromHSV(1, 0, -tempVal)})
						end


						local down = false

						hueBar.MouseButton1Down:Connect(function()
							down = true
							while RunService.RenderStepped:Wait() and down do
								updateHue()
							end
						end)

						hueDraggable.MouseButton1Down:connect(function()
							down = true
							while RunService.RenderStepped:Wait() and down do
								updateHue()
							end
						end)

						UserInputService.InputEnded:Connect(function(key)
							if key.UserInputType == Enum.UserInputType.MouseButton1 then
								if down then
									down = false
								end
							end
						end)
					end
					-- END HUE

					-- SAT & VALUE [PICKER]
					do
						local down = false

						updatePicker = function()
							sat = math.clamp((Mouse.X - pickerArea.AbsolutePosition.X) / (pickerArea.AbsoluteSize.X), 0, 1)
							val = 1 - math.clamp((Mouse.Y - pickerArea.AbsolutePosition.Y) / (pickerArea.AbsoluteSize.Y), 0, 1)

							local newXPos = math.clamp((Mouse.X - pickerArea.AbsolutePosition.X) / (pickerArea.AbsoluteSize.X) * pickerArea.AbsoluteSize.X, 0, pickerArea.AbsoluteSize.X)
							local newYPos = math.clamp((Mouse.Y - pickerArea.AbsolutePosition.Y) / (pickerArea.AbsoluteSize.Y) * pickerArea.AbsoluteSize.Y, 0, pickerArea.AbsoluteSize.Y)

							selectedColor = Color3.fromHSV(hue, sat, val)

							colorPickerDraggable:tween({Position = UDim2.fromOffset(newXPos, newYPos), Length = 0.05})
							text:tween({ImageColor3 = selectedColor, Length = 0.05})
							arrow:tween({ImageColor3 = selectedColor, Length = 0.05})
						end

						pickerArea.MouseButton1Down:Connect(function()
							down = true
							while RunService.RenderStepped:wait() and down do
								updatePicker()
							end
						end)

						UserInputService.InputEnded:Connect(function(key)
							if key.UserInputType == Enum.UserInputType.MouseButton1 then
								if down then
									down = false
								end
							end
						end)
					end
					-- END SAT & VALUE

					-- opening (fade in)
					darkener:tween({BackgroundTransparency = .4, Length = 0.1})
					arrow:tween({ImageTransparency = 0, Length = 0.1})
					text:tween({ImageTransparency = 0, Length = 0.1})
					_cpShadow:tween({ImageTransparency = .6, Length = 0.1})
					btnHolder:tween({BackgroundTransparency = 0, Length = 0.1})
					button:tween({TextTransparency = 0, Length = 0.1})
					hueBar:tween({BackgroundTransparency = 0, Length = 0.1})
					hueDraggable:tween({ImageTransparency = 0, Length = 0.1})
					color:tween{BackgroundTransparency = 0, Length = 0.1}
					brightness:tween{BackgroundTransparency = 0, Length = 0.1}
					black:tween{BackgroundTransparency = 0, Length = 0.1}
					_colorPickerDraggableStroke:tween{Transparency = 0, Length = 0.1}

					-- closing fade in
					fadeOut = function()
						darkener:tween({BackgroundTransparency = 1, Length = 0.1})
						arrow:tween({ImageTransparency = 1, Length = 0.1})
						text:tween({ImageTransparency = 1, Length = 0.1})
						_cpShadow:tween({ImageTransparency = 1, Length = 0.1})
						btnHolder:tween({BackgroundTransparency = 1, Length = 0.1})
						button:tween({TextTransparency = 1, Length = 0.1})
						hueBar:tween({BackgroundTransparency = 1, Length = 0.1})
						hueDraggable:tween({ImageTransparency = 1, Length = 0.1})
						color:tween{BackgroundTransparency = 1, Length = 0.1}
						brightness:tween{BackgroundTransparency = 1, Length = 0.1}
						black:tween{BackgroundTransparency = 1, Length = 0.1}
						_colorPickerDraggableStroke:tween({Transparency = 1, Length = 0.1}, function()
							task.delay(0.25, function()
								darkener.AbsoluteObject:Destroy()
							end)
						end)
					end
				end
			else
				do
					-- legacy
					local holder = darkener:object("Frame", {
						Centered = true,
						Theme = {BackgroundColor3 = "Secondary"},
						BackgroundTransparency = 1,
						Size = UDim2.fromOffset(255, 170),
					}):round(6)

					local _holderStroke = holder:object("UIStroke", {
						Transparency = 1,
						Theme = {Color = "Tertiary"},
						Thickness = 1.6
					})

					local _padding = holder:object("UIPadding", {
						PaddingLeft = UDim.new(0, 5),
						PaddingRight = UDim.new(0, 5),
						PaddingTop = UDim.new(0, 5),
						PaddingBottom = UDim.new(0, 5)
					})

					local pickerArea = holder:object("TextButton", {
						Text = "",
						BackgroundTransparency = 1,
						Size = UDim2.new(0.5, -5,1, -25),
					}):round(6)

					local _pickerAreaStroke = pickerArea:object("UIStroke", {
						Transparency = 1,
						Theme = {Color = "Tertiary"},
						Thickness = 1.6
					})

					local color = pickerArea:object("Frame", {
						Size = UDim2.fromScale(1, 1),
						BackgroundColor3 = selectedColor,
						BackgroundTransparency = 1,
						ZIndex = 10
					}):round(6)

					local brightness = pickerArea:object("Frame", {
						Size = UDim2.fromScale(1, 1),
						ZIndex = 11,
						BackgroundColor3 = Color3.fromRGB(255, 255, 255),
						BackgroundTransparency = 1,
						BorderSizePixel = 0
					}):round(6)

					local _brightness = brightness:object("UIGradient", {
						Color = ColorSequence.new{
							ColorSequenceKeypoint.new(0, Color3.fromRGB(255 ,255, 255)),
							ColorSequenceKeypoint.new(1, Color3.fromRGB(255 ,255, 255))
						},
						Transparency = NumberSequence.new{
							NumberSequenceKeypoint.new(0, 0),
							NumberSequenceKeypoint.new(1, 1),
						}
					})

					local black = pickerArea:object("Frame", {
						Size = UDim2.fromScale(1, 1),
						ZIndex = 12,
						BackgroundColor3 = Color3.fromRGB(255, 255, 255),
						BorderSizePixel = 0,
						BackgroundTransparency = 1
					}):round(6)

					local _black = black:object("UIGradient", {
						Color = ColorSequence.new{
							ColorSequenceKeypoint.new(0, Color3.fromRGB(0, 0, 0)),
							ColorSequenceKeypoint.new(1, Color3.fromRGB(0, 0, 0))
						},
						Transparency = NumberSequence.new{
							NumberSequenceKeypoint.new(0, 0),
							NumberSequenceKeypoint.new(1, 1),
						},
						Rotation = -90
					})

					local colorPickerDraggable = pickerArea:object("TextButton", {
						Centered = true,
						Text = "",
						AnchorPoint = Vector2.new(.5, .5),
						BackgroundTransparency = 1,
						Size = UDim2.fromOffset(6, 6),
						ZIndex = 20
					}):round(100)

					local _colorPickerDraggableStroke = colorPickerDraggable:object("UIStroke", {
						Transparency = 1,
						Color = Color3.fromRGB(255, 255, 255),
						Thickness = 1.6,
						ApplyStrokeMode = Enum.ApplyStrokeMode.Border
					})

					local hueArea = holder:object("TextButton", {
						Text = "",
						AnchorPoint = Vector2.new(0, 1),
						Position = UDim2.fromScale(0, 1),
						Size = UDim2.new(0.5, -5,0, 20),
						BackgroundColor3 = Color3.fromRGB(255, 255, 255),
						BackgroundTransparency = 1,
						ZIndex = 11
					}):round(6)

					local _hueAreaStroke = hueArea:object("UIStroke", {
						Transparency = 1,
						Theme = {Color = "Tertiary"},
						Thickness = 1.6
					})

					local _hueAreaGradient = hueArea:object("UIGradient", {
						Color = ColorSequence.new{
							ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 0, 0)),
							ColorSequenceKeypoint.new(0.167, Color3.fromRGB(255, 255, 0)),
							ColorSequenceKeypoint.new(0.333, Color3.fromRGB(0, 255, 0)),
							ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0, 255, 255)),
							ColorSequenceKeypoint.new(0.667, Color3.fromRGB(0, 0, 255)),
							ColorSequenceKeypoint.new(0.833, Color3.fromRGB(255, 0, 255)),
							ColorSequenceKeypoint.new(1, Color3.fromRGB(255, 0, 0))
						}
					})

					local hueDraggable = hueArea:object("TextButton", {
						Centered = true,
						Text = "",
						BackgroundTransparency = 1,
						Size = UDim2.new(0, 3, 1, 0),
						ZIndex = 20
					})

					local _hueDraggableStroke = hueDraggable:object("UIStroke", {
						Transparency = 1,
						Color = Color3.fromRGB(255, 255, 255),
						Thickness = 1.6,
						ApplyStrokeMode = Enum.ApplyStrokeMode.Border
					})

					local label = holder:object("TextLabel", {
						Text = "Color Picker",
						Font = Enum.Font.SourceSansBold,
						AnchorPoint = Vector2.new(1,0),
						BackgroundTransparency = 1,
						Position = UDim2.fromScale(1, 0),
						Size = UDim2.new(0.5, 0,0, 20),
						Theme = {TextColor3 = {"Tertiary", 15}},
						TextSize = 15,
						TextTransparency = 1
					})

					local infos = holder:object("Frame", {
						AnchorPoint = Vector2.new(1, 0),
						BackgroundTransparency = 1,
						Position = UDim2.new(1, 0,0, 25),
						Size = UDim2.new(0.5, 0,0, 60)
					})

					local _infosList = infos:object("UIListLayout", {
						Padding = UDim.new(0, 4),
						HorizontalAlignment = Enum.HorizontalAlignment.Center,
						SortOrder = Enum.SortOrder.Name
					})

					local r = infos:object("TextLabel", {
						AnchorPoint = Vector2.new(0.5, 0),
						Name = "1",
						Text = tostring(selectedColor.R * 255),
						Theme = {BackgroundColor3 = {"Secondary", 12}},
						Size = UDim2.new(1, -10,0, 18),
						TextColor3 = Color3.fromHSV(0, 0.8, 1),
						TextSize = 14,
						BackgroundTransparency = 1,
						TextTransparency = 1
					}):round(4)

					local g = infos:object("TextLabel", {
						AnchorPoint = Vector2.new(0.5, 0),
						Name = "2",
						Text = tostring(selectedColor.G * 255),
						Theme = {BackgroundColor3 = {"Secondary", 12}},
						Size = UDim2.new(1, -10,0, 18),
						TextColor3 = Color3.fromHSV(120/360, 0.8, 1),
						TextSize = 14,
						BackgroundTransparency = 1,
						TextTransparency = 1
					}):round(4)

					local b = infos:object("TextLabel", {
						AnchorPoint = Vector2.new(0.5, 0),
						Text = tostring(selectedColor.B * 255),
						Name = "3",
						Theme = {BackgroundColor3 = {"Secondary", 12}},
						Size = UDim2.new(1, -10,0, 18),
						TextColor3 = Color3.fromHSV(240/360, 0.8, 1),
						TextSize = 14,
						BackgroundTransparency = 1,
						TextTransparency = 1
					}):round(4)

					local pickBtn = holder:object("ImageButton", {
						AnchorPoint = Vector2.new(1, 1),
						Theme = {BackgroundColor3 = "Tertiary"},
						Position = UDim2.fromScale(1, 1),
						Size = UDim2.new(0.5, 0,0, 20),
						Image = "rbxassetid://8593962406",
						ScaleType = Enum.ScaleType.Fit,
						BackgroundTransparency = 1,
						ImageTransparency = 1
					}):round(6)

					local previewLight = holder:object("Frame", {
						AnchorPoint = Vector2.new(1, 1),
						BackgroundColor3 = selectedColor,
						Position = UDim2.new(1, -65,1, -25),
						Size = UDim2.fromOffset(40, 40),
						BackgroundTransparency = 1
					}):round(5)

					local _previewLightIcon = previewLight:object("ImageLabel", {
						Centered = true,
						BackgroundTransparency = 1,
						Size = UDim2.fromScale(.6, .6),
						Image = "rbxassetid://8593995344",
						ImageColor3 = Color3.fromRGB(255, 255, 255),
						ImageTransparency = 1
					})

					local previewDark = holder:object("Frame", {
						AnchorPoint = Vector2.new(1, 1),
						BackgroundColor3 = selectedColor,
						Position = UDim2.new(1, -15,1, -25),
						Size = UDim2.fromOffset(40, 40),
						BackgroundTransparency = 1
					}):round(5)

					local _previewDarkIcon = previewDark:object("ImageLabel", {
						Centered = true,
						BackgroundTransparency = 1,
						Size = UDim2.fromScale(.6, .6),
						Image = "rbxassetid://8593995344",
						ImageColor3 = Color3.fromRGB(0, 0, 0),
						ImageTransparency = 1
					})


					-- hacky fix for zindex issue
					for _, v in next, darkener.AbsoluteObject:GetDescendants() do
						pcall(function()
							v.ZIndex += 3
						end)
					end

					local function globalUpdate()
						r.Text = tostring(math.floor(selectedColor.R * 255))
						g.Text = tostring(math.floor(selectedColor.G * 255))
						b.Text = tostring(math.floor(selectedColor.B * 255))
						previewDark:tween({BackgroundColor3 = selectedColor})
						previewLight:tween({BackgroundColor3 = selectedColor})
					end
					-- HUE
					do
						updateHue = function()
							hue = math.clamp((Mouse.X - hueArea.AbsolutePosition.X) / (hueArea.AbsoluteSize.X), 0, 1)
							local newXPos = math.clamp((Mouse.X - hueArea.AbsolutePosition.X) / (hueArea.AbsoluteSize.X) * hueArea.AbsoluteSize.X, 0, hueArea.AbsoluteSize.X)
							selectedColor = Color3.fromHSV(hue, sat, val)
							color:tween({Length = 0.05, BackgroundColor3 = Color3.fromHSV(hue, 1, 1)})
							hueDraggable:tween({Length = 0.05, Position = UDim2.new(0, math.clamp(newXPos, 0, hueArea.AbsoluteSize.X), .5, 0)})

							globalUpdate()
						end


						local down = false

						hueArea.MouseButton1Down:Connect(function()
							down = true
							while RunService.RenderStepped:Wait() and down do
								updateHue()
							end
						end)

						hueDraggable.MouseButton1Down:connect(function()
							down = true
							while RunService.RenderStepped:Wait() and down do
								updateHue()
							end
						end)

						UserInputService.InputEnded:Connect(function(key)
							if key.UserInputType == Enum.UserInputType.MouseButton1 then
								if down then
									down = false
								end
							end
						end)
					end


					-- SAT & VALUE [PICKER]
					do
						local down = false

						updatePicker = function()
							sat = math.clamp((Mouse.X - pickerArea.AbsolutePosition.X) / (pickerArea.AbsoluteSize.X), 0, 1)
							val = 1 - math.clamp((Mouse.Y - pickerArea.AbsolutePosition.Y) / (pickerArea.AbsoluteSize.Y), 0, 1)

							local newXPos = math.clamp((Mouse.X - pickerArea.AbsolutePosition.X) / (pickerArea.AbsoluteSize.X) * pickerArea.AbsoluteSize.X, 0, pickerArea.AbsoluteSize.X)
							local newYPos = math.clamp((Mouse.Y - pickerArea.AbsolutePosition.Y) / (pickerArea.AbsoluteSize.Y) * pickerArea.AbsoluteSize.Y, 0, pickerArea.AbsoluteSize.Y)

							selectedColor = Color3.fromHSV(hue, sat, val)

							globalUpdate()

							colorPickerDraggable:tween({Position = UDim2.fromOffset(newXPos, newYPos), Length = 0.05})
						end

						pickerArea.MouseButton1Down:Connect(function()
							down = true
							while RunService.RenderStepped:wait() and down do
								updatePicker()
							end
						end)

						UserInputService.InputEnded:Connect(function(key)
							if key.UserInputType == Enum.UserInputType.MouseButton1 then
								if down then
									down = false
								end
							end
						end)
					end

					-- input n shit
					do
						local down = false
						local hovered = false

						pickBtn.MouseEnter:connect(function()
							hovered = true
							pickBtn:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Tertiary, 10)}
						end)

						pickBtn.MouseLeave:connect(function()
							hovered = false
							if not down then
								pickBtn:tween{BackgroundColor3 = Library.CurrentTheme.Tertiary}
							end
						end)

						pickBtn.MouseButton1Down:connect(function()
							pickBtn:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Tertiary, 20)}
						end)

						UserInputService.InputEnded:connect(function(key)
							if key.UserInputType == Enum.UserInputType.MouseButton1 then
								pickBtn:tween{BackgroundColor3 = (hovered and self:lighten(Library.CurrentTheme.Tertiary)) or Library.CurrentTheme.Tertiary}
							end
						end)

						pickBtn.MouseButton1Click:connect(function()
							fadeOut()
							icon:tween({ImageColor3 = selectedColor})
							options.Callback(selectedColor)
							task.delay(0.35, function()
								Library._colorPickerExists = false
							end)
						end)
					end

					--show fade in
					holder:tween({BackgroundTransparency = 0, Length = 0.1})
					_holderStroke:tween({Transparency = 0, Length = 0.1})
					pickerArea:tween({BackgroundTransparency = 0, Length = 0.1})
					_pickerAreaStroke:tween({Transparency = 0, Length = 0.1})
					color:tween({BackgroundTransparency = 0, Length = 0.1})
					brightness:tween({BackgroundTransparency = 0, Length = 0.1})
					black:tween({BackgroundTransparency = 0, Length = 0.1})
					_colorPickerDraggableStroke:tween({Transparency = 0, Length = 0.1})
					hueArea:tween({BackgroundTransparency = 0, Length = 0.1})
					_hueAreaStroke:tween({Transparency = 0, Length = 0.1})
					_hueDraggableStroke:tween({Transparency = 0, Length = 0.1})
					label:tween{TextTransparency = 0, Length = 0.1}
					r:tween({
						BackgroundTransparency = 0,
						TextTransparency = 0,
						Length = 0.1
					})
					g:tween({
						BackgroundTransparency = 0,
						TextTransparency = 0,
						Length = 0.1
					})
					b:tween({
						BackgroundTransparency = 0,
						TextTransparency = 0,
						Length = 0.1
					})
					pickBtn:tween({
						BackgroundTransparency = 0,
						ImageTransparency = 0,
						Length = 0.1
					})
					previewLight:tween({BackgroundTransparency = 0, Length = 0.1})
					_previewLightIcon:tween({ImageTransparency = 0, Length = 0.1})
					previewDark:tween({BackgroundTransparency = 0, Length = 0.1})
					_previewDarkIcon:tween({ImageTransparency = 0, Length = 0.1})
					darkener:tween({BackgroundTransparency = 0.5, Length = 0.1})
					-- fade out
					-- closing fade in
					fadeOut = function()
						holder:tween({BackgroundTransparency = 1, Length = 0.1})
						_holderStroke:tween({Transparency = 1, Length = 0.1})
						pickerArea:tween({BackgroundTransparency = 1, Length = 0.1})
						_pickerAreaStroke:tween({Transparency = 1, Length = 0.1})
						color:tween({BackgroundTransparency = 1, Length = 0.1})
						brightness:tween({BackgroundTransparency = 1, Length = 0.1})
						black:tween({BackgroundTransparency = 1, Length = 0.1})
						_colorPickerDraggableStroke:tween({Transparency = 1, Length = 0.1})
						hueArea:tween({BackgroundTransparency = 1, Length = 0.1})
						_hueAreaStroke:tween({Transparency = 1, Length = 0.1})
						_hueDraggableStroke:tween({Transparency = 1, Length = 0.1})
						label:tween{TextTransparency = 1, Length = 0.1}
						r:tween({
							BackgroundTransparency = 1,
							TextTransparency = 1,
							Length = 0.1
						})
						g:tween({
							BackgroundTransparency = 1,
							TextTransparency = 1,
							Length = 0.1
						})
						b:tween({
							BackgroundTransparency = 1,
							TextTransparency = 1,
							Length = 0.1
						})
						pickBtn:tween({
							BackgroundTransparency = 1,
							ImageTransparency = 1,
							Length = 0.1
						})
						previewLight:tween({BackgroundTransparency = 1, Length = 0.1})
						_previewLightIcon:tween({ImageTransparency = 1, Length = 0.1})
						previewDark:tween({BackgroundTransparency = 1, Length = 0.1})
						_previewDarkIcon:tween({ImageTransparency = 1, Length = 0.1})

						darkener:tween({BackgroundTransparency = 1, Length = 0.1}, function()
							task.delay(0.25, function()
								darkener.AbsoluteObject:Destroy()
							end)
						end)
					end
				end
			end
		end)
	end
	self:_resize_tab()
end

function Library:credit(options)
	options = self:set_defaults({
		Name = "Creditor",
		Description = nil
	}, options)
	options.V3rmillion = options.V3rmillion or options.V3rm

	local creditContainer = (self.creditsContainer or self.container):object("Frame", {
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(1, -20, 0, 52)
	}):round(7)

	local name = creditContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.fromOffset(10, (options.Description and 5) or 0),
		Size = (options.Description and UDim2.new(0.5, -10, 0, 22)) or UDim2.new(0.5, -10, 1, 0),
		Text = options.Name,
		TextSize = 22,
		Theme = {TextColor3 = "StrongText"},
		TextXAlignment = Enum.TextXAlignment.Left
	})

	if options.Description then
		local description = creditContainer:object("TextLabel", {
			BackgroundTransparency = 1,
			Position = UDim2.fromOffset(10, 27),
			Size = UDim2.new(0.5, -10, 0, 20),
			Text = options.Description,
			TextSize = 18,
			Theme = {TextColor3 = "WeakText"},
			TextXAlignment = Enum.TextXAlignment.Left
		})
	end
	
	

	if setclipboard then
	
		if options.Github then
			local githubContainer = creditContainer:object("TextButton", {
				AnchorPoint = Vector2.new(1, 1),
				Size = UDim2.fromOffset(24, 24),
				Position = UDim2.new(1, -8, 1, -8),
				Theme = {BackgroundColor3 = {"Main", 10}}
			}):round(5):tooltip("copy github")
			local github = githubContainer:object("ImageLabel", {
				Image = "http://www.roblox.com/asset/?id=11965755499",
				Size = UDim2.new(1, -4, 1, -4),
				Centered = true,
				BackgroundTransparency = 1
			}):round(100)

			githubContainer.MouseButton1Click:connect(function()
				setclipboard(options.Github)
			end)
		end
	
		if options.Discord then
			local discordContainer = creditContainer:object("TextButton", {
				AnchorPoint = Vector2.new(1, 1),
				Size = UDim2.fromOffset(24, 24),
				Position = UDim2.new(1, -8, 1, -8),
				BackgroundColor3 = Color3.fromRGB(88, 101, 242)
			}):round(5):tooltip("copy discord")
			local discord = discordContainer:object("Frame", {
				Size = UDim2.new(1, -6, 1, -6),
				Centered = true,
				BackgroundTransparency = 1
			})

			local tr = discord:object("ImageLabel", {
				BackgroundTransparency = 1,
				AnchorPoint = Vector2.new(1, 0),
				Size = UDim2.new(0.5, 0, 0.5, 0),
				Position = UDim2.new(1, 0, 0, -0),
				ImageColor3 = Color3.fromRGB(255, 255, 255),
				Image = "http://www.roblox.com/asset/?id=8594150191",
				ScaleType = Enum.ScaleType.Crop
			})

			local tl = discord:object("ImageLabel", {
				BackgroundTransparency = 1,
				AnchorPoint = Vector2.new(0, 0),
				Size = UDim2.new(0.5, 0, 0.5, 0),
				Position = UDim2.new(0, 0, 0, -0),
				ImageColor3 = Color3.fromRGB(255, 255, 255),
				Image = "http://www.roblox.com/asset/?id=8594187532",
				ScaleType = Enum.ScaleType.Crop
			})

			local bl = discord:object("ImageLabel", {
				BackgroundTransparency = 1,
				AnchorPoint = Vector2.new(0, 1),
				Size = UDim2.new(0.5, 0, 0.5, 0),
				Position = UDim2.new(0, 0, 1, 0),
				ImageColor3 = Color3.fromRGB(255, 255, 255),
				Image = "http://www.roblox.com/asset/?id=8594194954",
				ScaleType = Enum.ScaleType.Crop
			})

			local br = discord:object("ImageLabel", {
				BackgroundTransparency = 1,
				AnchorPoint = Vector2.new(1, 1),
				Size = UDim2.new(0.5, 0, 0.5, 0),
				Position = UDim2.new(1, 0, 1, 0),
				ImageColor3 = Color3.fromRGB(255, 255, 255),
				Image = "http://www.roblox.com/asset/?id=8594206483",
				ScaleType = Enum.ScaleType.Crop
			})

			discordContainer.MouseButton1Click:connect(function()
				setclipboard(options.Discord)
			end)
		end

		if options.V3rmillion then
			local v3rmillionContainer = creditContainer:object("TextButton", {
				AnchorPoint = Vector2.new(1, 1),
				Size = UDim2.fromOffset(24, 24),
				Position = UDim2.new(1, -40, 1, -8),
				Theme = {BackgroundColor3 = {"Main", 10}}
			}):round(5):tooltip("copy v3rm")
			local v3rmillion = v3rmillionContainer:object("ImageLabel", {
				Image = "http://www.roblox.com/asset/?id=8594086769",
				Size = UDim2.new(1, -4, 1, -4),
				Centered = true,
				BackgroundTransparency = 1
			})

			v3rmillionContainer.MouseButton1Click:connect(function()
				setclipboard(options.V3rmillion)
			end)
		end
	end


	self._resize_tab({
		container = self.creditsContainer or self.container,
		layout = (self.creditsContainer and self.creditsContainer.AbsoluteObject.UIListLayout) or self.layout
	})
end

function Library:_theme_selector()

	local themesCount = 0

	for _ in next, Library.Themes do
		themesCount += 1
	end

	local themeContainer = self.container:object("Frame", {
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(1, -20, 0, 127)
	}):round(7)

	local text = themeContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.fromOffset(10, 5),
		Size = UDim2.new(0.5, -10, 0, 22),
		Text = "Theme",
		TextSize = 22,
		Theme = {TextColor3 = "StrongText"},
		TextXAlignment = Enum.TextXAlignment.Left
	})

	local colorThemesContainer = themeContainer:object("Frame", {
		Size = UDim2.new(1, 0, 1, -32),
		BackgroundTransparency = 1,
		Position = UDim2.new(0.5, 0, 1, -5),
		AnchorPoint = Vector2.new(0.5, 1)
	})

	local grid = colorThemesContainer:object("UIGridLayout", {
		CellPadding = UDim2.fromOffset(10, 10),
		CellSize = UDim2.fromOffset(102, 83),
		VerticalAlignment = Enum.VerticalAlignment.Center
	})

	colorThemesContainer:object("UIPadding", {
		PaddingLeft = UDim.new(0, 10),
		PaddingTop = UDim.new(0, 5)
	})

	for themeName, themeColors in next, Library.Themes do
		local count = 0

		for _, color in next, themeColors do
			if not (type(color) == "boolean") then
				count += 1
			end
		end

		if count >= 5 then
			local theme = colorThemesContainer:object("TextButton", {
				BackgroundTransparency = 1
			})

			local themeColorsContainer = theme:object("Frame", {
				Size = UDim2.new(1, 0, 1, -20),
				BackgroundTransparency = 1
			}):round(5):stroke("WeakText", 1)

			local themeNameLabel = theme:object("TextLabel", {
				BackgroundTransparency = 1,
				Text = themeName,
				TextSize = 16,
				Theme = {TextColor3 = "StrongText"},
				Size = UDim2.new(1, 0, 0, 20),
				Position = UDim2.fromScale(0, 1),
				AnchorPoint = Vector2.new(0, 1)
			})

			local colorMain = themeColorsContainer:object("Frame", {
				Centered = true,
				Size = UDim2.fromScale(1, 1),
				BackgroundColor3 = themeColors.Main
			}):round(4)

			local colorSecondary = colorMain:object("Frame", {
				Centered = true,
				Size = UDim2.new(1, -16, 1, -16),
				BackgroundColor3 = themeColors.Secondary
			}):round(4)

			colorSecondary:object("UIListLayout", {
				Padding = UDim.new(0, 5)
			})

			colorSecondary:object("UIPadding", {
				PaddingTop = UDim.new(0, 5),
				PaddingLeft = UDim.new(0, 5)
			})

			local colorTertiary = colorSecondary:object("Frame", {
				Size = UDim2.new(1, -20, 0, 9),
				BackgroundColor3 = themeColors.Tertiary
			}):round(100)

			local colorStrong = colorSecondary:object("Frame", {
				Size = UDim2.new(1, -30, 0, 9),
				BackgroundColor3 = themeColors.StrongText
			}):round(100)

			local colorTertiary = colorSecondary:object("Frame", {
				Size = UDim2.new(1, -40, 0, 9),
				BackgroundColor3 = themeColors.WeakText
			}):round(100)

			theme.MouseButton1Click:connect(function()
				Library:change_theme(Library.Themes[themeName])
				updateSettings("Theme", themeName)
			end)
		end
	end
	self:_resize_tab()
end


function Library:keybind(options)
	options = self:set_defaults({
		Name = "Keybind",
		Keybind = nil,
		Description = nil,
		Callback = function() end
	}, options)

	local keybindContainer = self.container:object("TextButton", {
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(1, -20, 0, 52)
	}):round(7)

	local text = keybindContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.fromOffset(10, (options.Description and 5) or 0),
		Size = (options.Description and UDim2.new(0.5, -10, 0, 22)) or UDim2.new(0.5, -10, 1, 0),
		Text = options.Name,
		TextSize = 22,
		Theme = {TextColor3 = "StrongText"},
		TextXAlignment = Enum.TextXAlignment.Left
	})

	if options.Description then
		local description = keybindContainer:object("TextLabel", {
			BackgroundTransparency = 1,
			Position = UDim2.fromOffset(10, 27),
			Size = UDim2.new(0.5, -10, 0, 20),
			Text = options.Description,
			TextSize = 18,
			Theme = {TextColor3 = "WeakText"},
			TextXAlignment = Enum.TextXAlignment.Left
		})
	end


	local keybindDisplay = keybindContainer:object("TextLabel", {
		AnchorPoint = Vector2.new(1, 0),
		Theme = {
			BackgroundColor3 = {"Secondary", -20},
			TextColor3 = "WeakText"
		},
		Position = UDim2.new(1, -20,0, 16),
		Size = UDim2.new(0, 50,0, 20),
		TextSize = 12,
		Text = (options.Keybind and tostring(options.Keybind.Name):upper()) or "?"
	}):round(5):stroke("Tertiary")

	keybindDisplay.Size = UDim2.fromOffset(keybindDisplay.TextBounds.X + 20, 20)

	do
		local hovered = false
		local down = false
		local listening = false

		keybindContainer.MouseEnter:connect(function()
			hovered = true
			keybindContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 10)}
		end)

		keybindContainer.MouseLeave:connect(function()
			hovered = false
			if not down then
				keybindContainer:tween{BackgroundColor3 = Library.CurrentTheme.Secondary}
			end
		end)

		keybindContainer.MouseButton1Down:connect(function()
			keybindContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 20)}
		end)

		UserInputService.InputEnded:connect(function(key)
			if key.UserInputType == Enum.UserInputType.MouseButton1 then
				keybindContainer:tween{BackgroundColor3 = (hovered and self:lighten(Library.CurrentTheme.Secondary)) or Library.CurrentTheme.Secondary}
			end
		end)

		UserInputService.InputBegan:Connect(function(key, gameProcessed)
			if listening and not UserInputService:GetFocusedTextBox() then
				if key.UserInputType == Enum.UserInputType.Keyboard then
					if key.KeyCode ~= Enum.KeyCode.Escape then
						options.Keybind = key.KeyCode
					end
					keybindDisplay.Text = (options.Keybind and tostring(options.Keybind.Name):upper()) or "?"
					keybindDisplay:tween{Size = UDim2.fromOffset(keybindDisplay.TextBounds.X + 20, 20), Length = 0.05}
					listening = false
				end
			else
				if key.KeyCode == options.Keybind then
					options.Callback()
				end
			end
		end)

		keybindContainer.MouseButton1Click:connect(function()
			if not listening then listening = true; keybindDisplay.Text = "..." end
		end)
	end
	self:_resize_tab()

	local methods = {}

	function methods:Set(keycode)
		options.Keybind = keycode
		keybindDisplay.Text = (options.Keybind and tostring(options.Keybind.Name):upper()) or "?"
		keybindDisplay:tween{Size = UDim2.fromOffset(keybindDisplay.TextBounds.X + 20, 20), Length = 0.05}
	end

	return methods
end

function Library:prompt(options)
	options = self:set_defaults({
		Followup = false,
		Title = "Prompt",
		Text = "yo momma dead",
		Buttons = {
			ok = function()
				return true
			end
		}
	}, options)

	if Library._promptExists and not options.Followup then return end
	Library._promptExists = true

	local count = 0; for a, _ in next, options.Buttons do
		count += 1
	end

	local darkener = self.core:object("Frame", {
		BackgroundColor3 = Color3.new(0, 0, 0),
		BackgroundTransparency = 1,
		Size = UDim2.fromScale(1, 1)
	}):round(10)

	local promptContainer = darkener:object("Frame", {
		Theme = {BackgroundColor3 = "Main"},
		BackgroundTransparency = 1,
		Centered = true,
		Size = UDim2.fromOffset(200, 120)
	}):round(6)

	local _promptContainerStroke = promptContainer:object("UIStroke", {
		Theme = {Color = "Tertiary"},
		ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
		Transparency = 1
	})

	local _padding = promptContainer:object("UIPadding", {
		PaddingTop = UDim.new(0, 5),
		PaddingLeft = UDim.new(0, 5),
		PaddingBottom = UDim.new(0, 5),
		PaddingRight = UDim.new(0, 5)
	})

	local promptTitle = promptContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Size = UDim2.new(1, 0, 0, 20),
		TextXAlignment = Enum.TextXAlignment.Center,
		Font = Enum.Font.SourceSansBold,
		Text = options.Title,
		Theme = {TextColor3 = {"Tertiary", 15}},
		TextSize = 16,
		TextTransparency = 1
	})

	local promptText = promptContainer:object("TextLabel", {
		AnchorPoint = Vector2.new(0.5, 0),
		BackgroundTransparency = 1,
		Position = UDim2.new(0.5, 0,0, 26),
		Size = UDim2.new(1, -20,1, -60),
		TextSize = 14,
		Theme = {TextColor3 = "StrongText"},

		Text = options.Text,
		TextTransparency = 1,
		TextYAlignment = Enum.TextYAlignment.Top,
		TextXAlignment = Enum.TextXAlignment.Center,
		TextWrapped = true,
		TextTruncate = Enum.TextTruncate.AtEnd
	})

	local buttonHolder = promptContainer:object("Frame", {
		BackgroundTransparency = 1,
		AnchorPoint = Vector2.new(0, 1),
		Position = UDim2.new(0, 0,1, -5),
		Size = UDim2.new(1, 0,0, 20)
	})

	local _gridButtonHolder = buttonHolder:object("UIGridLayout", {
		CellPadding = UDim2.new(0, 10,0, 5),
		CellSize = UDim2.new(1/count, -10, 1, 0),
		FillDirection = Enum.FillDirection.Horizontal,
		HorizontalAlignment = Enum.HorizontalAlignment.Center
	})

	darkener:tween({BackgroundTransparency = 0.4, Length = 0.1})
	promptContainer:tween({BackgroundTransparency = 0, Length = 0.1})
	promptTitle:tween({TextTransparency = 0, Length = 0.1})
	_promptContainerStroke:tween({Transparency = 0, Length = 0.1})
	promptText:tween({TextTransparency = 0, Length = 0.1})

	local _temporaryPromptButtons = {}

	for text, callback in next, options.Buttons do
		local button = buttonHolder:object("TextButton", {
			AnchorPoint = Vector2.new(1, 1),
			Theme = {BackgroundColor3 = "Tertiary"},
			Text = tostring(text):upper(),
			TextSize = 13,
			Font = Enum.Font.SourceSansBold,
			BackgroundTransparency = 1,
			TextTransparency = 1
		}):round(4)

		table.insert(_temporaryPromptButtons, button)

		do
			button:tween({TextTransparency = 0, BackgroundTransparency = 0})

			local hovered = false
			local down = false

			button.MouseEnter:connect(function()
				hovered = true
				button:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Tertiary, 10)}
			end)

			button.MouseLeave:connect(function()
				hovered = false
				if not down then
					button:tween{BackgroundColor3 = Library.CurrentTheme.Tertiary}
				end
			end)

			button.MouseButton1Down:connect(function()
				button:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Tertiary, 20)}
			end)

			UserInputService.InputEnded:connect(function(key)
				if key.UserInputType == Enum.UserInputType.MouseButton1 then
					button:tween{BackgroundColor3 = (hovered and self:lighten(Library.CurrentTheme.Tertiary)) or Library.CurrentTheme.Tertiary}
				end
			end)

			button.MouseButton1Click:connect(function()
				promptContainer:tween({BackgroundTransparency = 1, Length = 0.1})
				promptTitle:tween({TextTransparency = 1, Length = 0.1})
				_promptContainerStroke:tween({Transparency = 1, Length = 0.1})
				promptText:tween({TextTransparency = 1, Length = 0.1})
				for i, b in next, _temporaryPromptButtons do
					b:tween({TextTransparency = 1, BackgroundTransparency = 1, Length = 0.1})
				end
				darkener:tween({BackgroundTransparency = 1, Length = 0.1}, function()
					darkener.AbsoluteObject:Destroy()
					task.delay(0.25, function()
						Library._promptExists = false
					end)
					callback()
				end)
			end)
		end
	end
end

function Library:cp(options)
	return Library.color_picker(self, options)
end
function Library:colorpicker(options)
	return Library.color_picker(self, options)
end

function Library:slider(options)
	options = self:set_defaults({
		Name = "Slider",
		Default = 50,
		Min = 0,
		Max = 100,
		Callback = function() end
	}, options)


	local sliderContainer = self.container:object("TextButton", {
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(1, -20, 0, 56)
	}):round(7)

	local text = sliderContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.fromOffset(10, 5),
		Size = UDim2.new(0.5, -10, 0, 22),
		Text = options.Name,
		TextSize = 22,
		Theme = {TextColor3 = "StrongText"},
		TextXAlignment = Enum.TextXAlignment.Left
	})

	if options.Description then
		local description = sliderContainer:object("TextLabel", {
			BackgroundTransparency = 1,
			Position = UDim2.fromOffset(10, 27),
			Size = UDim2.new(0.5, -10, 0, 20),
			Text = options.Description,
			TextSize = 18,
			Theme = {TextColor3 = "WeakText"},
			TextXAlignment = Enum.TextXAlignment.Left
		})
		sliderContainer.Size = UDim2.new(1, -20, 0, 76)
	end

	local valueText = sliderContainer:object("TextLabel", {
		AnchorPoint = Vector2.new(1, 0),

		Theme = {
			BackgroundColor3 = {"Secondary", -20},
			TextColor3 = "WeakText"
		},
		Position = UDim2.new(1, -10, 0, 10),
		Size = UDim2.new(0, 50,0, 20),
		TextSize = 12,
		Text = options.Default
	}):round(5):stroke("Tertiary")

	valueText.Size = UDim2.fromOffset(valueText.TextBounds.X + 20, 20)

	local sliderBar = sliderContainer:object("Frame", {
		Theme = {BackgroundColor3 = {"Secondary", -20}},
		AnchorPoint = Vector2.new(0.5, 1),
		Size = UDim2.new(1, -20, 0, 5),
		Position = UDim2.new(0.5, 0, 1, -12)
	}):round(100)

	local sliderLine = sliderBar:object("Frame", {
		Size = UDim2.fromScale(((options.Default - options.Min) / (options.Max - options.Min)), 1),
		Theme = {BackgroundColor3 = "Tertiary"}

	}):round(100)

	local sliderBall = sliderLine:object("Frame", {
		AnchorPoint = Vector2.new(0.5, 0.5),
		Position = UDim2.fromScale(1, 0.5),
		Size = UDim2.fromOffset(14, 14),
		Theme = {BackgroundColor3 = {"Tertiary", 20}}
	}):round(100)

	do
		local hovered = false
		local down = false

		sliderContainer.MouseEnter:connect(function()
			hovered = true
			sliderContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 10)}
		end)

		sliderContainer.MouseLeave:connect(function()
			hovered = false
			if not down then
				sliderContainer:tween{BackgroundColor3 = Library.CurrentTheme.Secondary}
			end
		end)

		UserInputService.InputEnded:connect(function(key)
			if key.UserInputType == Enum.UserInputType.MouseButton1 then
				down = false
				sliderContainer:tween{BackgroundColor3 = (hovered and self:lighten(Library.CurrentTheme.Secondary)) or Library.CurrentTheme.Secondary}
			end
		end)

		sliderContainer.MouseButton1Down:connect(function()
			sliderContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 20)}
			down = true
			local tween = valueText:tween{Size = UDim2.fromOffset(valueText.TextBounds.X + 20, 20)}
			while RunService.RenderStepped:wait() and down do
				local percentage = math.clamp((Mouse.X - sliderBar.AbsolutePosition.X) / (sliderBar.AbsoluteSize.X), 0, 1)
				local value = ((options.Max - options.Min) * percentage) + options.Min
				value = math.floor(value)
				valueText.Text = value
				if tween.PlaybackState == Enum.PlaybackState.Completed then
					tween = valueText:tween{Size = UDim2.fromOffset(valueText.TextBounds.X + 20, 20)}
				end
				sliderLine:tween{
					Length = 0.06,
					Size = UDim2.fromScale(percentage, 1)
				}
				options.Callback(value)
			end
		end)
	end
	self:_resize_tab()

	local methods = {}

	function methods:Set(value)
		sliderLine:tween{Size = UDim2.fromScale(((value - options.Min) / (options.Max - options.Min)), 1)}
	end

	return methods
end

function Library:textbox(options)
	options = self:set_defaults({
		Name = "Text Box",
		Placeholder = "Type something..",
		Description = nil,
		Callback = function(t) end
	}, options)

	local textboxContainer = self.container:object("TextButton", {
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(1, -20, 0, 52)
	}):round(7)

	local text = textboxContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.fromOffset(10, (options.Description and 5) or 0),
		Size = (options.Description and UDim2.new(0.5, -10, 0, 22)) or UDim2.new(0.5, -10, 1, 0),
		Text = options.Name,
		TextSize = 22,
		Theme = {TextColor3 = "StrongText"},
		TextXAlignment = Enum.TextXAlignment.Left
	})

	if options.Description then
		local description = textboxContainer:object("TextLabel", {
			BackgroundTransparency = 1,
			Position = UDim2.fromOffset(10, 27),
			Size = UDim2.new(0.5, -10, 0, 20),
			Text = options.Description,
			TextSize = 18,
			Theme = {TextColor3 = "WeakText"},
			TextXAlignment = Enum.TextXAlignment.Left
		})
	end


	local textBox = textboxContainer:object("TextBox", {
		AnchorPoint = Vector2.new(1, 0),
		Theme = {
			BackgroundColor3 = {"Secondary", -20},
			TextColor3 = "WeakText"
		},
		Position = UDim2.new(1, -50,0, 16),
		Size = UDim2.new(0, 50,0, 20),
		TextSize = 12,
		PlaceholderText = options.Placeholder,
		ClipsDescendants = true
	}):round(5):stroke("Tertiary")

	local writeIcon = textboxContainer:object("ImageLabel", {
		Image = "http://www.roblox.com/asset/?id=8569329416",
		AnchorPoint = Vector2.new(1, 0.5),
		BackgroundTransparency = 1,
		Position = UDim2.new(1, -13, 0.5, 0),
		Size = UDim2.new(0, 16, 0, 16),
		Theme = {ImageColor3 = "StrongText"}
	})



	textBox.Size = UDim2.fromOffset(textBox.TextBounds.X + 20, 20)

	do
		local hovered = false
		local down = false
		local focused = false

		textboxContainer.MouseEnter:connect(function()
			textboxContainer:tween{BackgroundColor3 = self:lighten(Library.CurrentTheme.Secondary, 10)}
		end)

		textboxContainer.MouseLeave:connect(function()
			hovered = false
			if not down then
				textboxContainer:tween{BackgroundColor3 = Library.CurrentTheme.Secondary}
			end
		end)

		textBox.Focused:connect(function()
			focused = true
			while focused and RunService.RenderStepped:wait() do
				textBox.AbsoluteObject:TweenSize(
					UDim2.fromOffset(math.clamp(textBox.TextBounds.X + 20, 0, 0.5 * textboxContainer.AbsoluteSize.X), 20),
					Enum.EasingDirection.InOut,
					Enum.EasingStyle.Linear,
					0.1,
					true
				)
			end
		end)

		textBox.FocusLost:connect(function()
			focused = false
			textBox.AbsoluteObject:TweenSize(
				UDim2.fromOffset(math.clamp(textBox.TextBounds.X + 20, 0, 0.5 * textboxContainer.AbsoluteSize.X), 20),
				Enum.EasingDirection.InOut,
				Enum.EasingStyle.Linear,
				0.1,
				true
			)
			options.Callback(textBox.Text)
		end)
	end
	self:_resize_tab()

	local methods = {}

	function methods:Set(text)
		textBox.Text = text
	end

	return methods
end

function Library:label(options)

	options = self:set_defaults({
		Text = "Label title",
		Description = "Label text",
	}, options)

	local labelContainer = self.container:object("TextButton", {
		Theme = {BackgroundColor3 = "Secondary"},
		Size = UDim2.new(1, -20, 0, 52),
		BackgroundTransparency = 1
	}):round(7):stroke("Secondary", 2)

	local text = labelContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.fromOffset(10, 5),
		Size = UDim2.new(0.5, -10, 0, 22),
		Text = options.Text,
		TextSize = 22,
		Theme = {TextColor3 = "StrongText"},
		TextXAlignment = Enum.TextXAlignment.Left
	})

	local description = labelContainer:object("TextLabel", {
		BackgroundTransparency = 1,
		Position = UDim2.new(0, 10, 1, -5),
		Size = UDim2.new(0.5, -10, 1, -22),
		Text = options.Description,
		TextSize = 18,
		AnchorPoint = Vector2.new(0, 1),
		Theme = {TextColor3 = "WeakText"},
		TextXAlignment = Enum.TextXAlignment.Left
	})

	self:_resize_tab()

	local methods = {}

	function methods:SetText(txt)
		text.Text = txt
	end

	function methods:SetDescription(txt)
		description.Text = txt
	end

	return methods
end

return setmetatable(Library, {
	__index = function(_, i)
		return rawget(Library, i:lower())
	end
})
