--[[
╔══════════════════════════════════════════════════════════════════════════════╗
║ NEXUS UI LIBRARY v3.0 ║
║ Ultra-Configurable Roblox GUI Library ║
║ 30+ Components | 15+ Themes | Premium System ║
╚══════════════════════════════════════════════════════════════════════════════╝
--]]
local NexusUI = {}
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local HttpService = game:GetService("HttpService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local TextService = game:GetService("TextService")
local CoreGui = game:GetService("CoreGui")
local Lighting = game:GetService("Lighting")
local LocalPlayer = Players.LocalPlayer
-- ═══════════════════════════════════════════════════════════════════════════════
-- DEFAULT CONFIGURATION (Fully Customizable)
-- ═══════════════════════════════════════════════════════════════════════════════
NexusUI.DefaultConfig = {
-- Window Settings
Title = "Nexus UI",
SubTitle = "v3.0",
Executor = "Unknown Executor",
-- GUI Dimensions
GUIWidth = 400,
GUIHeight = 300,
-- Position
Position = "Center", -- "Center", "TopLeft", "TopRight", "BottomLeft", "BottomRight", or UDim2
-- Features
KeySystem = true,
KeySystemTitle = "🔐 Key Authentication",
KeySystemSubtitle = "Enter your access key to continue",
ShowUserInfo = true,
ShowExecutorInfo = true,
ShowPremiumBadge = true,
Draggable = true,
Minimizable = true,
Closable = true,
Resizable = false,
-- Key Settings
FreeKeys = {"NEXUS-FREE-2024", "NEXUS-STARTER", "FREE-ACCESS"},
PremiumKeys = {"NEXUS-PREMIUM-VIP", "NEXUS-ELITE-2024", "PREMIUM-LIFETIME"},
-- Animation
AnimationSpeed = 0.3,
EasingStyle = Enum.EasingStyle.Quart,
EasingDirection = Enum.EasingDirection.Out,
-- Styling
Theme = "Dark",
CornerRadius = 8,
TabWidth = 100,
TitleBarHeight = 38,
Padding = 10,
Font = Enum.Font.Gotham,
FontBold = Enum.Font.GothamBold,
FontMedium = Enum.Font.GothamMedium,
FontSemiBold = Enum.Font.GothamSemibold,
-- Notification
NotificationDuration = 3,
NotificationPosition = "BottomRight", -- "TopRight", "TopLeft", "BottomRight", "BottomLeft"
-- Premium Features
PremiumFeatures = {
"ThemeCustomizer",
"AdvancedAnimations",
"CloudSave",
"PrioritySupport",
"CustomComponents",
"NoWatermark",
"AutoUpdate",
"MultiInstance",
"ScriptHub",
"DebugMode",
"ResizableWindow",
"CustomFont",
"BlurBackground",
},
-- Callbacks
OnLoad = function() end,
OnClose = function() end,
OnMinimize = function() end,
OnKeyAuthenticated = function(keyType) end,
OnThemeChange = function(themeName) end,
OnError = function(err) warn("[NexusUI] " .. tostring(err)) end,
}
-- ═══════════════════════════════════════════════════════════════════════════════
-- THEME SYSTEM (15+ Themes)
-- ═══════════════════════════════════════════════════════════════════════════════
NexusUI.Themes = {
Dark = {
Background = Color3.fromRGB(22, 22, 28),
Secondary = Color3.fromRGB(32, 32, 40),
Tertiary = Color3.fromRGB(42, 42, 52),
Accent = Color3.fromRGB(88, 101, 242),
AccentHover = Color3.fromRGB(105, 116, 245),
Text = Color3.fromRGB(255, 255, 255),
TextDim = Color3.fromRGB(178, 178, 188),
TextDark = Color3.fromRGB(120, 120, 130),
Border = Color3.fromRGB(50, 50, 60),
Success = Color3.fromRGB(46, 204, 113),
Warning = Color3.fromRGB(241, 196, 15),
Error = Color3.fromRGB(231, 76, 60),
Info = Color3.fromRGB(52, 152, 219),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
Midnight = {
Background = Color3.fromRGB(12, 12, 22),
Secondary = Color3.fromRGB(22, 22, 38),
Tertiary = Color3.fromRGB(32, 32, 52),
Accent = Color3.fromRGB(155, 89, 182),
AccentHover = Color3.fromRGB(175, 122, 197),
Text = Color3.fromRGB(255, 255, 255),
TextDim = Color3.fromRGB(180, 180, 200),
TextDark = Color3.fromRGB(120, 120, 150),
Border = Color3.fromRGB(40, 40, 65),
Success = Color3.fromRGB(46, 204, 113),
Warning = Color3.fromRGB(241, 196, 15),
Error = Color3.fromRGB(231, 76, 60),
Info = Color3.fromRGB(52, 152, 219),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
Ocean = {
Background = Color3.fromRGB(12, 28, 42),
Secondary = Color3.fromRGB(18, 38, 58),
Tertiary = Color3.fromRGB(28, 52, 78),
Accent = Color3.fromRGB(0, 168, 255),
AccentHover = Color3.fromRGB(51, 185, 255),
Text = Color3.fromRGB(255, 255, 255),
TextDim = Color3.fromRGB(180, 200, 220),
TextDark = Color3.fromRGB(100, 130, 160),
Border = Color3.fromRGB(35, 60, 85),
Success = Color3.fromRGB(46, 204, 113),
Warning = Color3.fromRGB(241, 196, 15),
Error = Color3.fromRGB(231, 76, 60),
Info = Color3.fromRGB(52, 152, 219),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
Forest = {
Background = Color3.fromRGB(12, 32, 22),
Secondary = Color3.fromRGB(18, 42, 28),
Tertiary = Color3.fromRGB(28, 58, 38),
Accent = Color3.fromRGB(46, 204, 113),
AccentHover = Color3.fromRGB(88, 214, 141),
Text = Color3.fromRGB(255, 255, 255),
TextDim = Color3.fromRGB(180, 210, 190),
TextDark = Color3.fromRGB(100, 150, 120),
Border = Color3.fromRGB(30, 55, 40),
Success = Color3.fromRGB(46, 204, 113),
Warning = Color3.fromRGB(241, 196, 15),
Error = Color3.fromRGB(231, 76, 60),
Info = Color3.fromRGB(52, 152, 219),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
Crimson = {
Background = Color3.fromRGB(32, 12, 12),
Secondary = Color3.fromRGB(42, 18, 18),
Tertiary = Color3.fromRGB(58, 28, 28),
Accent = Color3.fromRGB(231, 76, 60),
AccentHover = Color3.fromRGB(236, 112, 99),
Text = Color3.fromRGB(255, 255, 255),
TextDim = Color3.fromRGB(210, 180, 180),
TextDark = Color3.fromRGB(150, 100, 100),
Border = Color3.fromRGB(60, 35, 35),
Success = Color3.fromRGB(46, 204, 113),
Warning = Color3.fromRGB(241, 196, 15),
Error = Color3.fromRGB(231, 76, 60),
Info = Color3.fromRGB(52, 152, 219),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
Light = {
Background = Color3.fromRGB(245, 245, 250),
Secondary = Color3.fromRGB(235, 235, 240),
Tertiary = Color3.fromRGB(225, 225, 230),
Accent = Color3.fromRGB(88, 101, 242),
AccentHover = Color3.fromRGB(105, 116, 245),
Text = Color3.fromRGB(30, 30, 35),
TextDim = Color3.fromRGB(80, 80, 90),
TextDark = Color3.fromRGB(130, 130, 140),
Border = Color3.fromRGB(200, 200, 210),
Success = Color3.fromRGB(39, 174, 96),
Warning = Color3.fromRGB(211, 168, 0),
Error = Color3.fromRGB(192, 57, 43),
Info = Color3.fromRGB(41, 128, 185),
Premium = Color3.fromRGB(218, 165, 32),
Free = Color3.fromRGB(120, 120, 130),
},
Cream = {
Background = Color3.fromRGB(250, 245, 235),
Secondary = Color3.fromRGB(240, 235, 225),
Tertiary = Color3.fromRGB(230, 225, 215),
Accent = Color3.fromRGB(210, 105, 30),
AccentHover = Color3.fromRGB(220, 130, 60),
Text = Color3.fromRGB(40, 30, 20),
TextDim = Color3.fromRGB(100, 85, 70),
TextDark = Color3.fromRGB(140, 125, 110),
Border = Color3.fromRGB(210, 200, 185),
Success = Color3.fromRGB(39, 174, 96),
Warning = Color3.fromRGB(211, 168, 0),
Error = Color3.fromRGB(192, 57, 43),
Info = Color3.fromRGB(41, 128, 185),
Premium = Color3.fromRGB(218, 165, 32),
Free = Color3.fromRGB(120, 120, 130),
},
Cyberpunk = {
Background = Color3.fromRGB(8, 8, 18),
Secondary = Color3.fromRGB(18, 8, 28),
Tertiary = Color3.fromRGB(28, 12, 42),
Accent = Color3.fromRGB(255, 0, 128),
AccentHover = Color3.fromRGB(255, 51, 153),
Text = Color3.fromRGB(255, 255, 255),
TextDim = Color3.fromRGB(255, 180, 220),
TextDark = Color3.fromRGB(180, 100, 150),
Border = Color3.fromRGB(50, 20, 60),
Success = Color3.fromRGB(0, 255, 128),
Warning = Color3.fromRGB(255, 255, 0),
Error = Color3.fromRGB(255, 0, 0),
Info = Color3.fromRGB(0, 255, 255),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
Sunset = {
Background = Color3.fromRGB(28, 18, 22),
Secondary = Color3.fromRGB(42, 28, 32),
Tertiary = Color3.fromRGB(58, 38, 42),
Accent = Color3.fromRGB(255, 107, 107),
AccentHover = Color3.fromRGB(255, 140, 140),
Text = Color3.fromRGB(255, 255, 255),
TextDim = Color3.fromRGB(255, 200, 200),
TextDark = Color3.fromRGB(180, 130, 130),
Border = Color3.fromRGB(70, 45, 50),
Success = Color3.fromRGB(46, 204, 113),
Warning = Color3.fromRGB(241, 196, 15),
Error = Color3.fromRGB(231, 76, 60),
Info = Color3.fromRGB(52, 152, 219),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
Aurora = {
Background = Color3.fromRGB(12, 18, 28),
Secondary = Color3.fromRGB(18, 28, 42),
Tertiary = Color3.fromRGB(28, 42, 62),
Accent = Color3.fromRGB(0, 255, 170),
AccentHover = Color3.fromRGB(51, 255, 187),
Text = Color3.fromRGB(255, 255, 255),
TextDim = Color3.fromRGB(180, 220, 210),
TextDark = Color3.fromRGB(100, 150, 140),
Border = Color3.fromRGB(35, 50, 70),
Success = Color3.fromRGB(46, 204, 113),
Warning = Color3.fromRGB(241, 196, 15),
Error = Color3.fromRGB(231, 76, 60),
Info = Color3.fromRGB(52, 152, 219),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
Matrix = {
Background = Color3.fromRGB(4, 8, 4),
Secondary = Color3.fromRGB(6, 12, 6),
Tertiary = Color3.fromRGB(10, 20, 10),
Accent = Color3.fromRGB(0, 255, 65),
AccentHover = Color3.fromRGB(51, 255, 102),
Text = Color3.fromRGB(0, 255, 65),
TextDim = Color3.fromRGB(0, 200, 50),
TextDark = Color3.fromRGB(0, 150, 40),
Border = Color3.fromRGB(12, 24, 12),
Success = Color3.fromRGB(0, 255, 65),
Warning = Color3.fromRGB(255, 255, 0),
Error = Color3.fromRGB(255, 0, 0),
Info = Color3.fromRGB(0, 255, 255),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
Neon = {
Background = Color3.fromRGB(8, 8, 14),
Secondary = Color3.fromRGB(14, 14, 24),
Tertiary = Color3.fromRGB(24, 24, 40),
Accent = Color3.fromRGB(255, 0, 255),
AccentHover = Color3.fromRGB(255, 51, 255),
Text = Color3.fromRGB(255, 255, 255),
TextDim = Color3.fromRGB(255, 180, 255),
TextDark = Color3.fromRGB(180, 100, 180),
Border = Color3.fromRGB(40, 20, 40),
Success = Color3.fromRGB(0, 255, 128),
Warning = Color3.fromRGB(255, 255, 0),
Error = Color3.fromRGB(255, 0, 0),
Info = Color3.fromRGB(0, 255, 255),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
Pastel = {
Background = Color3.fromRGB(250, 248, 255),
Secondary = Color3.fromRGB(240, 238, 250),
Tertiary = Color3.fromRGB(230, 228, 245),
Accent = Color3.fromRGB(179, 136, 255),
AccentHover = Color3.fromRGB(200, 160, 255),
Text = Color3.fromRGB(60, 50, 80),
TextDim = Color3.fromRGB(100, 90, 120),
TextDark = Color3.fromRGB(140, 130, 160),
Border = Color3.fromRGB(210, 205, 225),
Success = Color3.fromRGB(129, 199, 132),
Warning = Color3.fromRGB(255, 213, 79),
Error = Color3.fromRGB(239, 83, 80),
Info = Color3.fromRGB(100, 181, 246),
Premium = Color3.fromRGB(218, 165, 32),
Free = Color3.fromRGB(120, 120, 130),
},
Gold = {
Background = Color3.fromRGB(22, 20, 12),
Secondary = Color3.fromRGB(38, 32, 18),
Tertiary = Color3.fromRGB(52, 44, 26),
Accent = Color3.fromRGB(255, 215, 0),
AccentHover = Color3.fromRGB(255, 223, 51),
Text = Color3.fromRGB(255, 255, 255),
TextDim = Color3.fromRGB(230, 210, 170),
TextDark = Color3.fromRGB(180, 160, 120),
Border = Color3.fromRGB(58, 50, 32),
Success = Color3.fromRGB(46, 204, 113),
Warning = Color3.fromRGB(241, 196, 15),
Error = Color3.fromRGB(231, 76, 60),
Info = Color3.fromRGB(52, 152, 219),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
Rose = {
Background = Color3.fromRGB(28, 18, 20),
Secondary = Color3.fromRGB(42, 28, 30),
Tertiary = Color3.fromRGB(58, 38, 42),
Accent = Color3.fromRGB(255, 105, 180),
AccentHover = Color3.fromRGB(255, 140, 200),
Text = Color3.fromRGB(255, 255, 255),
TextDim = Color3.fromRGB(255, 200, 220),
TextDark = Color3.fromRGB(180, 120, 140),
Border = Color3.fromRGB(70, 45, 52),
Success = Color3.fromRGB(46, 204, 113),
Warning = Color3.fromRGB(241, 196, 15),
Error = Color3.fromRGB(231, 76, 60),
Info = Color3.fromRGB(52, 152, 219),
Premium = Color3.fromRGB(255, 215, 0),
Free = Color3.fromRGB(149, 165, 166),
},
}
-- ═══════════════════════════════════════════════════════════════════════════════
-- UTILITY FUNCTIONS
-- ═══════════════════════════════════════════════════════════════════════════════
local function SafeCall(func, ...)
if type(func) ~= "function" then return nil end
local success, result = pcall(func, ...)
if not success then
warn("[NexusUI] Error: " .. tostring(result))
return nil
end
return result
end
local function Create(className, properties)
local success, instance = pcall(Instance.new, className)
if not success or not instance then return nil end
for prop, value in pairs(properties or {}) do
pcall(function()
instance[prop] = value
end)
end
return instance
end
local function Tween(instance, properties, duration, easingStyle, easingDirection, callback)
if not instance or not instance.Parent then return nil end
duration = duration or NexusUI.DefaultConfig.AnimationSpeed
easingStyle = easingStyle or NexusUI.DefaultConfig.EasingStyle
easingDirection = easingDirection or NexusUI.DefaultConfig.EasingDirection
local success, tweenInfo = pcall(function()
return TweenInfo.new(duration, easingStyle, easingDirection)
end)
if not success then return nil end
local success2, tween = pcall(function()
return TweenService:Create(instance, tweenInfo, properties)
end)
if not success2 or not tween then return nil end
if callback then
tween.Completed:Connect(function()
SafeCall(callback)
end)
end
tween:Play()
return tween
end
local function RoundNumber(num, decimals)
decimals = decimals or 2
local mult = 10 ^ decimals
return math.floor(num * mult + 0.5) / mult
end
local function FormatNumber(num)
if num >= 1000000 then
return string.format("%.1fM", num / 1000000)
elseif num >= 1000 then
return string.format("%.1fK", num / 1000)
else
return tostring(num)
end
end
-- ═══════════════════════════════════════════════════════════════════════════════
-- KEY SYSTEM
-- ═══════════════════════════════════════════════════════════════════════════════
NexusUI.KeySystem = {
IsAuthenticated = false,
KeyType = "Free",
ValidKeys = {},
Validate = function(self, key, config)
config = config or NexusUI.DefaultConfig
for _, validKey in ipairs(config.FreeKeys or {}) do
if key == validKey then
self.IsAuthenticated = true
self.KeyType = "Free"
return true, "Free"
end
end
for _, validKey in ipairs(config.PremiumKeys or {}) do
if key == validKey then
self.IsAuthenticated = true
self.KeyType = "Premium"
return true, "Premium"
end
end
return false, nil
end,
IsPremium = function(self)
return self.KeyType == "Premium"
end,
HasFeature = function(self, feature, config)
if self.KeyType == "Premium" then return true end
config = config or NexusUI.DefaultConfig
for _, f in ipairs(config.PremiumFeatures or {}) do
if f == feature then return false end
end
return true
end,
}
-- ═══════════════════════════════════════════════════════════════════════════════
-- MAIN WINDOW CREATION
-- ═══════════════════════════════════════════════════════════════════════════════
function NexusUI:CreateWindow(userConfig)
userConfig = userConfig or {}
-- Merge configs
local Config = {}
for k, v in pairs(self.DefaultConfig) do
Config[k] = v
end
for k, v in pairs(userConfig) do
Config[k] = v
end
local theme = self.Themes[Config.Theme] or self.Themes.Dark
local currentTheme = theme
-- Parent (support for different executors)
local parentGui
pcall(function()
parentGui = CoreGui
end)
if not parentGui then
pcall(function()
parentGui = LocalPlayer:WaitForChild("PlayerGui")
end)
end
if not parentGui then
parentGui = game:GetService("StarterGui")
end
-- ScreenGui
local ScreenGui = Create("ScreenGui", {
Name = "NexusUI_" .. (pcall(function() return HttpService:GenerateGUID(false) end) and HttpService:GenerateGUID(false) or "GUI"),
Parent = parentGui,
ResetOnSpawn = false,
ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
})
if not ScreenGui then return nil end
-- Calculate position
local guiPos
if typeof(Config.Position) == "UDim2" then
guiPos = Config.Position
elseif Config.Position == "TopLeft" then
guiPos = UDim2.new(0, 20, 0, 20)
elseif Config.Position == "TopRight" then
guiPos = UDim2.new(1, -Config.GUIWidth - 20, 0, 20)
elseif Config.Position == "BottomLeft" then
guiPos = UDim2.new(0, 20, 1, -Config.GUIHeight - 20)
elseif Config.Position == "BottomRight" then
guiPos = UDim2.new(1, -Config.GUIWidth - 20, 1, -Config.GUIHeight - 20)
else
guiPos = UDim2.new(0.5, -Config.GUIWidth/2, 0.5, -Config.GUIHeight/2)
end
-- Main Frame
local MainFrame = Create("Frame", {
Name = "MainFrame",
Size = UDim2.new(0, Config.GUIWidth, 0, Config.GUIHeight),
Position = guiPos,
BackgroundColor3 = currentTheme.Background,
BorderSizePixel = 0,
Parent = ScreenGui,
ClipsDescendants = true,
})
if not MainFrame then return nil end
-- Corner
local Corner = Create("UICorner", {
CornerRadius = UDim.new(0, Config.CornerRadius),
Parent = MainFrame,
})
-- Shadow
local Shadow = Create("ImageLabel", {
Name = "Shadow",
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.new(0.5, 0, 0.5, 4),
Size = UDim2.new(1, 24, 1, 24),
BackgroundTransparency = 1,
Image = "rbxassetid://1316045217",
ImageColor3 = Color3.fromRGB(0, 0, 0),
ImageTransparency = 0.6,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(10, 10, 118, 118),
ZIndex = -1,
Parent = MainFrame,
})
-- Title Bar
local TitleBar = Create("Frame", {
Name = "TitleBar",
Size = UDim2.new(1, 0, 0, Config.TitleBarHeight),
BackgroundColor3 = currentTheme.Secondary,
BorderSizePixel = 0,
Parent = MainFrame,
})
local TitleBarCorner = Create("UICorner", {
CornerRadius = UDim.new(0, Config.CornerRadius),
Parent = TitleBar,
})
local TitleBarFix = Create("Frame", {
Size = UDim2.new(1, 0, 0, 10),
Position = UDim2.new(0, 0, 1, -10),
BackgroundColor3 = currentTheme.Secondary,
BorderSizePixel = 0,
Parent = TitleBar,
})
-- Title Text
local TitleText = Create("TextLabel", {
Name = "Title",
Size = UDim2.new(0, 150, 0, 18),
Position = UDim2.new(0, 10, 0, 4),
BackgroundTransparency = 1,
Text = Config.Title,
TextColor3 = currentTheme.Text,
TextSize = 14,
Font = Config.FontBold,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = TitleBar,
})
-- Subtitle
local SubTitleText
if Config.SubTitle and Config.SubTitle ~= "" then
SubTitleText = Create("TextLabel", {
Name = "SubTitle",
Size = UDim2.new(0, 150, 0, 12),
Position = UDim2.new(0, 10, 0, 22),
BackgroundTransparency = 1,
Text = Config.SubTitle,
TextColor3 = currentTheme.TextDark,
TextSize = 9,
Font = Config.Font,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = TitleBar,
})
end
-- Executor Info
local ExecutorInfo
if Config.ShowExecutorInfo then
ExecutorInfo = Create("TextLabel", {
Name = "ExecutorInfo",
Size = UDim2.new(0, 100, 0, 12),
Position = UDim2.new(0, 10, 0, Config.SubTitle ~= "" and 34 or 22),
BackgroundTransparency = 1,
Text = Config.Executor,
TextColor3 = currentTheme.TextDark,
TextSize = 8,
Font = Config.Font,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = TitleBar,
})
end
-- Premium/Free Badge (beside title)
local KeyBadge
if Config.ShowPremiumBadge then
KeyBadge = Create("Frame", {
Name = "KeyBadge",
Size = UDim2.new(0, 60, 0, 16),
Position = UDim2.new(0, 10 + (TitleText and TitleText.TextBounds.X or 0) + 6, 0, 6),
BackgroundColor3 = currentTheme.Free,
BorderSizePixel = 0,
Parent = TitleBar,
})
local KeyBadgeCorner = Create("UICorner", {
CornerRadius = UDim.new(0, 4),
Parent = KeyBadge,
})
local KeyBadgeText = Create("TextLabel", {
Name = "Text",
Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1,
Text = "FREE",
TextColor3 = Color3.fromRGB(255, 255, 255),
TextSize = 8,
Font = Config.FontBold,
Parent = KeyBadge,
})
-- Update badge position when title changes
local function UpdateBadgePosition()
pcall(function()
KeyBadge.Position = UDim2.new(0, 10 + TitleText.TextBounds.X + 6, 0, 6)
end)
end
task.delay(0.1, UpdateBadgePosition)
end
-- User Info Container
local UserContainer
if Config.ShowUserInfo then
UserContainer = Create("Frame", {
Name = "UserContainer",
Size = UDim2.new(0, 120, 1, 0),
Position = UDim2.new(1, -125, 0, 0),
BackgroundTransparency = 1,
Parent = TitleBar,
})
-- Avatar
local Avatar = Create("ImageLabel", {
Name = "Avatar",
Size = UDim2.new(0, 24, 0, 24),
Position = UDim2.new(0, 0, 0.5, -12),
BackgroundColor3 = currentTheme.Tertiary,
Image = "",
BorderSizePixel = 0,
Parent = UserContainer,
})
local AvatarCorner = Create("UICorner", {
CornerRadius = UDim.new(1, 0),
Parent = Avatar,
})
pcall(function()
local userId = LocalPlayer and LocalPlayer.UserId or 0
Avatar.Image = "https://www.roblox.com/headshot-thumbnail/image?userId=" .. userId .. "&width=150&height=150&format=png"
end)
-- Username
local Username = Create("TextLabel", {
Name = "Username",
Size = UDim2.new(0, 90, 0, 14),
Position = UDim2.new(0, 28, 0, 4),
BackgroundTransparency = 1,
Text = LocalPlayer and LocalPlayer.Name or "Guest",
TextColor3 = currentTheme.Text,
TextSize = 11,
Font = Config.FontMedium,
TextXAlignment = Enum.TextXAlignment.Left,
TextTruncate = Enum.TextTruncate.AtEnd,
Parent = UserContainer,
})
-- Key Type Label
local KeyTypeLabel = Create("TextLabel", {
Name = "KeyType",
Size = UDim2.new(0, 50, 0, 12),
Position = UDim2.new(0, 28, 0, 20),
BackgroundTransparency = 1,
Text = "Free",
TextColor3 = currentTheme.Free,
TextSize = 9,
Font = Config.FontBold,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = UserContainer,
})
end
-- Window Controls
local CloseButton, MinimizeButton
if Config.Closable then
CloseButton = Create("TextButton", {
Name = "Close",
Size = UDim2.new(0, 26, 0, 26),
Position = UDim2.new(1, -30, 0, 6),
BackgroundColor3 = currentTheme.Error,
Text = "×",
TextColor3 = Color3.fromRGB(255, 255, 255),
TextSize = 16,
Font = Config.FontBold,
Parent = TitleBar,
})
local CloseCorner = Create("UICorner", {
CornerRadius = UDim.new(0, 6),
Parent = CloseButton,
})
end
if Config.Minimizable then
MinimizeButton = Create("TextButton", {
Name = "Minimize",
Size = UDim2.new(0, 26, 0, 26),
Position = UDim2.new(1, Config.Closable and -60 or -30, 0, 6),
BackgroundColor3 = currentTheme.Warning,
Text = "−",
TextColor3 = Color3.fromRGB(255, 255, 255),
TextSize = 16,
Font = Config.FontBold,
Parent = TitleBar,
})
local MinimizeCorner = Create("UICorner", {
CornerRadius = UDim.new(0, 6),
Parent = MinimizeButton,
})
end
-- Tab Container
local TabContainer = Create("Frame", {
Name = "TabContainer",
Size = UDim2.new(0, Config.TabWidth, 1, -Config.TitleBarHeight),
Position = UDim2.new(0, 0, 0, Config.TitleBarHeight),
BackgroundColor3 = currentTheme.Secondary,
BorderSizePixel = 0,
Parent = MainFrame,
})
local TabList = Create("ScrollingFrame", {
Name = "TabList",
Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1,
ScrollBarThickness = 2,
ScrollBarImageColor3 = currentTheme.Accent,
CanvasSize = UDim2.new(0, 0, 0, 0),
AutomaticCanvasSize = Enum.AutomaticSize.Y,
Parent = TabContainer,
})
local TabListLayout = Create("UIListLayout", {
Padding = UDim.new(0, 4),
HorizontalAlignment = Enum.HorizontalAlignment.Center,
Parent = TabList,
})
local TabListPadding = Create("UIPadding", {
PaddingTop = UDim.new(0, 8),
PaddingBottom = UDim.new(0, 8),
PaddingLeft = UDim.new(0, 6),
PaddingRight = UDim.new(0, 6),
Parent = TabList,
})
-- Content Container
local ContentContainer = Create("Frame", {
Name = "ContentContainer",
Size = UDim2.new(1, -Config.TabWidth, 1, -Config.TitleBarHeight),
Position = UDim2.new(0, Config.TabWidth, 0, Config.TitleBarHeight),
BackgroundColor3 = currentTheme.Background,
BorderSizePixel = 0,
Parent = MainFrame,
})
local ContentScroll = Create("ScrollingFrame", {
Name = "ContentScroll",
Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1,
ScrollBarThickness = 3,
ScrollBarImageColor3 = currentTheme.Accent,
CanvasSize = UDim2.new(0, 0, 0, 0),
AutomaticCanvasSize = Enum.AutomaticSize.Y,
Parent = ContentContainer,
})
local ContentLayout = Create("UIListLayout", {
Padding = UDim.new(0, 8),
HorizontalAlignment = Enum.HorizontalAlignment.Center,
Parent = ContentScroll,
})
local ContentPadding = Create("UIPadding", {
PaddingTop = UDim.new(0, 10),
PaddingBottom = UDim.new(0, 10),
PaddingLeft = UDim.new(0, 10),
PaddingRight = UDim.new(0, 10),
Parent = ContentScroll,
})
-- Draggable functionality
if Config.Draggable then
local dragging = false
local dragStart = nil
local startPos = nil
TitleBar.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = MainFrame.Position
end
end)
UserInputService.InputChanged:Connect(function(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - dragStart
MainFrame.Position = UDim2.new(
startPos.X.Scale, startPos.X.Offset + delta.X,
startPos.Y.Scale, startPos.Y.Offset + delta.Y
)
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = false
end
end)
end
-- Window Object
local Window = {
Config = Config,
ScreenGui = ScreenGui,
MainFrame = MainFrame,
Theme = currentTheme,
Tabs = {},
CurrentTab = nil,
IsMinimized = false,
IsDestroyed = false,
Elements = {},
Notifications = {},
}
-- Close functionality
if CloseButton then
CloseButton.MouseButton1Click:Connect(function()
SafeCall(Config.OnClose)
Tween(MainFrame, {Size = UDim2.new(0, 0, 0, 0)}, 0.2, nil, nil, function()
Window.IsDestroyed = true
ScreenGui:Destroy()
end)
end)
end
-- Minimize functionality
if MinimizeButton then
MinimizeButton.MouseButton1Click:Connect(function()
Window.IsMinimized = not Window.IsMinimized
SafeCall(Config.OnMinimize, Window.IsMinimized)
if Window.IsMinimized then
Tween(MainFrame, {Size = UDim2.new(0, Config.GUIWidth, 0, Config.TitleBarHeight)}, 0.3)
MinimizeButton.Text = "+"
else
Tween(MainFrame, {Size = UDim2.new(0, Config.GUIWidth, 0, Config.GUIHeight)}, 0.3)
MinimizeButton.Text = "−"
end
end)
end
-- ═══════════════════════════════════════════════════════════════════════════════
-- THEME MANAGEMENT
-- ═══════════════════════════════════════════════════════════════════════════════
function Window:SetTheme(themeName)
local newTheme = NexusUI.Themes[themeName]
if not newTheme then return end
self.Theme = newTheme
currentTheme = newTheme
Config.Theme = themeName
-- Update main elements
MainFrame.BackgroundColor3 = newTheme.Background
TitleBar.BackgroundColor3 = newTheme.Secondary
TitleBarFix.BackgroundColor3 = newTheme.Secondary
TabContainer.BackgroundColor3 = newTheme.Secondary
ContentContainer.BackgroundColor3 = newTheme.Background
TitleText.TextColor3 = newTheme.Text
if SubTitleText then SubTitleText.TextColor3 = newTheme.TextDark end
if ExecutorInfo then ExecutorInfo.TextColor3 = newTheme.TextDark end
TabList.ScrollBarImageColor3 = newTheme.Accent
ContentScroll.ScrollBarImageColor3 = newTheme.Accent
if UserContainer then
local avatar = UserContainer:FindFirstChild("Avatar")
if avatar then avatar.BackgroundColor3 = newTheme.Tertiary end
local username = UserContainer:FindFirstChild("Username")
if username then username.TextColor3 = newTheme.Text end
local keyType = UserContainer:FindFirstChild("KeyType")
if keyType then
keyType.TextColor3 = NexusUI.KeySystem:IsPremium() and newTheme.Premium or newTheme.Free
end
end
-- Update badge
if KeyBadge then
KeyBadge.BackgroundColor3 = NexusUI.KeySystem:IsPremium() and newTheme.Premium or newTheme.Free
end
-- Update all tabs and elements
for _, tab in pairs(self.Tabs) do
if tab.UpdateTheme then
tab:UpdateTheme(newTheme)
end
end
SafeCall(Config.OnThemeChange, themeName)
end
function Window:GetTheme()
return currentTheme
end
function Window:GetThemeName()
return Config.Theme
end
-- ═══════════════════════════════════════════════════════════════════════════════
-- NOTIFICATION SYSTEM
-- ═══════════════════════════════════════════════════════════════════════════════
function Window:Notify(notifyConfig)
notifyConfig = notifyConfig or {}
local title = notifyConfig.Title or "Notification"
local content = notifyConfig.Content or ""
local duration = notifyConfig.Duration or Config.NotificationDuration
local notifType = notifyConfig.Type or "Info"
local notifColor = currentTheme.Info
if notifType == "Success" then notifColor = currentTheme.Success
elseif notifType == "Warning" then notifColor = currentTheme.Warning
elseif notifType == "Error" then notifColor = currentTheme.Error end
local notifWidth = 260
local notifHeight = 70
local startPos, endPos
if Config.NotificationPosition == "TopRight" then
startPos = UDim2.new(1, 0, 0, -notifHeight)
endPos = UDim2.new(1, -notifWidth - 20, 0, 20 + (#self.Notifications * 80))
elseif Config.NotificationPosition == "TopLeft" then
startPos = UDim2.new(0, -notifWidth, 0, -notifHeight)
endPos = UDim2.new(0, 20, 0, 20 + (#self.Notifications * 80))
elseif Config.NotificationPosition == "BottomLeft" then
startPos = UDim2.new(0, -notifWidth, 1, 0)
endPos = UDim2.new(0, 20, 1, -notifHeight - 20 - (#self.Notifications * 80))
else
startPos = UDim2.new(1, 0, 1, 0)
endPos = UDim2.new(1, -notifWidth - 20, 1, -notifHeight - 20 - (#self.Notifications * 80))
end
local NotifFrame = Create("Frame", {
Name = "Notification",
Size = UDim2.new(0, notifWidth, 0, notifHeight),
Position = startPos,
BackgroundColor3 = currentTheme.Secondary,
BorderSizePixel = 0,
Parent = ScreenGui,
})
local NotifCorner = Create("UICorner", {
CornerRadius = UDim.new(0, 8),
Parent = NotifFrame,
})
local NotifBar = Create("Frame", {
Name = "Bar",
Size = UDim2.new(0, 4, 1, 0),
BackgroundColor3 = notifColor,
BorderSizePixel = 0,
Parent = NotifFrame,
})
local NotifTitle = Create("TextLabel", {
Name = "Title",
Size = UDim2.new(1, -20, 0, 18),
Position = UDim2.new(0, 12, 0, 6),
BackgroundTransparency = 1,
Text = title,
TextColor3 = currentTheme.Text,
TextSize = 12,
Font = Config.FontBold,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = NotifFrame,
})
local NotifContent = Create("TextLabel", {
Name = "Content",
Size = UDim2.new(1, -20, 0, 0),
Position = UDim2.new(0, 12, 0, 26),
BackgroundTransparency = 1,
Text = content,
TextColor3 = currentTheme.TextDim,
TextSize = 11,
Font = Config.Font,
TextXAlignment = Enum.TextXAlignment.Left,
TextWrapped = true,
AutomaticSize = Enum.AutomaticSize.Y,
Parent = NotifFrame,
})
table.insert(self.Notifications, NotifFrame)
Tween(NotifFrame, {Position = endPos}, 0.3)
task.delay(duration, function()
Tween(NotifFrame, {Position = startPos}, 0.3, nil, nil, function()
for i, notif in ipairs(self.Notifications) do
if notif == NotifFrame then
table.remove(self.Notifications, i)
break
end
end
NotifFrame:Destroy()
end)
end)
end
-- ═══════════════════════════════════════════════════════════════════════════════
-- KEY SYSTEM UI
-- ═══════════════════════════════════════════════════════════════════════════════
function Window:ShowKeySystem(keyConfig)
keyConfig = keyConfig or {}
local keyCallback = keyConfig.Callback or Config.OnKeyAuthenticated
if not Config.KeySystem then
MainFrame.Visible = true
Tween(MainFrame, {Size = UDim2.new(0, Config.GUIWidth, 0, Config.GUIHeight)}, 0.5)
SafeCall(keyCallback, "Free")
return
end
MainFrame.Visible = false
local KeyFrame = Create("Frame", {
Name = "KeySystem",
Size = UDim2.new(0, 320, 0, 240),
Position = UDim2.new(0.5, -160, 0.5, -120),
BackgroundColor3 = currentTheme.Background,
BorderSizePixel = 0,
Parent = ScreenGui,
})
local KeyCorner = Create("UICorner", {
CornerRadius = UDim.new(0, 10),
Parent = KeyFrame,
})
local KeyShadow = Create("ImageLabel", {
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.new(0.5, 0, 0.5, 4),
Size = UDim2.new(1, 24, 1, 24),
BackgroundTransparency = 1,
Image = "rbxassetid://1316045217",
ImageColor3 = Color3.fromRGB(0, 0, 0),
ImageTransparency = 0.6,
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(10, 10, 118, 118),
ZIndex = -1,
Parent = KeyFrame,
})
local KeyTitle = Create("TextLabel", {
Name = "Title",
Size = UDim2.new(1, 0, 0, 30),
Position = UDim2.new(0, 0, 0, 12),
BackgroundTransparency = 1,
Text = Config.KeySystemTitle,
TextColor3 = currentTheme.Text,
TextSize = 16,
Font = Config.FontBold,
Parent = KeyFrame,
})
local KeySubtitle = Create("TextLabel", {
Name = "Subtitle",
Size = UDim2.new(1, -20, 0, 16),
Position = UDim2.new(0, 10, 0, 42),
BackgroundTransparency = 1,
Text = Config.KeySystemSubtitle,
TextColor3 = currentTheme.TextDim,
TextSize = 11,
Font = Config.Font,
Parent = KeyFrame,
})
local KeyInput = Create("TextBox", {
Name = "Input",
Size = UDim2.new(1, -24, 0, 36),
Position = UDim2.new(0, 12, 0, 68),
BackgroundColor3 = currentTheme.Secondary,
Text = "",
PlaceholderText = "Enter key here...",
TextColor3 = currentTheme.Text,
PlaceholderColor3 = currentTheme.TextDark,
TextSize = 13,
Font = Config.Font,
Parent = KeyFrame,
})
local KeyInputCorner = Create("UICorner", {
CornerRadius = UDim.new(0, 6),
Parent = KeyInput,
})
local StatusLabel = Create("TextLabel", {
Name = "Status",
Size = UDim2.new(1, -20, 0, 16),
Position = UDim2.new(0, 10, 0, 110),
BackgroundTransparency = 1,
Text = "",
TextColor3 = currentTheme.Error,
TextSize = 10,
Font = Config.Font,
Parent = KeyFrame,
})
local SubmitBtn = Create("TextButton", {
Name = "Submit",
Size = UDim2.new(1, -24, 0, 36),
Position = UDim2.new(0, 12, 0, 132),
BackgroundColor3 = currentTheme.Accent,
Text = "Submit Key",
TextColor3 = Color3.fromRGB(255, 255, 255),
TextSize = 13,
Font = Config.FontBold,
Parent = KeyFrame,
})
local SubmitCorner = Create("UICorner", {
CornerRadius = UDim.new(0, 6),
Parent = SubmitBtn,
})
local FreeKeyHint = Create("TextLabel", {
Name = "Hint",
Size = UDim2.new(1, -20, 0, 14),
Position = UDim2.new(0, 10, 0, 174),
BackgroundTransparency = 1,
Text = "Free: " .. (Config.FreeKeys[1] or "NEXUS-FREE") .. " | Premium: " .. (Config.PremiumKeys[1] or "NEXUS-PREMIUM"),
TextColor3 = currentTheme.TextDark,
TextSize = 9,
Font = Config.Font,
Parent = KeyFrame,
})
local function Shake()
Tween(KeyFrame, {Position = UDim2.new(0.5, -155, 0.5, -120)}, 0.05, nil, nil, function()
Tween(KeyFrame, {Position = UDim2.new(0.5, -160, 0.5, -120)}, 0.05, nil, nil, function()
Tween(KeyFrame, {Position = UDim2.new(0.5, -165, 0.5, -120)}, 0.05, nil, nil, function()
Tween(KeyFrame, {Position = UDim2.new(0.5, -160, 0.5, -120)}, 0.05)
end)
end)
end)
end
SubmitBtn.MouseButton1Click:Connect(function()
local key = KeyInput.Text
local valid, keyType = NexusUI.KeySystem:Validate(key, Config)
if valid then
StatusLabel.TextColor3 = currentTheme.Success
StatusLabel.Text = "✓ Key validated! Loading..."
-- Update badge
if KeyBadge then
KeyBadge.BackgroundColor3 = keyType == "Premium" and currentTheme.Premium or currentTheme.Free
local badgeText = KeyBadge:FindFirstChild("Text")
if badgeText then badgeText.Text = keyType:upper() end
end
if UserContainer then
local keyTypeLabel = UserContainer:FindFirstChild("KeyType")
if keyTypeLabel then
keyTypeLabel.Text = keyType
keyTypeLabel.TextColor3 = keyType == "Premium" and currentTheme.Premium or currentTheme.Free
end
end
Tween(KeyFrame, {Size = UDim2.new(0, 0, 0, 0)}, 0.3, nil, nil, function()
KeyFrame:Destroy()
MainFrame.Visible = true
MainFrame.Size = UDim2.new(0, 0, 0, 0)
Tween(MainFrame, {Size = UDim2.new(0, Config.GUIWidth, 0, Config.GUIHeight)}, 0.4)
SafeCall(keyCallback, keyType)
end)
else
StatusLabel.TextColor3 = currentTheme.Error
StatusLabel.Text = "✗ Invalid key. Please try again."
Shake()
end
end)
KeyFrame.Size = UDim2.new(0, 0, 0, 0)
Tween(KeyFrame, {Size = UDim2.new(0, 320, 0, 240)}, 0.4)
end
-- ═══════════════════════════════════════════════════════════════════════════════
-- TAB SYSTEM
-- ═══════════════════════════════════════════════════════════════════════════════
function Window:CreateTab(tabConfig)
tabConfig = tabConfig or {}
local tabName = tabConfig.Name or "Tab"
local tabIcon = tabConfig.Icon or ""
local tabOrder = tabConfig.Order or #self.Tabs + 1
-- Tab Button
local TabButton = Create("TextButton", {
Name = tabName .. "Tab",
Size = UDim2.new(1, -4, 0, 32),
BackgroundColor3 = currentTheme.Tertiary,
Text = "",
AutoButtonColor = false,
Parent = TabList,
})
local TabButtonCorner = Create("UICorner", {
CornerRadius = UDim.new(0, 6),
Parent = TabButton,
})
local TabName
if tabIcon ~= "" then
local IconLabel = Create("ImageLabel", {
Name = "Icon",
Size = UDim2.new(0, 18, 0, 18),
Position = UDim2.new(0, 8, 0.5, -9),
BackgroundTransparency = 1,
Image = tabIcon,
ImageColor3 = currentTheme.TextDim,
Parent = TabButton,
})
TabName = Create("TextLabel", {
Name = "Name",
Size = UDim2.new(1, -32, 1, 0),
Position = UDim2.new(0, 28, 0, 0),
BackgroundTransparency = 1,
Text = tabName,
TextColor3 = currentTheme.TextDim,
TextSize = 12,
Font = Config.FontMedium,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = TabButton,
})
else
TabName = Create("TextLabel", {
Name = "Name",
Size = UDim2.new(1, -16, 1, 0),
Position = UDim2.new(0, 10, 0, 0),
BackgroundTransparency = 1,
Text = tabName,
TextColor3 = currentTheme.TextDim,
TextSize = 12,
Font = Config.FontMedium,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = TabButton,
})
end
-- Tab Content
local TabContent = Create("Frame", {
Name = tabName .. "Content",
Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1,
Visible = false,
Parent = ContentScroll,
})
local TabContentLayout = Create("UIListLayout", {
Padding = UDim.new(0, 8),
HorizontalAlignment = Enum.HorizontalAlignment.Center,
Parent = TabContent,
})
-- Tab Object
local Tab = {
Name = tabName,
Button = TabButton,
Content = TabContent,
Elements = {},
Config = tabConfig,
}
function Tab:UpdateTheme(newTheme)
local isSelected = (Window.CurrentTab == self)
TabButton.BackgroundColor3 = isSelected and newTheme.Accent or newTheme.Tertiary
if TabName then
TabName.TextColor3 = isSelected and Color3.fromRGB(255,255,255) or newTheme.TextDim
end
local icon = TabButton:FindFirstChild("Icon")
if icon then
icon.ImageColor3 = isSelected and Color3.fromRGB(255,255,255) or newTheme.TextDim
end
for _, element in pairs(self.Elements) do
if element.UpdateTheme then
element:UpdateTheme(newTheme)
end
end
end
function Tab:Select()
if Window.CurrentTab and Window.CurrentTab ~= self then
Window.CurrentTab.Content.Visible = false
Tween(Window.CurrentTab.Button, {BackgroundColor3 = currentTheme.Tertiary}, 0.2)
local oldName = Window.CurrentTab.Button:FindFirstChild("Name")
if oldName then Tween(oldName, {TextColor3 = currentTheme.TextDim}, 0.2) end
local oldIcon = Window.CurrentTab.Button:FindFirstChild("Icon")
if oldIcon then Tween(oldIcon, {ImageColor3 = currentTheme.TextDim}, 0.2) end
end
Window.CurrentTab = self
self.Content.Visible = true
Tween(self.Button, {BackgroundColor3 = currentTheme.Accent}, 0.2)
if TabName then Tween(TabName, {TextColor3 = Color3.fromRGB(255,255,255)}, 0.2) end
local icon = self.Button:FindFirstChild("Icon")
if icon then Tween(icon, {ImageColor3 = Color3.fromRGB(255,255,255)}, 0.2) end
end
TabButton.MouseButton1Click:Connect(function()
Tab:Select()
end)
TabButton.MouseEnter:Connect(function()
if Window.CurrentTab ~= Tab then
Tween(TabButton, {BackgroundColor3 = currentTheme.AccentHover}, 0.2)
end
end)
TabButton.MouseLeave:Connect(function()
if Window.CurrentTab ~= Tab then
Tween(TabButton, {BackgroundColor3 = currentTheme.Tertiary}, 0.2)
end
end)
-- Select first tab
if #self.Tabs == 0 then
Tab:Select()
end
table.insert(self.Tabs, Tab)
-- ═══════════════════════════════════════════════════════════════════════════════
-- COMPONENT FACTORY
-- ═══════════════════════════════════════════════════════════════════════════════
local function GetParent(config)
return config and config.Section and config.Section.Content or TabContent
end
local function AddElement(tab, element)
table.insert(tab.Elements, element)
return element
end
-- 1. SECTION
function Tab:CreateSection(config)
config = config or {}
local name = config.Name or "Section"
local Frame = Create("Frame", {
Name = name .. "Section",
Size = UDim2.new(1, 0, 0, 30),
BackgroundTransparency = 1,
AutomaticSize = Enum.AutomaticSize.Y,
Parent = TabContent,
})
local Title = Create("TextLabel", {
Name = "Title",
Size = UDim2.new(1, 0, 0, 20),
BackgroundTransparency = 1,
Text = name,
TextColor3 = currentTheme.Text,
TextSize = 13,
Font = Config.FontBold,
TextXAlignment = Enum.TextXAlignment.Left,
Parent = Frame,
})
local Line = Create("Frame", {
Name = "Line",
Size = UDim2.new(1, 0, 0, 1),
Position = UDim2.new(0, 0, 0, 22),
BackgroundColor3 = currentTheme.Border,
BorderSizePixel = 0,
Parent = Frame,
})
local Content = Create("Frame", {
Name = "Content",
Size = UDim2.new(1, 0, 0, 0),
Position = UDim2.new(0, 0, 0, 28),
BackgroundTransparency = 1,
AutomaticSize = Enum.AutomaticSize.Y,
Parent = Frame,
})
local ContentLayout = Create("UIListLayout", {
Padding = UDim.new(0, 6),
Parent = Content,
})
local Obj = {
Frame = Frame, Content = Content, Title = Title, Line = Line,
UpdateTheme = function(self, newTheme)
Title.TextColor3 = newTheme.Text
Line.BackgroundColor3 = newTheme.Border
end,
}
return AddElement(self, Obj)
end
-- 2. BUTTON
function Tab:CreateButton(config)
config = config or {}
local text = config.Text or "Button"
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Button",
Size = UDim2.new(1, 0, 0, 34),
BackgroundColor3 = currentTheme.Accent,
BorderSizePixel = 0,
Parent = parent,
})
local Corner = Create("UICorner", {
CornerRadius = UDim.new(0, 6),
Parent = Frame,
})
local Label = Create("TextLabel", {
Name = "Text",
Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1,
Text = text,
TextColor3 = Color3.fromRGB(255,255,255),
TextSize = 12,
Font = Config.FontBold,
Parent = Frame,
})
local Click = Create("TextButton", {
Name = "Click",
Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1,
Text = "",
Parent = Frame,
})
Click.MouseButton1Click:Connect(function()
SafeCall(callback)
Tween(Frame, {BackgroundColor3 = currentTheme.AccentHover}, 0.1, nil, nil, function()
Tween(Frame, {BackgroundColor3 = currentTheme.Accent}, 0.1)
end)
end)
Click.MouseEnter:Connect(function() Tween(Frame, {BackgroundColor3 = currentTheme.AccentHover}, 0.2) end)
Click.MouseLeave:Connect(function() Tween(Frame, {BackgroundColor3 = currentTheme.Accent}, 0.2) end)
local Obj = {
Frame = Frame, Text = Label,
UpdateTheme = function(self, newTheme) Frame.BackgroundColor3 = newTheme.Accent end,
SetText = function(self, txt) Label.Text = txt end,
SetCallback = function(self, cb) callback = cb end,
}
return AddElement(self, Obj)
end
-- 3. TOGGLE
function Tab:CreateToggle(config)
config = config or {}
local text = config.Text or "Toggle"
local default = config.Default or false
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Toggle",
Size = UDim2.new(1, 0, 0, 34),
BackgroundColor3 = currentTheme.Secondary,
BorderSizePixel = 0,
Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(1, -60, 1, 0), Position = UDim2.new(0, 12, 0, 0),
BackgroundTransparency = 1, Text = text, TextColor3 = currentTheme.Text,
TextSize = 12, Font = Config.Font, TextXAlignment = Enum.TextXAlignment.Left,
Parent = Frame,
})
local BG = Create("Frame", {
Name = "BG", Size = UDim2.new(0, 40, 0, 20),
Position = UDim2.new(1, -50, 0.5, -10),
BackgroundColor3 = default and currentTheme.Accent or currentTheme.Tertiary,
BorderSizePixel = 0, Parent = Frame,
})
local BGC = Create("UICorner", {CornerRadius = UDim.new(1, 0), Parent = BG})
local Circle = Create("Frame", {
Name = "Circle", Size = UDim2.new(0, 16, 0, 16),
Position = default and UDim2.new(1, -18, 0.5, -8) or UDim2.new(0, 2, 0.5, -8),
BackgroundColor3 = Color3.fromRGB(255,255,255), BorderSizePixel = 0, Parent = BG,
})
local CC = Create("UICorner", {CornerRadius = UDim.new(1, 0), Parent = Circle})
local Click = Create("TextButton", {
Name = "Click", Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1, Text = "", Parent = Frame,
})
local isOn = default
Click.MouseButton1Click:Connect(function()
isOn = not isOn
if isOn then
Tween(BG, {BackgroundColor3 = currentTheme.Accent}, 0.2)
Tween(Circle, {Position = UDim2.new(1, -18, 0.5, -8)}, 0.2)
else
Tween(BG, {BackgroundColor3 = currentTheme.Tertiary}, 0.2)
Tween(Circle, {Position = UDim2.new(0, 2, 0.5, -8)}, 0.2)
end
SafeCall(callback, isOn)
end)
local Obj = {
Frame = Frame, Value = isOn,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Label.TextColor3 = newTheme.Text
BG.BackgroundColor3 = isOn and newTheme.Accent or newTheme.Tertiary
end,
Set = function(self, val)
isOn = val
BG.BackgroundColor3 = isOn and currentTheme.Accent or currentTheme.Tertiary
Circle.Position = isOn and UDim2.new(1, -18, 0.5, -8) or UDim2.new(0, 2, 0.5, -8)
SafeCall(callback, isOn)
end,
Get = function(self) return isOn end,
}
return AddElement(self, Obj)
end
-- 4. SLIDER
function Tab:CreateSlider(config)
config = config or {}
local text = config.Text or "Slider"
local min = config.Min or 0
local max = config.Max or 100
local default = config.Default or min
local increment = config.Increment or 1
local suffix = config.Suffix or ""
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Slider", Size = UDim2.new(1, 0, 0, 50),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Label", Size = UDim2.new(0.7, 0, 0, 20),
Position = UDim2.new(0, 12, 0, 4), BackgroundTransparency = 1,
Text = text, TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.Font, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local ValueText = Create("TextLabel", {
Name = "Value", Size = UDim2.new(0.3, -16, 0, 20),
Position = UDim2.new(0.7, 4, 0, 4), BackgroundTransparency = 1,
Text = tostring(default) .. suffix, TextColor3 = currentTheme.Accent,
TextSize = 12, Font = Config.FontBold, TextXAlignment = Enum.TextXAlignment.Right,
Parent = Frame,
})
local BG = Create("Frame", {
Name = "BG", Size = UDim2.new(1, -24, 0, 6),
Position = UDim2.new(0, 12, 0, 32), BackgroundColor3 = currentTheme.Tertiary,
BorderSizePixel = 0, Parent = Frame,
})
local BGC = Create("UICorner", {CornerRadius = UDim.new(1, 0), Parent = BG})
local Fill = Create("Frame", {
Name = "Fill", Size = UDim2.new((default - min) / (max - min), 0, 1, 0),
BackgroundColor3 = currentTheme.Accent, BorderSizePixel = 0, Parent = BG,
})
local FC = Create("UICorner", {CornerRadius = UDim.new(1, 0), Parent = Fill})
local Knob = Create("Frame", {
Name = "Knob", Size = UDim2.new(0, 14, 0, 14),
Position = UDim2.new((default - min) / (max - min), -7, 0.5, -7),
BackgroundColor3 = Color3.fromRGB(255,255,255), BorderSizePixel = 0, Parent = BG,
})
local KC = Create("UICorner", {CornerRadius = UDim.new(1, 0), Parent = Knob})
local isDragging = false
local currentValue = default
local function Update(input)
local pos = math.clamp((input.Position.X - BG.AbsolutePosition.X) / BG.AbsoluteSize.X, 0, 1)
local val = min + (max - min) * pos
val = math.floor(val / increment + 0.5) * increment
val = math.clamp(val, min, max)
currentValue = val
local scale = (val - min) / (max - min)
Fill.Size = UDim2.new(scale, 0, 1, 0)
Knob.Position = UDim2.new(scale, -7, 0.5, -7)
ValueText.Text = tostring(RoundNumber(val, 2)) .. suffix
SafeCall(callback, val)
end
Knob.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then isDragging = true end
end)
BG.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then isDragging = true Update(input) end
end)
UserInputService.InputChanged:Connect(function(input)
if isDragging and input.UserInputType == Enum.UserInputType.MouseMovement then Update(input) end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then isDragging = false end
end)
local Obj = {
Frame = Frame, Value = currentValue,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Label.TextColor3 = newTheme.Text
ValueText.TextColor3 = newTheme.Accent
BG.BackgroundColor3 = newTheme.Tertiary
Fill.BackgroundColor3 = newTheme.Accent
end,
Set = function(self, val)
val = math.clamp(val, min, max)
currentValue = val
local scale = (val - min) / (max - min)
Fill.Size = UDim2.new(scale, 0, 1, 0)
Knob.Position = UDim2.new(scale, -7, 0.5, -7)
ValueText.Text = tostring(RoundNumber(val, 2)) .. suffix
SafeCall(callback, val)
end,
Get = function(self) return currentValue end,
}
return AddElement(self, Obj)
end
-- 5. DROPDOWN
function Tab:CreateDropdown(config)
config = config or {}
local text = config.Text or "Dropdown"
local options = config.Options or {}
local default = config.Default or options[1] or ""
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Dropdown", Size = UDim2.new(1, 0, 0, 34),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0,
ClipsDescendants = true, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(1, -50, 0, 34),
Position = UDim2.new(0, 12, 0, 0), BackgroundTransparency = 1,
Text = text, TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.Font, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local Selected = Create("TextLabel", {
Name = "Selected", Size = UDim2.new(0, 100, 0, 34),
Position = UDim2.new(1, -110, 0, 0), BackgroundTransparency = 1,
Text = default, TextColor3 = currentTheme.Accent, TextSize = 11,
Font = Config.FontMedium, TextXAlignment = Enum.TextXAlignment.Right,
TextTruncate = Enum.TextTruncate.AtEnd, Parent = Frame,
})
local Arrow = Create("TextLabel", {
Name = "Arrow", Size = UDim2.new(0, 20, 0, 34),
Position = UDim2.new(1, -24, 0, 0), BackgroundTransparency = 1,
Text = "▼", TextColor3 = currentTheme.TextDim, TextSize = 10,
Font = Config.Font, Parent = Frame,
})
local OptionsContainer = Create("Frame", {
Name = "Options", Size = UDim2.new(1, 0, 0, 0),
Position = UDim2.new(0, 0, 0, 34), BackgroundTransparency = 1, Parent = Frame,
})
local OL = Create("UIListLayout", {Padding = UDim.new(0, 2), Parent = OptionsContainer})
local isOpen = false
local selectedOption = default
local optionButtons = {}
local function MakeOption(opt)
local Btn = Create("TextButton", {
Name = opt, Size = UDim2.new(1, -16, 0, 28),
Position = UDim2.new(0, 8, 0, 0), BackgroundColor3 = currentTheme.Tertiary,
Text = opt, TextColor3 = currentTheme.Text, TextSize = 11,
Font = Config.Font, TextXAlignment = Enum.TextXAlignment.Left, Parent = OptionsContainer,
})
local BC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = Btn})
Btn.MouseButton1Click:Connect(function()
selectedOption = opt
Selected.Text = opt
SafeCall(callback, opt)
isOpen = false
Tween(Frame, {Size = UDim2.new(1, 0, 0, 34)}, 0.2)
Arrow.Text = "▼"
end)
Btn.MouseEnter:Connect(function()
Tween(Btn, {BackgroundColor3 = currentTheme.Accent}, 0.15)
Tween(Btn, {TextColor3 = Color3.fromRGB(255,255,255)}, 0.15)
end)
Btn.MouseLeave:Connect(function()
Tween(Btn, {BackgroundColor3 = currentTheme.Tertiary}, 0.15)
Tween(Btn, {TextColor3 = currentTheme.Text}, 0.15)
end)
table.insert(optionButtons, Btn)
return Btn
end
for _, opt in ipairs(options) do MakeOption(opt) end
local Click = Create("TextButton", {
Name = "Click", Size = UDim2.new(1, 0, 0, 34),
BackgroundTransparency = 1, Text = "", Parent = Frame,
})
Click.MouseButton1Click:Connect(function()
isOpen = not isOpen
if isOpen then
local h = 34 + (#options * 30) + 4
Tween(Frame, {Size = UDim2.new(1, 0, 0, math.min(h, 200))}, 0.2)
Arrow.Text = "▲"
else
Tween(Frame, {Size = UDim2.new(1, 0, 0, 34)}, 0.2)
Arrow.Text = "▼"
end
end)
local Obj = {
Frame = Frame, Value = selectedOption, Options = optionButtons,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Label.TextColor3 = newTheme.Text
Selected.TextColor3 = newTheme.Accent
Arrow.TextColor3 = newTheme.TextDim
for _, btn in ipairs(optionButtons) do
btn.BackgroundColor3 = newTheme.Tertiary
btn.TextColor3 = newTheme.Text
end
end,
Set = function(self, val)
selectedOption = val
Selected.Text = val
SafeCall(callback, val)
end,
Get = function(self) return selectedOption end,
Refresh = function(self, newOptions)
for _, btn in ipairs(optionButtons) do btn:Destroy() end
optionButtons = {}
for _, opt in ipairs(newOptions) do MakeOption(opt) end
end,
}
return AddElement(self, Obj)
end
-- 6. INPUT / TEXTBOX
function Tab:CreateInput(config)
config = config or {}
local text = config.Text or "Input"
local placeholder = config.Placeholder or "Enter text..."
local default = config.Default or ""
local callback = config.Callback or function() end
local isNumeric = config.Numeric or false
local isPassword = config.Password or false
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Input", Size = UDim2.new(1, 0, 0, 56),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Label", Size = UDim2.new(1, -16, 0, 18),
Position = UDim2.new(0, 10, 0, 4), BackgroundTransparency = 1,
Text = text, TextColor3 = currentTheme.Text, TextSize = 11,
Font = Config.Font, Parent = Frame,
})
local Box = Create("TextBox", {
Name = "Box", Size = UDim2.new(1, -16, 0, 26),
Position = UDim2.new(0, 8, 0, 26), BackgroundColor3 = currentTheme.Tertiary,
Text = default, PlaceholderText = placeholder,
TextColor3 = currentTheme.Text, PlaceholderColor3 = currentTheme.TextDark,
TextSize = 12, Font = Config.Font, ClearTextOnFocus = false, Parent = Frame,
})
local BC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = Box})
if isPassword then Box.Text = string.rep("•", #default) end
Box.FocusLost:Connect(function(enterPressed)
local txt = Box.Text
if isNumeric then txt = tonumber(txt) or 0 Box.Text = tostring(txt) end
SafeCall(callback, txt, enterPressed)
end)
Box.Focused:Connect(function() Tween(Box, {BackgroundColor3 = currentTheme.Accent}, 0.2) end)
Box.FocusLost:Connect(function() Tween(Box, {BackgroundColor3 = currentTheme.Tertiary}, 0.2) end)
local Obj = {
Frame = Frame, Box = Box, Value = default,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Label.TextColor3 = newTheme.Text
Box.BackgroundColor3 = newTheme.Tertiary
Box.TextColor3 = newTheme.Text
Box.PlaceholderColor3 = newTheme.TextDark
end,
Set = function(self, val) Box.Text = tostring(val) SafeCall(callback, val, false) end,
Get = function(self) return Box.Text end,
}
return AddElement(self, Obj)
end
-- 7. KEYBIND
function Tab:CreateKeybind(config)
config = config or {}
local text = config.Text or "Keybind"
local defaultKey = config.Default or Enum.KeyCode.LeftShift
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Keybind", Size = UDim2.new(1, 0, 0, 34),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(1, -80, 1, 0),
Position = UDim2.new(0, 12, 0, 0), BackgroundTransparency = 1,
Text = text, TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.Font, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local KeyDisplay = Create("TextButton", {
Name = "Key", Size = UDim2.new(0, 60, 0, 24),
Position = UDim2.new(1, -68, 0.5, -12), BackgroundColor3 = currentTheme.Tertiary,
Text = defaultKey.Name, TextColor3 = currentTheme.Text, TextSize = 10,
Font = Config.FontBold, Parent = Frame,
})
local KC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = KeyDisplay})
local currentKey = defaultKey
local isListening = false
KeyDisplay.MouseButton1Click:Connect(function()
isListening = true
KeyDisplay.Text = "..."
KeyDisplay.BackgroundColor3 = currentTheme.Accent
end)
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if isListening and input.UserInputType == Enum.UserInputType.Keyboard then
isListening = false
currentKey = input.KeyCode
KeyDisplay.Text = input.KeyCode.Name
KeyDisplay.BackgroundColor3 = currentTheme.Tertiary
SafeCall(callback, input.KeyCode)
elseif input.KeyCode == currentKey and not gameProcessed then
SafeCall(callback, currentKey)
end
end)
local Obj = {
Frame = Frame, Key = currentKey,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Label.TextColor3 = newTheme.Text
KeyDisplay.BackgroundColor3 = newTheme.Tertiary
KeyDisplay.TextColor3 = newTheme.Text
end,
Set = function(self, key)
currentKey = key
KeyDisplay.Text = key.Name
end,
Get = function(self) return currentKey end,
}
return AddElement(self, Obj)
end
-- 8. COLOR PICKER
function Tab:CreateColorPicker(config)
config = config or {}
local text = config.Text or "Color"
local defaultColor = config.Default or Color3.fromRGB(255, 0, 0)
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Color", Size = UDim2.new(1, 0, 0, 34),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(1, -60, 1, 0),
Position = UDim2.new(0, 12, 0, 0), BackgroundTransparency = 1,
Text = text, TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.Font, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local Preview = Create("Frame", {
Name = "Preview", Size = UDim2.new(0, 36, 0, 22),
Position = UDim2.new(1, -48, 0.5, -11), BackgroundColor3 = defaultColor,
BorderSizePixel = 0, Parent = Frame,
})
local PC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = Preview})
local Click = Create("TextButton", {
Name = "Click", Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1, Text = "", Parent = Frame,
})
local currentColor = defaultColor
Click.MouseButton1Click:Connect(function()
local Dialog = Create("Frame", {
Name = "ColorDialog", Size = UDim2.new(0, 200, 0, 150),
Position = UDim2.new(0.5, -100, 0.5, -75),
BackgroundColor3 = currentTheme.Background, BorderSizePixel = 0, Parent = ScreenGui,
})
local DC = Create("UICorner", {CornerRadius = UDim.new(0, 8), Parent = Dialog})
local DTitle = Create("TextLabel", {
Size = UDim2.new(1, 0, 0, 24), BackgroundTransparency = 1,
Text = "Pick a Color", TextColor3 = currentTheme.Text, TextSize = 13,
Font = Config.FontBold, Parent = Dialog,
})
local colors = {
Color3.fromRGB(255,0,0), Color3.fromRGB(255,128,0), Color3.fromRGB(255,255,0),
Color3.fromRGB(128,255,0), Color3.fromRGB(0,255,0), Color3.fromRGB(0,255,128),
Color3.fromRGB(0,255,255), Color3.fromRGB(0,128,255), Color3.fromRGB(0,0,255),
Color3.fromRGB(128,0,255), Color3.fromRGB(255,0,255), Color3.fromRGB(255,0,128),
}
for i, color in ipairs(colors) do
local row = math.floor((i-1)/4)
local col = (i-1)%4
local Btn = Create("TextButton", {
Size = UDim2.new(0, 40, 0, 30),
Position = UDim2.new(0, 10 + col*46, 0, 30 + row*36),
BackgroundColor3 = color, Text = "", Parent = Dialog,
})
local BC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = Btn})
Btn.MouseButton1Click:Connect(function()
currentColor = color
Preview.BackgroundColor3 = color
SafeCall(callback, color)
Dialog:Destroy()
end)
end
local CloseBtn = Create("TextButton", {
Size = UDim2.new(0, 60, 0, 24),
Position = UDim2.new(0.5, -30, 1, -32),
BackgroundColor3 = currentTheme.Accent, Text = "Close",
TextColor3 = Color3.fromRGB(255,255,255), TextSize = 11,
Font = Config.FontBold, Parent = Dialog,
})
local CBC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = CloseBtn})
CloseBtn.MouseButton1Click:Connect(function() Dialog:Destroy() end)
end)
local Obj = {
Frame = Frame, Value = currentColor,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Label.TextColor3 = newTheme.Text
end,
Set = function(self, color)
currentColor = color
Preview.BackgroundColor3 = color
SafeCall(callback, color)
end,
Get = function(self) return currentColor end,
}
return AddElement(self, Obj)
end
-- 9. LABEL
function Tab:CreateLabel(config)
config = config or {}
local text = config.Text or "Label"
local color = config.Color or currentTheme.Text
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "Label", Size = UDim2.new(1, 0, 0, 20),
BackgroundTransparency = 1, Parent = parent,
})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(1, 0, 1, 0), BackgroundTransparency = 1,
Text = text, TextColor3 = color, TextSize = 12, Font = Config.Font,
TextXAlignment = Enum.TextXAlignment.Left, TextWrapped = true, Parent = Frame,
})
local Obj = {
Frame = Frame, Text = Label,
UpdateTheme = function(self, newTheme)
if color == currentTheme.Text then Label.TextColor3 = newTheme.Text end
end,
Set = function(self, txt) Label.Text = txt end,
Get = function(self) return Label.Text end,
}
return AddElement(self, Obj)
end
-- 10. PARAGRAPH
function Tab:CreateParagraph(config)
config = config or {}
local title = config.Title or "Title"
local content = config.Content or "Content..."
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "Paragraph", Size = UDim2.new(1, 0, 0, 60),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0,
AutomaticSize = Enum.AutomaticSize.Y, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local PTitle = Create("TextLabel", {
Name = "Title", Size = UDim2.new(1, -16, 0, 18),
Position = UDim2.new(0, 8, 0, 6), BackgroundTransparency = 1,
Text = title, TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.FontBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local PContent = Create("TextLabel", {
Name = "Content", Size = UDim2.new(1, -16, 0, 0),
Position = UDim2.new(0, 8, 0, 26), BackgroundTransparency = 1,
Text = content, TextColor3 = currentTheme.TextDim, TextSize = 11,
Font = Config.Font, TextXAlignment = Enum.TextXAlignment.Left,
TextWrapped = true, AutomaticSize = Enum.AutomaticSize.Y, Parent = Frame,
})
local Obj = {
Frame = Frame, Title = PTitle, Content = PContent,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
PTitle.TextColor3 = newTheme.Text
PContent.TextColor3 = newTheme.TextDim
end,
SetTitle = function(self, txt) PTitle.Text = txt end,
SetContent = function(self, txt) PContent.Text = txt end,
}
return AddElement(self, Obj)
end
-- 11. PROGRESS BAR
function Tab:CreateProgressBar(config)
config = config or {}
local text = config.Text or "Progress"
local value = config.Value or 0
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Progress", Size = UDim2.new(1, 0, 0, 40),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Label", Size = UDim2.new(1, -16, 0, 16),
Position = UDim2.new(0, 8, 0, 4), BackgroundTransparency = 1,
Text = text, TextColor3 = currentTheme.Text, TextSize = 11,
Font = Config.Font, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local ValueText = Create("TextLabel", {
Name = "Value", Size = UDim2.new(0, 40, 0, 16),
Position = UDim2.new(1, -48, 0, 4), BackgroundTransparency = 1,
Text = tostring(value) .. "%", TextColor3 = currentTheme.Accent,
TextSize = 11, Font = Config.FontBold, TextXAlignment = Enum.TextXAlignment.Right,
Parent = Frame,
})
local BG = Create("Frame", {
Name = "BG", Size = UDim2.new(1, -16, 0, 8),
Position = UDim2.new(0, 8, 0, 26), BackgroundColor3 = currentTheme.Tertiary,
BorderSizePixel = 0, Parent = Frame,
})
local BGC = Create("UICorner", {CornerRadius = UDim.new(1, 0), Parent = BG})
local Fill = Create("Frame", {
Name = "Fill", Size = UDim2.new(value/100, 0, 1, 0),
BackgroundColor3 = currentTheme.Accent, BorderSizePixel = 0, Parent = BG,
})
local FC = Create("UICorner", {CornerRadius = UDim.new(1, 0), Parent = Fill})
local Obj = {
Frame = Frame, Value = value,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Label.TextColor3 = newTheme.Text
ValueText.TextColor3 = newTheme.Accent
BG.BackgroundColor3 = newTheme.Tertiary
Fill.BackgroundColor3 = newTheme.Accent
end,
Set = function(self, val)
val = math.clamp(val, 0, 100)
ValueText.Text = tostring(math.floor(val)) .. "%"
Tween(Fill, {Size = UDim2.new(val/100, 0, 1, 0)}, 0.3)
end,
Get = function(self) return value end,
}
return AddElement(self, Obj)
end
-- 12. DIVIDER
function Tab:CreateDivider(config)
config = config or {}
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "Divider", Size = UDim2.new(1, 0, 0, 1),
BackgroundColor3 = currentTheme.Border, BorderSizePixel = 0, Parent = parent,
})
local Obj = {
Frame = Frame,
UpdateTheme = function(self, newTheme) Frame.BackgroundColor3 = newTheme.Border end,
}
return AddElement(self, Obj)
end
-- 13. IMAGE
function Tab:CreateImage(config)
config = config or {}
local imageId = config.Image or ""
local size = config.Size or UDim2.new(1, 0, 0, 100)
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "ImageFrame", Size = size,
BackgroundColor3 = currentTheme.Tertiary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Image = Create("ImageLabel", {
Name = "Image", Size = UDim2.new(1, -8, 1, -8),
Position = UDim2.new(0, 4, 0, 4), BackgroundTransparency = 1,
Image = imageId, ScaleType = Enum.ScaleType.Fit, Parent = Frame,
})
local Obj = {
Frame = Frame, Image = Image,
UpdateTheme = function(self, newTheme) Frame.BackgroundColor3 = newTheme.Tertiary end,
SetImage = function(self, id) Image.Image = id end,
}
return AddElement(self, Obj)
end
-- 14. SPACER
function Tab:CreateSpacer(config)
config = config or {}
local height = config.Height or 10
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "Spacer", Size = UDim2.new(1, 0, 0, height),
BackgroundTransparency = 1, Parent = parent,
})
return Frame
end
-- 15. LIST
function Tab:CreateList(config)
config = config or {}
local title = config.Title or "List"
local items = config.Items or {}
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = title .. "List", Size = UDim2.new(1, 0, 0, 120),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local LTitle = Create("TextLabel", {
Name = "Title", Size = UDim2.new(1, -16, 0, 20),
Position = UDim2.new(0, 8, 0, 4), BackgroundTransparency = 1,
Text = title, TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.FontBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local Scroll = Create("ScrollingFrame", {
Name = "Scroll", Size = UDim2.new(1, -8, 1, -28),
Position = UDim2.new(0, 4, 0, 24), BackgroundTransparency = 1,
ScrollBarThickness = 2, ScrollBarImageColor3 = currentTheme.Accent,
CanvasSize = UDim2.new(0, 0, 0, 0), AutomaticCanvasSize = Enum.AutomaticSize.Y,
Parent = Frame,
})
local LL = Create("UIListLayout", {Padding = UDim.new(0, 2), Parent = Scroll})
local listItems = {}
local Obj = {
Frame = Frame, Items = listItems,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
LTitle.TextColor3 = newTheme.Text
Scroll.ScrollBarImageColor3 = newTheme.Accent
for _, btn in ipairs(listItems) do
btn.BackgroundColor3 = newTheme.Tertiary
btn.TextColor3 = newTheme.Text
end
end,
AddItem = function(self, itemText)
local Btn = Create("TextButton", {
Size = UDim2.new(1, -4, 0, 26), Position = UDim2.new(0, 2, 0, 0),
BackgroundColor3 = currentTheme.Tertiary, Text = itemText,
TextColor3 = currentTheme.Text, TextSize = 11, Font = Config.Font,
Parent = Scroll,
})
local BC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = Btn})
Btn.MouseButton1Click:Connect(function() SafeCall(callback, itemText) end)
Btn.MouseEnter:Connect(function()
Tween(Btn, {BackgroundColor3 = currentTheme.Accent}, 0.15)
Tween(Btn, {TextColor3 = Color3.fromRGB(255,255,255)}, 0.15)
end)
Btn.MouseLeave:Connect(function()
Tween(Btn, {BackgroundColor3 = currentTheme.Tertiary}, 0.15)
Tween(Btn, {TextColor3 = currentTheme.Text}, 0.15)
end)
table.insert(listItems, Btn)
return Btn
end,
Clear = function(self)
for _, btn in ipairs(listItems) do btn:Destroy() end
listItems = {}
end,
}
for _, item in ipairs(items) do Obj:AddItem(item) end
return AddElement(self, Obj)
end
-- 16. MULTI-TOGGLE
function Tab:CreateMultiToggle(config)
config = config or {}
local text = config.Text or "Multi Toggle"
local options = config.Options or {}
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Multi", Size = UDim2.new(1, 0, 0, 30 + (#options * 28)),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Title = Create("TextLabel", {
Name = "Title", Size = UDim2.new(1, -16, 0, 20),
Position = UDim2.new(0, 8, 0, 4), BackgroundTransparency = 1,
Text = text, TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.FontBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local selected = {}
local buttons = {}
for i, option in ipairs(options) do
local Btn = Create("TextButton", {
Name = option, Size = UDim2.new(1, -16, 0, 24),
Position = UDim2.new(0, 8, 0, 24 + (i-1)*26),
BackgroundColor3 = currentTheme.Tertiary, Text = " " .. option,
TextColor3 = currentTheme.TextDim, TextSize = 11, Font = Config.Font,
TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local BC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = Btn})
local Check = Create("TextLabel", {
Name = "Check", Size = UDim2.new(0, 20, 1, 0),
Position = UDim2.new(1, -24, 0, 0), BackgroundTransparency = 1,
Text = "✓", TextColor3 = currentTheme.Accent, TextSize = 14,
Font = Config.FontBold, Visible = false, Parent = Btn,
})
Btn.MouseButton1Click:Connect(function()
if selected[option] then
selected[option] = nil
Check.Visible = false
Tween(Btn, {BackgroundColor3 = currentTheme.Tertiary}, 0.15)
Tween(Btn, {TextColor3 = currentTheme.TextDim}, 0.15)
else
selected[option] = true
Check.Visible = true
Tween(Btn, {BackgroundColor3 = currentTheme.Accent}, 0.15)
Tween(Btn, {TextColor3 = Color3.fromRGB(255,255,255)}, 0.15)
end
SafeCall(callback, selected)
end)
table.insert(buttons, Btn)
end
local Obj = {
Frame = Frame, Selected = selected,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Title.TextColor3 = newTheme.Text
for _, btn in ipairs(buttons) do
local opt = btn.Name
if selected[opt] then
btn.BackgroundColor3 = newTheme.Accent
btn.TextColor3 = Color3.fromRGB(255,255,255)
else
btn.BackgroundColor3 = newTheme.Tertiary
btn.TextColor3 = newTheme.TextDim
end
end
end,
Set = function(self, selections)
selected = selections
for _, btn in ipairs(buttons) do
local check = btn:FindFirstChild("Check")
local opt = btn.Name
if selected[opt] then
check.Visible = true
btn.BackgroundColor3 = currentTheme.Accent
btn.TextColor3 = Color3.fromRGB(255,255,255)
else
check.Visible = false
btn.BackgroundColor3 = currentTheme.Tertiary
btn.TextColor3 = currentTheme.TextDim
end
end
end,
Get = function(self) return selected end,
}
return AddElement(self, Obj)
end
-- 17. THEME SELECTOR (Premium)
function Tab:CreateThemeSelector(config)
config = config or {}
local parent = GetParent(config)
if not NexusUI.KeySystem:IsPremium() then
return self:CreateLabel({
Text = "🔒 Theme Customizer (Premium Only)",
Color = currentTheme.Warning, Section = config and config.Section,
})
end
local Frame = Create("Frame", {
Name = "ThemeSelector", Size = UDim2.new(1, 0, 0, 80),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Title = Create("TextLabel", {
Name = "Title", Size = UDim2.new(1, -16, 0, 20),
Position = UDim2.new(0, 8, 0, 4), BackgroundTransparency = 1,
Text = "🎨 Theme Selector", TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.FontBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local Scroll = Create("ScrollingFrame", {
Name = "Scroll", Size = UDim2.new(1, -8, 1, -28),
Position = UDim2.new(0, 4, 0, 24), BackgroundTransparency = 1,
ScrollBarThickness = 2, ScrollBarImageColor3 = currentTheme.Accent,
CanvasSize = UDim2.new(0, 0, 0, 0), AutomaticCanvasSize = Enum.AutomaticSize.X,
ScrollingDirection = Enum.ScrollingDirection.X, Parent = Frame,
})
local SL = Create("UIListLayout", {Padding = UDim.new(0, 6), FillDirection = Enum.FillDirection.Horizontal, Parent = Scroll})
for themeName, themeData in pairs(NexusUI.Themes) do
local Btn = Create("TextButton", {
Size = UDim2.new(0, 70, 0, 40), BackgroundColor3 = themeData.Accent,
Text = themeName, TextColor3 = Color3.fromRGB(255,255,255), TextSize = 10,
Font = Config.FontBold, Parent = Scroll,
})
local BC = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Btn})
Btn.MouseButton1Click:Connect(function() Window:SetTheme(themeName) end)
end
local Obj = {
Frame = Frame,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Title.TextColor3 = newTheme.Text
Scroll.ScrollBarImageColor3 = newTheme.Accent
end,
}
return AddElement(self, Obj)
end
-- 18. CHIP / TAG
function Tab:CreateChip(config)
config = config or {}
local text = config.Text or "Chip"
local color = config.Color or currentTheme.Accent
local removable = config.Removable or false
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Chip", Size = UDim2.new(0, 0, 0, 26),
BackgroundColor3 = color, BorderSizePixel = 0,
AutomaticSize = Enum.AutomaticSize.X, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 13), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(0, 0, 1, 0),
Position = UDim2.new(0, 10, 0, 0), BackgroundTransparency = 1,
Text = text, TextColor3 = Color3.fromRGB(255,255,255), TextSize = 11,
Font = Config.FontMedium, AutomaticSize = Enum.AutomaticSize.X, Parent = Frame,
})
if removable then
local RemoveBtn = Create("TextButton", {
Name = "Remove", Size = UDim2.new(0, 18, 0, 18),
Position = UDim2.new(1, -20, 0.5, -9), BackgroundTransparency = 1,
Text = "×", TextColor3 = Color3.fromRGB(255,255,255), TextSize = 14,
Font = Config.FontBold, Parent = Frame,
})
RemoveBtn.MouseButton1Click:Connect(function()
SafeCall(callback, "removed")
Frame:Destroy()
end)
Frame.Size = UDim2.new(0, 0, 0, 26)
end
local Obj = {
Frame = Frame, Text = Label,
UpdateTheme = function(self, newTheme) end,
Set = function(self, txt) Label.Text = txt end,
}
return AddElement(self, Obj)
end
-- 19. BADGE
function Tab:CreateBadge(config)
config = config or {}
local text = config.Text or "Badge"
local badgeType = config.Type or "Default" -- Default, Success, Warning, Error, Info, Premium
local parent = GetParent(config)
local badgeColors = {
Default = currentTheme.Accent,
Success = currentTheme.Success,
Warning = currentTheme.Warning,
Error = currentTheme.Error,
Info = currentTheme.Info,
Premium = currentTheme.Premium,
}
local color = badgeColors[badgeType] or currentTheme.Accent
local Frame = Create("Frame", {
Name = text .. "Badge", Size = UDim2.new(0, 0, 0, 18),
BackgroundColor3 = color, BorderSizePixel = 0,
AutomaticSize = Enum.AutomaticSize.X, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(0, 0, 1, 0),
Position = UDim2.new(0, 8, 0, 0), BackgroundTransparency = 1,
Text = text, TextColor3 = Color3.fromRGB(255,255,255), TextSize = 9,
Font = Config.FontBold, AutomaticSize = Enum.AutomaticSize.X, Parent = Frame,
})
local Obj = {
Frame = Frame, Text = Label,
UpdateTheme = function(self, newTheme) end,
Set = function(self, txt) Label.Text = txt end,
SetType = function(self, t)
badgeType = t
Frame.BackgroundColor3 = badgeColors[t] or currentTheme.Accent
end,
}
return AddElement(self, Obj)
end
-- 20. ACCORDION
function Tab:CreateAccordion(config)
config = config or {}
local title = config.Title or "Accordion"
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = title .. "Accordion", Size = UDim2.new(1, 0, 0, 32),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0,
ClipsDescendants = true, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Header = Create("TextButton", {
Name = "Header", Size = UDim2.new(1, 0, 0, 32),
BackgroundTransparency = 1, Text = "", Parent = Frame,
})
local TitleLabel = Create("TextLabel", {
Name = "Title", Size = UDim2.new(1, -40, 1, 0),
Position = UDim2.new(0, 12, 0, 0), BackgroundTransparency = 1,
Text = title, TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.FontBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = Header,
})
local Arrow = Create("TextLabel", {
Name = "Arrow", Size = UDim2.new(0, 20, 0, 32),
Position = UDim2.new(1, -28, 0, 0), BackgroundTransparency = 1,
Text = "▼", TextColor3 = currentTheme.TextDim, TextSize = 12,
Font = Config.Font, Parent = Header,
})
local Content = Create("Frame", {
Name = "Content", Size = UDim2.new(1, 0, 0, 0),
Position = UDim2.new(0, 0, 0, 32), BackgroundTransparency = 1,
AutomaticSize = Enum.AutomaticSize.Y, Parent = Frame,
})
local CL = Create("UIListLayout", {Padding = UDim.new(0, 6), Parent = Content})
local CP = Create("UIPadding", {PaddingTop = UDim.new(0, 4), PaddingBottom = UDim.new(0, 4), PaddingLeft = UDim.new(0, 10), PaddingRight = UDim.new(0, 10), Parent = Content})
local isOpen = false
Header.MouseButton1Click:Connect(function()
isOpen = not isOpen
if isOpen then
Tween(Arrow, {Rotation = 180}, 0.2)
Frame.AutomaticSize = Enum.AutomaticSize.Y
else
Tween(Arrow, {Rotation = 0}, 0.2)
Frame.Size = UDim2.new(1, 0, 0, 32)
end
SafeCall(callback, isOpen)
end)
local Obj = {
Frame = Frame, Content = Content, IsOpen = isOpen,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
TitleLabel.TextColor3 = newTheme.Text
Arrow.TextColor3 = newTheme.TextDim
end,
Toggle = function(self)
isOpen = not isOpen
if isOpen then
Arrow.Rotation = 180
Frame.AutomaticSize = Enum.AutomaticSize.Y
else
Arrow.Rotation = 0
Frame.Size = UDim2.new(1, 0, 0, 32)
end
end,
}
return AddElement(self, Obj)
end
-- 21. TOOLTIP
function Tab:CreateTooltip(config)
config = config or {}
local text = config.Text or "Tooltip"
local target = config.Target
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "Tooltip", Size = UDim2.new(0, 0, 0, 24),
BackgroundColor3 = currentTheme.Tertiary, BorderSizePixel = 0,
AutomaticSize = Enum.AutomaticSize.X, Visible = false, Parent = ScreenGui,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(0, 0, 1, 0),
Position = UDim2.new(0, 8, 0, 0), BackgroundTransparency = 1,
Text = text, TextColor3 = currentTheme.Text, TextSize = 10,
Font = Config.Font, AutomaticSize = Enum.AutomaticSize.X, Parent = Frame,
})
if target then
target.MouseEnter:Connect(function()
Frame.Visible = true
Frame.Position = UDim2.new(0, target.AbsolutePosition.X, 0, target.AbsolutePosition.Y - 30)
Tween(Frame, {BackgroundTransparency = 0}, 0.2)
end)
target.MouseLeave:Connect(function()
Tween(Frame, {BackgroundTransparency = 1}, 0.2, nil, nil, function() Frame.Visible = false end)
end)
end
local Obj = {
Frame = Frame, Text = Label,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Tertiary
Label.TextColor3 = newTheme.Text
end,
Set = function(self, txt) Label.Text = txt end,
Show = function(self) Frame.Visible = true Tween(Frame, {BackgroundTransparency = 0}, 0.2) end,
Hide = function(self) Tween(Frame, {BackgroundTransparency = 1}, 0.2, nil, nil, function() Frame.Visible = false end) end,
}
return AddElement(self, Obj)
end
-- 22. TABLE / DATA GRID
function Tab:CreateDataGrid(config)
config = config or {}
local columns = config.Columns or {"Name", "Value"}
local rows = config.Rows or {}
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "DataGrid", Size = UDim2.new(1, 0, 0, 40 + (#rows * 26)),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Header = Create("Frame", {
Name = "Header", Size = UDim2.new(1, 0, 0, 24),
BackgroundColor3 = currentTheme.Tertiary, BorderSizePixel = 0, Parent = Frame,
})
local HC = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Header})
local colWidth = 1 / #columns
for i, col in ipairs(columns) do
local ColLabel = Create("TextLabel", {
Size = UDim2.new(colWidth, -4, 1, 0),
Position = UDim2.new((i-1)*colWidth, 2, 0, 0),
BackgroundTransparency = 1, Text = col,
TextColor3 = currentTheme.Text, TextSize = 10,
Font = Config.FontBold, TextXAlignment = Enum.TextXAlignment.Left,
Parent = Header,
})
end
local rowFrames = {}
local Obj = {
Frame = Frame, Rows = rowFrames,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Header.BackgroundColor3 = newTheme.Tertiary
end,
AddRow = function(self, rowData)
local idx = #rowFrames + 1
local Row = Create("Frame", {
Size = UDim2.new(1, 0, 0, 24),
Position = UDim2.new(0, 0, 0, 24 + (idx-1)*26),
BackgroundTransparency = 1, Parent = Frame,
})
for i, val in ipairs(rowData) do
local ValLabel = Create("TextLabel", {
Size = UDim2.new(colWidth, -4, 1, 0),
Position = UDim2.new((i-1)*colWidth, 2, 0, 0),
BackgroundTransparency = 1, Text = tostring(val),
TextColor3 = currentTheme.TextDim, TextSize = 10,
Font = Config.Font, TextXAlignment = Enum.TextXAlignment.Left,
Parent = Row,
})
end
table.insert(rowFrames, Row)
Frame.Size = UDim2.new(1, 0, 0, 40 + (#rowFrames * 26))
return Row
end,
Clear = function(self)
for _, row in ipairs(rowFrames) do row:Destroy() end
rowFrames = {}
Frame.Size = UDim2.new(1, 0, 0, 40)
end,
}
for _, row in ipairs(rows) do Obj:AddRow(row) end
return AddElement(self, Obj)
end
-- 23. NUMBER SPINNER
function Tab:CreateNumberSpinner(config)
config = config or {}
local text = config.Text or "Spinner"
local min = config.Min or 0
local max = config.Max or 100
local default = config.Default or min
local increment = config.Increment or 1
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Spinner", Size = UDim2.new(1, 0, 0, 34),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(1, -100, 1, 0),
Position = UDim2.new(0, 12, 0, 0), BackgroundTransparency = 1,
Text = text, TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.Font, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local ValueBox = Create("TextBox", {
Name = "Value", Size = UDim2.new(0, 50, 0, 24),
Position = UDim2.new(1, -90, 0.5, -12), BackgroundColor3 = currentTheme.Tertiary,
Text = tostring(default), TextColor3 = currentTheme.Text, TextSize = 11,
Font = Config.FontBold, Parent = Frame,
})
local VBC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = ValueBox})
local MinusBtn = Create("TextButton", {
Name = "Minus", Size = UDim2.new(0, 24, 0, 24),
Position = UDim2.new(1, -36, 0.5, -12), BackgroundColor3 = currentTheme.Accent,
Text = "−", TextColor3 = Color3.fromRGB(255,255,255), TextSize = 14,
Font = Config.FontBold, Parent = Frame,
})
local MBC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = MinusBtn})
local PlusBtn = Create("TextButton", {
Name = "Plus", Size = UDim2.new(0, 24, 0, 24),
Position = UDim2.new(1, -62, 0.5, -12), BackgroundColor3 = currentTheme.Accent,
Text = "+", TextColor3 = Color3.fromRGB(255,255,255), TextSize = 14,
Font = Config.FontBold, Parent = Frame,
})
local PBC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = PlusBtn})
local currentValue = default
local function Update(val)
val = math.clamp(val, min, max)
currentValue = val
ValueBox.Text = tostring(val)
SafeCall(callback, val)
end
PlusBtn.MouseButton1Click:Connect(function() Update(currentValue + increment) end)
MinusBtn.MouseButton1Click:Connect(function() Update(currentValue - increment) end)
ValueBox.FocusLost:Connect(function()
local val = tonumber(ValueBox.Text) or min
Update(val)
end)
local Obj = {
Frame = Frame, Value = currentValue,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Label.TextColor3 = newTheme.Text
ValueBox.BackgroundColor3 = newTheme.Tertiary
ValueBox.TextColor3 = newTheme.Text
MinusBtn.BackgroundColor3 = newTheme.Accent
PlusBtn.BackgroundColor3 = newTheme.Accent
end,
Set = function(self, val) Update(val) end,
Get = function(self) return currentValue end,
}
return AddElement(self, Obj)
end
-- 24. SEARCH BAR
function Tab:CreateSearchBar(config)
config = config or {}
local placeholder = config.Placeholder or "Search..."
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "SearchBar", Size = UDim2.new(1, 0, 0, 32),
BackgroundColor3 = currentTheme.Tertiary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Icon = Create("TextLabel", {
Name = "Icon", Size = UDim2.new(0, 24, 0, 24),
Position = UDim2.new(0, 6, 0.5, -12), BackgroundTransparency = 1,
Text = "🔍", TextColor3 = currentTheme.TextDim, TextSize = 12,
Font = Config.Font, Parent = Frame,
})
local Box = Create("TextBox", {
Name = "Box", Size = UDim2.new(1, -36, 1, 0),
Position = UDim2.new(0, 30, 0, 0), BackgroundTransparency = 1,
Text = "", PlaceholderText = placeholder,
TextColor3 = currentTheme.Text, PlaceholderColor3 = currentTheme.TextDark,
TextSize = 12, Font = Config.Font, Parent = Frame,
})
Box.Changed:Connect(function(prop)
if prop == "Text" then SafeCall(callback, Box.Text) end
end)
local Obj = {
Frame = Frame, Box = Box,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Tertiary
Icon.TextColor3 = newTheme.TextDim
Box.TextColor3 = newTheme.Text
Box.PlaceholderColor3 = newTheme.TextDark
end,
Set = function(self, txt) Box.Text = txt end,
Get = function(self) return Box.Text end,
Clear = function(self) Box.Text = "" end,
}
return AddElement(self, Obj)
end
-- 25. RICH TEXT / HTML-LIKE LABEL
function Tab:CreateRichText(config)
config = config or {}
local text = config.Text or "Bold and italic"
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "RichText", Size = UDim2.new(1, 0, 0, 40),
BackgroundTransparency = 1, AutomaticSize = Enum.AutomaticSize.Y, Parent = parent,
})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(1, 0, 0, 0),
BackgroundTransparency = 1, Text = text,
TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.Font, TextWrapped = true,
AutomaticSize = Enum.AutomaticSize.Y, RichText = true,
TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local Obj = {
Frame = Frame, Text = Label,
UpdateTheme = function(self, newTheme) Label.TextColor3 = newTheme.Text end,
Set = function(self, txt) Label.Text = txt end,
}
return AddElement(self, Obj)
end
-- 26. CODE BLOCK
function Tab:CreateCodeBlock(config)
config = config or {}
local code = config.Code or "print('Hello World')"
local language = config.Language or "lua"
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "CodeBlock", Size = UDim2.new(1, 0, 0, 80),
BackgroundColor3 = currentTheme.Tertiary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local LangLabel = Create("TextLabel", {
Name = "Lang", Size = UDim2.new(0, 60, 0, 16),
Position = UDim2.new(0, 8, 0, 4), BackgroundTransparency = 1,
Text = language, TextColor3 = currentTheme.TextDark, TextSize = 9,
Font = Config.FontBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local CodeLabel = Create("TextLabel", {
Name = "Code", Size = UDim2.new(1, -16, 1, -24),
Position = UDim2.new(0, 8, 0, 20), BackgroundTransparency = 1,
Text = code, TextColor3 = currentTheme.TextDim, TextSize = 11,
Font = Enum.Font.Code, TextWrapped = true, TextXAlignment = Enum.TextXAlignment.Left,
Parent = Frame,
})
local Obj = {
Frame = Frame, Code = CodeLabel,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Tertiary
LangLabel.TextColor3 = newTheme.TextDark
CodeLabel.TextColor3 = newTheme.TextDim
end,
Set = function(self, txt) CodeLabel.Text = txt end,
}
return AddElement(self, Obj)
end
-- 27. COLLAPSIBLE
function Tab:CreateCollapsible(config)
config = config or {}
local title = config.Title or "Collapsible"
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = title .. "Collapsible", Size = UDim2.new(1, 0, 0, 32),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0,
ClipsDescendants = true, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Header = Create("TextButton", {
Name = "Header", Size = UDim2.new(1, 0, 0, 32),
BackgroundTransparency = 1, Text = "", Parent = Frame,
})
local TitleLabel = Create("TextLabel", {
Name = "Title", Size = UDim2.new(1, -40, 1, 0),
Position = UDim2.new(0, 12, 0, 0), BackgroundTransparency = 1,
Text = title, TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.FontBold, TextXAlignment = Enum.TextXAlignment.Left, Parent = Header,
})
local Toggle = Create("Frame", {
Name = "Toggle", Size = UDim2.new(0, 36, 0, 18),
Position = UDim2.new(1, -44, 0.5, -9), BackgroundColor3 = currentTheme.Tertiary,
BorderSizePixel = 0, Parent = Header,
})
local TC = Create("UICorner", {CornerRadius = UDim.new(1, 0), Parent = Toggle})
local Circle = Create("Frame", {
Name = "Circle", Size = UDim2.new(0, 14, 0, 14),
Position = UDim2.new(0, 2, 0.5, -7), BackgroundColor3 = Color3.fromRGB(255,255,255),
BorderSizePixel = 0, Parent = Toggle,
})
local CC = Create("UICorner", {CornerRadius = UDim.new(1, 0), Parent = Circle})
local Content = Create("Frame", {
Name = "Content", Size = UDim2.new(1, 0, 0, 0),
Position = UDim2.new(0, 0, 0, 32), BackgroundTransparency = 1,
AutomaticSize = Enum.AutomaticSize.Y, Parent = Frame,
})
local CL = Create("UIListLayout", {Padding = UDim.new(0, 6), Parent = Content})
local CP = Create("UIPadding", {PaddingTop = UDim.new(0, 4), PaddingBottom = UDim.new(0, 4), PaddingLeft = UDim.new(0, 10), PaddingRight = UDim.new(0, 10), Parent = Content})
local isExpanded = false
Header.MouseButton1Click:Connect(function()
isExpanded = not isExpanded
if isExpanded then
Tween(Toggle, {BackgroundColor3 = currentTheme.Accent}, 0.2)
Tween(Circle, {Position = UDim2.new(1, -16, 0.5, -7)}, 0.2)
Frame.AutomaticSize = Enum.AutomaticSize.Y
else
Tween(Toggle, {BackgroundColor3 = currentTheme.Tertiary}, 0.2)
Tween(Circle, {Position = UDim2.new(0, 2, 0.5, -7)}, 0.2)
Frame.Size = UDim2.new(1, 0, 0, 32)
end
end)
local Obj = {
Frame = Frame, Content = Content, IsExpanded = isExpanded,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
TitleLabel.TextColor3 = newTheme.Text
Toggle.BackgroundColor3 = isExpanded and newTheme.Accent or newTheme.Tertiary
end,
Toggle = function(self)
isExpanded = not isExpanded
if isExpanded then
Toggle.BackgroundColor3 = currentTheme.Accent
Circle.Position = UDim2.new(1, -16, 0.5, -7)
Frame.AutomaticSize = Enum.AutomaticSize.Y
else
Toggle.BackgroundColor3 = currentTheme.Tertiary
Circle.Position = UDim2.new(0, 2, 0.5, -7)
Frame.Size = UDim2.new(1, 0, 0, 32)
end
end,
}
return AddElement(self, Obj)
end
-- 28. BREADCRUMB
function Tab:CreateBreadcrumb(config)
config = config or {}
local items = config.Items or {"Home", "Settings", "Profile"}
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "Breadcrumb", Size = UDim2.new(1, 0, 0, 24),
BackgroundTransparency = 1, Parent = parent,
})
local itemLabels = {}
local xOffset = 0
for i, item in ipairs(items) do
local isLast = (i == #items)
local ItemLabel = Create("TextButton", {
Name = item, Size = UDim2.new(0, 0, 0, 20),
Position = UDim2.new(0, xOffset, 0, 2), BackgroundTransparency = 1,
Text = item, TextColor3 = isLast and currentTheme.Text or currentTheme.Accent,
TextSize = 11, Font = isLast and Config.FontBold or Config.Font,
AutomaticSize = Enum.AutomaticSize.X, Parent = Frame,
})
if not isLast then
local Separator = Create("TextLabel", {
Size = UDim2.new(0, 16, 0, 20),
Position = UDim2.new(0, xOffset + ItemLabel.TextBounds.X + 2, 0, 2),
BackgroundTransparency = 1, Text = ">",
TextColor3 = currentTheme.TextDark, TextSize = 11,
Font = Config.Font, Parent = Frame,
})
xOffset = xOffset + ItemLabel.TextBounds.X + 18
end
if not isLast then
ItemLabel.MouseButton1Click:Connect(function() SafeCall(callback, item, i) end)
end
table.insert(itemLabels, ItemLabel)
end
local Obj = {
Frame = Frame, Items = itemLabels,
UpdateTheme = function(self, newTheme)
for i, lbl in ipairs(itemLabels) do
local isLast = (i == #itemLabels)
lbl.TextColor3 = isLast and newTheme.Text or newTheme.Accent
end
end,
}
return AddElement(self, Obj)
end
-- 29. PAGINATION
function Tab:CreatePagination(config)
config = config or {}
local totalPages = config.TotalPages or 5
local currentPage = config.CurrentPage or 1
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "Pagination", Size = UDim2.new(1, 0, 0, 30),
BackgroundTransparency = 1, Parent = parent,
})
local pageButtons = {}
local btnWidth = math.min(30, (Config.GUIWidth - Config.TabWidth - 40) / totalPages)
for i = 1, totalPages do
local Btn = Create("TextButton", {
Name = "Page" .. i, Size = UDim2.new(0, btnWidth, 0, 26),
Position = UDim2.new(0, (i-1)*(btnWidth+4), 0, 2),
BackgroundColor3 = i == currentPage and currentTheme.Accent or currentTheme.Tertiary,
Text = tostring(i), TextColor3 = i == currentPage and Color3.fromRGB(255,255,255) or currentTheme.Text,
TextSize = 11, Font = Config.FontBold, Parent = Frame,
})
local BC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = Btn})
Btn.MouseButton1Click:Connect(function()
currentPage = i
for j, b in ipairs(pageButtons) do
b.BackgroundColor3 = (j == i) and currentTheme.Accent or currentTheme.Tertiary
b.TextColor3 = (j == i) and Color3.fromRGB(255,255,255) or currentTheme.Text
end
SafeCall(callback, i)
end)
table.insert(pageButtons, Btn)
end
local Obj = {
Frame = Frame, CurrentPage = currentPage, Buttons = pageButtons,
UpdateTheme = function(self, newTheme)
for i, btn in ipairs(pageButtons) do
btn.BackgroundColor3 = (i == currentPage) and newTheme.Accent or newTheme.Tertiary
end
end,
SetPage = function(self, page)
currentPage = page
for i, btn in ipairs(pageButtons) do
btn.BackgroundColor3 = (i == page) and currentTheme.Accent or currentTheme.Tertiary
btn.TextColor3 = (i == page) and Color3.fromRGB(255,255,255) or currentTheme.Text
end
end,
}
return AddElement(self, Obj)
end
-- 30. SKELETON / LOADING
function Tab:CreateSkeleton(config)
config = config or {}
local lines = config.Lines or 3
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = "Skeleton", Size = UDim2.new(1, 0, 0, 10 + (lines * 16)),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local skeletonBars = {}
for i = 1, lines do
local Bar = Create("Frame", {
Name = "Bar" .. i, Size = UDim2.new(math.random(60, 100)/100, 0, 0, 10),
Position = UDim2.new(0, 10, 0, 10 + (i-1)*16),
BackgroundColor3 = currentTheme.Tertiary, BorderSizePixel = 0,
Parent = Frame,
})
local BC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = Bar})
table.insert(skeletonBars, Bar)
-- Shimmer effect
local Shimmer = Create("Frame", {
Size = UDim2.new(0.3, 0, 1, 0),
Position = UDim2.new(-0.3, 0, 0, 0),
BackgroundColor3 = Color3.fromRGB(255,255,255),
BackgroundTransparency = 0.9,
BorderSizePixel = 0, Parent = Bar,
})
local SC = Create("UICorner", {CornerRadius = UDim.new(0, 4), Parent = Shimmer})
task.spawn(function()
while Bar and Bar.Parent do
Tween(Shimmer, {Position = UDim2.new(1, 0, 0, 0)}, 1.5)
task.wait(1.5)
Shimmer.Position = UDim2.new(-0.3, 0, 0, 0)
task.wait(0.5)
end
end)
end
local Obj = {
Frame = Frame, Bars = skeletonBars,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
for _, bar in ipairs(skeletonBars) do
bar.BackgroundColor3 = newTheme.Tertiary
end
end,
Destroy = function(self)
for _, bar in ipairs(skeletonBars) do bar:Destroy() end
Frame:Destroy()
end,
}
return AddElement(self, Obj)
end
-- 31. TIMER / COUNTDOWN
function Tab:CreateTimer(config)
config = config or {}
local text = config.Text or "Timer"
local seconds = config.Seconds or 60
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Timer", Size = UDim2.new(1, 0, 0, 34),
BackgroundColor3 = currentTheme.Secondary, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(0.5, 0, 1, 0),
Position = UDim2.new(0, 12, 0, 0), BackgroundTransparency = 1,
Text = text, TextColor3 = currentTheme.Text, TextSize = 12,
Font = Config.Font, TextXAlignment = Enum.TextXAlignment.Left, Parent = Frame,
})
local TimeLabel = Create("TextLabel", {
Name = "Time", Size = UDim2.new(0.5, -16, 1, 0),
Position = UDim2.new(0.5, 4, 0, 0), BackgroundTransparency = 1,
Text = string.format("%02d:%02d", math.floor(seconds/60), seconds%60),
TextColor3 = currentTheme.Accent, TextSize = 12,
Font = Config.FontBold, TextXAlignment = Enum.TextXAlignment.Right, Parent = Frame,
})
local isRunning = false
local currentSeconds = seconds
local connection
local function FormatTime(s)
return string.format("%02d:%02d", math.floor(s/60), s%60)
end
local Obj = {
Frame = Frame, Time = currentSeconds,
UpdateTheme = function(self, newTheme)
Frame.BackgroundColor3 = newTheme.Secondary
Label.TextColor3 = newTheme.Text
TimeLabel.TextColor3 = newTheme.Accent
end,
Start = function(self)
if isRunning then return end
isRunning = true
connection = task.spawn(function()
while isRunning and currentSeconds > 0 do
task.wait(1)
currentSeconds = currentSeconds - 1
TimeLabel.Text = FormatTime(currentSeconds)
if currentSeconds <= 0 then
isRunning = false
SafeCall(callback)
end
end
end)
end,
Stop = function(self) isRunning = false end,
Reset = function(self)
isRunning = false
currentSeconds = seconds
TimeLabel.Text = FormatTime(currentSeconds)
end,
Set = function(self, s)
seconds = s
currentSeconds = s
TimeLabel.Text = FormatTime(s)
end,
}
return AddElement(self, Obj)
end
-- 32. COPY BUTTON
function Tab:CreateCopyButton(config)
config = config or {}
local text = config.Text or "Copy"
local copyText = config.CopyText or "Copied!"
local callback = config.Callback or function() end
local parent = GetParent(config)
local Frame = Create("Frame", {
Name = text .. "Copy", Size = UDim2.new(1, 0, 0, 34),
BackgroundColor3 = currentTheme.Accent, BorderSizePixel = 0, Parent = parent,
})
local Corner = Create("UICorner", {CornerRadius = UDim.new(0, 6), Parent = Frame})
local Label = Create("TextLabel", {
Name = "Text", Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1, Text = "📋 " .. text,
TextColor3 = Color3.fromRGB(255,255,255), TextSize = 12,
Font = Config.FontBold, Parent = Frame,
})
local Click = Create("TextButton", {
Name = "Click", Size = UDim2.new(1, 0, 1, 0),
BackgroundTransparency = 1, Text = "", Parent = Frame,
})
Click.MouseButton1Click:Connect(function()
pcall(function()
setclipboard(copyText)
end)
Label.Text = "✅ Copied!"
task.delay(2, function()
if Label and Label.Parent then
Label.Text = "📋 " .. text
end
end)
SafeCall(callback, copyText)
end)
local Obj = {
Frame = Frame, Text = Label,
UpdateTheme = function(self, newTheme) Frame.BackgroundColor3 = newTheme.Accent end,
SetText = function(self, txt) copyText = txt end,
}
return AddElement(self, Obj)
end
return Tab
end
-- ═══════════════════════════════════════════════════════════════════════════════
-- WINDOW METHODS
-- ═══════════════════════════════════════════════════════════════════════════════
function Window:SetTitle(newTitle)
Config.Title = newTitle
TitleText.Text = newTitle
if KeyBadge then
pcall(function()
KeyBadge.Position = UDim2.new(0, 10 + TitleText.TextBounds.X + 6, 0, 6)
end)
end
end
function Window:SetSize(width, height)
Config.GUIWidth = width
Config.GUIHeight = height
Tween(MainFrame, {Size = UDim2.new(0, width, 0, height)}, 0.3)
end
function Window:SetPosition(pos)
Tween(MainFrame, {Position = pos}, 0.3)
end
function Window:Show()
MainFrame.Visible = true
Tween(MainFrame, {Size = UDim2.new(0, Config.GUIWidth, 0, Config.GUIHeight)}, 0.3)
end
function Window:Hide()
Tween(MainFrame, {Size = UDim2.new(0, 0, 0, 0)}, 0.3, nil, nil, function()
MainFrame.Visible = false
end)
end
function Window:Destroy()
Tween(MainFrame, {Size = UDim2.new(0, 0, 0, 0)}, 0.2, nil, nil, function()
self.IsDestroyed = true
ScreenGui:Destroy()
end)
end
function Window:IsVisible()
return MainFrame.Visible
end
function Window:GetConfig()
return Config
end
-- ═══════════════════════════════════════════════════════════════════════════════
-- ANIMATED ENTRANCE
-- ═══════════════════════════════════════════════════════════════════════════════
MainFrame.Size = UDim2.new(0, 0, 0, 0)
Tween(MainFrame, {Size = UDim2.new(0, Config.GUIWidth, 0, Config.GUIHeight)}, 0.5)
SafeCall(Config.OnLoad)
return Window
end
-- ═══════════════════════════════════════════════════════════════════════════════
-- EXAMPLE USAGE
-- ═══════════════════════════════════════════════════════════════════════════════
--[[
local Nexus = loadstring(game:HttpGet("YOUR_URL"))()
local Window = Nexus:CreateWindow({
Title = "Nexus Hub",
SubTitle = "v3.0 Premium",
Executor = "Synapse X",
Theme = "Dark",
KeySystem = true,
ShowUserInfo = true,
ShowPremiumBadge = true,
Position = "Center",
NotificationPosition = "BottomRight",
OnLoad = function() print("Window loaded!") end,
OnKeyAuthenticated = function(keyType) print("Key: " .. keyType) end,
})
Window:ShowKeySystem()
local MainTab = Window:CreateTab({Name = "Main", Icon = ""})
local VisualTab = Window:CreateTab({Name = "Visual", Icon = ""})
local SettingsTab = Window:CreateTab({Name = "Settings", Icon = ""})
-- Section
local Section = MainTab:CreateSection({Name = "Player Mods"})
-- All 32 components demonstrated:
MainTab:CreateButton({Text = "Infinite Jump", Section = Section, Callback = function() print("Jump!") end})
MainTab:CreateToggle({Text = "Auto Farm", Default = false, Section = Section, Callback = function(v) print(v) end})
MainTab:CreateSlider({Text = "Speed", Min = 16, Max = 500, Default = 16, Suffix = " s/s", Section = Section, Callback = function(v) print(v) end})
MainTab:CreateDropdown({Text = "Teleport", Options = {"Spawn","Shop","Boss"}, Default = "Spawn", Section = Section, Callback = function(v) print(v) end})
MainTab:CreateInput({Text = "Player", Placeholder = "Name...", Section = Section, Callback = function(t) print(t) end})
MainTab:CreateKeybind({Text = "Fly Key", Default = Enum.KeyCode.F, Section = Section, Callback = function(k) print(k) end})
MainTab:CreateColorPicker({Text = "ESP Color", Default = Color3.fromRGB(255,0,0), Section = Section, Callback = function(c) print(c) end})
MainTab:CreateLabel({Text = "Info Label", Color = Color3.fromRGB(200,200,200), Section = Section})
MainTab:CreateParagraph({Title = "Notice", Content = "This is a paragraph component for longer text.", Section = Section})
MainTab:CreateProgressBar({Text = "Loading", Value = 45, Section = Section})
MainTab:CreateDivider({Section = Section})
MainTab:CreateImage({Image = "rbxassetid://123456", Size = UDim2.new(1,0,0,80), Section = Section})
MainTab:CreateSpacer({Height = 10, Section = Section})
MainTab:CreateList({Title = "Scripts", Items = {"Aimbot","ESP","Fly"}, Section = Section, Callback = function(i) print(i) end})
MainTab:CreateMultiToggle({Text = "Features", Options = {"Aim","ESP","Wall"}, Section = Section, Callback = function(s) print(s) end})
MainTab:CreateThemeSelector({Section = Section})
MainTab:CreateChip({Text = "New", Color = Color3.fromRGB(46,204,113), Section = Section})
MainTab:CreateBadge({Text = "BETA", Type = "Warning", Section = Section})
MainTab:CreateAccordion({Title = "Advanced Settings", Section = Section})
MainTab:CreateDataGrid({Columns = {"Name","Value"}, Rows = {{"Speed","100"},{"Jump","50"}}, Section = Section})
MainTab:CreateNumberSpinner({Text = "Amount", Min = 0, Max = 100, Default = 10, Section = Section})
MainTab:CreateSearchBar({Placeholder = "Search scripts...", Section = Section, Callback = function(t) print(t) end})
MainTab:CreateRichText({Text = "Bold Italic Underline", Section = Section})
MainTab:CreateCodeBlock({Code = "print('Hello World')", Language = "lua", Section = Section})
MainTab:CreateCollapsible({Title = "More Options", Section = Section})
MainTab:CreateBreadcrumb({Items = {"Home","Settings","Profile"}, Section = Section})
MainTab:CreatePagination({TotalPages = 5, CurrentPage = 1, Section = Section, Callback = function(p) print(p) end})
MainTab:CreateSkeleton({Lines = 3, Section = Section})
MainTab:CreateTimer({Text = "Cooldown", Seconds = 60, Section = Section, Callback = function() print("Done!") end})
MainTab:CreateCopyButton({Text = "Copy Script", CopyText = "loadstring()()", Section = Section})
Window:Notify({Title = "Welcome!", Content = "Nexus UI v3.0 loaded!", Type = "Success", Duration = 3})
--]]
return NexusUI