Not a member of GistPad yet?
Sign Up,
it unlocks many cool features!
- -- Advanced Roblox Luau GUI Library for Executors
- -- Made by Soldo / Discord: Soldo_io
- -- Created with modern animations and comprehensive components
- -- IMPORTANT: DO NOT call GuiLibrary:CreateTab(window, "Settings") in your example script!
- -- The hidden Settings tab is created automatically.
- local GuiLibrary = {}
- local TweenService = game:GetService("TweenService")
- local UserInputService = game:GetService("UserInputService")
- local RunService = game:GetService("RunService")
- local HttpService = game:GetService("HttpService")
- -- Animation settings
- local ANIM_TIME = 0.3
- local EASING_STYLE = Enum.EasingStyle.Quart
- local EASING_DIRECTION = Enum.EasingDirection.Out
- -- Initial Color scheme
- local COLORS = {
- PRIMARY = Color3.fromRGB(45, 45, 55),
- SECONDARY = Color3.fromRGB(35, 35, 45),
- ACCENT = Color3.fromRGB(100, 100, 255),
- SUCCESS = Color3.fromRGB(75, 181, 67),
- WARNING = Color3.fromRGB(255, 193, 7),
- DANGER = Color3.fromRGB(220, 53, 69),
- TEXT = Color3.fromRGB(220, 220, 220),
- TEXT_MUTED = Color3.fromRGB(160, 160, 160),
- BORDER = Color3.fromRGB(60, 60, 70),
- HOVER = Color3.fromRGB(55, 55, 65)
- }
- -- Theme configurations
- local themes = {
- Dark = { PRIMARY = Color3.fromRGB(45, 45, 55), SECONDARY = Color3.fromRGB(35, 35, 45), ACCENT = Color3.fromRGB(100, 100, 255), SUCCESS = Color3.fromRGB(75, 181, 67), WARNING = Color3.fromRGB(255, 193, 7), DANGER = Color3.fromRGB(220, 53, 69), TEXT = Color3.fromRGB(220, 220, 220), TEXT_MUTED = Color3.fromRGB(160, 160, 160), BORDER = Color3.fromRGB(60, 60, 70), HOVER = Color3.fromRGB(55, 55, 65) },
- Light = { PRIMARY = Color3.fromRGB(230, 230, 240), SECONDARY = Color3.fromRGB(245, 245, 250), ACCENT = Color3.fromRGB(50, 100, 200), SUCCESS = Color3.fromRGB(50, 150, 50), WARNING = Color3.fromRGB(200, 150, 0), DANGER = Color3.fromRGB(200, 50, 50), TEXT = Color3.fromRGB(40, 40, 50), TEXT_MUTED = Color3.fromRGB(100, 100, 120), BORDER = Color3.fromRGB(200, 200, 210), HOVER = Color3.fromRGB(220, 220, 230) },
- Midnight = { PRIMARY = Color3.fromRGB(20, 20, 30), SECONDARY = Color3.fromRGB(15, 15, 25), ACCENT = Color3.fromRGB(80, 80, 150), SUCCESS = Color3.fromRGB(60, 150, 60), WARNING = Color3.fromRGB(200, 150, 0), DANGER = Color3.fromRGB(180, 40, 40), TEXT = Color3.fromRGB(200, 200, 210), TEXT_MUTED = Color3.fromRGB(140, 140, 160), BORDER = Color3.fromRGB(40, 40, 50), HOVER = Color3.fromRGB(30, 30, 40) },
- Forest = { PRIMARY = Color3.fromRGB(30, 40, 30), SECONDARY = Color3.fromRGB(25, 35, 25), ACCENT = Color3.fromRGB(50, 120, 50), SUCCESS = Color3.fromRGB(60, 150, 60), WARNING = Color3.fromRGB(150, 120, 0), DANGER = Color3.fromRGB(150, 50, 50), TEXT = Color3.fromRGB(220, 230, 220), TEXT_MUTED = Color3.fromRGB(160, 180, 160), BORDER = Color3.fromRGB(40, 50, 40), HOVER = Color3.fromRGB(35, 45, 35) },
- Ocean = { PRIMARY = Color3.fromRGB(30, 40, 50), SECONDARY = Color3.fromRGB(25, 35, 45), ACCENT = Color3.fromRGB(0, 100, 150), SUCCESS = Color3.fromRGB(50, 150, 100), WARNING = Color3.fromRGB(150, 120, 0), DANGER = Color3.fromRGB(150, 50, 50), TEXT = Color3.fromRGB(220, 230, 240), TEXT_MUTED = Color3.fromRGB(160, 180, 200), BORDER = Color3.fromRGB(40, 50, 60), HOVER = Color3.fromRGB(35, 45, 55) }
- }
- -- Auto Save System
- local AUTO_SAVE_FOLDER = "GuiLibrary_AutoSaves"
- local autoSaveEnabled = false
- local currentPlaceId = tostring(game.PlaceId)
- local function ensureAutoSaveFolder()
- pcall(function() if not isfolder(AUTO_SAVE_FOLDER) then makefolder(AUTO_SAVE_FOLDER) end end)
- end
- local function getAutoSavePath()
- return AUTO_SAVE_FOLDER .. "/" .. currentPlaceId .. ".json"
- end
- print("DEBUG: GuiLibrary loaded - Soldo_io")
- local function createTween(object, properties, time)
- time = time or ANIM_TIME
- local tweenInfo = TweenInfo.new(time, EASING_STYLE, EASING_DIRECTION)
- local tween = TweenService:Create(object, tweenInfo, properties)
- tween:Play()
- return tween
- end
- local function createCorner(parent, radius)
- local corner = Instance.new("UICorner")
- corner.CornerRadius = UDim.new(0, radius or 8)
- corner.Parent = parent
- return corner
- end
- local function createStroke(parent, thickness, color)
- local stroke = Instance.new("UIStroke")
- stroke.Thickness = thickness or 1
- stroke.Color = color or COLORS.BORDER
- stroke.Parent = parent
- return stroke
- end
- local function updateElementColors(window)
- print("DEBUG: updateElementColors called")
- if window.MainFrame then
- createTween(window.MainFrame, {BackgroundColor3 = COLORS.PRIMARY})
- local uiStroke = window.MainFrame:FindFirstChild("UIStroke")
- if uiStroke then createTween(uiStroke, {Color = COLORS.BORDER}) end
- end
- local titleBar = window.MainFrame and window.MainFrame:FindFirstChild("TitleBar")
- if titleBar then
- createTween(titleBar, {BackgroundColor3 = COLORS.SECONDARY})
- local titleLabel = titleBar:FindFirstChild("TitleLabel")
- if titleLabel then createTween(titleLabel, {TextColor3 = COLORS.TEXT}) end
- local fpsLabel = titleBar:FindFirstChild("FPSLabel")
- if fpsLabel then createTween(fpsLabel, {BackgroundColor3 = COLORS.PRIMARY}) end
- local settingsButton = titleBar:FindFirstChild("SettingsButton")
- if settingsButton then createTween(settingsButton, {TextColor3 = COLORS.TEXT}) end
- local closeButton = titleBar:FindFirstChild("CloseButton")
- if closeButton then createTween(closeButton, {TextColor3 = COLORS.DANGER}) end
- end
- for tabName, tab in pairs(window.Tabs or {}) do
- if tab.Button then
- if window.CurrentTab == tabName then
- createTween(tab.Button, {BackgroundColor3 = COLORS.ACCENT, TextColor3 = COLORS.TEXT})
- else
- createTween(tab.Button, {BackgroundColor3 = COLORS.SECONDARY, TextColor3 = COLORS.TEXT_MUTED})
- end
- end
- if tab.Content then createTween(tab.Content, {ScrollBarImageColor3 = COLORS.ACCENT}) end
- for _, element in ipairs(tab.Elements or {}) do
- if element and element:IsA("GuiObject") then
- if element.Name:match("Button") and not element.Name:match("Tab") then
- createTween(element, {BackgroundColor3 = COLORS.ACCENT, TextColor3 = COLORS.TEXT})
- elseif element.Name:match("Toggle") then
- createTween(element, {BackgroundColor3 = COLORS.SECONDARY})
- local tb = element:FindFirstChild("TextButton")
- if tb then
- local ind = tb:FindFirstChild("Frame")
- if ind then
- local isOn = ind.Position.X.Scale > 0.5
- createTween(tb, {BackgroundColor3 = isOn and COLORS.SUCCESS or COLORS.BORDER})
- createTween(ind, {BackgroundColor3 = COLORS.TEXT})
- end
- end
- local lbl = element:FindFirstChildWhichIsA("TextLabel")
- if lbl then createTween(lbl, {TextColor3 = COLORS.TEXT}) end
- elseif element.Name:match("Slider") then
- createTween(element, {BackgroundColor3 = COLORS.SECONDARY})
- local track = element:FindFirstChild("Frame")
- if track then
- createTween(track, {BackgroundColor3 = COLORS.BORDER})
- local fill = track:FindFirstChild("Frame")
- if fill then createTween(fill, {BackgroundColor3 = COLORS.ACCENT}) end
- local handle = track:FindFirstChild("TextButton")
- if handle then createTween(handle, {BackgroundColor3 = COLORS.TEXT}) end
- end
- local lbl = element:FindFirstChild("SliderLabel")
- if lbl then createTween(lbl, {TextColor3 = COLORS.TEXT}) end
- local val = element:FindFirstChild("TextLabel", true)
- if val and val.Name ~= "SliderLabel" then createTween(val, {TextColor3 = COLORS.ACCENT}) end
- elseif element.Name:match("Section") then
- createTween(element, {BackgroundColor3 = COLORS.BORDER})
- local lbl = element:FindFirstChildWhichIsA("TextLabel")
- if lbl then createTween(lbl, {TextColor3 = COLORS.TEXT}) end
- end
- end
- end
- end
- end
- local function createLoader(parent, size)
- local loaderFrame = Instance.new("Frame")
- loaderFrame.Size = UDim2.new(0, size, 0, size)
- loaderFrame.Position = UDim2.new(0.5, -size/2, 0.5, -size/2)
- loaderFrame.BackgroundTransparency = 1
- loaderFrame.Parent = parent
- local dots = {}
- local numDots = 8
- local radius = size * 0.3
- for i = 1, numDots do
- local dot = Instance.new("Frame")
- dot.Size = UDim2.new(0, 10, 0, 10)
- dot.BackgroundColor3 = COLORS.ACCENT
- dot.BorderSizePixel = 0
- dot.Parent = loaderFrame
- createCorner(dot, 5)
- local angle = (i - 1) * (2 * math.pi / numDots)
- dot.Position = UDim2.new(0.5, math.cos(angle) * radius, 0.5, math.sin(angle) * radius)
- table.insert(dots, dot)
- end
- task.spawn(function()
- while loaderFrame.Parent do
- for _, dot in ipairs(dots) do
- createTween(dot, {Size = UDim2.new(0, 14, 0, 14), BackgroundTransparency = 0}, 0.3)
- task.wait(0.1)
- createTween(dot, {Size = UDim2.new(0, 10, 0, 10), BackgroundTransparency = 0.5}, 0.3)
- end
- task.wait(0.2)
- end
- end)
- return loaderFrame
- end
- local function saveConfig(window)
- print("DEBUG: saveConfig called - autoSaveEnabled =", autoSaveEnabled)
- window = window or GuiLibrary.CurrentWindow
- if not window or not window.CurrentSize then
- print("DEBUG: saveConfig skipped - no window or CurrentSize")
- return
- end
- ensureAutoSaveFolder()
- local config = {
- UIScale = window.CurrentSize.X.Offset / 600,
- AnimationsEnabled = (ANIM_TIME > 0.05),
- Components = {}
- }
- for _, tab in pairs(window.Tabs or {}) do
- for _, element in ipairs(tab.Elements or {}) do
- local id = element:GetAttribute("ElementID")
- if not id then continue end
- local data = {Type = nil, Value = nil}
- if element.Name:match("Toggle") then
- local tb = element:FindFirstChild("TextButton")
- local ind = tb and tb:FindFirstChild("Frame")
- if ind then data.Type = "Toggle" data.Value = ind.Position.X.Scale > 0.5 end
- elseif element.Name:match("Slider") then
- local valLabel = element:FindFirstChild("TextLabel", true)
- if valLabel and valLabel.Name ~= "SliderLabel" then data.Type = "Slider" data.Value = tonumber(valLabel.Text) or 0 end
- end
- if data.Type then table.insert(config.Components, {ID = id, Data = data}) end
- end
- end
- pcall(function() writefile(getAutoSavePath(), HttpService:JSONEncode(config)) end)
- print("DEBUG: Config saved successfully to", getAutoSavePath())
- end
- GuiLibrary.SaveConfig = saveConfig
- local function loadConfig(window)
- print("DEBUG: loadConfig called")
- local path = getAutoSavePath()
- if not pcall(isfile, path) or not isfile(path) then print("DEBUG: No save file found") return false end
- local success, config = pcall(function() return HttpService:JSONDecode(readfile(path)) end)
- if not success or not config then print("DEBUG: Failed to decode save file") return false end
- if config.UIScale then
- local newSize = UDim2.new(0, 600 * config.UIScale, 0, 400 * config.UIScale)
- window.CurrentSize = newSize
- createTween(window.MainFrame, {Size = newSize}, 0.25)
- end
- if config.AnimationsEnabled ~= nil then ANIM_TIME = config.AnimationsEnabled and 0.3 or 0.01 end
- for _, entry in ipairs(config.Components or {}) do
- for _, tab in pairs(window.Tabs or {}) do
- for _, element in ipairs(tab.Elements or {}) do
- if element:GetAttribute("ElementID") == entry.ID then
- local d = entry.Data
- if d.Type == "Toggle" and d.Value ~= nil then
- local tb = element:FindFirstChild("TextButton")
- local ind = tb and tb:FindFirstChild("Frame")
- if ind then
- local isOn = d.Value
- tb.BackgroundColor3 = isOn and COLORS.SUCCESS or COLORS.BORDER
- ind.Position = isOn and UDim2.new(1, -18, 0.5, -8) or UDim2.new(0, 2, 0.5, -8)
- end
- elseif d.Type == "Slider" and d.Value then
- local valLabel = element:FindFirstChild("TextLabel", true)
- if valLabel and valLabel.Name ~= "SliderLabel" then valLabel.Text = tostring(d.Value) end
- end
- break
- end
- end
- end
- end
- updateElementColors(window)
- print("DEBUG: Config loaded successfully")
- return true
- end
- -- ==================== COMPONENT FUNCTIONS ====================
- function GuiLibrary:CreateButton(tab, text, callback)
- local button = Instance.new("TextButton")
- button.Name = text .. "Button"
- button.Size = UDim2.new(1, 0, 0, 35)
- button.BackgroundColor3 = COLORS.ACCENT
- button.Text = text
- button.TextColor3 = COLORS.TEXT
- button.TextSize = 12
- button.Font = Enum.Font.Gotham
- button.BorderSizePixel = 0
- button.Parent = tab.Content
- createCorner(button, 6)
- button.MouseButton1Click:Connect(function()
- createTween(button, {Size = UDim2.new(1, -4, 0, 31)})
- task.wait(0.1)
- createTween(button, {Size = UDim2.new(1, 0, 0, 35)})
- if callback then callback() end
- end)
- button.MouseEnter:Connect(function() createTween(button, {BackgroundColor3 = Color3.fromRGB(math.min(COLORS.ACCENT.R*255+20,255),math.min(COLORS.ACCENT.G*255+20,255),math.min(COLORS.ACCENT.B*255+20,255))}) end)
- button.MouseLeave:Connect(function() createTween(button, {BackgroundColor3 = COLORS.ACCENT}) end)
- table.insert(tab.Elements, button)
- return button
- end
- function GuiLibrary:CreateToggle(tab, text, default, callback)
- local toggleFrame = Instance.new("Frame")
- toggleFrame.Name = text .. "Toggle"
- toggleFrame.Size = UDim2.new(1, 0, 0, 35)
- toggleFrame.BackgroundColor3 = COLORS.SECONDARY
- toggleFrame.BorderSizePixel = 0
- toggleFrame.Parent = tab.Content
- createCorner(toggleFrame, 6)
- local toggleLabel = Instance.new("TextLabel")
- toggleLabel.Size = UDim2.new(1, -50, 1, 0)
- toggleLabel.Position = UDim2.new(0, 10, 0, 0)
- toggleLabel.BackgroundTransparency = 1
- toggleLabel.Text = text
- toggleLabel.TextColor3 = COLORS.TEXT
- toggleLabel.TextSize = 12
- toggleLabel.Font = Enum.Font.Gotham
- toggleLabel.TextXAlignment = Enum.TextXAlignment.Left
- toggleLabel.Parent = toggleFrame
- local toggleButton = Instance.new("TextButton")
- toggleButton.Size = UDim2.new(0, 40, 0, 20)
- toggleButton.Position = UDim2.new(1, -45, 0.5, -10)
- toggleButton.BackgroundColor3 = default and COLORS.SUCCESS or COLORS.BORDER
- toggleButton.Text = ""
- toggleButton.BorderSizePixel = 0
- toggleButton.Parent = toggleFrame
- createCorner(toggleButton, 10)
- local toggleIndicator = Instance.new("Frame")
- toggleIndicator.Size = UDim2.new(0, 16, 0, 16)
- toggleIndicator.Position = default and UDim2.new(1, -18, 0.5, -8) or UDim2.new(0, 2, 0.5, -8)
- toggleIndicator.BackgroundColor3 = COLORS.TEXT
- toggleIndicator.BorderSizePixel = 0
- toggleIndicator.Parent = toggleButton
- createCorner(toggleIndicator, 8)
- local isToggled = default or false
- local elementID = (tab.Name or "Tab") .. "_" .. text:gsub("%s+", "_") .. "_Toggle"
- toggleFrame:SetAttribute("ElementID", elementID)
- toggleButton.MouseButton1Click:Connect(function()
- isToggled = not isToggled
- if isToggled then
- createTween(toggleButton, {BackgroundColor3 = COLORS.SUCCESS})
- createTween(toggleIndicator, {Position = UDim2.new(1, -18, 0.5, -8)})
- else
- createTween(toggleButton, {BackgroundColor3 = COLORS.BORDER})
- createTween(toggleIndicator, {Position = UDim2.new(0, 2, 0.5, -8)})
- end
- if callback then callback(isToggled) end
- if GuiLibrary.SaveConfig then GuiLibrary.SaveConfig() end
- end)
- toggleFrame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then createTween(toggleFrame, {BackgroundColor3 = COLORS.HOVER}) end end)
- toggleFrame.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then createTween(toggleFrame, {BackgroundColor3 = COLORS.SECONDARY}) end end)
- table.insert(tab.Elements, toggleFrame)
- return {Frame = toggleFrame, GetValue = function() return isToggled end}
- end
- function GuiLibrary:CreateSlider(tab, text, min, max, default, callback)
- local sliderFrame = Instance.new("Frame")
- sliderFrame.Name = text .. "Slider"
- sliderFrame.Size = UDim2.new(1, 0, 0, 50)
- sliderFrame.BackgroundColor3 = COLORS.SECONDARY
- sliderFrame.BorderSizePixel = 0
- sliderFrame.Parent = tab.Content
- createCorner(sliderFrame, 6)
- local sliderLabel = Instance.new("TextLabel")
- sliderLabel.Name = "SliderLabel"
- sliderLabel.Size = UDim2.new(0.7, 0, 0, 20)
- sliderLabel.Position = UDim2.new(0, 10, 0, 5)
- sliderLabel.BackgroundTransparency = 1
- sliderLabel.Text = text
- sliderLabel.TextColor3 = COLORS.TEXT
- sliderLabel.TextSize = 12
- sliderLabel.Font = Enum.Font.Gotham
- sliderLabel.TextXAlignment = Enum.TextXAlignment.Left
- sliderLabel.Parent = sliderFrame
- local valueLabel = Instance.new("TextLabel")
- valueLabel.Size = UDim2.new(0.3, -10, 0, 20)
- valueLabel.Position = UDim2.new(0.7, 0, 0, 5)
- valueLabel.BackgroundTransparency = 1
- valueLabel.Text = tostring(default or min)
- valueLabel.TextColor3 = COLORS.ACCENT
- valueLabel.TextSize = 12
- valueLabel.Font = Enum.Font.GothamBold
- valueLabel.TextXAlignment = Enum.TextXAlignment.Right
- valueLabel.Parent = sliderFrame
- local sliderTrack = Instance.new("Frame")
- sliderTrack.Size = UDim2.new(1, -20, 0, 4)
- sliderTrack.Position = UDim2.new(0, 10, 1, -15)
- sliderTrack.BackgroundColor3 = COLORS.BORDER
- sliderTrack.BorderSizePixel = 0
- sliderTrack.Parent = sliderFrame
- createCorner(sliderTrack, 2)
- local sliderFill = Instance.new("Frame")
- sliderFill.Size = UDim2.new(0, 0, 1, 0)
- sliderFill.BackgroundColor3 = COLORS.ACCENT
- sliderFill.BorderSizePixel = 0
- sliderFill.Parent = sliderTrack
- createCorner(sliderFill, 2)
- local sliderHandle = Instance.new("TextButton")
- sliderHandle.Size = UDim2.new(0, 16, 0, 16)
- sliderHandle.Position = UDim2.new(0, -8, 0.5, -8)
- sliderHandle.BackgroundColor3 = COLORS.TEXT
- sliderHandle.Text = ""
- sliderHandle.BorderSizePixel = 0
- sliderHandle.Parent = sliderTrack
- createCorner(sliderHandle, 8)
- local currentValue = default or min
- local dragging = false
- local function updateSlider(value)
- currentValue = math.clamp(value, min, max)
- local percentage = (currentValue - min) / (max - min)
- createTween(sliderFill, {Size = UDim2.new(percentage, 0, 1, 0)}, 0.1)
- createTween(sliderHandle, {Position = UDim2.new(percentage, -8, 0.5, -8)}, 0.1)
- valueLabel.Text = string.format("%.1f", currentValue)
- if callback then callback(currentValue) end
- if GuiLibrary.SaveConfig then GuiLibrary.SaveConfig() end
- end
- sliderHandle.MouseButton1Down:Connect(function() dragging = true end)
- UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 and dragging then dragging = false end end)
- UserInputService.InputChanged:Connect(function(input)
- if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
- local mousePos = input.Position.X
- local trackPos = sliderTrack.AbsolutePosition.X
- local trackSize = sliderTrack.AbsoluteSize.X
- local percentage = math.clamp((mousePos - trackPos) / trackSize, 0, 1)
- updateSlider(min + (max - min) * percentage)
- end
- end)
- sliderTrack.InputBegan:Connect(function(input)
- if input.UserInputType == Enum.UserInputType.MouseButton1 then
- local mousePos = input.Position.X
- local trackPos = sliderTrack.AbsolutePosition.X
- local trackSize = sliderTrack.AbsoluteSize.X
- local percentage = math.clamp((mousePos - trackPos) / trackSize, 0, 1)
- updateSlider(min + (max - min) * percentage)
- end
- end)
- sliderFrame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then createTween(sliderFrame, {BackgroundColor3 = COLORS.HOVER}) end end)
- sliderFrame.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then createTween(sliderFrame, {BackgroundColor3 = COLORS.SECONDARY}) end end)
- local elementID = (tab.Name or "Tab") .. "_" .. text:gsub("%s+", "_") .. "_Slider"
- sliderFrame:SetAttribute("ElementID", elementID)
- updateSlider(currentValue)
- table.insert(tab.Elements, sliderFrame)
- return {Frame = sliderFrame, GetValue = function() return currentValue end, SetValue = updateSlider}
- end
- function GuiLibrary:CreateDropdown(tab, text, options, callback)
- local dropdownFrame = Instance.new("Frame")
- dropdownFrame.Name = text .. "Dropdown"
- dropdownFrame.Size = UDim2.new(1, 0, 0, 35)
- dropdownFrame.BackgroundColor3 = COLORS.SECONDARY
- dropdownFrame.BorderSizePixel = 0
- dropdownFrame.Parent = tab.Content
- createCorner(dropdownFrame, 6)
- local dropdownButton = Instance.new("TextButton")
- dropdownButton.Size = UDim2.new(1, -20, 0, 25)
- dropdownButton.Position = UDim2.new(0, 10, 0, 5)
- dropdownButton.BackgroundColor3 = COLORS.PRIMARY
- dropdownButton.Text = text .. ": " .. (options[1] or "None")
- dropdownButton.TextColor3 = COLORS.TEXT
- dropdownButton.TextSize = 12
- dropdownButton.Font = Enum.Font.Gotham
- dropdownButton.BorderSizePixel = 0
- dropdownButton.TextXAlignment = Enum.TextXAlignment.Left
- dropdownButton.ZIndex = 110
- dropdownButton.Parent = dropdownFrame
- createCorner(dropdownButton, 4)
- local dropdownArrow = Instance.new("TextLabel")
- dropdownArrow.Size = UDim2.new(0, 20, 0, 20)
- dropdownArrow.Position = UDim2.new(1, -30, 0, 5)
- dropdownArrow.BackgroundTransparency = 1
- dropdownArrow.Text = "▼"
- dropdownArrow.TextColor3 = COLORS.TEXT_MUTED
- dropdownArrow.TextSize = 10
- dropdownArrow.Font = Enum.Font.Gotham
- dropdownArrow.ZIndex = 110
- dropdownArrow.Parent = dropdownButton
- local dropdownList = Instance.new("ScrollingFrame")
- dropdownList.Name = "DropdownList"
- dropdownList.Size = UDim2.new(1, -20, 0, 0)
- dropdownList.Position = UDim2.new(0, 10, 0, 35)
- dropdownList.BackgroundColor3 = COLORS.PRIMARY
- dropdownList.BorderSizePixel = 0
- dropdownList.Visible = false
- dropdownList.ZIndex = 100
- dropdownList.ScrollBarThickness = 6
- dropdownList.ScrollBarImageColor3 = COLORS.ACCENT
- dropdownList.Parent = dropdownFrame
- createCorner(dropdownList, 4)
- createStroke(dropdownList, 1, COLORS.BORDER)
- local listLayout = Instance.new("UIListLayout")
- listLayout.SortOrder = Enum.SortOrder.LayoutOrder
- listLayout.Parent = dropdownList
- local contentPadding = Instance.new("UIPadding")
- contentPadding.PaddingTop = UDim.new(0, 5)
- contentPadding.PaddingBottom = UDim.new(0, 5)
- contentPadding.Parent = dropdownList
- local currentSelection = options[1] or "None"
- local isOpen = false
- local originalPositions = {}
- local baseY = dropdownFrame.Position.Y.Offset + dropdownFrame.Size.Y.Offset
- for i, element in ipairs(tab.Content:GetChildren()) do
- if element:IsA("GuiObject") and element ~= dropdownFrame and element.Position.Y.Offset >= baseY then
- originalPositions[element] = element.Position
- end
- end
- for i, option in ipairs(options) do
- local optionButton = Instance.new("TextButton")
- optionButton.Size = UDim2.new(1, -10, 0, 25)
- optionButton.BackgroundColor3 = Color3.new(0, 0, 0)
- optionButton.BackgroundTransparency = 1
- optionButton.Text = option
- optionButton.TextColor3 = COLORS.TEXT
- optionButton.TextSize = 11
- optionButton.Font = Enum.Font.Gotham
- optionButton.BorderSizePixel = 0
- optionButton.LayoutOrder = i
- optionButton.ZIndex = 101
- optionButton.Parent = dropdownList
- optionButton.MouseButton1Click:Connect(function()
- currentSelection = option
- dropdownButton.Text = text .. ": " .. option
- isOpen = false
- createTween(dropdownArrow, {Rotation = 0})
- createTween(dropdownList, {Size = UDim2.new(1, -20, 0, 0)})
- for element, pos in pairs(originalPositions) do createTween(element, {Position = pos}) end
- task.wait(ANIM_TIME)
- dropdownList.Visible = false
- dropdownFrame.Size = UDim2.new(1, 0, 0, 35)
- if callback then callback(option) end
- end)
- optionButton.MouseEnter:Connect(function() createTween(optionButton, {BackgroundTransparency = 0.9, TextColor3 = COLORS.TEXT}) end)
- optionButton.MouseLeave:Connect(function() createTween(optionButton, {BackgroundTransparency = 1, TextColor3 = COLORS.TEXT_MUTED}) end)
- end
- dropdownButton.MouseButton1Click:Connect(function()
- isOpen = not isOpen
- if isOpen then
- local dropdownHeight = math.min(#options * 25, 125)
- dropdownFrame.Size = UDim2.new(1, 0, 0, 35 + dropdownHeight)
- dropdownList.Size = UDim2.new(1, -20, 0, 0)
- dropdownList.CanvasSize = UDim2.new(0, 0, 0, #options * 25)
- dropdownList.Visible = true
- createTween(dropdownArrow, {Rotation = 180})
- createTween(dropdownList, {Size = UDim2.new(1, -20, 0, dropdownHeight)})
- local offset = dropdownHeight
- for element, pos in pairs(originalPositions) do
- local newY = pos.Y.Offset + offset
- createTween(element, {Position = UDim2.new(pos.X.Scale, pos.X.Offset, pos.Y.Scale, newY)})
- end
- else
- createTween(dropdownArrow, {Rotation = 0})
- createTween(dropdownList, {Size = UDim2.new(1, -20, 0, 0)})
- for element, pos in pairs(originalPositions) do createTween(element, {Position = pos}) end
- task.wait(ANIM_TIME)
- dropdownList.Visible = false
- dropdownFrame.Size = UDim2.new(1, 0, 0, 35)
- end
- end)
- dropdownButton.MouseEnter:Connect(function() createTween(dropdownButton, {BackgroundColor3 = COLORS.HOVER}) end)
- dropdownButton.MouseLeave:Connect(function() createTween(dropdownButton, {BackgroundColor3 = COLORS.PRIMARY}) end)
- table.insert(tab.Elements, dropdownFrame)
- return {Frame = dropdownFrame, GetValue = function() return currentSelection end}
- end
- function GuiLibrary:CreateLabel(tab, text)
- local label = Instance.new("TextLabel")
- label.Name = text .. "Label"
- label.Size = UDim2.new(1, 0, 0, 25)
- label.BackgroundTransparency = 1
- label.Text = text
- label.TextColor3 = COLORS.TEXT
- label.TextSize = 12
- label.Font = Enum.Font.Gotham
- label.TextXAlignment = Enum.TextXAlignment.Left
- label.Parent = tab.Content
- table.insert(tab.Elements, label)
- return label
- end
- function GuiLibrary:CreateSection(tab, title)
- print("DEBUG: CreateSection called with title:", title)
- local sectionFrame = Instance.new("Frame")
- sectionFrame.Name = title .. "Section"
- sectionFrame.Size = UDim2.new(1, 0, 0, 30)
- sectionFrame.BackgroundColor3 = COLORS.BORDER
- sectionFrame.BorderSizePixel = 0
- sectionFrame.Parent = tab.Content
- createCorner(sectionFrame, 4)
- local sectionLabel = Instance.new("TextLabel")
- sectionLabel.Size = UDim2.new(1, -20, 1, 0)
- sectionLabel.Position = UDim2.new(0, 10, 0, 0)
- sectionLabel.BackgroundTransparency = 1
- sectionLabel.Text = title
- sectionLabel.TextColor3 = COLORS.TEXT
- sectionLabel.TextSize = 13
- sectionLabel.Font = Enum.Font.GothamBold
- sectionLabel.TextXAlignment = Enum.TextXAlignment.Left
- sectionLabel.Parent = sectionFrame
- table.insert(tab.Elements, sectionFrame)
- return sectionFrame
- end
- function GuiLibrary:CreateInput(tab, placeholder, callback)
- local inputFrame = Instance.new("Frame")
- inputFrame.Name = placeholder .. "Input"
- inputFrame.Size = UDim2.new(1, 0, 0, 35)
- inputFrame.BackgroundColor3 = COLORS.SECONDARY
- inputFrame.BorderSizePixel = 0
- inputFrame.Parent = tab.Content
- createCorner(inputFrame, 6)
- local textBox = Instance.new("TextBox")
- textBox.Size = UDim2.new(1, -20, 1, -10)
- textBox.Position = UDim2.new(0, 10, 0, 5)
- textBox.BackgroundColor3 = COLORS.PRIMARY
- textBox.PlaceholderText = placeholder
- textBox.PlaceholderColor3 = COLORS.TEXT_MUTED
- textBox.Text = ""
- textBox.TextColor3 = COLORS.TEXT
- textBox.TextSize = 12
- textBox.Font = Enum.Font.Gotham
- textBox.BorderSizePixel = 0
- textBox.ClearTextOnFocus = false
- textBox.Parent = inputFrame
- createCorner(textBox, 4)
- textBox.FocusLost:Connect(function(enterPressed)
- if callback and enterPressed then callback(textBox.Text) end
- end)
- textBox.Focused:Connect(function() createStroke(textBox, 2, COLORS.ACCENT) end)
- textBox.FocusLost:Connect(function()
- local stroke = textBox:FindFirstChild("UIStroke")
- if stroke then stroke:Destroy() end
- end)
- table.insert(tab.Elements, inputFrame)
- return {Frame = inputFrame, TextBox = textBox, GetValue = function() return textBox.Text end}
- end
- function GuiLibrary:CreateColorPicker(tab, text, defaultColor, callback)
- local colorFrame = Instance.new("Frame")
- colorFrame.Name = text .. "ColorPicker"
- colorFrame.Size = UDim2.new(1, 0, 0, 35)
- colorFrame.BackgroundColor3 = COLORS.SECONDARY
- colorFrame.BorderSizePixel = 0
- colorFrame.Parent = tab.Content
- createCorner(colorFrame, 6)
- local colorLabel = Instance.new("TextLabel")
- colorLabel.Size = UDim2.new(1, -50, 1, 0)
- colorLabel.Position = UDim2.new(0, 10, 0, 0)
- colorLabel.BackgroundTransparency = 1
- colorLabel.Text = text
- colorLabel.TextColor3 = COLORS.TEXT
- colorLabel.TextSize = 12
- colorLabel.Font = Enum.Font.Gotham
- colorLabel.TextXAlignment = Enum.TextXAlignment.Left
- colorLabel.Parent = colorFrame
- local colorDisplay = Instance.new("TextButton")
- colorDisplay.Size = UDim2.new(0, 30, 0, 25)
- colorDisplay.Position = UDim2.new(1, -35, 0.5, -12.5)
- colorDisplay.BackgroundColor3 = defaultColor or Color3.new(1, 1, 1)
- colorDisplay.Text = ""
- colorDisplay.BorderSizePixel = 0
- colorDisplay.Parent = colorFrame
- createCorner(colorDisplay, 6)
- createStroke(colorDisplay, 2, COLORS.BORDER)
- local currentColor = defaultColor or Color3.new(1, 1, 1)
- colorDisplay.MouseButton1Click:Connect(function()
- local colors = {Color3.new(1,0,0), Color3.new(0,1,0), Color3.new(0,0,1), Color3.new(1,1,0), Color3.new(1,0,1), Color3.new(0,1,1), Color3.new(1,1,1), Color3.new(0,0,0)}
- local currentIndex = 1
- for i, color in ipairs(colors) do if currentColor == color then currentIndex = i break end end
- currentIndex = currentIndex % #colors + 1
- currentColor = colors[currentIndex]
- createTween(colorDisplay, {BackgroundColor3 = currentColor})
- if callback then callback(currentColor) end
- end)
- colorDisplay.MouseEnter:Connect(function() createTween(colorDisplay, {Size = UDim2.new(0, 32, 0, 27)}) end)
- colorDisplay.MouseLeave:Connect(function() createTween(colorDisplay, {Size = UDim2.new(0, 30, 0, 25)}) end)
- table.insert(tab.Elements, colorFrame)
- return {Frame = colorFrame, GetValue = function() return currentColor end, SetColor = function(color) currentColor = color; colorDisplay.BackgroundColor3 = color end}
- end
- function GuiLibrary:CreateKeybind(tab, text, defaultKey, callback)
- local keybindFrame = Instance.new("Frame")
- keybindFrame.Name = text .. "Keybind"
- keybindFrame.Size = UDim2.new(1, 0, 0, 35)
- keybindFrame.BackgroundColor3 = COLORS.SECONDARY
- keybindFrame.BorderSizePixel = 0
- keybindFrame.Parent = tab.Content
- createCorner(keybindFrame, 6)
- local keybindLabel = Instance.new("TextLabel")
- keybindLabel.Size = UDim2.new(1, -80, 1, 0)
- keybindLabel.Position = UDim2.new(0, 10, 0, 0)
- keybindLabel.BackgroundTransparency = 1
- keybindLabel.Text = text
- keybindLabel.TextColor3 = COLORS.TEXT
- keybindLabel.TextSize = 12
- keybindLabel.Font = Enum.Font.Gotham
- keybindLabel.TextXAlignment = Enum.TextXAlignment.Left
- keybindLabel.Parent = keybindFrame
- local keybindButton = Instance.new("TextButton")
- keybindButton.Size = UDim2.new(0, 60, 0, 25)
- keybindButton.Position = UDim2.new(1, -65, 0.5, -12.5)
- keybindButton.BackgroundColor3 = COLORS.PRIMARY
- keybindButton.Text = defaultKey and defaultKey.Name or "None"
- keybindButton.TextColor3 = COLORS.TEXT
- keybindButton.TextSize = 10
- keybindButton.Font = Enum.Font.Gotham
- keybindButton.BorderSizePixel = 0
- keybindButton.Parent = keybindFrame
- createCorner(keybindButton, 4)
- local currentKey = defaultKey
- local listening = false
- keybindButton.MouseButton1Click:Connect(function()
- if listening then return end
- listening = true
- keybindButton.Text = "..."
- createTween(keybindButton, {BackgroundColor3 = COLORS.WARNING})
- local connection
- connection = UserInputService.InputBegan:Connect(function(input, gameProcessed)
- if gameProcessed then return end
- if input.UserInputType == Enum.UserInputType.Keyboard then
- currentKey = input.KeyCode
- keybindButton.Text = input.KeyCode.Name
- listening = false
- createTween(keybindButton, {BackgroundColor3 = COLORS.PRIMARY})
- connection:Disconnect()
- end
- end)
- end)
- if currentKey then
- UserInputService.InputBegan:Connect(function(input, gameProcessed)
- if gameProcessed or listening then return end
- if input.KeyCode == currentKey and callback then callback() end
- end)
- end
- table.insert(tab.Elements, keybindFrame)
- return {Frame = keybindFrame, GetKey = function() return currentKey end}
- end
- function GuiLibrary:CreateNotification(title, message, duration, notifType)
- duration = duration or 3
- notifType = notifType or "info"
- local colors = { info = COLORS.ACCENT, success = COLORS.SUCCESS, warning = COLORS.WARNING, error = COLORS.DANGER }
- local notifGui = Instance.new("ScreenGui")
- notifGui.Name = "NotificationGui"
- notifGui.Parent = game.CoreGui
- local notifFrame = Instance.new("Frame")
- notifFrame.Size = UDim2.new(0, 300, 0, 80)
- notifFrame.Position = UDim2.new(1, 0, 0, 50)
- notifFrame.BackgroundColor3 = COLORS.PRIMARY
- notifFrame.BorderSizePixel = 0
- notifFrame.Parent = notifGui
- createCorner(notifFrame, 8)
- createStroke(notifFrame, 2, colors[notifType])
- local titleLabel = Instance.new("TextLabel")
- titleLabel.Size = UDim2.new(1, -20, 0, 25)
- titleLabel.Position = UDim2.new(0, 10, 0, 5)
- titleLabel.BackgroundTransparency = 1
- titleLabel.Text = title
- titleLabel.TextColor3 = colors[notifType]
- titleLabel.TextSize = 14
- titleLabel.Font = Enum.Font.GothamBold
- titleLabel.TextXAlignment = Enum.TextXAlignment.Left
- titleLabel.Parent = notifFrame
- local messageLabel = Instance.new("TextLabel")
- messageLabel.Size = UDim2.new(1, -20, 0, 45)
- messageLabel.Position = UDim2.new(0, 10, 0, 25)
- messageLabel.BackgroundTransparency = 1
- messageLabel.Text = message
- messageLabel.TextColor3 = COLORS.TEXT
- messageLabel.TextSize = 11
- messageLabel.Font = Enum.Font.Gotham
- messageLabel.TextXAlignment = Enum.TextXAlignment.Left
- messageLabel.TextWrapped = true
- messageLabel.Parent = notifFrame
- createTween(notifFrame, {Position = UDim2.new(1, -310, 0, 50)})
- task.wait(duration)
- createTween(notifFrame, {Position = UDim2.new(1, 0, 0, 50)})
- task.wait(ANIM_TIME)
- notifGui:Destroy()
- end
- -- ==================== HIDDEN SETTINGS TAB ====================
- function GuiLibrary:CreateSettingsTab(window)
- print("DEBUG: CreateSettingsTab called - creating hidden settings tab")
- local name = "Settings"
- local tabContent = Instance.new("ScrollingFrame")
- tabContent.Name = name .. "Content"
- tabContent.Size = UDim2.new(1, 0, 1, 0)
- tabContent.BackgroundTransparency = 1
- tabContent.BorderSizePixel = 0
- tabContent.ScrollBarThickness = 6
- tabContent.ScrollBarImageColor3 = COLORS.ACCENT
- tabContent.Visible = false
- tabContent.Parent = window.TabContentContainer
- local contentLayout = Instance.new("UIListLayout")
- contentLayout.SortOrder = Enum.SortOrder.LayoutOrder
- contentLayout.Padding = UDim.new(0, 8)
- contentLayout.Parent = tabContent
- local contentPadding = Instance.new("UIPadding")
- contentPadding.PaddingTop = UDim.new(0, 10)
- contentPadding.PaddingLeft = UDim.new(0, 10)
- contentPadding.PaddingRight = UDim.new(0, 10)
- contentPadding.PaddingBottom = UDim.new(0, 10)
- contentPadding.Parent = tabContent
- local settingsTab = { Button = nil, Content = tabContent, Name = name, Elements = {} }
- window.Tabs[name] = settingsTab
- print("DEBUG: Hidden Settings tab created and added to window.Tabs")
- GuiLibrary:CreateSection(settingsTab, "UI Settings | Library by Soldo_io")
- GuiLibrary:CreateKeybind(settingsTab, "Toggle GUI", Enum.KeyCode.Insert, function() window.Toggle() end)
- GuiLibrary:CreateSlider(settingsTab, "UI Scale", 0.5, 2.0, 1.0, function(value)
- local newSize = UDim2.new(0, 600 * value, 0, 400 * value)
- window.CurrentSize = newSize
- createTween(window.MainFrame, {Size = newSize}, 0.2)
- GuiLibrary.SaveConfig()
- end)
- GuiLibrary:CreateDropdown(settingsTab, "Theme", {"Dark", "Light", "Midnight", "Forest", "Ocean"}, function(theme)
- for key, color in pairs(themes[theme]) do COLORS[key] = color end
- updateElementColors(window)
- GuiLibrary.SaveConfig()
- end)
- GuiLibrary:CreateToggle(settingsTab, "Enable Animations", true, function(state)
- ANIM_TIME = state and 0.3 or 0.01
- GuiLibrary.SaveConfig()
- end)
- GuiLibrary:CreateToggle(settingsTab, "Auto Save Config", false, function(state)
- autoSaveEnabled = state
- if state then
- GuiLibrary.SaveConfig()
- GuiLibrary:CreateNotification("Auto Save", "Enabled - Settings will now save automatically", 3, "success")
- else
- GuiLibrary:CreateNotification("Auto Save", "Disabled", 2, "info")
- end
- end)
- GuiLibrary:CreateSection(settingsTab, "Performance | Library by Soldo_io")
- GuiLibrary:CreateToggle(settingsTab, "Show FPS", false, function(state)
- if state and window.FPSLabel then window.FPSLabel.Visible = true elseif window.FPSLabel then window.FPSLabel.Visible = false end
- end)
- GuiLibrary:CreateButton(settingsTab, "Reset Settings", function()
- GuiLibrary:CreateNotification("Settings", "Settings have been reset to default!", 2, "info")
- for key, color in pairs(themes["Dark"]) do COLORS[key] = color end
- window.MainFrame.Size = UDim2.new(0, 600, 0, 400)
- window.CurrentSize = UDim2.new(0, 600, 0, 400)
- ANIM_TIME = 0.3
- updateElementColors(window)
- GuiLibrary.SaveConfig()
- end)
- print("DEBUG: All settings elements created successfully")
- end
- -- ==================== CreateWindow ====================
- function GuiLibrary:CreateWindow(title, size)
- print("DEBUG: CreateWindow started")
- title = title or "GUI Library"
- size = size or UDim2.new(0, 600, 0, 400)
- local screenGui = Instance.new("ScreenGui")
- screenGui.Name = "GuiLibraryUI"
- screenGui.ResetOnSpawn = false
- screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
- screenGui.Parent = game.CoreGui
- local loader = createLoader(screenGui, 100)
- local mainFrame = Instance.new("Frame")
- mainFrame.Name = "MainFrame"
- mainFrame.Size = UDim2.new(0, 0, 0, 0)
- mainFrame.Position = UDim2.new(0.5, 0, 0.5, 0)
- mainFrame.BackgroundColor3 = COLORS.PRIMARY
- mainFrame.BorderSizePixel = 0
- mainFrame.Active = true
- mainFrame.Draggable = true
- mainFrame.Visible = false
- mainFrame.Parent = screenGui
- createCorner(mainFrame, 12)
- createStroke(mainFrame, 2, COLORS.BORDER)
- local titleBar = Instance.new("Frame")
- titleBar.Name = "TitleBar"
- titleBar.Size = UDim2.new(1, 0, 0, 40)
- titleBar.BackgroundColor3 = COLORS.SECONDARY
- titleBar.BorderSizePixel = 0
- titleBar.Parent = mainFrame
- createCorner(titleBar, 12)
- local titleLabel = Instance.new("TextLabel")
- titleLabel.Name = "TitleLabel"
- titleLabel.Size = UDim2.new(1, -140, 1, 0)
- titleLabel.Position = UDim2.new(0, 10, 0, 0)
- titleLabel.BackgroundTransparency = 1
- titleLabel.Text = title
- titleLabel.TextColor3 = COLORS.TEXT
- titleLabel.TextSize = 16
- titleLabel.Font = Enum.Font.GothamBold
- titleLabel.TextXAlignment = Enum.TextXAlignment.Left
- titleLabel.Parent = titleBar
- local fpsLabel = Instance.new("TextLabel")
- fpsLabel.Name = "FPSLabel"
- fpsLabel.Size = UDim2.new(0, 60, 0, 30)
- fpsLabel.Position = UDim2.new(1, -130, 0, 5)
- fpsLabel.BackgroundColor3 = COLORS.PRIMARY
- fpsLabel.TextColor3 = COLORS.SUCCESS
- fpsLabel.TextSize = 12
- fpsLabel.Font = Enum.Font.GothamBold
- fpsLabel.Text = "FPS: 60"
- fpsLabel.Visible = false
- fpsLabel.Parent = titleBar
- createCorner(fpsLabel, 4)
- local settingsButton = Instance.new("TextButton")
- settingsButton.Name = "SettingsButton"
- settingsButton.Size = UDim2.new(0, 30, 0, 30)
- settingsButton.Position = UDim2.new(1, -70, 0, 5)
- settingsButton.BackgroundTransparency = 1
- settingsButton.Text = "⚙️"
- settingsButton.TextColor3 = COLORS.TEXT
- settingsButton.TextSize = 14
- settingsButton.Font = Enum.Font.GothamBold
- settingsButton.BorderSizePixel = 0
- settingsButton.Parent = titleBar
- createCorner(settingsButton, 6)
- local closeButton = Instance.new("TextButton")
- closeButton.Name = "CloseButton"
- closeButton.Size = UDim2.new(0, 30, 0, 30)
- closeButton.Position = UDim2.new(1, -35, 0, 5)
- closeButton.BackgroundTransparency = 1
- closeButton.Text = "❌"
- closeButton.TextColor3 = COLORS.DANGER
- closeButton.TextSize = 14
- closeButton.Font = Enum.Font.GothamBold
- closeButton.BorderSizePixel = 0
- closeButton.Parent = titleBar
- createCorner(closeButton, 6)
- local contentFrame = Instance.new("Frame")
- contentFrame.Name = "ContentFrame"
- contentFrame.Size = UDim2.new(1, -20, 1, -60)
- contentFrame.Position = UDim2.new(0, 10, 0, 50)
- contentFrame.BackgroundTransparency = 1
- contentFrame.Parent = mainFrame
- local tabsContainer = Instance.new("Frame")
- tabsContainer.Name = "TabsContainer"
- tabsContainer.Size = UDim2.new(1, 0, 0, 35)
- tabsContainer.BackgroundTransparency = 1
- tabsContainer.Parent = contentFrame
- local tabsLayout = Instance.new("UIListLayout")
- tabsLayout.FillDirection = Enum.FillDirection.Horizontal
- tabsLayout.SortOrder = Enum.SortOrder.LayoutOrder
- tabsLayout.Padding = UDim.new(0, 5)
- tabsLayout.Parent = tabsContainer
- local tabContentContainer = Instance.new("Frame")
- tabContentContainer.Name = "TabContentContainer"
- tabContentContainer.Size = UDim2.new(1, 0, 1, -45)
- tabContentContainer.Position = UDim2.new(0, 0, 0, 45)
- tabContentContainer.BackgroundTransparency = 1
- tabContentContainer.Parent = contentFrame
- local window = {
- ScreenGui = screenGui,
- MainFrame = mainFrame,
- ContentFrame = contentFrame,
- TabsContainer = tabsContainer,
- TabContentContainer = tabContentContainer,
- Tabs = {},
- CurrentTab = nil,
- CurrentSize = size,
- FPSLabel = fpsLabel
- }
- GuiLibrary.CurrentWindow = window -- <--- THIS FIXES THE NIL ERROR
- local isVisible = true
- local function hideWindow()
- if not isVisible then return end
- isVisible = false
- window.CurrentSize = mainFrame.Size
- createTween(mainFrame, {Size = UDim2.new(0, window.CurrentSize.X.Offset * 0.8, 0, window.CurrentSize.Y.Offset * 0.8), BackgroundTransparency = 0.7}, ANIM_TIME * 0.5)
- task.wait(ANIM_TIME * 0.5)
- createTween(mainFrame, {Size = UDim2.new(0, 0, 0, 0), Position = UDim2.new(0.5, 0, 0.5, 0), BackgroundTransparency = 1, Rotation = 45}, ANIM_TIME * 0.5)
- task.wait(ANIM_TIME * 0.5)
- mainFrame.Visible = false
- end
- local function showWindow()
- if isVisible then return end
- isVisible = true
- mainFrame.Visible = true
- mainFrame.Size = UDim2.new(0, 0, 0, 0)
- mainFrame.Position = UDim2.new(0.5, 0, 0.5, 0)
- mainFrame.BackgroundTransparency = 1
- mainFrame.Rotation = -45
- createTween(mainFrame, {Size = UDim2.new(0, window.CurrentSize.X.Offset * 0.8, 0, window.CurrentSize.Y.Offset * 0.8), BackgroundTransparency = 0.3, Rotation = 0}, ANIM_TIME * 0.5)
- task.wait(ANIM_TIME * 0.5)
- createTween(mainFrame, {Size = window.CurrentSize, Position = UDim2.new(0.5, -window.CurrentSize.X.Offset/2, 0.5, -window.CurrentSize.Y.Offset/2), BackgroundTransparency = 0}, ANIM_TIME * 0.5)
- end
- settingsButton.MouseButton1Click:Connect(function()
- print("DEBUG: Gear button clicked - opening hidden Settings tab")
- local settingsTab = window.Tabs["Settings"]
- if not settingsTab then print("DEBUG: Settings tab not found!") return end
- if window.CurrentTab and window.Tabs[window.CurrentTab] then
- local current = window.Tabs[window.CurrentTab]
- if current.Button then createTween(current.Button, {BackgroundColor3 = COLORS.SECONDARY, TextColor3 = COLORS.TEXT_MUTED}) end
- current.Content.Visible = false
- end
- window.CurrentTab = "Settings"
- settingsTab.Content.Visible = true
- print("DEBUG: Hidden Settings tab is now visible")
- end)
- settingsButton.MouseEnter:Connect(function() createTween(settingsButton, {TextColor3 = COLORS.HOVER}) end)
- settingsButton.MouseLeave:Connect(function() createTween(settingsButton, {TextColor3 = COLORS.TEXT}) end)
- closeButton.MouseButton1Click:Connect(function()
- createTween(mainFrame, {Size = UDim2.new(0, 0, 0, 0), Position = UDim2.new(0.5, 0, 0.5, 0)})
- task.wait(ANIM_TIME)
- screenGui:Destroy()
- end)
- closeButton.MouseEnter:Connect(function() createTween(closeButton, {TextColor3 = Color3.fromRGB(255, 75, 75)}) end)
- closeButton.MouseLeave:Connect(function() createTween(closeButton, {TextColor3 = COLORS.DANGER}) end)
- task.wait(1.5)
- loader:Destroy()
- mainFrame.Visible = true
- createTween(mainFrame, {Size = size, Position = UDim2.new(0.5, -size.X.Offset/2, 0.5, -size.Y.Offset/2)})
- print("DEBUG: Creating hidden Settings tab now...")
- GuiLibrary:CreateSettingsTab(window)
- task.spawn(function()
- task.wait(0.5)
- loadConfig(window)
- end)
- window.Hide = hideWindow
- window.Show = showWindow
- window.Toggle = function() if isVisible then hideWindow() else showWindow() end end
- updateElementColors(window)
- print("DEBUG: CreateWindow finished - GUI ready")
- return window
- end
- -- Tab System (normal visible tabs)
- function GuiLibrary:CreateTab(window, name)
- local tabButton = Instance.new("TextButton")
- tabButton.Name = name .. "Tab"
- tabButton.Size = UDim2.new(0, 100, 1, 0)
- tabButton.BackgroundColor3 = COLORS.SECONDARY
- tabButton.Text = name
- tabButton.TextColor3 = COLORS.TEXT_MUTED
- tabButton.TextSize = 12
- tabButton.Font = Enum.Font.Gotham
- tabButton.BorderSizePixel = 0
- tabButton.Parent = window.TabsContainer
- createCorner(tabButton, 6)
- local tabContent = Instance.new("ScrollingFrame")
- tabContent.Name = name .. "Content"
- tabContent.Size = UDim2.new(1, 0, 1, 0)
- tabContent.BackgroundTransparency = 1
- tabContent.BorderSizePixel = 0
- tabContent.ScrollBarThickness = 6
- tabContent.ScrollBarImageColor3 = COLORS.ACCENT
- tabContent.Visible = false
- tabContent.Parent = window.TabContentContainer
- local contentLayout = Instance.new("UIListLayout")
- contentLayout.SortOrder = Enum.SortOrder.LayoutOrder
- contentLayout.Padding = UDim.new(0, 8)
- contentLayout.Parent = tabContent
- local contentPadding = Instance.new("UIPadding")
- contentPadding.PaddingTop = UDim.new(0, 10)
- contentPadding.PaddingLeft = UDim.new(0, 10)
- contentPadding.PaddingRight = UDim.new(0, 10)
- contentPadding.PaddingBottom = UDim.new(0, 10)
- contentPadding.Parent = tabContent
- local function updateCanvasSize()
- local totalHeight = contentPadding.PaddingTop.Offset + contentPadding.PaddingBottom.Offset
- for _, child in ipairs(tabContent:GetChildren()) do
- if child:IsA("GuiObject") and child ~= contentLayout and child ~= contentPadding then
- totalHeight = totalHeight + child.Size.Y.Offset + contentLayout.Padding.Offset
- end
- end
- tabContent.CanvasSize = UDim2.new(0, 0, 0, totalHeight)
- end
- contentLayout.Changed:Connect(updateCanvasSize)
- tabContent.ChildAdded:Connect(updateCanvasSize)
- tabContent.ChildRemoved:Connect(updateCanvasSize)
- updateCanvasSize()
- local tab = { Button = tabButton, Content = tabContent, Name = name, Elements = {} }
- window.Tabs[name] = tab
- local function switchTab()
- print("DEBUG: switchTab called - switching to", name)
- if window.CurrentTab == name then return end
- if window.CurrentTab and window.Tabs[window.CurrentTab] then
- local current = window.Tabs[window.CurrentTab]
- if current.Button then
- createTween(current.Button, {BackgroundColor3 = COLORS.SECONDARY, TextColor3 = COLORS.TEXT_MUTED})
- end
- current.Content.Visible = false
- end
- window.CurrentTab = name
- createTween(tabButton, {BackgroundColor3 = COLORS.ACCENT, TextColor3 = COLORS.TEXT})
- tabContent.Visible = true
- print("DEBUG: Switched to tab", name)
- end
- tabButton.MouseButton1Click:Connect(switchTab)
- tabButton.MouseEnter:Connect(function() if window.CurrentTab ~= name then createTween(tabButton, {BackgroundColor3 = COLORS.HOVER}) end end)
- tabButton.MouseLeave:Connect(function() if window.CurrentTab ~= name then createTween(tabButton, {BackgroundColor3 = COLORS.SECONDARY}) end end)
- if not window.CurrentTab then
- window.CurrentTab = name
- createTween(tabButton, {BackgroundColor3 = COLORS.ACCENT, TextColor3 = COLORS.TEXT})
- tabContent.Visible = true
- end
- updateElementColors(window)
- return tab
- end
- return GuiLibrary
RAW Paste Data
Copied
