--[[
███████╗██╗░░░░░██╗░░░██╗███████╗███╗░░██╗████████╗ ██████╗░██╗░░░░░██╗░░░██╗░██████╗
██╔════╝██║░░░░░██║░░░██║██╔════╝████╗░██║╚══██╔══╝ ██╔══██╗██║░░░░░██║░░░██║██╔════╝
█████╗░░██║░░░░░██║░░░██║█████╗░░██╔██╗██║░░░██║░░░ ██████╔╝██║░░░░░██║░░░██║╚█████╗░
██╔══╝░░██║░░░░░██║░░░██║██╔══╝░░██║╚████║░░░██║░░░ ██╔═══╝░██║░░░░░██║░░░██║░╚═══██╗
██║░░░░░███████╗╚██████╔╝███████╗██║░╚███║░░░██║░░░ ██║░░░░░███████╗╚██████╔╝██████╔╝
╚═╝░░░░░╚══════╝░╚═════╝░╚══════╝╚═╝░░╚══╝░░░╚═╝░░░ ╚═╝░░░░░╚══════╝░╚═════╝░╚═════╝░
A modified version of Fluent
https://fluent-pl.us
]]
local Lighting = game:GetService("Lighting")
local RunService = game:GetService("RunService")
local LocalPlayer = game:GetService("Players").LocalPlayer
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local TextService = game:GetService("TextService")
local Camera = game:GetService("Workspace").CurrentCamera
local Mouse = LocalPlayer:GetMouse()
local httpService = game:GetService("HttpService")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Mobile = not RunService:IsStudio() and table.find({Enum.Platform.IOS, Enum.Platform.Android}, UserInputService:GetPlatform()) ~= nil
local fischbypass
if game.GameId == 5750914919 then
fischbypass = true
end
local RenderStepped = RunService.RenderStepped
local ProtectGui = protectgui or (syn and syn.protect_gui) or function() end
local Themes = {
Names = {
"Dark",
"Darker",
"AMOLED",
"Light",
"Balloon",
"SoftCream",
"Aqua",
"Amethyst",
"Rose",
"Midnight",
"Forest",
"Sunset",
"Ocean",
"Emerald",
"Sapphire",
"Cloud",
"Grape",
"Bloody",
"Arctic"
},
Dark = {
Name = "Dark",
Accent = Color3.fromRGB(96, 205, 255),
AcrylicMain = Color3.fromRGB(60, 60, 60),
AcrylicBorder = Color3.fromRGB(90, 90, 90),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(40, 40, 40), Color3.fromRGB(40, 40, 40)),
AcrylicNoise = 0.9,
TitleBarLine = Color3.fromRGB(75, 75, 75),
Tab = Color3.fromRGB(120, 120, 120),
Element = Color3.fromRGB(120, 120, 120),
ElementBorder = Color3.fromRGB(35, 35, 35),
InElementBorder = Color3.fromRGB(90, 90, 90),
ElementTransparency = 0.87,
ToggleSlider = Color3.fromRGB(120, 120, 120),
ToggleToggled = Color3.fromRGB(42, 42, 42),
SliderRail = Color3.fromRGB(120, 120, 120),
DropdownFrame = Color3.fromRGB(160, 160, 160),
DropdownHolder = Color3.fromRGB(45, 45, 45),
DropdownBorder = Color3.fromRGB(35, 35, 35),
DropdownOption = Color3.fromRGB(120, 120, 120),
Keybind = Color3.fromRGB(120, 120, 120),
Input = Color3.fromRGB(160, 160, 160),
InputFocused = Color3.fromRGB(10, 10, 10),
InputIndicator = Color3.fromRGB(150, 150, 150),
Dialog = Color3.fromRGB(45, 45, 45),
DialogHolder = Color3.fromRGB(35, 35, 35),
DialogHolderLine = Color3.fromRGB(30, 30, 30),
DialogButton = Color3.fromRGB(45, 45, 45),
DialogButtonBorder = Color3.fromRGB(80, 80, 80),
DialogBorder = Color3.fromRGB(70, 70, 70),
DialogInput = Color3.fromRGB(55, 55, 55),
DialogInputLine = Color3.fromRGB(160, 160, 160),
Text = Color3.fromRGB(240, 240, 240),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(120, 120, 120),
HoverChange = 0.07,
},
Darker = {
Name = "Darker",
Accent = Color3.fromRGB(56, 109, 223),
AcrylicMain = Color3.fromRGB(30, 30, 30),
AcrylicBorder = Color3.fromRGB(60, 60, 60),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(17, 17, 17), Color3.fromRGB(18, 18, 18)),
AcrylicNoise = 0.94,
TitleBarLine = Color3.fromRGB(65, 65, 65),
Tab = Color3.fromRGB(100, 100, 100),
Element = Color3.fromRGB(70, 70, 70),
ElementBorder = Color3.fromRGB(25, 25, 25),
InElementBorder = Color3.fromRGB(55, 55, 55),
ElementTransparency = 0.82,
DropdownFrame = Color3.fromRGB(120, 120, 120),
DropdownHolder = Color3.fromRGB(35, 35, 35),
DropdownBorder = Color3.fromRGB(25, 25, 25),
Dialog = Color3.fromRGB(35, 35, 35),
DialogHolder = Color3.fromRGB(25, 25, 25),
DialogHolderLine = Color3.fromRGB(20, 20, 20),
DialogButton = Color3.fromRGB(35, 35, 35),
DialogButtonBorder = Color3.fromRGB(55, 55, 55),
DialogBorder = Color3.fromRGB(50, 50, 50),
DialogInput = Color3.fromRGB(45, 45, 45),
DialogInputLine = Color3.fromRGB(120, 120, 120),
},
AMOLED = {
Name = "AMOLED",
Accent = Color3.fromRGB(255, 255, 255),
AcrylicMain = Color3.fromRGB(0, 0, 0),
AcrylicBorder = Color3.fromRGB(20, 20, 20),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(0, 0, 0), Color3.fromRGB(0, 0, 0)),
AcrylicNoise = 1,
TitleBarLine = Color3.fromRGB(25, 25, 25),
Tab = Color3.fromRGB(40, 40, 40),
Element = Color3.fromRGB(15, 15, 15),
ElementBorder = Color3.fromRGB(0, 0, 0),
InElementBorder = Color3.fromRGB(40, 40, 40),
ElementTransparency = 0.95,
ToggleSlider = Color3.fromRGB(40, 40, 40),
ToggleToggled = Color3.fromRGB(255, 255, 255),
SliderRail = Color3.fromRGB(40, 40, 40),
DropdownFrame = Color3.fromRGB(20, 20, 20),
DropdownHolder = Color3.fromRGB(0, 0, 0),
DropdownBorder = Color3.fromRGB(0, 0, 0),
DropdownOption = Color3.fromRGB(40, 40, 40),
Keybind = Color3.fromRGB(40, 40, 40),
Input = Color3.fromRGB(40, 40, 40),
InputFocused = Color3.fromRGB(0, 0, 0),
InputIndicator = Color3.fromRGB(60, 60, 60),
InputIndicatorFocus = Color3.fromRGB(255, 255, 255),
Dialog = Color3.fromRGB(0, 0, 0),
DialogHolder = Color3.fromRGB(0, 0, 0),
DialogHolderLine = Color3.fromRGB(20, 20, 20),
DialogButton = Color3.fromRGB(15, 15, 15),
DialogButtonBorder = Color3.fromRGB(30, 30, 30),
DialogBorder = Color3.fromRGB(27, 27, 27),
DialogInput = Color3.fromRGB(15, 15, 15),
DialogInputLine = Color3.fromRGB(60, 60, 60),
Text = Color3.fromRGB(255, 255, 255),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(40, 40, 40),
HoverChange = 0.04
},
Light = {
Name = "Light",
Accent = Color3.fromRGB(0, 103, 192),
AcrylicMain = Color3.fromRGB(200, 200, 200),
AcrylicBorder = Color3.fromRGB(120, 120, 120),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(255, 255, 255), Color3.fromRGB(255, 255, 255)),
AcrylicNoise = 0.96,
TitleBarLine = Color3.fromRGB(160, 160, 160),
Tab = Color3.fromRGB(90, 90, 90),
Element = Color3.fromRGB(255, 255, 255),
ElementBorder = Color3.fromRGB(180, 180, 180),
InElementBorder = Color3.fromRGB(150, 150, 150),
ElementTransparency = 0.65,
ToggleSlider = Color3.fromRGB(40, 40, 40),
ToggleToggled = Color3.fromRGB(255, 255, 255),
SliderRail = Color3.fromRGB(40, 40, 40),
DropdownFrame = Color3.fromRGB(200, 200, 200),
DropdownHolder = Color3.fromRGB(240, 240, 240),
DropdownBorder = Color3.fromRGB(200, 200, 200),
DropdownOption = Color3.fromRGB(150, 150, 150),
Keybind = Color3.fromRGB(120, 120, 120),
Input = Color3.fromRGB(200, 200, 200),
InputFocused = Color3.fromRGB(100, 100, 100),
InputIndicator = Color3.fromRGB(80, 80, 80),
InputIndicatorFocus = Color3.fromRGB(0, 103, 192),
Dialog = Color3.fromRGB(255, 255, 255),
DialogHolder = Color3.fromRGB(240, 240, 240),
DialogHolderLine = Color3.fromRGB(228, 228, 228),
DialogButton = Color3.fromRGB(255, 255, 255),
DialogButtonBorder = Color3.fromRGB(190, 190, 190),
DialogBorder = Color3.fromRGB(140, 140, 140),
DialogInput = Color3.fromRGB(250, 250, 250),
DialogInputLine = Color3.fromRGB(160, 160, 160),
Text = Color3.fromRGB(0, 0, 0),
SubText = Color3.fromRGB(40, 40, 40),
Hover = Color3.fromRGB(50, 50, 50),
HoverChange = 0.16,
},
Balloon = {
Name = "Balloon",
Accent = Color3.fromRGB(100, 170, 255),
AcrylicMain = Color3.fromRGB(189, 224, 255),
AcrylicBorder = Color3.fromRGB(160, 227, 255),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(240, 250, 255), Color3.fromRGB(210, 235, 250)),
AcrylicNoise = 1,
TitleBarLine = Color3.fromRGB(150, 200, 255),
Tab = Color3.fromRGB(153, 185, 255),
Element = Color3.fromRGB(160, 200, 255),
ElementBorder = Color3.fromRGB(130, 170, 230),
InElementBorder = Color3.fromRGB(120, 174, 240),
ElementTransparency = 0.80,
ToggleSlider = Color3.fromRGB(93, 163, 255),
ToggleToggled = Color3.fromRGB(60, 112, 180),
SliderRail = Color3.fromRGB(170, 220, 255),
DropdownFrame = Color3.fromRGB(175, 235, 255),
DropdownHolder = Color3.fromRGB(200, 220, 240),
DropdownBorder = Color3.fromRGB(130, 170, 230),
DropdownOption = Color3.fromRGB(146, 202, 255),
Keybind = Color3.fromRGB(170, 220, 255),
Input = Color3.fromRGB(170, 220, 255),
InputFocused = Color3.fromRGB(75, 95, 140),
InputIndicator = Color3.fromRGB(190, 250, 255),
InputIndicatorFocus = Color3.fromRGB(100, 170, 255),
Dialog = Color3.fromRGB(189, 230, 255),
DialogHolder = Color3.fromRGB(201, 239, 255),
DialogHolderLine = Color3.fromRGB(197, 236, 250),
DialogButton = Color3.fromRGB(219, 252, 255),
DialogButtonBorder = Color3.fromRGB(160, 200, 255),
DialogBorder = Color3.fromRGB(175, 220, 255),
DialogInput = Color3.fromRGB(160, 200, 255),
DialogInputLine = Color3.fromRGB(185, 230, 255),
Text = Color3.fromRGB(30, 30, 30),
SubText = Color3.fromRGB(90, 90, 90),
Hover = Color3.fromRGB(170, 220, 255),
HoverChange = 0.03
},
SoftCream = {
Name = "SoftCream",
Accent = Color3.fromRGB(206, 163, 90),
AcrylicMain = Color3.fromRGB(255, 245, 220),
AcrylicBorder = Color3.fromRGB(255, 230, 200),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(255, 245, 220), Color3.fromRGB(255, 235, 210)),
AcrylicNoise = 0.93,
TitleBarLine = Color3.fromRGB(255, 220, 190),
Tab = Color3.fromRGB(199, 165, 112),
Element = Color3.fromRGB(255, 216, 161),
ElementBorder = Color3.fromRGB(234, 193, 111),
InElementBorder = Color3.fromRGB(255, 212, 143),
ElementTransparency = 0.80,
ToggleSlider = Color3.fromRGB(214, 175, 97),
ToggleToggled = Color3.fromRGB(200, 160, 100),
SliderRail = Color3.fromRGB(255, 220, 190),
DropdownFrame = Color3.fromRGB(255, 228, 164),
DropdownHolder = Color3.fromRGB(250, 240, 225),
DropdownBorder = Color3.fromRGB(255, 210, 180),
DropdownOption = Color3.fromRGB(255, 190, 115),
Keybind = Color3.fromRGB(255, 220, 190),
Input = Color3.fromRGB(255, 220, 190),
InputFocused = Color3.fromRGB(180, 140, 80),
InputIndicator = Color3.fromRGB(255, 250, 205),
InputIndicatorFocus = Color3.fromRGB(255, 236, 158),
Dialog = Color3.fromRGB(255, 255, 240),
DialogHolder = Color3.fromRGB(255, 245, 220),
DialogHolderLine = Color3.fromRGB(255, 240, 210),
DialogButton = Color3.fromRGB(255, 255, 240),
DialogButtonBorder = Color3.fromRGB(255, 210, 180),
DialogBorder = Color3.fromRGB(255, 220, 190),
DialogInput = Color3.fromRGB(255, 210, 180),
DialogInputLine = Color3.fromRGB(255, 225, 205),
Text = Color3.fromRGB(30, 30, 30),
SubText = Color3.fromRGB(90, 90, 90),
Hover = Color3.fromRGB(255, 220, 190),
HoverChange = 0.03
},
Aqua = {
Name = "Aqua",
Accent = Color3.fromRGB(38, 166, 178),
AcrylicMain = Color3.fromRGB(18, 54, 61),
AcrylicBorder = Color3.fromRGB(80, 118, 130),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(41, 101, 139), Color3.fromRGB(11, 132, 128)),
AcrylicNoise = 0.92,
TitleBarLine = Color3.fromRGB(68, 135, 136),
Tab = Color3.fromRGB(126, 175, 180),
Element = Color3.fromRGB(66, 130, 160),
ElementBorder = Color3.fromRGB(40, 100, 122),
InElementBorder = Color3.fromRGB(75, 109, 110),
ElementTransparency = 0.87,
ToggleSlider = Color3.fromRGB(100, 152, 160),
ToggleToggled = Color3.fromRGB(25, 70, 95),
SliderRail = Color3.fromRGB(115, 150, 160),
DropdownFrame = Color3.fromRGB(158, 194, 200),
DropdownHolder = Color3.fromRGB(39, 99, 116),
DropdownBorder = Color3.fromRGB(33, 119, 120),
DropdownOption = Color3.fromRGB(121, 152, 160),
Keybind = Color3.fromRGB(108, 153, 160),
Input = Color3.fromRGB(112, 156, 160),
InputFocused = Color3.fromRGB(14, 35, 40),
InputIndicator = Color3.fromRGB(137, 181, 190),
Dialog = Color3.fromRGB(27, 113, 130),
DialogHolder = Color3.fromRGB(33, 99, 109),
DialogHolderLine = Color3.fromRGB(34, 81, 86),
DialogButton = Color3.fromRGB(27, 128, 130),
DialogButtonBorder = Color3.fromRGB(62, 100, 110),
DialogBorder = Color3.fromRGB(26, 86, 100),
DialogInput = Color3.fromRGB(36, 107, 105),
DialogInputLine = Color3.fromRGB(70, 120, 130),
Text = Color3.fromRGB(240, 240, 240),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(112, 155, 160),
HoverChange = 0.04,
},
Amethyst = {
Name = "Amethyst",
Accent = Color3.fromRGB(126, 44, 182),
AcrylicMain = Color3.fromRGB(40, 12, 71),
AcrylicBorder = Color3.fromRGB(85, 45, 120),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(34, 19, 49), Color3.fromRGB(41, 24, 57)),
AcrylicNoise = 0.92,
TitleBarLine = Color3.fromRGB(95, 55, 130),
Tab = Color3.fromRGB(135, 75, 170),
Element = Color3.fromRGB(115, 55, 150),
ElementBorder = Color3.fromRGB(60, 35, 85),
InElementBorder = Color3.fromRGB(85, 45, 110),
ElementTransparency = 0.87,
ToggleSlider = Color3.fromRGB(135, 65, 160),
ToggleToggled = Color3.fromRGB(59, 30, 79),
SliderRail = Color3.fromRGB(135, 65, 160),
DropdownFrame = Color3.fromRGB(145, 85, 170),
DropdownHolder = Color3.fromRGB(50, 30, 70),
DropdownBorder = Color3.fromRGB(60, 35, 85),
DropdownOption = Color3.fromRGB(135, 65, 160),
Keybind = Color3.fromRGB(135, 65, 160),
Input = Color3.fromRGB(135, 65, 160),
InputFocused = Color3.fromRGB(25, 15, 35),
InputIndicator = Color3.fromRGB(155, 85, 180),
InputIndicatorFocus = Color3.fromRGB(126, 44, 182),
Dialog = Color3.fromRGB(50, 30, 70),
DialogHolder = Color3.fromRGB(40, 25, 60),
DialogHolderLine = Color3.fromRGB(35, 20, 55),
DialogButton = Color3.fromRGB(50, 30, 70),
DialogButtonBorder = Color3.fromRGB(90, 50, 120),
DialogBorder = Color3.fromRGB(80, 45, 110),
DialogInput = Color3.fromRGB(60, 35, 80),
DialogInputLine = Color3.fromRGB(145, 75, 170),
Text = Color3.fromRGB(240, 240, 240),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(135, 65, 160),
HoverChange = 0.04
},
Rose = {
Name = "Rose",
Accent = Color3.fromRGB(219, 48, 123),
AcrylicMain = Color3.fromRGB(35, 25, 30),
AcrylicBorder = Color3.fromRGB(145, 35, 75),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(65, 25, 45), Color3.fromRGB(75, 30, 50)),
AcrylicNoise = 0.92,
TitleBarLine = Color3.fromRGB(150, 65, 95),
Tab = Color3.fromRGB(190, 85, 115),
Element = Color3.fromRGB(170, 60, 90),
ElementBorder = Color3.fromRGB(95, 35, 55),
InElementBorder = Color3.fromRGB(120, 50, 70),
ElementTransparency = 0.87,
ToggleSlider = Color3.fromRGB(190, 75, 105),
ToggleToggled = Color3.fromRGB(45, 15, 25),
SliderRail = Color3.fromRGB(190, 75, 105),
DropdownFrame = Color3.fromRGB(200, 95, 125),
DropdownHolder = Color3.fromRGB(75, 30, 45),
DropdownBorder = Color3.fromRGB(95, 35, 55),
DropdownOption = Color3.fromRGB(190, 75, 105),
Keybind = Color3.fromRGB(190, 75, 105),
Input = Color3.fromRGB(190, 75, 105),
InputFocused = Color3.fromRGB(35, 15, 20),
InputIndicator = Color3.fromRGB(210, 95, 125),
InputIndicatorFocus = Color3.fromRGB(219, 48, 123),
Dialog = Color3.fromRGB(75, 30, 45),
DialogHolder = Color3.fromRGB(65, 25, 40),
DialogHolderLine = Color3.fromRGB(60, 20, 35),
DialogButton = Color3.fromRGB(75, 30, 45),
DialogButtonBorder = Color3.fromRGB(115, 45, 65),
DialogBorder = Color3.fromRGB(105, 40, 60),
DialogInput = Color3.fromRGB(85, 35, 50),
DialogInputLine = Color3.fromRGB(200, 85, 115),
Text = Color3.fromRGB(240, 240, 240),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(190, 75, 105),
HoverChange = 0.04
},
Midnight = {
Name = "Midnight",
Accent = Color3.fromRGB(52, 50, 178),
AcrylicMain = Color3.fromRGB(20, 20, 20),
AcrylicBorder = Color3.fromRGB(83, 83, 130),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(1, 1, 39), Color3.fromRGB(6, 6, 54)),
AcrylicNoise = 0.96,
TitleBarLine = Color3.fromRGB(77, 75, 126),
Tab = Color3.fromRGB(126, 127, 180),
Element = Color3.fromRGB(111, 108, 160),
ElementBorder = Color3.fromRGB(32, 32, 59),
InElementBorder = Color3.fromRGB(85, 83, 110),
ElementTransparency = 0.87,
ToggleSlider = Color3.fromRGB(120, 117, 160),
ToggleToggled = Color3.fromRGB(30, 12, 68),
SliderRail = Color3.fromRGB(117, 117, 160),
DropdownFrame = Color3.fromRGB(161, 161, 200),
DropdownHolder = Color3.fromRGB(35, 36, 80),
DropdownBorder = Color3.fromRGB(32, 30, 65),
DropdownOption = Color3.fromRGB(116, 116, 160),
Keybind = Color3.fromRGB(110, 123, 160),
Input = Color3.fromRGB(116, 112, 160),
InputFocused = Color3.fromRGB(20, 10, 30),
InputIndicator = Color3.fromRGB(136, 140, 190),
Dialog = Color3.fromRGB(37, 37, 80),
DialogHolder = Color3.fromRGB(24, 24, 65),
DialogHolderLine = Color3.fromRGB(25, 26, 60),
DialogButton = Color3.fromRGB(46, 44, 80),
DialogButtonBorder = Color3.fromRGB(71, 72, 110),
DialogBorder = Color3.fromRGB(72, 70, 100),
DialogInput = Color3.fromRGB(55, 55, 85),
DialogInputLine = Color3.fromRGB(133, 131, 190),
Text = Color3.fromRGB(240, 240, 240),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(119, 121, 160),
HoverChange = 0.04,
},
Forest = {
Name = "Forest",
Accent = Color3.fromRGB(46, 141, 70),
AcrylicMain = Color3.fromRGB(20, 35, 25),
AcrylicBorder = Color3.fromRGB(50, 90, 60),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(15, 35, 20), Color3.fromRGB(20, 40, 25)),
AcrylicNoise = 0.92,
TitleBarLine = Color3.fromRGB(60, 100, 70),
Tab = Color3.fromRGB(80, 140, 90),
Element = Color3.fromRGB(70, 120, 80),
ElementBorder = Color3.fromRGB(30, 50, 35),
InElementBorder = Color3.fromRGB(60, 90, 70),
ElementTransparency = 0.87,
ToggleSlider = Color3.fromRGB(90, 150, 100),
ToggleToggled = Color3.fromRGB(19, 57, 21),
SliderRail = Color3.fromRGB(90, 150, 100),
DropdownFrame = Color3.fromRGB(100, 160, 110),
DropdownHolder = Color3.fromRGB(35, 60, 40),
DropdownBorder = Color3.fromRGB(30, 50, 35),
DropdownOption = Color3.fromRGB(90, 150, 100),
Keybind = Color3.fromRGB(90, 150, 100),
Input = Color3.fromRGB(90, 150, 100),
InputFocused = Color3.fromRGB(15, 25, 18),
InputIndicator = Color3.fromRGB(110, 170, 120),
InputIndicatorFocus = Color3.fromRGB(46, 141, 70),
Dialog = Color3.fromRGB(35, 60, 40),
DialogHolder = Color3.fromRGB(30, 50, 35),
DialogHolderLine = Color3.fromRGB(25, 45, 30),
DialogButton = Color3.fromRGB(35, 60, 40),
DialogButtonBorder = Color3.fromRGB(70, 110, 80),
DialogBorder = Color3.fromRGB(60, 100, 70),
DialogInput = Color3.fromRGB(45, 70, 50),
DialogInputLine = Color3.fromRGB(100, 160, 110),
Text = Color3.fromRGB(240, 240, 240),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(90, 150, 100),
HoverChange = 0.04
},
Sunset = {
Name = "Sunset",
Accent = Color3.fromRGB(255, 128, 0),
AcrylicMain = Color3.fromRGB(40, 25, 25),
AcrylicBorder = Color3.fromRGB(130, 80, 60),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(70, 35, 20), Color3.fromRGB(60, 30, 20)),
AcrylicNoise = 0.92,
TitleBarLine = Color3.fromRGB(140, 90, 70),
Tab = Color3.fromRGB(180, 120, 90),
Element = Color3.fromRGB(160, 100, 70),
ElementBorder = Color3.fromRGB(70, 40, 30),
InElementBorder = Color3.fromRGB(110, 70, 50),
ElementTransparency = 0.87,
ToggleSlider = Color3.fromRGB(180, 110, 80),
ToggleToggled = Color3.fromRGB(62, 34, 21),
SliderRail = Color3.fromRGB(180, 110, 80),
DropdownFrame = Color3.fromRGB(190, 130, 100),
DropdownHolder = Color3.fromRGB(60, 35, 25),
DropdownBorder = Color3.fromRGB(70, 40, 30),
DropdownOption = Color3.fromRGB(180, 110, 80),
Keybind = Color3.fromRGB(180, 110, 80),
Input = Color3.fromRGB(180, 110, 80),
InputFocused = Color3.fromRGB(30, 20, 15),
InputIndicator = Color3.fromRGB(200, 130, 100),
InputIndicatorFocus = Color3.fromRGB(255, 128, 0),
Dialog = Color3.fromRGB(60, 35, 25),
DialogHolder = Color3.fromRGB(50, 30, 20),
DialogHolderLine = Color3.fromRGB(45, 25, 15),
DialogButton = Color3.fromRGB(60, 35, 25),
DialogButtonBorder = Color3.fromRGB(100, 65, 45),
DialogBorder = Color3.fromRGB(90, 55, 40),
DialogInput = Color3.fromRGB(70, 45, 35),
DialogInputLine = Color3.fromRGB(190, 120, 90),
Text = Color3.fromRGB(240, 240, 240),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(180, 110, 80),
HoverChange = 0.04
},
Ocean = {
Name = "Ocean",
Accent = Color3.fromRGB(0, 141, 255),
AcrylicMain = Color3.fromRGB(20, 25, 40),
AcrylicBorder = Color3.fromRGB(40, 60, 100),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(15, 25, 45), Color3.fromRGB(20, 30, 50)),
AcrylicNoise = 0.92,
TitleBarLine = Color3.fromRGB(50, 70, 120),
Tab = Color3.fromRGB(70, 90, 160),
Element = Color3.fromRGB(60, 80, 140),
ElementBorder = Color3.fromRGB(30, 40, 70),
InElementBorder = Color3.fromRGB(50, 60, 100),
ElementTransparency = 0.87,
ToggleSlider = Color3.fromRGB(80, 100, 170),
ToggleToggled = Color3.fromRGB(11, 35, 67),
SliderRail = Color3.fromRGB(80, 100, 170),
DropdownFrame = Color3.fromRGB(90, 110, 180),
DropdownHolder = Color3.fromRGB(25, 35, 60),
DropdownBorder = Color3.fromRGB(30, 40, 70),
DropdownOption = Color3.fromRGB(80, 100, 170),
Keybind = Color3.fromRGB(80, 100, 170),
Input = Color3.fromRGB(80, 100, 170),
InputFocused = Color3.fromRGB(15, 20, 35),
InputIndicator = Color3.fromRGB(100, 120, 190),
InputIndicatorFocus = Color3.fromRGB(0, 141, 255),
Dialog = Color3.fromRGB(25, 35, 60),
DialogHolder = Color3.fromRGB(20, 30, 55),
DialogHolderLine = Color3.fromRGB(15, 25, 50),
DialogButton = Color3.fromRGB(25, 35, 60),
DialogButtonBorder = Color3.fromRGB(45, 65, 110),
DialogBorder = Color3.fromRGB(40, 60, 100),
DialogInput = Color3.fromRGB(35, 45, 70),
DialogInputLine = Color3.fromRGB(90, 110, 180),
Text = Color3.fromRGB(240, 240, 240),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(80, 100, 170),
HoverChange = 0.04
},
Emerald = {
Name = "Emerald",
Accent = Color3.fromRGB(0, 168, 107),
AcrylicMain = Color3.fromRGB(20, 35, 30),
AcrylicBorder = Color3.fromRGB(30, 100, 80),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(20, 55, 45), Color3.fromRGB(25, 60, 50)),
AcrylicNoise = 0.92,
TitleBarLine = Color3.fromRGB(40, 110, 90),
Tab = Color3.fromRGB(50, 130, 100),
Element = Color3.fromRGB(40, 120, 95),
ElementBorder = Color3.fromRGB(25, 75, 60),
InElementBorder = Color3.fromRGB(35, 85, 70),
ElementTransparency = 0.87,
ToggleSlider = Color3.fromRGB(45, 130, 100),
ToggleToggled = Color3.fromRGB(15, 40, 30),
SliderRail = Color3.fromRGB(45, 130, 100),
DropdownFrame = Color3.fromRGB(55, 140, 110),
DropdownHolder = Color3.fromRGB(20, 70, 55),
DropdownBorder = Color3.fromRGB(25, 75, 60),
DropdownOption = Color3.fromRGB(45, 130, 100),
Keybind = Color3.fromRGB(45, 130, 100),
Input = Color3.fromRGB(45, 130, 100),
InputFocused = Color3.fromRGB(10, 35, 25),
InputIndicator = Color3.fromRGB(55, 150, 120),
InputIndicatorFocus = Color3.fromRGB(0, 168, 107),
Dialog = Color3.fromRGB(20, 70, 55),
DialogHolder = Color3.fromRGB(15, 65, 50),
DialogHolderLine = Color3.fromRGB(15, 60, 45),
DialogButton = Color3.fromRGB(20, 70, 55),
DialogButtonBorder = Color3.fromRGB(30, 90, 70),
DialogBorder = Color3.fromRGB(25, 85, 65),
DialogInput = Color3.fromRGB(25, 75, 60),
DialogInputLine = Color3.fromRGB(50, 140, 110),
Text = Color3.fromRGB(240, 240, 240),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(45, 130, 100),
HoverChange = 0.04
},
Sapphire = {
Name = "Sapphire",
Accent = Color3.fromRGB(0, 105, 255),
AcrylicMain = Color3.fromRGB(24, 30, 85),
AcrylicBorder = Color3.fromRGB(25, 80, 150),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(13, 33, 94), Color3.fromRGB(21, 44, 127)),
AcrylicNoise = 0.88,
TitleBarLine = Color3.fromRGB(50, 120, 200),
Tab = Color3.fromRGB(60, 140, 220),
Element = Color3.fromRGB(42, 98, 176),
ElementBorder = Color3.fromRGB(23, 66, 113),
InElementBorder = Color3.fromRGB(27, 65, 126),
ElementTransparency = 0.85,
ToggleSlider = Color3.fromRGB(50, 140, 210),
ToggleToggled = Color3.fromRGB(20, 50, 80),
SliderRail = Color3.fromRGB(50, 140, 210),
DropdownFrame = Color3.fromRGB(60, 150, 230),
DropdownHolder = Color3.fromRGB(15, 60, 100),
DropdownBorder = Color3.fromRGB(30, 90, 140),
DropdownOption = Color3.fromRGB(50, 140, 210),
Keybind = Color3.fromRGB(50, 140, 210),
Input = Color3.fromRGB(50, 140, 210),
InputFocused = Color3.fromRGB(15, 40, 60),
InputIndicator = Color3.fromRGB(60, 160, 240),
InputIndicatorFocus = Color3.fromRGB(0, 105, 255),
Dialog = Color3.fromRGB(10, 60, 100),
DialogHolder = Color3.fromRGB(15, 50, 90),
DialogHolderLine = Color3.fromRGB(15, 45, 80),
DialogButton = Color3.fromRGB(10, 60, 100),
DialogButtonBorder = Color3.fromRGB(30, 100, 160),
DialogBorder = Color3.fromRGB(20, 80, 130),
DialogInput = Color3.fromRGB(30, 90, 140),
DialogInputLine = Color3.fromRGB(55, 150, 230),
Text = Color3.fromRGB(240, 240, 240),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(50, 140, 210),
HoverChange = 0.05
},
Cloud = {
Name = "Cloud",
Accent = Color3.fromRGB(27, 114, 138),
AcrylicMain = Color3.fromRGB(13, 62, 77),
AcrylicBorder = Color3.fromRGB(80, 118, 130),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(51, 74, 83), Color3.fromRGB(4, 47, 66)),
AcrylicNoise = 0.94,
TitleBarLine = Color3.fromRGB(97, 97, 97),
Tab = Color3.fromRGB(126, 175, 180),
Element = Color3.fromRGB(66, 130, 160),
ElementBorder = Color3.fromRGB(40, 100, 122),
InElementBorder = Color3.fromRGB(75, 109, 110),
ElementTransparency = 0.87,
ToggleSlider = Color3.fromRGB(100, 152, 160),
ToggleToggled = Color3.fromRGB(26, 59, 80),
SliderRail = Color3.fromRGB(115, 150, 160),
DropdownFrame = Color3.fromRGB(158, 194, 200),
DropdownHolder = Color3.fromRGB(39, 99, 116),
DropdownBorder = Color3.fromRGB(33, 119, 120),
DropdownOption = Color3.fromRGB(121, 152, 160),
Keybind = Color3.fromRGB(108, 153, 160),
Input = Color3.fromRGB(112, 156, 160),
InputFocused = Color3.fromRGB(14, 35, 40),
InputIndicator = Color3.fromRGB(137, 181, 190),
Dialog = Color3.fromRGB(11, 75, 88),
DialogHolder = Color3.fromRGB(18, 77, 93),
DialogHolderLine = Color3.fromRGB(33, 76, 86),
DialogButton = Color3.fromRGB(43, 72, 80),
DialogButtonBorder = Color3.fromRGB(62, 100, 110),
DialogBorder = Color3.fromRGB(26, 86, 100),
DialogInput = Color3.fromRGB(4, 97, 107),
DialogInputLine = Color3.fromRGB(70, 120, 130),
Text = Color3.fromRGB(209, 240, 233),
SubText = Color3.fromRGB(170, 170, 170),
Hover = Color3.fromRGB(112, 155, 160),
HoverChange = 0.04,
},
Grape = {
Name = "Grape",
Accent = Color3.fromRGB(183, 176, 223),
AcrylicMain = Color3.fromRGB(0, 0, 0),
AcrylicBorder = Color3.fromRGB(20, 20, 20),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(6, 0, 16), Color3.fromRGB(6, 0, 16)),
AcrylicNoise = 1,
TitleBarLine = Color3.fromRGB(25, 25, 25),
Tab = Color3.fromRGB(40, 40, 40),
Element = Color3.fromRGB(15, 15, 15),
ElementBorder = Color3.fromRGB(6, 0, 16),
InElementBorder = Color3.fromRGB(40, 40, 40),
ElementTransparency = 1,
ToggleSlider = Color3.fromRGB(255, 255, 255),
ToggleToggled = Color3.fromRGB(19, 16, 36),
SliderRail = Color3.fromRGB(40, 40, 40),
DropdownFrame = Color3.fromRGB(20, 20, 20),
DropdownHolder = Color3.fromRGB(12, 0, 34),
DropdownBorder = Color3.fromRGB(6, 0, 16),
DropdownOption = Color3.fromRGB(40, 40, 40),
Keybind = Color3.fromRGB(40, 40, 40),
Input = Color3.fromRGB(40, 40, 40),
InputFocused = Color3.fromRGB(6, 0, 16),
InputIndicator = Color3.fromRGB(60, 60, 60),
InputIndicatorFocus = Color3.fromRGB(255, 255, 255),
Dialog = Color3.fromRGB(7, 0, 18),
DialogHolder = Color3.fromRGB(7, 0, 18),
DialogHolderLine = Color3.fromRGB(7, 0, 18),
DialogButton = Color3.fromRGB(13, 0, 33),
DialogButtonBorder = Color3.fromRGB(30, 30, 30),
DialogBorder = Color3.fromRGB(27, 27, 27),
DialogInput = Color3.fromRGB(7, 0, 18),
DialogInputLine = Color3.fromRGB(60, 60, 60),
Text = Color3.fromRGB(255, 255, 255),
SubText = Color3.fromRGB(123, 144, 170),
Hover = Color3.fromRGB(40, 40, 40),
HoverChange = 0.04
},
Bloody = {
Name = "Bloody",
Accent = Color3.fromRGB(144, 0, 0),
AcrylicMain = Color3.fromRGB(61, 0, 0),
AcrylicBorder = Color3.fromRGB(86, 0, 0),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(90, 0, 0), Color3.fromRGB(100, 0, 0)),
AcrylicNoise = 0.92,
TitleBarLine = Color3.fromRGB(126, 0, 0),
Tab = Color3.fromRGB(134, 0, 0),
Element = Color3.fromRGB(156, 0, 0),
ElementBorder = Color3.fromRGB(91, 0, 0),
InElementBorder = Color3.fromRGB(106, 0, 0),
ElementTransparency = 0.86,
ToggleSlider = Color3.fromRGB(130, 5, 5),
ToggleToggled = Color3.fromRGB(66, 0, 0),
SliderRail = Color3.fromRGB(150, 30, 30),
DropdownFrame = Color3.fromRGB(150, 30, 30),
DropdownHolder = Color3.fromRGB(79, 0, 0),
DropdownBorder = Color3.fromRGB(116, 0, 0),
DropdownOption = Color3.fromRGB(150, 30, 30),
Keybind = Color3.fromRGB(150, 30, 30),
Input = Color3.fromRGB(150, 30, 30),
InputFocused = Color3.fromRGB(40, 10, 10),
InputIndicator = Color3.fromRGB(113, 1, 1),
Dialog = Color3.fromRGB(85, 0, 1),
DialogHolder = Color3.fromRGB(77, 0, 8),
DialogHolderLine = Color3.fromRGB(88, 4, 4),
DialogButton = Color3.fromRGB(115, 14, 21),
DialogButtonBorder = Color3.fromRGB(83, 0, 1),
DialogBorder = Color3.fromRGB(43, 4, 5),
DialogInput = Color3.fromRGB(108, 20, 21),
DialogInputLine = Color3.fromRGB(91, 1, 1),
Text = Color3.fromRGB(240, 240, 240),
SubText = Color3.fromRGB(131, 131, 131),
Hover = Color3.fromRGB(181, 0, 0),
HoverChange = 0.04
},
Arctic = {
Name = "Arctic",
Accent = Color3.fromRGB(64, 224, 255),
AcrylicMain = Color3.fromRGB(10, 18, 25),
AcrylicBorder = Color3.fromRGB(35, 55, 70),
AcrylicGradient = ColorSequence.new(Color3.fromRGB(15, 25, 35), Color3.fromRGB(18, 30, 40)),
AcrylicNoise = 0.94,
TitleBarLine = Color3.fromRGB(45, 70, 90),
Tab = Color3.fromRGB(70, 110, 140),
Element = Color3.fromRGB(60, 95, 120),
ElementBorder = Color3.fromRGB(60, 95, 120),
InElementBorder = Color3.fromRGB(70, 110, 140),
ElementTransparency = 0.88,
ToggleSlider = Color3.fromRGB(90, 140, 180),
ToggleToggled = Color3.fromRGB(15, 25, 35),
SliderRail = Color3.fromRGB(90, 140, 180),
DropdownFrame = Color3.fromRGB(110, 170, 220),
DropdownHolder = Color3.fromRGB(30, 45, 60),
DropdownBorder = Color3.fromRGB(60, 95, 120),
DropdownOption = Color3.fromRGB(90, 140, 180),
Keybind = Color3.fromRGB(90, 140, 180),
Input = Color3.fromRGB(90, 140, 180),
InputFocused = Color3.fromRGB(10, 18, 25),
InputIndicator = Color3.fromRGB(130, 200, 255),
InputIndicatorFocus = Color3.fromRGB(64, 224, 255),
Dialog = Color3.fromRGB(30, 45, 60),
DialogHolder = Color3.fromRGB(18, 30, 40),
DialogHolderLine = Color3.fromRGB(15, 25, 35),
DialogButton = Color3.fromRGB(30, 45, 60),
DialogButtonBorder = Color3.fromRGB(45, 70, 90),
DialogBorder = Color3.fromRGB(40, 60, 80),
DialogInput = Color3.fromRGB(35, 55, 70),
DialogInputLine = Color3.fromRGB(110, 170, 220),
Text = Color3.fromRGB(240, 250, 255),
SubText = Color3.fromRGB(180, 200, 220),
Hover = Color3.fromRGB(90, 140, 180),
HoverChange = 0.04
}
}
local Library = {
Version = "1.2.2",
OpenFrames = {},
Options = {},
Themes = Themes.Names,
Windows = {},
Window = nil,
WindowFrame = nil,
Unloaded = false,
Creator = nil,
DialogOpen = false,
UseAcrylic = false,
Acrylic = false,
Transparency = true,
MinimizeKeybind = nil,
MinimizeKey = Enum.KeyCode.LeftControl,
}
local function isMotor(value)
local motorType = tostring(value):match("^Motor%((.+)%)$")
if motorType then
return true, motorType
else
return false
end
end
local Connection = {}
Connection.__index = Connection
function Connection.new(signal, handler)
return setmetatable({
signal = signal,
connected = true,
_handler = handler,
}, Connection)
end
function Connection:disconnect()
if self.connected then
self.connected = false
for index, connection in pairs(self.signal._connections) do
if connection == self then
table.remove(self.signal._connections, index)
return
end
end
end
end
local Signal = {}
Signal.__index = Signal
function Signal.new()
return setmetatable({
_connections = {},
_threads = {},
}, Signal)
end
function Signal:fire(...)
for _, connection in pairs(self._connections) do
connection._handler(...)
end
for _, thread in pairs(self._threads) do
coroutine.resume(thread, ...)
end
self._threads = {}
end
function Signal:connect(handler)
local connection = Connection.new(self, handler)
table.insert(self._connections, connection)
return connection
end
function Signal:wait()
table.insert(self._threads, coroutine.running())
return coroutine.yield()
end
local Linear = {}
Linear.__index = Linear
function Linear.new(targetValue, options)
assert(targetValue, "Missing argument #1: targetValue")
options = options or {}
return setmetatable({
_targetValue = targetValue,
_velocity = options.velocity or 1,
}, Linear)
end
function Linear:step(state, dt)
local position = state.value
local velocity = self._velocity
local goal = self._targetValue
local dPos = dt * velocity
local complete = dPos >= math.abs(goal - position)
position = position + dPos * (goal > position and 1 or -1)
if complete then
position = self._targetValue
velocity = 0
end
return {
complete = complete,
value = position,
velocity = velocity,
}
end
local Instant = {}
Instant.__index = Instant
function Instant.new(targetValue)
return setmetatable({
_targetValue = targetValue,
}, Instant)
end
function Instant:step()
return {
complete = true,
value = self._targetValue,
}
end
local VELOCITY_THRESHOLD = 0.001
local POSITION_THRESHOLD = 0.001
local EPS = 0.0001
local Spring = {}
Spring.__index = Spring
function Spring.new(targetValue, options)
assert(targetValue, "Missing argument #1: targetValue")
options = options or {}
return setmetatable({
_targetValue = targetValue,
_frequency = options.frequency or 4,
_dampingRatio = options.dampingRatio or 1,
}, Spring)
end
function Spring:step(state, dt)
local d = self._dampingRatio
local f = self._frequency * 2 * math.pi
local g = self._targetValue
local p0 = state.value
local v0 = state.velocity or 0
local offset = p0 - g
local decay = math.exp(-d * f * dt)
local p1, v1
if d == 1 then
p1 = (offset * (1 + f * dt) + v0 * dt) * decay + g
v1 = (v0 * (1 - f * dt) - offset * (f * f * dt)) * decay
elseif d < 1 then
local c = math.sqrt(1 - d * d)
local i = math.cos(f * c * dt)
local j = math.sin(f * c * dt)
local z
if c > EPS then
z = j / c
else
local a = dt * f
z = a + ((a * a) * (c * c) * (c * c) / 20 - c * c) * (a * a * a) / 6
end
local y
if f * c > EPS then
y = j / (f * c)
else
local b = f * c
y = dt + ((dt * dt) * (b * b) * (b * b) / 20 - b * b) * (dt * dt * dt) / 6
end
p1 = (offset * (i + d * z) + v0 * y) * decay + g
v1 = (v0 * (i - z * d) - offset * (z * f)) * decay
else
local c = math.sqrt(d * d - 1)
local r1 = -f * (d - c)
local r2 = -f * (d + c)
local co2 = (v0 - offset * r1) / (2 * f * c)
local co1 = offset - co2
local e1 = co1 * math.exp(r1 * dt)
local e2 = co2 * math.exp(r2 * dt)
p1 = e1 + e2 + g
v1 = e1 * r1 + e2 * r2
end
local complete = math.abs(v1) < VELOCITY_THRESHOLD and math.abs(p1 - g) < POSITION_THRESHOLD
return {
complete = complete,
value = complete and g or p1,
velocity = v1,
}
end
local noop = function() end
local BaseMotor = {}
BaseMotor.__index = BaseMotor
function BaseMotor.new()
return setmetatable({
_onStep = Signal.new(),
_onStart = Signal.new(),
_onComplete = Signal.new(),
}, BaseMotor)
end
function BaseMotor:onStep(handler)
return self._onStep:connect(handler)
end
function BaseMotor:onStart(handler)
return self._onStart:connect(handler)
end
function BaseMotor:onComplete(handler)
return self._onComplete:connect(handler)
end
function BaseMotor:start()
if not self._connection then
self._connection = RunService.RenderStepped:Connect(function(deltaTime)
self:step(deltaTime)
end)
end
end
function BaseMotor:stop()
if self._connection then
self._connection:Disconnect()
self._connection = nil
end
end
BaseMotor.destroy = BaseMotor.stop
BaseMotor.step = noop
BaseMotor.getValue = noop
BaseMotor.setGoal = noop
function BaseMotor:__tostring()
return "Motor"
end
local SingleMotor = setmetatable({}, BaseMotor)
SingleMotor.__index = SingleMotor
function SingleMotor.new(initialValue, useImplicitConnections)
assert(initialValue, "Missing argument #1: initialValue")
assert(typeof(initialValue) == "number", "initialValue must be a number!")
local self = setmetatable(BaseMotor.new(), SingleMotor)
if useImplicitConnections ~= nil then
self._useImplicitConnections = useImplicitConnections
else
self._useImplicitConnections = true
end
self._goal = nil
self._state = {
complete = true,
value = initialValue,
}
return self
end
function SingleMotor:step(deltaTime)
if self._state.complete then
return true
end
local newState = self._goal:step(self._state, deltaTime)
self._state = newState
self._onStep:fire(newState.value)
if newState.complete then
if self._useImplicitConnections then
self:stop()
end
self._onComplete:fire()
end
return newState.complete
end
function SingleMotor:getValue()
return self._state.value
end
function SingleMotor:setGoal(goal)
self._state.complete = false
self._goal = goal
self._onStart:fire()
if self._useImplicitConnections then
self:start()
end
end
function SingleMotor:__tostring()
return "Motor(Single)"
end
local GroupMotor = setmetatable({}, BaseMotor)
GroupMotor.__index = GroupMotor
local function toMotor(value)
if isMotor(value) then
return value
end
local valueType = typeof(value)
if valueType == "number" then
return SingleMotor.new(value, false)
elseif valueType == "table" then
return GroupMotor.new(value, false)
end
error(("Unable to convert %q to motor; type %s is unsupported"):format(value, valueType), 2)
end
function GroupMotor.new(initialValues, useImplicitConnections)
assert(initialValues, "Missing argument #1: initialValues")
assert(typeof(initialValues) == "table", "initialValues must be a table!")
assert(
not initialValues.step,
'initialValues contains disallowed property "step". Did you mean to put a table of values here?'
)
local self = setmetatable(BaseMotor.new(), GroupMotor)
if useImplicitConnections ~= nil then
self._useImplicitConnections = useImplicitConnections
else
self._useImplicitConnections = true
end
self._complete = true
self._motors = {}
for key, value in pairs(initialValues) do
self._motors[key] = toMotor(value)
end
return self
end
function GroupMotor:step(deltaTime)
if self._complete then
return true
end
local allMotorsComplete = true
for _, motor in pairs(self._motors) do
local complete = motor:step(deltaTime)
if not complete then
allMotorsComplete = false
end
end
self._onStep:fire(self:getValue())
if allMotorsComplete then
if self._useImplicitConnections then
self:stop()
end
self._complete = true
self._onComplete:fire()
end
return allMotorsComplete
end
function GroupMotor:setGoal(goals)
assert(not goals.step, 'goals contains disallowed property "step". Did you mean to put a table of goals here?')
self._complete = false
self._onStart:fire()
for key, goal in pairs(goals) do
local motor = assert(self._motors[key], ("Unknown motor for key %s"):format(key))
motor:setGoal(goal)
end
if self._useImplicitConnections then
self:start()
end
end
function GroupMotor:getValue()
local values = {}
for key, motor in pairs(self._motors) do
values[key] = motor:getValue()
end
return values
end
function GroupMotor:__tostring()
return "Motor(Group)"
end
local Flipper = {
SingleMotor = SingleMotor,
GroupMotor = GroupMotor,
Instant = Instant,
Linear = Linear,
Spring = Spring,
isMotor = isMotor,
}
local Creator = {
Registry = {},
Signals = {},
TransparencyMotors = {},
DefaultProperties = {
ScreenGui = {
ResetOnSpawn = false,
ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
},
Frame = {
BackgroundColor3 = Color3.new(1, 1, 1),
BorderColor3 = Color3.new(0, 0, 0),
BorderSizePixel = 0,
},
ScrollingFrame = {
BackgroundColor3 = Color3.new(1, 1, 1),
BorderColor3 = Color3.new(0, 0, 0),
ScrollBarImageColor3 = Color3.new(0, 0, 0),
},
TextLabel = {
BackgroundColor3 = Color3.new(1, 1, 1),
BorderColor3 = Color3.new(0, 0, 0),
Font = Enum.Font.SourceSans,
Text = "",
TextColor3 = Color3.new(0, 0, 0),
BackgroundTransparency = 1,
TextSize = 14,
},
TextButton = {
BackgroundColor3 = Color3.new(1, 1, 1),
BorderColor3 = Color3.new(0, 0, 0),
AutoButtonColor = false,
Font = Enum.Font.SourceSans,
Text = "",
TextColor3 = Color3.new(0, 0, 0),
TextSize = 14,
},
TextBox = {
BackgroundColor3 = Color3.new(1, 1, 1),
BorderColor3 = Color3.new(0, 0, 0),
ClearTextOnFocus = false,
Font = Enum.Font.SourceSans,
Text = "",
TextColor3 = Color3.new(0, 0, 0),
TextSize = 14,
},
ImageLabel = {
BackgroundTransparency = 1,
BackgroundColor3 = Color3.new(1, 1, 1),
BorderColor3 = Color3.new(0, 0, 0),
BorderSizePixel = 0,
},
ImageButton = {
BackgroundColor3 = Color3.new(1, 1, 1),
BorderColor3 = Color3.new(0, 0, 0),
AutoButtonColor = false,
},
CanvasGroup = {
BackgroundColor3 = Color3.new(1, 1, 1),
BorderColor3 = Color3.new(0, 0, 0),
BorderSizePixel = 0,
},
},
}
local function ApplyCustomProps(Object, Props)
if Props.ThemeTag then
Creator.AddThemeObject(Object, Props.ThemeTag)
end
end
function Creator.AddSignal(Signal, Function)
local Connected = Signal:Connect(Function)
table.insert(Creator.Signals, Connected)
return Connected
end
function Creator.Disconnect()
for Idx = #Creator.Signals, 1, -1 do
local Connection = table.remove(Creator.Signals, Idx)
if Connection.Disconnect then
Connection:Disconnect()
end
end
end
Creator.Themes = Themes
Creator.Theme = Creator.Theme or "Dark"
function Creator.GetThemeProperty(Property)
local Theme = Creator.Themes[Creator.Theme]
if Theme then
return Theme[Property]
end
return Creator.Themes.Dark[Property]
end
function Creator.UpdateTheme()
if not Creator.Themes[Creator.Theme] then
Creator.Theme = "Dark"
end
for Instance, Object in next, Creator.Registry do
for Property, ColorIdx in next, Object.Properties do
local themeValue = Creator.GetThemeProperty(ColorIdx)
if themeValue then
Instance[Property] = themeValue
end
end
end
local transparency = Creator.GetThemeProperty("ElementTransparency")
if transparency then
for _, Motor in next, Creator.TransparencyMotors do
Motor:setGoal(Flipper.Instant.new(transparency))
end
end
end
function Creator.AddThemeObject(Object, Properties)
local Idx = #Creator.Registry + 1
local Data = {
Object = Object,
Properties = Properties,
Idx = Idx,
}
Creator.Registry[Object] = Data
Creator.UpdateTheme()
return Object
end
function Creator.OverrideTag(Object, Properties)
Creator.Registry[Object].Properties = Properties
Creator.UpdateTheme()
end
function Creator.GetThemeProperty(Property)
if Themes[Library.Theme][Property] then
return Themes[Library.Theme][Property]
end
return Themes["Dark"][Property]
end
local MiniMessageColors = {
["black"] = "#000000",
["dark_blue"] = "#0000AA",
["dark_green"] = "#00AA00",
["dark_aqua"] = "#00AAAA",
["dark_red"] = "#AA0000",
["dark_purple"] = "#AA00AA",
["gold"] = "#FFAA00",
["gray"] = "#AAAAAA",
["grey"] = "#AAAAAA",
["dark_gray"] = "#555555",
["dark_grey"] = "#555555",
["blue"] = "#5555FF",
["green"] = "#55FF55",
["aqua"] = "#55FFFF",
["cyan"] = "#55FFFF",
["red"] = "#FF5555",
["light_purple"] = "#FF55FF",
["magenta"] = "#FF55FF",
["yellow"] = "#FFFF55",
["white"] = "#FFFFFF",
["reset"] = "#FFFFFF",
["orange"] = "#FFAA00",
["pink"] = "#FF55FF",
["lime"] = "#55FF55",
["brown"] = "#AA5500",
}
local function MiniMessageToRichText(text)
if type(text) ~= "string" or text == "" then
return text
end
if not text:match("<[^>]+>") then
return text
end
local result = text
result = result:gsub("
", "\n")
result = result:gsub("
", "\n")
result = result:gsub("
", "\n")
result = result:gsub("", "\n")
result = result:gsub("", "\n")
result = result:gsub("", "")
result = result:gsub("(.-)", "%1")
result = result:gsub("", "")
result = result:gsub("", "")
local function hexToRgb(hex)
hex = hex:gsub("#", "")
local r = tonumber("0x" .. hex:sub(1, 2))
local g = tonumber("0x" .. hex:sub(3, 4))
local b = tonumber("0x" .. hex:sub(5, 6))
return r, g, b
end
local function rgbToHex(r, g, b)
return string.format("#%02X%02X%02X", math.floor(r), math.floor(g), math.floor(b))
end
local function interpolateColor(color1Hex, color2Hex, t)
local r1, g1, b1 = hexToRgb(color1Hex)
local r2, g2, b2 = hexToRgb(color2Hex)
local r = r1 + (r2 - r1) * t
local g = g1 + (g2 - g1) * t
local b = b1 + (b2 - b1) * t
return rgbToHex(r, g, b)
end
for i = 1, 10 do
local newResult = result:gsub("]+)>(.-)", function(colorsStr, content)
local colors = {}
for colorMatch in colorsStr:gmatch("(#%x%x%x%x%x%x)") do
table.insert(colors, colorMatch)
end
if #colors == 0 then
for colorMatch in colorsStr:gmatch("(%x%x%x%x%x%x)") do
table.insert(colors, "#" .. colorMatch)
end
end
if #colors < 2 then
if #colors == 1 then
return '' .. content .. ''
else
return content
end
end
local cleanText = content:gsub("<[^>]+>", "")
local textLength = #cleanText
if textLength == 0 then
return content
end
if textLength == 1 then
return '' .. content .. ''
end
local parts = {}
local pos = 1
local charIndex = 0
while pos <= #content do
if content:sub(pos, pos) == "<" then
local tagEnd = content:find(">", pos)
if tagEnd then
local tag = content:sub(pos, tagEnd)
table.insert(parts, {type = "tag", value = tag})
pos = tagEnd + 1
else
table.insert(parts, {type = "char", value = content:sub(pos, pos), index = charIndex})
charIndex = charIndex + 1
pos = pos + 1
end
else
local char = content:sub(pos, pos)
table.insert(parts, {type = "char", value = char, index = charIndex})
charIndex = charIndex + 1
pos = pos + 1
end
end
local function getGradientColor(t)
t = math.max(0, math.min(1, t))
if #colors == 2 then
return interpolateColor(colors[1], colors[2], t)
end
local numSegments = #colors - 1
local segmentSize = 1 / numSegments
local segmentIndex = math.floor(t / segmentSize)
if segmentIndex >= numSegments then
segmentIndex = numSegments - 1
t = 1.0
end
local segmentStart = segmentIndex * segmentSize
local segmentEnd = (segmentIndex + 1) * segmentSize
local segmentT = 0
if segmentEnd > segmentStart then
segmentT = (t - segmentStart) / (segmentEnd - segmentStart)
else
segmentT = (t >= segmentEnd) and 1.0 or 0.0
end
segmentT = math.max(0, math.min(1, segmentT))
local color1Index = segmentIndex + 1
local color2Index = segmentIndex + 2
if color1Index < 1 then color1Index = 1 end
if color2Index > #colors then color2Index = #colors end
if color1Index > #colors then color1Index = #colors end
return interpolateColor(colors[color1Index], colors[color2Index], segmentT)
end
local gradientText = ""
local currentSegment = ""
local currentColor = nil
local segments = {}
for _, part in ipairs(parts) do
if part.type == "tag" then
if currentSegment ~= "" and currentColor ~= nil then
table.insert(segments, {text = currentSegment, color = currentColor})
currentSegment = ""
currentColor = nil
end
table.insert(segments, {text = part.value, color = nil})
else
local t = part.index / (textLength - 1)
if textLength == 1 then t = 0 end
local charColor = getGradientColor(t)
if currentColor == charColor then
currentSegment = currentSegment .. part.value
else
if currentSegment ~= "" and currentColor ~= nil then
table.insert(segments, {text = currentSegment, color = currentColor})
end
currentSegment = part.value
currentColor = charColor
end
end
end
if currentSegment ~= "" and currentColor ~= nil then
table.insert(segments, {text = currentSegment, color = currentColor})
end
local hasTextSegments = false
for _, segment in ipairs(segments) do
if segment.text and segment.text ~= "" then
hasTextSegments = true
break
end
end
if not hasTextSegments and textLength > 0 then
local fallbackText = ""
for i = 1, textLength do
local t = (i - 1) / (textLength - 1)
if textLength == 1 then t = 0 end
local charColor = getGradientColor(t)
local char = cleanText:sub(i, i)
fallbackText = fallbackText .. '' .. char .. ''
end
return fallbackText
end
for _, segment in ipairs(segments) do
if segment.color and segment.text and segment.text ~= "" then
gradientText = gradientText .. '' .. segment.text .. ''
elseif segment.text then
gradientText = gradientText .. segment.text
end
end
if gradientText == "" or gradientText == nil or not gradientText:match('' .. char .. ''
end
return fallbackText
end
return gradientText
end)
if newResult == result then
break
end
result = newResult
end
result = result:gsub("(.-)", '%2')
result = result:gsub("", '')
result = result:gsub("(.-)", function(hex, content)
return '' .. content .. ''
end)
result = result:gsub("", function(hex)
return ''
end)
result = result:gsub("", "")
result = result:gsub("<(#%x%x%x%x%x%x)>(.-)#%x%x%x%x%x%x>", '%2')
result = result:gsub("<(#%x%x%x%x%x%x)>", '')
result = result:gsub("(#%x%x%x%x%x%x)>", "")
local colorNames = {}
for colorName, _ in pairs(MiniMessageColors) do
table.insert(colorNames, colorName)
end
table.sort(colorNames, function(a, b) return #a > #b end)
for _, colorName in ipairs(colorNames) do
local hexColor = MiniMessageColors[colorName]
result = result:gsub("<" .. colorName .. ">(.-)" .. colorName .. ">", '%1')
result = result:gsub("<" .. colorName .. ">", '')
result = result:gsub("" .. colorName .. ">", "")
end
result = result:gsub("(.-)", "%1")
result = result:gsub("", "")
result = result:gsub("", "")
result = result:gsub("(.-)", "%1")
result = result:gsub("", "")
result = result:gsub("", "")
result = result:gsub("(.-)", "%1")
result = result:gsub("(.-)", "%1")
result = result:gsub("", "")
result = result:gsub("", "")
result = result:gsub("", "")
result = result:gsub("", "")
result = result:gsub("(.-)", "%1")
result = result:gsub("(.-)", "%1")
result = result:gsub("", "")
result = result:gsub("", "")
result = result:gsub("", "")
result = result:gsub("", "")
result = result:gsub('', "")
result = result:gsub("", "")
result = result:gsub("", "")
result = result:gsub("", "")
result = result:gsub("", "")
result = result:gsub("", "")
return result
end
local TextElements = {}
local TextElementConnections = {}
local function setupMiniMessageSupport(object, properties)
if not (object:IsA("TextLabel") or object:IsA("TextButton") or object:IsA("TextBox")) then
return
end
local richTextExplicitlySet = properties and properties.RichText ~= nil
if not richTextExplicitlySet then
object.RichText = true
elseif properties.RichText == false then
object.RichText = false
end
local lastText = object.Text or ""
local isConverting = false
local function convertTextIfNeeded(text)
if not text or type(text) ~= "string" then
return text
end
local hasRichTextTags = text:match('')
if hasRichTextTags then
return text
end
if text:match("<[^>]+>") then
local hasMiniMessagePattern =
text:match("<%w+>") or
text:match("") or
text:match("") or
text:match("") or
text:match("%w+>") or
text:match("")
if hasMiniMessagePattern then
if not object.RichText then
object.RichText = true
end
return MiniMessageToRichText(text)
end
end
return text
end
local connection = object:GetPropertyChangedSignal("Text"):Connect(function()
if isConverting then
return
end
local currentText = object.Text or ""
if currentText ~= lastText then
local converted = convertTextIfNeeded(currentText)
if converted ~= currentText then
isConverting = true
object.Text = converted
lastText = converted
isConverting = false
else
lastText = currentText
end
end
end)
table.insert(TextElementConnections, connection)
TextElements[object] = true
if object.Text then
local converted = convertTextIfNeeded(object.Text)
if converted ~= object.Text then
object.Text = converted
lastText = converted
end
end
end
function Creator.New(Name, Properties, Children)
local Object = Instance.new(Name)
for Name, Value in next, Creator.DefaultProperties[Name] or {} do
Object[Name] = Value
end
local originalText = Properties and Properties.Text
for Name, Value in next, Properties or {} do
if Name ~= "ThemeTag" then
Object[Name] = Value
end
end
if originalText and type(originalText) == "string" and originalText:match("<[^>]+>") then
Object.Text = MiniMessageToRichText(originalText)
if Properties and Properties.RichText == nil then
Object.RichText = true
end
end
for _, Child in next, Children or {} do
Child.Parent = Object
end
ApplyCustomProps(Object, Properties)
setupMiniMessageSupport(Object, Properties)
return Object
end
function Creator.SpringMotor(Initial, Instance, Prop, IgnoreDialogCheck, ResetOnThemeChange)
IgnoreDialogCheck = IgnoreDialogCheck or false
ResetOnThemeChange = ResetOnThemeChange or false
local Motor = Flipper.SingleMotor.new(Initial)
Motor:onStep(function(value)
Instance[Prop] = value
end)
if ResetOnThemeChange then
table.insert(Creator.TransparencyMotors, Motor)
end
local function SetValue(Value, Ignore)
Ignore = Ignore or false
if not IgnoreDialogCheck then
if not Ignore then
if Prop == "BackgroundTransparency" and Library.DialogOpen then
return
end
end
end
Motor:setGoal(Flipper.Spring.new(Value, { frequency = 8 }))
end
return Motor, SetValue
end
Library.Creator = Creator
Library.MiniMessageToRichText = MiniMessageToRichText
local New = Creator.New
local GUI = New("ScreenGui", {
Parent = LocalPlayer:WaitForChild("PlayerGui"),
})
Library.GUI = GUI
ProtectGui(GUI)
function Library:SafeCallback(Function, ...)
if not Function then
return
end
local Success, Event = pcall(Function, ...)
if not Success then
local _, i = Event:find(":%d+: ")
if not i then
return Library:Notify({
Title = "Interface",
Content = "Callback error",
SubContent = Event,
Duration = 5,
})
end
return Library:Notify({
Title = "Interface",
Content = "Callback error",
SubContent = Event:sub(i + 1),
Duration = 5,
})
end
end--?
function Library:Round(Number, Factor)
if Factor == 0 then
return math.floor(Number)
end
Number = tostring(Number)
return Number:find("%.") and tonumber(Number:sub(1, Number:find("%.") + Factor)) or Number
end
local function map(value, inMin, inMax, outMin, outMax)
return (value - inMin) * (outMax - outMin) / (inMax - inMin) + outMin
end
local function viewportPointToWorld(location, distance)
local unitRay = game:GetService("Workspace").CurrentCamera:ScreenPointToRay(location.X, location.Y)
return unitRay.Origin + unitRay.Direction * distance
end
local function getOffset()
local viewportSizeY = game:GetService("Workspace").CurrentCamera.ViewportSize.Y
return map(viewportSizeY, 0, 2560, 8, 56)
end
local viewportPointToWorld, getOffset = unpack({ viewportPointToWorld, getOffset })
local BlurFolder = Instance.new("Folder")
BlurFolder.Name = "FluentBlur"
do
local ws = game:GetService("Workspace")
local function attachToCurrentCamera()
local cam = ws.CurrentCamera
if cam and BlurFolder.Parent ~= cam then
BlurFolder.Parent = cam
end
end
attachToCurrentCamera()
ws:GetPropertyChangedSignal("CurrentCamera"):Connect(attachToCurrentCamera)
end
local function createAcrylic()
local Part = Creator.New("Part", {
Name = "Body",
Color = Color3.new(0, 0, 0),
Material = Enum.Material.Glass,
Size = Vector3.new(1, 1, 0),
Anchored = true,
CanCollide = false,
Locked = true,
CastShadow = false,
Transparency = 0.98,
}, {
Creator.New("SpecialMesh", {
Name = "Mesh",
MeshType = Enum.MeshType.Brick,
Offset = Vector3.new(0, 0, -0.000001),
}),
})
return Part
end
function AcrylicBlur()
local function createAcrylicBlur(distance)
local cleanups = {}
distance = distance or 0.001
local positions = {
topLeft = Vector2.new(),
topRight = Vector2.new(),
bottomRight = Vector2.new(),
}
local model = createAcrylic()
model.Parent = BlurFolder
local function updatePositions(size, position)
positions.topLeft = position
positions.topRight = position + Vector2.new(size.X, 0)
positions.bottomRight = position + size
end
local function render()
local res = game:GetService("Workspace").CurrentCamera
if res then
res = res.CFrame
end
local cond = res
if not cond then
cond = CFrame.new()
end
local camera = cond
local topLeft = positions.topLeft
local topRight = positions.topRight
local bottomRight = positions.bottomRight
local topLeft3D = viewportPointToWorld(topLeft, distance)
local topRight3D = viewportPointToWorld(topRight, distance)
local bottomRight3D = viewportPointToWorld(bottomRight, distance)
local width = (topRight3D - topLeft3D).Magnitude
local height = (topRight3D - bottomRight3D).Magnitude
model.CFrame = CFrame.fromMatrix((topLeft3D + bottomRight3D) / 2, camera.XVector, camera.YVector, camera.ZVector)
model.Mesh.Scale = Vector3.new(width, height, 0)
end
local function onChange(rbx)
local offset = getOffset()
local size = rbx.AbsoluteSize - Vector2.new(offset, offset)
local position = rbx.AbsolutePosition + Vector2.new(offset / 2, offset / 2)
updatePositions(size, position)
task.spawn(render)
end
local function renderOnChange()
local camera = game:GetService("Workspace").CurrentCamera
if not camera then
return
end
table.insert(cleanups, camera:GetPropertyChangedSignal("CFrame"):Connect(render))
table.insert(cleanups, camera:GetPropertyChangedSignal("ViewportSize"):Connect(render))
table.insert(cleanups, camera:GetPropertyChangedSignal("FieldOfView"):Connect(render))
task.spawn(render)
end
model.Destroying:Connect(function()
for _, item in cleanups do
pcall(function()
item:Disconnect()
end)
end
end)
renderOnChange()
return onChange, model
end
return function(distance)
local Blur = {}
local onChange, model = createAcrylicBlur(distance)
local comp = Creator.New("Frame", {
BackgroundTransparency = 1,
Size = UDim2.fromScale(1, 1),
})
Creator.AddSignal(comp:GetPropertyChangedSignal("AbsolutePosition"), function()
onChange(comp)
end)
Creator.AddSignal(comp:GetPropertyChangedSignal("AbsoluteSize"), function()
onChange(comp)
end)
Blur.AddParent = function(Parent)
Creator.AddSignal(Parent:GetPropertyChangedSignal("Visible"), function()
Blur.SetVisibility(Parent.Visible)
end)
end
Blur.SetVisibility = function(Value)
model.Transparency = Value and 0.98 or 1
end
Blur.Frame = comp
Blur.Model = model
return Blur
end
end
function AcrylicPaint()
local New = Creator.New
local AcrylicBlur = AcrylicBlur()
return function(props)
local AcrylicPaint = {}
AcrylicPaint.Frame = New("Frame", {
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = 0.9,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BorderSizePixel = 0,
}, {
New("ImageLabel", {
Image = "rbxassetid://8992230677",
ScaleType = "Slice",
SliceCenter = Rect.new(Vector2.new(99, 99), Vector2.new(99, 99)),
AnchorPoint = Vector2.new(0.5, 0.5),
Size = UDim2.new(1, 120, 1, 116),
Position = UDim2.new(0.5, 0, 0.5, 0),
BackgroundTransparency = 1,
ImageColor3 = Color3.fromRGB(0, 0, 0),
ImageTransparency = 0.7,
}),
New("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
New("Frame", {
BackgroundTransparency = 0.45,
Size = UDim2.fromScale(1, 1),
Name = "Background",
ThemeTag = {
BackgroundColor3 = "AcrylicMain",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
}),
New("Frame", {
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BackgroundTransparency = 0.4,
Size = UDim2.fromScale(1, 1),
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
New("UIGradient", {
Rotation = 90,
ThemeTag = {
Color = "AcrylicGradient",
},
}),
}),
New("ImageLabel", {
Image = "rbxassetid://9968344105",
ImageTransparency = 0.98,
ScaleType = Enum.ScaleType.Tile,
TileSize = UDim2.new(0, 128, 0, 128),
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = 1,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
}),
New("ImageLabel", {
Image = "rbxassetid://9968344227",
ImageTransparency = 0.9,
ScaleType = Enum.ScaleType.Tile,
TileSize = UDim2.new(0, 128, 0, 128),
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = 1,
ThemeTag = {
ImageTransparency = "AcrylicNoise",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
}),
New("Frame", {
BackgroundTransparency = 1,
Size = UDim2.fromScale(1, 1),
ZIndex = 2,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
New("UIStroke", {
Transparency = 0.5,
Thickness = 1,
ThemeTag = {
Color = "AcrylicBorder",
},
}),
}),
})
local Blur
if Library.UseAcrylic then
Blur = AcrylicBlur()
Blur.Frame.Parent = AcrylicPaint.Frame
AcrylicPaint.Model = Blur.Model
AcrylicPaint.AddParent = Blur.AddParent
AcrylicPaint.SetVisibility = Blur.SetVisibility
end
return AcrylicPaint
end
end
local Acrylic = {
AcrylicBlur = AcrylicBlur(),
CreateAcrylic = createAcrylic,
AcrylicPaint = AcrylicPaint(),
}
function Acrylic.init()
local baseEffect = Instance.new("DepthOfFieldEffect")
baseEffect.FarIntensity = 0
baseEffect.InFocusRadius = 0.1
baseEffect.NearIntensity = 1
local depthOfFieldDefaults = {}
function Acrylic.Enable()
for _, effect in pairs(depthOfFieldDefaults) do
effect.Enabled = false
end
baseEffect.Parent = game:GetService("Lighting")
end
function Acrylic.Disable()
for _, effect in pairs(depthOfFieldDefaults) do
effect.Enabled = effect.enabled
end
baseEffect.Parent = nil
end
local function registerDefaults()
local function register(object)
if object:IsA("DepthOfFieldEffect") then
depthOfFieldDefaults[object] = { enabled = object.Enabled }
end
end
for _, child in pairs(game:GetService("Lighting"):GetChildren()) do
register(child)
end
if game:GetService("Workspace").CurrentCamera then
for _, child in pairs(game:GetService("Workspace").CurrentCamera:GetChildren()) do
register(child)
end
end
end
registerDefaults()
Acrylic.Enable()
end
local Components = {
Assets = {
Close = "rbxassetid://9886659671",
Min = "rbxassetid://9886659276",
Max = "rbxassetid://9886659406",
Restore = "rbxassetid://9886659001",
},
}
Components.Element = (function()
local New = Creator.New
local Spring = Flipper.Spring.new
return function(Title, Desc, Parent, Hover, Options)
local Element = {}
local Options = Options or {}
Element.TitleLabel = New("TextLabel", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json", Enum.FontWeight.Medium, Enum.FontStyle.Normal),
Text = Title,
TextColor3 = Color3.fromRGB(240, 240, 240),
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left,
Size = UDim2.new(1, 0, 0, 14),
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BackgroundTransparency = 1,
LayoutOrder = 2,
ThemeTag = {
TextColor3 = "Text",
},
})
Element.Header = New("Frame", {
AutomaticSize = Enum.AutomaticSize.Y,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 14),
}, {
New("UIListLayout", {
Padding = UDim.new(0, 5),
FillDirection = Enum.FillDirection.Horizontal,
SortOrder = Enum.SortOrder.LayoutOrder,
VerticalAlignment = Enum.VerticalAlignment.Center,
}),
})
if Options and Options.Icon then
local iconImage = Options.Icon
pcall(function()
if Library and Library.GetIcon then
local resolved = Library:GetIcon(Options.Icon)
if resolved then iconImage = resolved end
end
end)
Element.IconImage = New("ImageLabel", {
Image = iconImage,
Size = UDim2.fromOffset(16, 16),
BackgroundTransparency = 1,
LayoutOrder = 1,
ThemeTag = {
ImageColor3 = "Text",
},
})
Element.IconImage.Parent = Element.Header
end
Element.TitleLabel.Parent = Element.Header
Element.DescLabel = New("TextLabel", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
Text = Desc,
TextColor3 = Color3.fromRGB(200, 200, 200),
TextSize = 12,
TextWrapped = true,
TextXAlignment = Enum.TextXAlignment.Left,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
AutomaticSize = Enum.AutomaticSize.Y,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 14),
ThemeTag = {
TextColor3 = "SubText",
},
})
Element.LabelHolder = New("Frame", {
AutomaticSize = Enum.AutomaticSize.Y,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BackgroundTransparency = 1,
Position = UDim2.fromOffset(10, 0),
Size = UDim2.new(1, -28, 0, 0),
}, {
New("UIListLayout", {
SortOrder = Enum.SortOrder.LayoutOrder,
VerticalAlignment = Enum.VerticalAlignment.Center,
}),
New("UIPadding", {
PaddingBottom = UDim.new(0, 13),
PaddingTop = UDim.new(0, 13),
}),
Element.Header,
Element.DescLabel,
})
Element.Border = New("UIStroke", {
Transparency = 0.5,
ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
Color = Color3.fromRGB(0, 0, 0),
ThemeTag = {
Color = "ElementBorder",
},
})
Element.Frame = New("TextButton", {
Visible = Options.Visible and Options.Visible or true,
Size = UDim2.new(1, 0, 0, 0),
BackgroundTransparency = 0.89,
BackgroundColor3 = Color3.fromRGB(130, 130, 130),
Parent = Parent,
AutomaticSize = Enum.AutomaticSize.Y,
Text = "",
LayoutOrder = 7,
ThemeTag = {
BackgroundColor3 = "Element",
BackgroundTransparency = "ElementTransparency",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
Element.Border,
Element.LabelHolder,
})
function Element:SetTitle(Set)
Element.TitleLabel.Text = Set
local hasTitle = (Set ~= nil and Set ~= "")
Element.Header.Visible = hasTitle
if not hasTitle then
if Element.IconImage then
if not Element.DescRow then
Element.DescRow = New("Frame", {
AutomaticSize = Enum.AutomaticSize.Y,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 14),
LayoutOrder = 2,
}, {
New("UIListLayout", {
Padding = UDim.new(0, 5),
FillDirection = Enum.FillDirection.Horizontal,
SortOrder = Enum.SortOrder.LayoutOrder,
VerticalAlignment = Enum.VerticalAlignment.Center,
}),
})
Element.DescRow.Parent = Element.LabelHolder
end
if not Element.DescIconImage then
Element.DescIconImage = New("ImageLabel", {
Image = Element.IconImage.Image,
Size = UDim2.fromOffset(16, 16),
BackgroundTransparency = 1,
LayoutOrder = 1,
ThemeTag = {
ImageColor3 = "Text",
},
})
Element.DescIconImage.Parent = Element.DescRow
else
Element.DescIconImage.Image = Element.IconImage.Image
Element.DescIconImage.Parent = Element.DescRow
end
Element.DescLabel.Parent = Element.DescRow
Element.DescLabel.LayoutOrder = 2
Element.DescLabel.Size = UDim2.new(1, -24, 0, 14)
else
if Element.DescRow then
Element.DescRow:Destroy()
Element.DescRow = nil
Element.DescIconImage = nil
end
Element.DescLabel.Parent = Element.LabelHolder
Element.DescLabel.LayoutOrder = 2
Element.DescLabel.Size = UDim2.new(1, 0, 0, 14)
end
else
if Element.DescRow then
Element.DescRow:Destroy()
Element.DescRow = nil
Element.DescIconImage = nil
end
Element.DescLabel.Parent = Element.LabelHolder
Element.DescLabel.LayoutOrder = 2
Element.DescLabel.Size = UDim2.new(1, 0, 0, 14)
end
if Library.Window and Library.Window.AllElements and Library.Window.AllElements[Element.Frame] then
Library.Window.AllElements[Element.Frame].title = Set
elseif Library.Windows and #Library.Windows > 0 then
local currentWindow = Library.Windows[#Library.Windows]
if currentWindow and currentWindow.AllElements and currentWindow.AllElements[Element.Frame] then
currentWindow.AllElements[Element.Frame].title = Set
end
end
end
function Element:Visible(Bool)
Element.Frame.Visible = Bool
end
function Element:SetDesc(Set)
if Set == nil then
Set = ""
end
if Set == "" then
Element.DescLabel.Visible = false
else
Element.DescLabel.Visible = true
end
Element.DescLabel.Text = Set
if Library.Window and Library.Window.AllElements and Library.Window.AllElements[Element.Frame] then
Library.Window.AllElements[Element.Frame].description = Set
elseif Library.Windows and #Library.Windows > 0 then
local currentWindow = Library.Windows[#Library.Windows]
if currentWindow and currentWindow.AllElements and currentWindow.AllElements[Element.Frame] then
currentWindow.AllElements[Element.Frame].description = Set
end
end
end
function Element:GetTitle()
return Element.TitleLabel.Text
end
function Element:GetDesc()
return Element.DescLabel.Text
end
function Element:Destroy()
Element.Frame:Destroy()
end
Element.Header.Visible = not (Title == nil or Title == "")
Element:SetTitle(Title or "")
Element:SetDesc(Desc)
if Library.Window and Library.Window.RegisterElement then
Library.Window.RegisterElement(Element.Frame, Title, "Element", Desc)
elseif Library.Windows and #Library.Windows > 0 then
local currentWindow = Library.Windows[#Library.Windows]
if currentWindow and currentWindow.RegisterElement then
currentWindow.RegisterElement(Element.Frame, Title, "Element", Desc)
end
end
if Hover then
local Themes = Library.Themes
local Motor, SetTransparency = Creator.SpringMotor(
Creator.GetThemeProperty("ElementTransparency"),
Element.Frame,
"BackgroundTransparency",
false,
true
)
Creator.AddSignal(Element.Frame.MouseEnter, function()
SetTransparency(Creator.GetThemeProperty("ElementTransparency") - Creator.GetThemeProperty("HoverChange"))
end)
Creator.AddSignal(Element.Frame.MouseLeave, function()
SetTransparency(Creator.GetThemeProperty("ElementTransparency"))
end)
Creator.AddSignal(Element.Frame.MouseButton1Down, function()
SetTransparency(Creator.GetThemeProperty("ElementTransparency") + Creator.GetThemeProperty("HoverChange"))
end)
Creator.AddSignal(Element.Frame.MouseButton1Up, function()
SetTransparency(Creator.GetThemeProperty("ElementTransparency") - Creator.GetThemeProperty("HoverChange"))
end)
end
return Element
end
end)()
Components.Section = (function()
local New = Creator.New
return function(Title, Parent, Icon)
local Section = {}
Section.Layout = New("UIListLayout", {
Padding = UDim.new(0, 5),
})
Section.Container = New("Frame", {
Size = UDim2.new(1, 0, 0, 26),
Position = UDim2.fromOffset(0, 24),
BackgroundTransparency = 1,
}, {
Section.Layout,
})
local SectionHeader = New("Frame", {
Size = UDim2.new(1, -16, 0, 18),
Position = UDim2.fromOffset(0, 2),
BackgroundTransparency = 1,
}, {
New("UIListLayout", {
Padding = UDim.new(0, 5),
FillDirection = Enum.FillDirection.Horizontal,
SortOrder = Enum.SortOrder.LayoutOrder,
VerticalAlignment = Enum.VerticalAlignment.Center,
}),
Icon and New("ImageLabel", {
Image = Icon,
Size = UDim2.fromOffset(16, 16),
BackgroundTransparency = 1,
LayoutOrder = 1,
ThemeTag = {
ImageColor3 = "Text",
},
}) or nil,
New("TextLabel", {
RichText = true,
Text = Title,
TextTransparency = 0,
FontFace = Font.new("rbxassetid://12187365364", Enum.FontWeight.SemiBold, Enum.FontStyle.Normal),
TextSize = 18,
TextXAlignment = "Left",
TextYAlignment = "Center",
Size = UDim2.fromScale(0, 1),
AutomaticSize = Enum.AutomaticSize.X,
BackgroundTransparency = 1,
LayoutOrder = 2,
ThemeTag = {
TextColor3 = "Text",
},
}),
})
Section.Root = New("Frame", {
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 26),
LayoutOrder = 7,
Parent = Parent,
}, {
SectionHeader,
Section.Container,
})
Creator.AddSignal(Section.Layout:GetPropertyChangedSignal("AbsoluteContentSize"), function()
Section.Container.Size = UDim2.new(1, 0, 0, Section.Layout.AbsoluteContentSize.Y)
Section.Root.Size = UDim2.new(1, 0, 0, Section.Layout.AbsoluteContentSize.Y + 25)
end)
if Library.Window and Library.Window.RegisterElement then
Library.Window.RegisterElement(Section.Root, Title, "Section")
elseif Library.Windows and #Library.Windows > 0 then
local currentWindow = Library.Windows[#Library.Windows]
if currentWindow and currentWindow.RegisterElement then
currentWindow.RegisterElement(Section.Root, Title, "Section")
end
end
return Section
end
end)()
Components.Tab = (function()
local New = Creator.New
local Spring = Flipper.Spring.new
local Instant = Flipper.Instant.new
local Components = Components
local TabModule = {
Window = nil,
Tabs = {},
Containers = {},
SelectedTab = 0,
TabCount = 0,
AnimationTask = nil,
CurrentAnimationTab = 0,
}
function TabModule:Init(Window)
TabModule.Window = Window
return TabModule
end
function TabModule:GetCurrentTabPos()
local TabHolderPos = TabModule.Window.TabHolder.AbsolutePosition.Y
local TabPos = TabModule.Tabs[TabModule.SelectedTab].Frame.AbsolutePosition.Y
return TabPos - TabHolderPos
end
function TabModule:New(Title, Icon, Parent)
local Window = TabModule.Window
local Elements = Library.Elements
TabModule.TabCount = TabModule.TabCount + 1
local TabIndex = TabModule.TabCount
local Tab = {
Selected = false,
Name = Title,
Type = "Tab",
}
if not fischbypass then
if Library:GetIcon(Icon) then
Icon = Library:GetIcon(Icon)
end
if Icon == "" or nil then
Icon = nil
end
end
Tab.Frame = New("TextButton", {
Size = UDim2.new(1, 0, 0, 34),
BackgroundTransparency = 0.92,
Parent = Parent,
ZIndex = 10,
ThemeTag = {
BackgroundColor3 = "Tab",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 6),
}),
New("TextLabel", {
AnchorPoint = Vector2.new(0, 0.5),
Position = not fischbypass and Icon and UDim2.new(0, 30, 0.5, 0) or UDim2.new(0, 12, 0.5, 0),
Text = Title,
RichText = true,
TextColor3 = Color3.fromRGB(255, 255, 255),
TextTransparency = 0,
FontFace = Font.new(
"rbxasset://fonts/families/GothamSSm.json",
Enum.FontWeight.Regular,
Enum.FontStyle.Normal
),
TextSize = 12,
TextXAlignment = "Left",
TextYAlignment = "Center",
Size = UDim2.new(1, -12, 1, 0),
BackgroundTransparency = 1,
ZIndex = 11,
ThemeTag = {
TextColor3 = "Text",
},
}),
New("ImageLabel", {
AnchorPoint = Vector2.new(0, 0.5),
Size = UDim2.fromOffset(16, 16),
Position = UDim2.new(0, 8, 0.5, 0),
BackgroundTransparency = 1,
Image = Icon and Icon or nil,
ZIndex = 11,
ThemeTag = {
ImageColor3 = "Text",
},
}),
})
local ContainerLayout = New("UIListLayout", {
Padding = UDim.new(0, 5),
SortOrder = Enum.SortOrder.LayoutOrder,
})
Tab.ContainerAnim = New("CanvasGroup", {
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = 1,
GroupTransparency = 0,
Parent = Window.ContainerHolder,
Visible = false,
Position = UDim2.fromOffset(0, 0),
})
Tab.ContainerFrame = New("ScrollingFrame", {
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = 1,
Parent = Tab.ContainerAnim,
Visible = true,
BottomImage = "rbxassetid://6889812791",
MidImage = "rbxassetid://6889812721",
TopImage = "rbxassetid://6276641225",
ScrollBarImageColor3 = Color3.fromRGB(255, 255, 255),
ScrollBarImageTransparency = 0.95,
ScrollBarThickness = 3,
BorderSizePixel = 0,
CanvasSize = UDim2.fromScale(0, 0),
ScrollingDirection = Enum.ScrollingDirection.Y,
ScrollingEnabled = true,
}, {
ContainerLayout,
New("UIPadding", {
PaddingRight = UDim.new(0, 10),
PaddingLeft = UDim.new(0, 1),
PaddingTop = UDim.new(0, 1),
PaddingBottom = UDim.new(0, 1),
}),
})
Tab.ContainerXMotor = Flipper.SingleMotor.new(0)
Tab.ContainerTransparencyMotor = Flipper.SingleMotor.new(0)
Tab.ContainerXMotor:onStep(function(Value)
if Tab.ContainerAnim and Tab.ContainerAnim.Parent then
Tab.ContainerAnim.Position = UDim2.fromOffset(Value, 0)
end
end)
Tab.ContainerTransparencyMotor:onStep(function(Value)
if Tab.ContainerAnim and Tab.ContainerAnim.Parent then
Tab.ContainerAnim.GroupTransparency = Value
end
end)
Creator.AddSignal(ContainerLayout:GetPropertyChangedSignal("AbsoluteContentSize"), function()
Tab.ContainerFrame.CanvasSize = UDim2.new(0, 0, 0, ContainerLayout.AbsoluteContentSize.Y + 2)
end)
Tab.Motor, Tab.SetTransparency = Creator.SpringMotor(0.92, Tab.Frame, "BackgroundTransparency")
Creator.AddSignal(Tab.Frame.MouseEnter, function()
Tab.SetTransparency(Tab.Selected and 0.85 or 0.87)
end)
Creator.AddSignal(Tab.Frame.MouseLeave, function()
Tab.SetTransparency(Tab.Selected and 0.89 or 0.92)
end)
Creator.AddSignal(Tab.Frame.MouseButton1Down, function()
Tab.SetTransparency(0.92)
end)
Creator.AddSignal(Tab.Frame.MouseButton1Up, function()
Tab.SetTransparency(Tab.Selected and 0.85 or 0.89)
end)
Creator.AddSignal(Tab.Frame.MouseButton1Click, function()
TabModule:SelectTab(TabIndex)
end)
TabModule.Containers[TabIndex] = Tab.ContainerAnim
TabModule.Tabs[TabIndex] = Tab
Tab.Container = Tab.ContainerFrame
Tab.ScrollFrame = Tab.Container
Tab.SubTabs = {}
Tab.SubTabContainers = {}
Tab.SelectedSubTab = 0
Tab.SubTabCount = 0
Tab.SubTabHolder = nil
function Tab:AddSubTab(Title, Icon)
self.SubTabCount = self.SubTabCount + 1
local SubTabIndex = self.SubTabCount
if not self.SubTabHolder then
local SubTabListLayout = New("UIListLayout", {
Padding = UDim.new(0, 6),
FillDirection = Enum.FillDirection.Horizontal,
SortOrder = Enum.SortOrder.LayoutOrder,
VerticalAlignment = Enum.VerticalAlignment.Center,
})
self.SubTabHolder = New("ScrollingFrame", {
Size = UDim2.new(1, -20, 0, 40),
Position = UDim2.fromOffset(1, 8),
BackgroundTransparency = 1,
Parent = self.ContainerFrame,
ScrollingDirection = Enum.ScrollingDirection.X,
ScrollBarThickness = 0,
ScrollBarImageTransparency = 1,
ScrollBarImageColor3 = Color3.fromRGB(255, 255, 255),
CanvasSize = UDim2.fromScale(0, 1),
BorderSizePixel = 0,
}, {
SubTabListLayout,
New("UIPadding", {
PaddingLeft = UDim.new(0, 0),
PaddingRight = UDim.new(0, 0),
PaddingTop = UDim.new(0, 0),
PaddingBottom = UDim.new(0, 0),
}),
})
Creator.AddSignal(SubTabListLayout:GetPropertyChangedSignal("AbsoluteContentSize"), function()
self.SubTabHolder.CanvasSize = UDim2.new(0, SubTabListLayout.AbsoluteContentSize.X, 0, 40)
end)
local SubTabContainerHolder = New("Frame", {
Size = UDim2.new(1, -11, 1, -56),
Position = UDim2.fromOffset(1, 48),
BackgroundTransparency = 1,
ClipsDescendants = true,
Parent = self.ContainerFrame,
})
self.SubTabContainerHolder = SubTabContainerHolder
end
local SubTabIcon = Icon
if not fischbypass then
if Library:GetIcon(Icon) then
SubTabIcon = Library:GetIcon(Icon)
end
if SubTabIcon == "" or nil then
SubTabIcon = nil
end
end
local SubTabButton = New("TextButton", {
Size = UDim2.new(0, 0, 0, 32),
AutomaticSize = Enum.AutomaticSize.X,
BackgroundTransparency = 0.92,
Parent = self.SubTabHolder,
Text = "",
ThemeTag = {
BackgroundColor3 = "Tab",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 6),
}),
New("UIStroke", {
Transparency = 1,
Thickness = 1,
ThemeTag = {
Color = "Accent",
},
}),
New("UIListLayout", {
Padding = UDim.new(0, 6),
FillDirection = Enum.FillDirection.Horizontal,
SortOrder = Enum.SortOrder.LayoutOrder,
VerticalAlignment = Enum.VerticalAlignment.Center,
HorizontalAlignment = Enum.HorizontalAlignment.Center,
}),
New("UIPadding", {
PaddingLeft = UDim.new(0, 12),
PaddingRight = UDim.new(0, 12),
PaddingTop = UDim.new(0, 6),
PaddingBottom = UDim.new(0, 6),
}),
SubTabIcon and New("ImageLabel", {
Size = UDim2.fromOffset(16, 16),
BackgroundTransparency = 1,
Image = SubTabIcon,
LayoutOrder = 1,
ThemeTag = {
ImageColor3 = "Text",
},
}) or nil,
New("TextLabel", {
Text = Title,
RichText = true,
TextColor3 = Color3.fromRGB(255, 255, 255),
TextTransparency = 0,
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json", Enum.FontWeight.Regular, Enum.FontStyle.Normal),
TextSize = 12,
TextXAlignment = "Left",
TextYAlignment = "Center",
Size = UDim2.new(0, 0, 1, 0),
AutomaticSize = Enum.AutomaticSize.X,
BackgroundTransparency = 1,
LayoutOrder = 2,
ThemeTag = {
TextColor3 = "Text",
},
}),
})
local SubTabContainerAnim = New("CanvasGroup", {
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = 1,
GroupTransparency = 0,
Parent = self.SubTabContainerHolder,
Visible = false,
Position = UDim2.fromOffset(0, 0),
})
local SubTabContainer = New("ScrollingFrame", {
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = 1,
Parent = SubTabContainerAnim,
Visible = true,
BottomImage = "rbxassetid://6889812791",
MidImage = "rbxassetid://6889812721",
TopImage = "rbxassetid://6276641225",
ScrollBarImageColor3 = Color3.fromRGB(255, 255, 255),
ScrollBarImageTransparency = 0.95,
ScrollBarThickness = 3,
BorderSizePixel = 0,
CanvasSize = UDim2.fromScale(0, 0),
ScrollingDirection = Enum.ScrollingDirection.Y,
ScrollingEnabled = true,
}, {
New("UIListLayout", {
Padding = UDim.new(0, 5),
SortOrder = Enum.SortOrder.LayoutOrder,
}),
New("UIPadding", {
PaddingRight = UDim.new(0, 10),
PaddingLeft = UDim.new(0, 1),
PaddingTop = UDim.new(0, 1),
PaddingBottom = UDim.new(0, 1),
}),
})
local SubTabLayout = SubTabContainer:FindFirstChild("UIListLayout")
Creator.AddSignal(SubTabLayout:GetPropertyChangedSignal("AbsoluteContentSize"), function()
SubTabContainer.CanvasSize = UDim2.new(0, 0, 0, SubTabLayout.AbsoluteContentSize.Y + 2)
end)
local SubTabXMotor = Flipper.SingleMotor.new(0)
local SubTabTransparencyMotor = Flipper.SingleMotor.new(0)
SubTabXMotor:onStep(function(Value)
if SubTabContainerAnim and SubTabContainerAnim.Parent then
SubTabContainerAnim.Position = UDim2.fromOffset(Value, 0)
end
end)
SubTabTransparencyMotor:onStep(function(Value)
if SubTabContainerAnim and SubTabContainerAnim.Parent then
SubTabContainerAnim.GroupTransparency = Value
end
end)
local SubTabMotor, SubTabSetTransparency = Creator.SpringMotor(0.92, SubTabButton, "BackgroundTransparency")
local SubTabStroke = SubTabButton:FindFirstChild("UIStroke")
local function UpdateSubTabAppearance()
if self.SelectedSubTab == SubTabIndex then
SubTabSetTransparency(0.75)
if SubTabStroke then
SubTabStroke.Transparency = 0
end
else
SubTabSetTransparency(0.92)
if SubTabStroke then
SubTabStroke.Transparency = 1
end
end
end
Creator.AddSignal(SubTabButton.MouseEnter, function()
if self.SelectedSubTab ~= SubTabIndex then
SubTabSetTransparency(0.87)
end
end)
Creator.AddSignal(SubTabButton.MouseLeave, function()
UpdateSubTabAppearance()
end)
Creator.AddSignal(SubTabButton.MouseButton1Down, function()
SubTabSetTransparency(0.92)
end)
Creator.AddSignal(SubTabButton.MouseButton1Up, function()
UpdateSubTabAppearance()
end)
UpdateSubTabAppearance()
Creator.AddSignal(SubTabButton.MouseButton1Click, function()
self:SelectSubTab(SubTabIndex)
end)
local SubTab = {
Type = "SubTab",
Name = Title,
Button = SubTabButton,
Container = SubTabContainer,
ContainerAnim = SubTabContainerAnim,
XMotor = SubTabXMotor,
TransparencyMotor = SubTabTransparencyMotor,
SetTransparency = SubTabSetTransparency,
Selected = false,
}
self.SubTabs[SubTabIndex] = SubTab
self.SubTabContainers[SubTabIndex] = SubTabContainerAnim
if self.SubTabCount == 1 then
self:SelectSubTab(SubTabIndex)
end
function SubTab:AddSection(SectionTitle, SectionIcon)
local Section = { Type = "Section" }
local Icon = SectionIcon
if not fischbypass then
if Library:GetIcon(Icon) then
Icon = Library:GetIcon(Icon)
end
if Icon == "" or nil then
Icon = nil
end
end
local SectionFrame = Components.Section(SectionTitle, SubTab.Container, Icon)
Section.Container = SectionFrame.Container
Section.ScrollFrame = SubTab.Container
setmetatable(Section, Elements)
return Section
end
setmetatable(SubTab, Elements)
return SubTab
end
function Tab:SelectSubTab(SubTabIndex)
if self.SelectedSubTab == SubTabIndex then
return
end
local PreviousSubTab = self.SelectedSubTab
local Direction = (PreviousSubTab > 0 and SubTabIndex > PreviousSubTab) and 1 or -1
if PreviousSubTab == 0 then
Direction = 0
end
local ContainerSize = self.SubTabContainerHolder and self.SubTabContainerHolder.AbsoluteSize.X or 500
local SlideDistance = math.min(ContainerSize * 0.15, 60)
self.SelectedSubTab = SubTabIndex
for idx, SubTabObj in next, self.SubTabs do
SubTabObj.Selected = (idx == SubTabIndex)
local SubTabStroke = SubTabObj.Button:FindFirstChild("UIStroke")
if idx == SubTabIndex then
SubTabObj.SetTransparency(0.75)
if SubTabStroke then
SubTabStroke.Transparency = 0
end
else
SubTabObj.SetTransparency(0.92)
if SubTabStroke then
SubTabStroke.Transparency = 1
end
end
end
if PreviousSubTab > 0 and PreviousSubTab ~= SubTabIndex and self.SubTabs[PreviousSubTab] and self.SubTabs[SubTabIndex] then
local OldContainer = self.SubTabs[PreviousSubTab].ContainerAnim
local NewContainer = self.SubTabs[SubTabIndex].ContainerAnim
local OldSubTab = self.SubTabs[PreviousSubTab]
local NewSubTab = self.SubTabs[SubTabIndex]
for idx, Container in next, self.SubTabContainers do
if Container and idx ~= PreviousSubTab and idx ~= SubTabIndex then
Container.Visible = false
Container.Position = UDim2.fromOffset(0, 0)
Container.GroupTransparency = 0
if self.SubTabs[idx] then
pcall(function()
self.SubTabs[idx].XMotor:setGoal(Instant(0))
self.SubTabs[idx].TransparencyMotor:setGoal(Instant(0))
end)
end
end
end
OldContainer.Visible = true
OldContainer.Position = UDim2.fromOffset(0, 0)
OldContainer.GroupTransparency = 0
pcall(function()
OldSubTab.XMotor:setGoal(Instant(0))
OldSubTab.TransparencyMotor:setGoal(Instant(0))
end)
NewContainer.Visible = true
NewContainer.Position = UDim2.fromOffset(Direction * SlideDistance, 0)
NewContainer.GroupTransparency = 1
pcall(function()
NewSubTab.XMotor:setGoal(Instant(Direction * SlideDistance))
NewSubTab.TransparencyMotor:setGoal(Instant(1))
end)
task.wait()
pcall(function()
OldSubTab.XMotor:setGoal(Spring(-Direction * SlideDistance, { frequency = 4, dampingRatio = 0.7 }))
OldSubTab.TransparencyMotor:setGoal(Spring(1, { frequency = 4, dampingRatio = 0.7 }))
end)
pcall(function()
NewSubTab.XMotor:setGoal(Spring(0, { frequency = 4, dampingRatio = 0.7 }))
NewSubTab.TransparencyMotor:setGoal(Spring(0, { frequency = 4, dampingRatio = 0.7 }))
end)
task.spawn(function()
task.wait(0.5)
if self.SelectedSubTab == SubTabIndex and self.SubTabs[PreviousSubTab] then
local OldContainer = self.SubTabs[PreviousSubTab].ContainerAnim
local OldSubTab = self.SubTabs[PreviousSubTab]
if OldContainer and OldContainer.Parent then
OldContainer.Visible = false
OldContainer.Position = UDim2.fromOffset(0, 0)
OldContainer.GroupTransparency = 0
end
if OldSubTab and OldSubTab.XMotor and OldSubTab.TransparencyMotor then
pcall(function()
OldSubTab.XMotor:setGoal(Instant(0))
OldSubTab.TransparencyMotor:setGoal(Instant(0))
end)
end
end
end)
else
for idx, Container in next, self.SubTabContainers do
if Container then
Container.Visible = (idx == SubTabIndex)
Container.Position = UDim2.fromOffset(0, 0)
Container.GroupTransparency = 0
if self.SubTabs[idx] then
pcall(function()
self.SubTabs[idx].XMotor:setGoal(Instant(0))
self.SubTabs[idx].TransparencyMotor:setGoal(Instant(0))
end)
end
end
end
end
end
function Tab:AddSection(SectionTitle, SectionIcon)
if self.SelectedSubTab > 0 and self.SubTabs[self.SelectedSubTab] then
return self.SubTabs[self.SelectedSubTab]:AddSection(SectionTitle, SectionIcon)
end
local Section = { Type = "Section" }
local Icon = SectionIcon
if not fischbypass then
if Library:GetIcon(Icon) then
Icon = Library:GetIcon(Icon)
end
if Icon == "" or nil then
Icon = nil
end
end
local SectionFrame = Components.Section(SectionTitle, Tab.Container, Icon)
Section.Container = SectionFrame.Container
Section.ScrollFrame = Tab.Container
setmetatable(Section, Elements)
return Section
end
setmetatable(Tab, Elements)
return Tab
end
function TabModule:SelectTab(Tab)
if TabModule.SelectedTab == Tab then
return
end
if TabModule.AnimationTask then
task.cancel(TabModule.AnimationTask)
TabModule.AnimationTask = nil
end
local Window = TabModule.Window
local PreviousTab = TabModule.SelectedTab
local Direction = (PreviousTab > 0 and Tab > PreviousTab) and 1 or -1
if PreviousTab == 0 then
Direction = 0
end
local ContainerSize = Window.ContainerHolder and Window.ContainerHolder.AbsoluteSize.X or (Window.ContainerCanvas and Window.ContainerCanvas.AbsoluteSize.X or 500)
local SlideDistance = math.min(ContainerSize * 0.15, 60)
TabModule.SelectedTab = Tab
TabModule.CurrentAnimationTab = Tab
for _, TabObject in next, TabModule.Tabs do
TabObject.SetTransparency(0.92)
TabObject.Selected = false
end
TabModule.Tabs[Tab].SetTransparency(0.89)
TabModule.Tabs[Tab].Selected = true
Window.TabDisplay.Text = TabModule.Tabs[Tab].Name
Window.SelectorPosMotor:setGoal(Spring(TabModule:GetCurrentTabPos(), { frequency = 6 }))
if PreviousTab > 0 and PreviousTab ~= Tab and TabModule.Tabs[PreviousTab] and TabModule.Tabs[Tab] then
local OldContainer = TabModule.Tabs[PreviousTab].ContainerAnim
local NewContainer = TabModule.Tabs[Tab].ContainerAnim
local OldTab = TabModule.Tabs[PreviousTab]
local NewTab = TabModule.Tabs[Tab]
if not OldContainer or not NewContainer or not OldTab.ContainerXMotor or not OldTab.ContainerTransparencyMotor or not NewTab.ContainerXMotor or not NewTab.ContainerTransparencyMotor then
for idx, Container in next, TabModule.Containers do
if Container then
Container.Visible = (idx == Tab)
Container.Position = UDim2.fromOffset(0, 0)
Container.GroupTransparency = 0
end
end
return
end
for idx, Container in next, TabModule.Containers do
if Container and idx ~= PreviousTab and idx ~= Tab then
Container.Visible = false
Container.Position = UDim2.fromOffset(0, 0)
Container.GroupTransparency = 0
if TabModule.Tabs[idx] and TabModule.Tabs[idx].ContainerXMotor and TabModule.Tabs[idx].ContainerTransparencyMotor then
pcall(function()
TabModule.Tabs[idx].ContainerXMotor:setGoal(Instant(0))
TabModule.Tabs[idx].ContainerTransparencyMotor:setGoal(Instant(0))
end)
end
end
end
OldContainer.Visible = true
OldContainer.Position = UDim2.fromOffset(0, 0)
OldContainer.GroupTransparency = 0
pcall(function()
OldTab.ContainerXMotor:setGoal(Instant(0))
OldTab.ContainerTransparencyMotor:setGoal(Instant(0))
end)
NewContainer.Visible = true
NewContainer.Position = UDim2.fromOffset(Direction * SlideDistance, 0)
NewContainer.GroupTransparency = 1
pcall(function()
NewTab.ContainerXMotor:setGoal(Instant(Direction * SlideDistance))
NewTab.ContainerTransparencyMotor:setGoal(Instant(1))
end)
task.wait()
pcall(function()
OldTab.ContainerXMotor:setGoal(Spring(-Direction * SlideDistance, { frequency = 4, dampingRatio = 0.7 }))
OldTab.ContainerTransparencyMotor:setGoal(Spring(1, { frequency = 4, dampingRatio = 0.7 }))
end)
pcall(function()
NewTab.ContainerXMotor:setGoal(Spring(0, { frequency = 4, dampingRatio = 0.7 }))
NewTab.ContainerTransparencyMotor:setGoal(Spring(0, { frequency = 4, dampingRatio = 0.7 }))
end)
TabModule.AnimationTask = task.spawn(function()
task.wait(0.5)
if TabModule.CurrentAnimationTab == Tab and TabModule.Tabs[PreviousTab] then
local OldContainer = TabModule.Tabs[PreviousTab].ContainerAnim
local OldTab = TabModule.Tabs[PreviousTab]
if OldContainer and OldContainer.Parent then
OldContainer.Visible = false
OldContainer.Position = UDim2.fromOffset(0, 0)
OldContainer.GroupTransparency = 0
end
if OldTab and OldTab.ContainerXMotor and OldTab.ContainerTransparencyMotor then
pcall(function()
OldTab.ContainerXMotor:setGoal(Instant(0))
OldTab.ContainerTransparencyMotor:setGoal(Instant(0))
end)
end
TabModule.AnimationTask = nil
end
end)
else
for idx, Container in next, TabModule.Containers do
if Container then
Container.Visible = (idx == Tab)
Container.Position = UDim2.fromOffset(0, 0)
Container.GroupTransparency = 0
if TabModule.Tabs[idx] and TabModule.Tabs[idx].ContainerXMotor and TabModule.Tabs[idx].ContainerTransparencyMotor then
pcall(function()
TabModule.Tabs[idx].ContainerXMotor:setGoal(Instant(0))
TabModule.Tabs[idx].ContainerTransparencyMotor:setGoal(Instant(0))
end)
end
end
end
end
end
return TabModule
end)()
Components.Button = (function()
local New = Creator.New
local Spring = Flipper.Spring.new
return function(Theme, Parent, DialogCheck)
DialogCheck = DialogCheck or false
local Button = {}
Button.Title = New("TextLabel", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
TextColor3 = Color3.fromRGB(200, 200, 200),
TextSize = 14,
TextWrapped = true,
TextXAlignment = Enum.TextXAlignment.Center,
TextYAlignment = Enum.TextYAlignment.Center,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
AutomaticSize = Enum.AutomaticSize.Y,
BackgroundTransparency = 1,
Size = UDim2.fromScale(1, 1),
ThemeTag = {
TextColor3 = "Text",
},
})
Button.HoverFrame = New("Frame", {
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = 1,
ThemeTag = {
BackgroundColor3 = "Hover",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
})
Button.Frame = New("TextButton", {
Size = UDim2.new(0, 0, 0, 32),
Parent = Parent,
ThemeTag = {
BackgroundColor3 = "DialogButton",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
New("UIStroke", {
ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
Transparency = 0.65,
ThemeTag = {
Color = "DialogButtonBorder",
},
}),
Button.HoverFrame,
Button.Title,
})
local Motor, SetTransparency = Creator.SpringMotor(1, Button.HoverFrame, "BackgroundTransparency", DialogCheck)
Creator.AddSignal(Button.Frame.MouseEnter, function()
SetTransparency(0.97)
end)
Creator.AddSignal(Button.Frame.MouseLeave, function()
SetTransparency(1)
end)
Creator.AddSignal(Button.Frame.MouseButton1Down, function()
SetTransparency(1)
end)
Creator.AddSignal(Button.Frame.MouseButton1Up, function()
SetTransparency(0.97)
end)
return Button
end
end)()
Components.Dialog = (function()
local Spring = Flipper.Spring.new
local Instant = Flipper.Instant.new
local New = Creator.New
local Dialog = {
Window = nil,
}
function Dialog:Init(Window)
Dialog.Window = Window
return Dialog
end
function Dialog:Create()
local NewDialog = {
Buttons = 0,
}
NewDialog.TintFrame = New("TextButton", {
Text = "",
Size = UDim2.fromScale(1, 1),
BackgroundColor3 = Color3.fromRGB(0, 0, 0),
BackgroundTransparency = 1,
Parent = Dialog.Window.Root,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
})
local TintMotor, TintTransparency = Creator.SpringMotor(1, NewDialog.TintFrame, "BackgroundTransparency", true)
NewDialog.ButtonHolder = New("Frame", {
Size = UDim2.new(1, -40, 1, -40),
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.fromScale(0.5, 0.5),
BackgroundTransparency = 1,
}, {
New("UIListLayout", {
Padding = UDim.new(0, 10),
FillDirection = Enum.FillDirection.Horizontal,
HorizontalAlignment = Enum.HorizontalAlignment.Center,
SortOrder = Enum.SortOrder.LayoutOrder,
}),
})
NewDialog.ButtonHolderFrame = New("Frame", {
Size = UDim2.new(1, 0, 0, 70),
Position = UDim2.new(0, 0, 1, -70),
ThemeTag = {
BackgroundColor3 = "DialogHolder",
},
}, {
New("Frame", {
Size = UDim2.new(1, 0, 0, 1),
ThemeTag = {
BackgroundColor3 = "DialogHolderLine",
},
}),
NewDialog.ButtonHolder,
})
NewDialog.Title = New("TextLabel", {
FontFace = Font.new(
"rbxasset://fonts/families/GothamSSm.json",
Enum.FontWeight.SemiBold,
Enum.FontStyle.Normal
),
Text = "Dialog",
TextColor3 = Color3.fromRGB(240, 240, 240),
TextSize = 22,
TextXAlignment = Enum.TextXAlignment.Left,
Size = UDim2.new(1, 0, 0, 22),
Position = UDim2.fromOffset(20, 25),
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BackgroundTransparency = 1,
ThemeTag = {
TextColor3 = "Text",
},
})
NewDialog.Scale = New("UIScale", {
Scale = 1,
})
local ScaleMotor, Scale = Creator.SpringMotor(1.1, NewDialog.Scale, "Scale")
NewDialog.Root = New("CanvasGroup", {
Size = UDim2.fromOffset(300, 165),
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.fromScale(0.5, 0.5),
GroupTransparency = 1,
Parent = NewDialog.TintFrame,
ThemeTag = {
BackgroundColor3 = "Dialog",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
New("UIStroke", {
Transparency = 0.5,
ThemeTag = {
Color = "DialogBorder",
},
}),
NewDialog.Scale,
NewDialog.Title,
NewDialog.ButtonHolderFrame,
})
local RootMotor, RootTransparency = Creator.SpringMotor(1, NewDialog.Root, "GroupTransparency")
function NewDialog:Open()
Library.DialogOpen = true
NewDialog.Scale.Scale = 1.1
TintTransparency(0.75)
RootTransparency(0)
Scale(1)
end
function NewDialog:Close()
Library.DialogOpen = false
TintTransparency(1)
RootTransparency(1)
Scale(1.1)
NewDialog.Root.UIStroke:Destroy()
task.wait(0.15)
NewDialog.TintFrame:Destroy()
end
function NewDialog:Button(Title, Callback)
NewDialog.Buttons = NewDialog.Buttons + 1
Title = Title or "Button"
Callback = Callback or function() end
local Button = Components.Button("", NewDialog.ButtonHolder, true)
Button.Title.Text = Title
for _, Btn in next, NewDialog.ButtonHolder:GetChildren() do
if Btn:IsA("TextButton") then
Btn.Size =
UDim2.new(1 / NewDialog.Buttons, -(((NewDialog.Buttons - 1) * 10) / NewDialog.Buttons), 0, 32)
end
end
Creator.AddSignal(Button.Frame.MouseButton1Click, function()
Library:SafeCallback(Callback)
pcall(function()
NewDialog:Close()
end)
end)
return Button
end
return NewDialog
end
return Dialog
end)()
Components.Notification = (function()
local Spring = Flipper.Spring.new
local Instant = Flipper.Instant.new
local New = Creator.New
local Notification = {}
function Notification:Init(GUI)
Library.ActiveNotifications = Library.ActiveNotifications or {}
Notification.Holder = New("Frame", {
Position = UDim2.new(1, -30, 1, -30),
Size = UDim2.new(0, 310, 1, -30),
AnchorPoint = Vector2.new(1, 1),
BackgroundTransparency = 1,
Parent = GUI,
}, {
New("UIListLayout", {
HorizontalAlignment = Enum.HorizontalAlignment.Center,
SortOrder = Enum.SortOrder.LayoutOrder,
VerticalAlignment = Enum.VerticalAlignment.Bottom,
Padding = UDim.new(0, 20),
}),
})
end
function Notification:New(Config)
Config.Title = Config.Title or "Title"
Config.Content = Config.Content or "Content"
Config.SubContent = Config.SubContent or ""
Config.Duration = Config.Duration or nil
local NewNotification = {
Closed = false,
}
NewNotification.AcrylicPaint = Acrylic.AcrylicPaint()
NewNotification.Title = New("TextLabel", {
Position = UDim2.new(0, 14, 0, 17),
Text = Config.Title,
RichText = true,
TextColor3 = Color3.fromRGB(255, 255, 255),
TextTransparency = 0,
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
TextSize = 13,
TextXAlignment = "Left",
TextYAlignment = "Center",
Size = UDim2.new(1, -12, 0, 12),
TextWrapped = true,
BackgroundTransparency = 1,
ThemeTag = {
TextColor3 = "Text",
},
})
NewNotification.ContentLabel = New("TextLabel", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
Text = Config.Content,
TextColor3 = Color3.fromRGB(240, 240, 240),
TextSize = 14,
TextXAlignment = Enum.TextXAlignment.Left,
AutomaticSize = Enum.AutomaticSize.Y,
Size = UDim2.new(1, 0, 0, 14),
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BackgroundTransparency = 1,
TextWrapped = true,
ThemeTag = {
TextColor3 = "Text",
},
})
NewNotification.SubContentLabel = New("TextLabel", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
Text = Config.SubContent,
TextColor3 = Color3.fromRGB(240, 240, 240),
TextSize = 14,
TextXAlignment = Enum.TextXAlignment.Left,
AutomaticSize = Enum.AutomaticSize.Y,
Size = UDim2.new(1, 0, 0, 14),
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BackgroundTransparency = 1,
TextWrapped = true,
ThemeTag = {
TextColor3 = "SubText",
},
})
NewNotification.LabelHolder = New("Frame", {
AutomaticSize = Enum.AutomaticSize.Y,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BackgroundTransparency = 1,
Position = UDim2.fromOffset(14, 40),
Size = UDim2.new(1, -28, 0, 0),
}, {
New("UIListLayout", {
SortOrder = Enum.SortOrder.LayoutOrder,
VerticalAlignment = Enum.VerticalAlignment.Center,
Padding = UDim.new(0, 3),
}),
NewNotification.ContentLabel,
NewNotification.SubContentLabel,
})
NewNotification.CloseButton = New("TextButton", {
Text = "",
Position = UDim2.new(1, -14, 0, 13),
Size = UDim2.fromOffset(20, 20),
AnchorPoint = Vector2.new(1, 0),
BackgroundTransparency = 1,
}, {
New("ImageLabel", {
Image = Components.Close,
Size = UDim2.fromOffset(16, 16),
Position = UDim2.fromScale(0.5, 0.5),
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1,
ThemeTag = {
ImageColor3 = "Text",
},
}),
})
NewNotification.Root = New("Frame", {
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 1, 0),
Position = UDim2.fromScale(1, 0),
}, {
NewNotification.AcrylicPaint.Frame,
NewNotification.Title,
NewNotification.CloseButton,
NewNotification.LabelHolder,
})
if Config.Content == "" then
NewNotification.ContentLabel.Visible = false
end
if Config.SubContent == "" then
NewNotification.SubContentLabel.Visible = false
end
NewNotification.Holder = New("Frame", {
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 200),
Parent = Notification.Holder,
}, {
NewNotification.Root,
})
local RootMotor = Flipper.GroupMotor.new({
Scale = 1,
Offset = 60,
})
RootMotor:onStep(function(Values)
NewNotification.Root.Position = UDim2.new(Values.Scale, Values.Offset, 0, 0)
end)
Creator.AddSignal(NewNotification.CloseButton.MouseButton1Click, function()
NewNotification:Close()
end)
function NewNotification:ApplyTransparency()
if Library.Theme == "Glass" and Library.UseAcrylic then
local Value = Library.NotificationTransparency or 1
local notifTransparency = 0.85 + (Value * 0.08)
if Value > 1 then
notifTransparency = 0.93 + ((Value - 1) * 0.04)
end
local notifBackgroundTransparency = 0.8 + (Value * 0.1)
if Value > 1 then
notifBackgroundTransparency = 0.9 + ((Value - 1) * 0.05)
end
if NewNotification.AcrylicPaint and NewNotification.AcrylicPaint.Model then
NewNotification.AcrylicPaint.Model.Transparency = math.min(notifTransparency, 0.97)
end
if NewNotification.AcrylicPaint and NewNotification.AcrylicPaint.Frame and NewNotification.AcrylicPaint.Frame.Background then
NewNotification.AcrylicPaint.Frame.Background.BackgroundTransparency = math.min(notifBackgroundTransparency, 0.95)
end
end
end
function NewNotification:Open()
local ContentSize = NewNotification.LabelHolder.AbsoluteSize.Y
NewNotification.Holder.Size = UDim2.new(1, 0, 0, 58 + ContentSize)
RootMotor:setGoal({
Scale = Spring(0, { frequency = 5 }),
Offset = Spring(0, { frequency = 5 }),
})
task.defer(function()
task.wait(0.1)
NewNotification:ApplyTransparency()
end)
end
function NewNotification:Close()
if not NewNotification.Closed then
NewNotification.Closed = true
for i, notif in pairs(Library.ActiveNotifications or {}) do
if notif == NewNotification then
table.remove(Library.ActiveNotifications, i)
break
end
end
task.spawn(function()
RootMotor:setGoal({
Scale = Spring(1, { frequency = 5 }),
Offset = Spring(60, { frequency = 5 }),
})
task.wait(0.4)
if Library.UseAcrylic then
NewNotification.AcrylicPaint.Model:Destroy()
end
NewNotification.Holder:Destroy()
end)
end
end
table.insert(Library.ActiveNotifications, NewNotification)
NewNotification:Open()
if Config.Duration then
task.delay(Config.Duration, function()
NewNotification:Close()
end)
end
return NewNotification
end
return Notification
end)()
Components.Textbox = (function()
local New = Creator.New
return function(Parent, Acrylic)
Acrylic = Acrylic or false
local Textbox = {}
Textbox.Input = New("TextBox", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
TextColor3 = Color3.fromRGB(200, 200, 200),
TextSize = 14,
TextXAlignment = Enum.TextXAlignment.Left,
TextYAlignment = Enum.TextYAlignment.Center,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
AutomaticSize = Enum.AutomaticSize.Y,
BackgroundTransparency = 1,
Size = UDim2.fromScale(1, 1),
Position = UDim2.fromOffset(10, 0),
ThemeTag = {
TextColor3 = "Text",
PlaceholderColor3 = "SubText",
},
})
Textbox.Container = New("Frame", {
BackgroundTransparency = 1,
ClipsDescendants = true,
Position = UDim2.new(0, 6, 0, 0),
Size = UDim2.new(1, -12, 1, 0),
}, {
Textbox.Input,
})
Textbox.Indicator = New("Frame", {
Size = UDim2.new(1, -4, 0, 1),
Position = UDim2.new(0, 2, 1, 0),
AnchorPoint = Vector2.new(0, 1),
BackgroundTransparency = Acrylic and 0.5 or 0,
ThemeTag = {
BackgroundColor3 = Acrylic and "InputIndicator" or "DialogInputLine",
},
})
Textbox.Frame = New("Frame", {
Size = UDim2.new(0, 0, 0, 30),
BackgroundTransparency = Acrylic and 0.9 or 0,
Parent = Parent,
ThemeTag = {
BackgroundColor3 = Acrylic and "Input" or "DialogInput",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
New("UIStroke", {
ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
Transparency = Acrylic and 0.5 or 0.65,
ThemeTag = {
Color = Acrylic and "InElementBorder" or "DialogButtonBorder",
},
}),
Textbox.Indicator,
Textbox.Container,
})
local function Update()
local PADDING = 2
local Reveal = Textbox.Container.AbsoluteSize.X
if not Textbox.Input:IsFocused() or Textbox.Input.TextBounds.X <= Reveal - 2 * PADDING then
Textbox.Input.Position = UDim2.new(0, PADDING, 0, 0)
else
local Cursor = Textbox.Input.CursorPosition
if Cursor ~= -1 then
local subtext = string.sub(Textbox.Input.Text, 1, Cursor - 1)
local width = TextService:GetTextSize(
subtext,
Textbox.Input.TextSize,
Textbox.Input.Font,
Vector2.new(math.huge, math.huge)
).X
local CurrentCursorPos = Textbox.Input.Position.X.Offset + width
if CurrentCursorPos < PADDING then
Textbox.Input.Position = UDim2.fromOffset(PADDING - width, 0)
elseif CurrentCursorPos > Reveal - PADDING - 1 then
Textbox.Input.Position = UDim2.fromOffset(Reveal - width - PADDING - 1, 0)
end
end
end
end
task.spawn(Update)
Creator.AddSignal(Textbox.Input:GetPropertyChangedSignal("Text"), Update)
Creator.AddSignal(Textbox.Input:GetPropertyChangedSignal("CursorPosition"), Update)
Creator.AddSignal(Textbox.Input.Focused, function()
Update()
Textbox.Indicator.Size = UDim2.new(1, -2, 0, 2)
Textbox.Indicator.Position = UDim2.new(0, 1, 1, 0)
Textbox.Indicator.BackgroundTransparency = 0
Creator.OverrideTag(Textbox.Frame, { BackgroundColor3 = Acrylic and "InputFocused" or "DialogHolder" })
Creator.OverrideTag(Textbox.Indicator, { BackgroundColor3 = "InputIndicatorFocus" })
end)
Creator.AddSignal(Textbox.Input.FocusLost, function()
Update()
Textbox.Indicator.Size = UDim2.new(1, -4, 0, 1)
Textbox.Indicator.Position = UDim2.new(0, 2, 1, 0)
Textbox.Indicator.BackgroundTransparency = 0.5
Creator.OverrideTag(Textbox.Frame, { BackgroundColor3 = Acrylic and "Input" or "DialogInput" })
Creator.OverrideTag(Textbox.Indicator, { BackgroundColor3 = Acrylic and "InputIndicator" or "DialogInputLine" })
end)
return Textbox
end
end)()
Components.TitleBar = (function()
local New = Creator.New
local AddSignal = Creator.AddSignal
local function parseColor(value)
if typeof(value) == "Color3" then return value end
if typeof(value) == "string" then
local hex = value:gsub("#","")
if #hex == 6 then
local r = tonumber(hex:sub(1,2), 16) or 255
local g = tonumber(hex:sub(3,4), 16) or 255
local b = tonumber(hex:sub(5,6), 16) or 255
return Color3.fromRGB(r,g,b)
end
end
return Themes[Library.Theme].SubText or Color3.fromRGB(170,170,170)
end
return function(Config)
local TitleBar = {}
local function BarButton(Icon, Pos, Parent, Callback)
local Button = {
Callback = Callback or function() end,
}
Button.Frame = New("TextButton", {
Size = UDim2.new(0, 34, 1, -8),
AnchorPoint = Vector2.new(1, 0),
BackgroundTransparency = 1,
Parent = Parent,
Position = Pos,
Text = "",
ThemeTag = {
BackgroundColor3 = "Text",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 7),
}),
New("ImageLabel", {
Image = Icon,
Size = UDim2.fromOffset(16, 16),
Position = UDim2.fromScale(0.5, 0.5),
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1,
Name = "Icon",
ThemeTag = {
ImageColor3 = "Text",
},
}),
})
local Motor, SetTransparency = Creator.SpringMotor(1, Button.Frame, "BackgroundTransparency")
AddSignal(Button.Frame.MouseEnter, function()
SetTransparency(0.94)
end)
AddSignal(Button.Frame.MouseLeave, function()
SetTransparency(1, true)
end)
AddSignal(Button.Frame.MouseButton1Down, function()
SetTransparency(0.96)
end)
AddSignal(Button.Frame.MouseButton1Up, function()
SetTransparency(0.94)
end)
AddSignal(Button.Frame.MouseButton1Click, Button.Callback)
Button.SetCallback = function(Func)
Button.Callback = Func
end
return Button
end
TitleBar.Frame = New("Frame", {
Size = UDim2.new(1, 0, 0, 42),
BackgroundTransparency = 1,
Parent = Config.Parent,
}, {
New("Frame", {
Size = UDim2.new(1, -16, 1, 0),
Position = UDim2.new(0, 12, 0, 0),
BackgroundTransparency = 1,
}, {
New("UIListLayout", {
Padding = UDim.new(0, 5),
FillDirection = Enum.FillDirection.Horizontal,
SortOrder = Enum.SortOrder.LayoutOrder,
VerticalAlignment = Enum.VerticalAlignment.Center,
}),
Config.Icon and New("ImageLabel", {
Image = Config.Icon,
Size = UDim2.fromOffset(20, 20),
BackgroundTransparency = 1,
LayoutOrder = 1,
ThemeTag = {
ImageColor3 = "Text",
},
}) or nil,
New("TextLabel", {
RichText = true,
Text = Config.Title,
FontFace = Font.new(
"rbxasset://fonts/families/GothamSSm.json",
Enum.FontWeight.Regular,
Enum.FontStyle.Normal
),
TextSize = 12,
TextXAlignment = "Left",
TextYAlignment = "Center",
Size = UDim2.fromScale(0, 1),
AutomaticSize = Enum.AutomaticSize.X,
BackgroundTransparency = 1,
LayoutOrder = Config.Icon and 2 or 1,
ThemeTag = {
TextColor3 = "Text",
},
}),
Config.SubTitle and New("TextLabel", {
RichText = true,
Text = Config.SubTitle,
TextTransparency = 0.4,
FontFace = Font.new(
"rbxasset://fonts/families/GothamSSm.json",
Enum.FontWeight.Regular,
Enum.FontStyle.Normal
),
TextSize = 12,
TextXAlignment = "Left",
TextYAlignment = "Center",
Size = UDim2.fromScale(0, 1),
AutomaticSize = Enum.AutomaticSize.X,
BackgroundTransparency = 1,
LayoutOrder = Config.Icon and 3 or 2,
ThemeTag = {
TextColor3 = "Text",
},
}) or nil,
}),
New("Frame", {
BackgroundTransparency = 0.5,
Size = UDim2.new(1, 0, 0, 1),
Position = UDim2.new(0, 0, 1, 0),
ThemeTag = {
BackgroundColor3 = "TitleBarLine",
},
}),
})
TitleBar.CloseButton = BarButton(Components.Assets.Close, UDim2.new(1, -4, 0, 4), TitleBar.Frame, function()
Library.Window:Dialog({
Title = "Close",
Content = "Are you sure you want to unload the interface?",
Buttons = {
{
Title = "Yes",
Callback = function()
Library:Destroy()
end,
},
{
Title = "No",
},
},
})
end)
TitleBar.MaxButton = BarButton(Components.Assets.Max, UDim2.new(1, -40, 0, 4), TitleBar.Frame, function()
Config.Window.Maximize(not Config.Window.Maximized)
end)
TitleBar.MinButton = BarButton(Components.Assets.Min, UDim2.new(1, -80, 0, 4), TitleBar.Frame, function()
Library.Window:Minimize()
end)
return TitleBar
end
end)()
Components.Window = (function()
local Spring = Flipper.Spring.new
local Instant = Flipper.Instant.new
local New = Creator.New
return function(Config)
local Window = {
Minimized = false,
Maximized = false,
Size = Config.Size,
CurrentPos = 0,
TabWidth = 0,
Position = UDim2.fromOffset(0, 0),
DropdownsOutsideWindow = Config.DropdownsOutsideWindow == true,
}
Library.Window = Window
local Dragging, DragInput, MousePos, StartPos = false
local Resizing, ResizePos = false
local MinimizeNotif = false
Window.AcrylicPaint = Acrylic.AcrylicPaint()
local function CenterWindow()
local vp = Camera.ViewportSize
local x = math.max(0, (vp.X - Window.Size.X.Offset) / 2)
local y = math.max(0, (vp.Y - Window.Size.Y.Offset) / 2)
Window.Position = UDim2.fromOffset(math.floor(x), math.floor(y))
if Window.Root then
Window.Root.Position = Window.Position
end
end
Window.TabWidth = Config.TabWidth
local Selector = New("Frame", {
Size = UDim2.fromOffset(4, 0),
BackgroundColor3 = Color3.fromRGB(76, 194, 255),
Position = UDim2.fromOffset(0, (Window.TabHolderTop or 45) + 0),
AnchorPoint = Vector2.new(0, 0.5),
ZIndex = 1,
ThemeTag = {
BackgroundColor3 = "Accent",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 9),
}),
})
local ResizeStartFrame = New("Frame", {
Size = UDim2.fromOffset(20, 20),
BackgroundTransparency = 1,
Position = UDim2.new(1, -20, 1, -2),
})
local SearchElements = {}
local AllElements = {}
local function UpdateElementVisibility(searchTerm)
if not searchTerm then searchTerm = "" end
local function normalizeText(text)
if not text then return "" end
text = tostring(text)
text = string.gsub(text, "^%s+", "")
text = string.gsub(text, "%s+$", "")
text = string.gsub(text, "%s+", " ")
return string.lower(text)
end
local function getElementValues(elementFrame)
local values = {}
local function addText(text)
if text and text ~= "" then
table.insert(values, tostring(text))
end
end
local function findTextInDescendants(obj)
if obj:IsA("TextLabel") or obj:IsA("TextButton") or obj:IsA("TextBox") then
addText(obj.Text)
end
for _, child in pairs(obj:GetChildren()) do
findTextInDescendants(child)
end
end
findTextInDescendants(elementFrame)
return values
end
local function checkMatch(text, query)
if query == "" then
return true
end
local normalizedText = normalizeText(text)
if normalizedText == "" then
return false
end
local queryLower = normalizeText(query)
if queryLower == "" then
return true
end
if string.find(queryLower, "%s", 1) then
local words = {}
for word in string.gmatch(queryLower, "%S+") do
if #word > 0 then
table.insert(words, word)
end
end
if #words == 0 then
return true
end
for _, word in ipairs(words) do
if not string.find(normalizedText, word, 1, true) then
return false
end
end
return true
else
return string.find(normalizedText, queryLower, 1, true) ~= nil
end
end
local normalizedQuery = normalizeText(searchTerm)
local matchedSectionFrames = {}
local elementsInMatchedSections = {}
for element, data in pairs(AllElements) do
if element and element.Parent then
if data.type == "Section" then
local title = tostring(data.title or "")
if normalizedQuery ~= "" and checkMatch(title, normalizedQuery) then
matchedSectionFrames[element] = true
if element:FindFirstChild("Container") then
local container = element:FindFirstChild("Container")
for _, child in pairs(container:GetChildren()) do
if not child:IsA("UIListLayout") and not child:IsA("UIPadding") then
elementsInMatchedSections[child] = true
end
end
end
end
end
end
end
for element, data in pairs(AllElements) do
if element and element.Parent then
if normalizedQuery == "" then
element.Visible = true
else
local title = tostring(data.title or "")
local desc = tostring(data.description or "")
local matchesTitle = checkMatch(title, normalizedQuery)
local matchesDesc = checkMatch(desc, normalizedQuery)
local matchesValues = false
local elementValues = getElementValues(element)
for _, value in ipairs(elementValues) do
if checkMatch(value, normalizedQuery) then
matchesValues = true
break
end
end
local matchesSection = elementsInMatchedSections[element] == true
if not matchesSection and data.section then
for sectionFrame, _ in pairs(matchedSectionFrames) do
if data.section == sectionFrame then
matchesSection = true
break
end
end
end
element.Visible = matchesTitle or matchesDesc or matchesValues or matchesSection
end
end
end
local searchTermForClosure = searchTerm
task.spawn(function()
task.wait(0.05)
if not Window or not Window.ContainerHolder then return end
for _, tabContainer in pairs(Window.ContainerHolder:GetChildren()) do
if tabContainer:IsA("ScrollingFrame") then
local containerLayout = tabContainer:FindFirstChild("UIListLayout")
if containerLayout then
local containerPadding = tabContainer:FindFirstChild("UIPadding")
local paddingTop = containerPadding and containerPadding.PaddingTop.Offset or 1
local paddingBottom = containerPadding and containerPadding.PaddingBottom.Offset or 1
local contentSize = containerLayout.AbsoluteContentSize.Y + paddingTop + paddingBottom
tabContainer.CanvasSize = UDim2.new(0, 0, 0, math.max(0, contentSize))
end
for _, section in pairs(tabContainer:GetChildren()) do
if section:IsA("Frame") and section.Name ~= "UIPadding" then
local sectionContainer = section:FindFirstChild("Container")
if sectionContainer and sectionContainer:IsA("Frame") then
local containerLayout = sectionContainer:FindFirstChild("UIListLayout")
if containerLayout then
local hasVisibleChild = false
for _, element in pairs(sectionContainer:GetChildren()) do
if not element:IsA("UIListLayout") and element.Visible then
hasVisibleChild = true
break
end
end
if searchTermForClosure == "" or hasVisibleChild then
section.Visible = true
local containerPadding = sectionContainer:FindFirstChild("UIPadding")
local containerPaddingTop = containerPadding and containerPadding.PaddingTop.Offset or 0
local containerPaddingBottom = containerPadding and containerPadding.PaddingBottom.Offset or 0
local containerContentSize = containerLayout.AbsoluteContentSize.Y + containerPaddingTop + containerPaddingBottom
sectionContainer.Size = UDim2.new(1, 0, 0, math.max(0, containerContentSize))
else
section.Visible = false
sectionContainer.Size = UDim2.new(1, 0, 0, 0)
end
end
end
local sectionLayout = section:FindFirstChild("UIListLayout")
if sectionLayout then
local sectionPadding = section:FindFirstChild("UIPadding")
local sectionPaddingTop = sectionPadding and sectionPadding.PaddingTop.Offset or 0
local sectionPaddingBottom = sectionPadding and sectionPadding.PaddingBottom.Offset or 0
local sectionContentSize = sectionLayout.AbsoluteContentSize.Y + sectionPaddingTop + sectionPaddingBottom
section.Size = UDim2.new(1, 0, 0, math.max(0, sectionContentSize + 25))
end
end
end
end
end
end)
end
local function RegisterElement(elementFrame, title, elementType, description)
if elementFrame then
local sectionFrame = nil
local parent = elementFrame.Parent
while parent do
if parent:FindFirstChild("Container") then
local sectionRoot = parent
local sectionContainer = parent:FindFirstChild("Container")
if sectionContainer and elementFrame.Parent == sectionContainer then
sectionFrame = sectionRoot
break
end
end
parent = parent.Parent
end
AllElements[elementFrame] = {
title = tostring(title or ""),
type = elementType or "Element",
description = tostring(description or ""),
section = sectionFrame
}
end
end
Window.ShowSearch = (Config.Search == nil) and true or (Config.Search and true or false)
local ImageAsset = Config.Image
local hasImage = ImageAsset and type(ImageAsset) == "string" and ImageAsset ~= ""
local imageSize = Window.TabWidth - 24
local topOffset = 0
local ImageFrame = hasImage and New("ImageLabel", {
Size = UDim2.new(0, imageSize, 0, imageSize),
Position = UDim2.new(0.5, 0, 0, topOffset),
AnchorPoint = Vector2.new(0.5, 0),
BackgroundTransparency = 1,
Image = ImageAsset,
ZIndex = 5,
Visible = true,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 6),
}),
}) or nil
Window.HasImage = hasImage
Window.ImageFrame = ImageFrame
Window.ImageSize = imageSize
Window.TopOffset = topOffset
local searchOffset = hasImage and (imageSize + 10 + topOffset) or topOffset
local searchHeight = 28
local tabHolderTop
if hasImage then
if Window.ShowSearch then
tabHolderTop = imageSize + 10 + topOffset + searchHeight + 6
else
tabHolderTop = imageSize + 10 + topOffset
end
else
if Window.ShowSearch then
tabHolderTop = topOffset + searchHeight + 6
else
tabHolderTop = 45
end
end
Window.TabHolderTop = tabHolderTop
Window.TabHolder = New("ScrollingFrame", {
Size = UDim2.new(1, 0, 1, -(tabHolderTop + 6)),
Position = UDim2.new(0, 0, 0, tabHolderTop),
BackgroundTransparency = 1,
ScrollBarImageTransparency = 1,
ScrollBarThickness = 0,
BorderSizePixel = 0,
CanvasSize = UDim2.fromScale(0, 0),
ScrollingDirection = Enum.ScrollingDirection.Y,
}, {
New("UIListLayout", {
Padding = UDim.new(0, 4),
}),
})
local SearchFrame = New("Frame", {
Size = UDim2.new(1, 0, 0, 28),
Position = UDim2.new(0, 0, 0, searchOffset),
BackgroundTransparency = 0.7,
ZIndex = 10,
Visible = Window.ShowSearch,
BackgroundColor3 = Color3.fromRGB(20, 20, 20),
ThemeTag = {
BackgroundColor3 = "Element",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
})
local SearchInput = New("TextBox", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
TextColor3 = Color3.fromRGB(200, 200, 200),
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left,
TextYAlignment = Enum.TextYAlignment.Center,
BackgroundTransparency = 1,
Size = UDim2.new(1, -36, 1, 0),
Position = UDim2.new(0, 8, 0, 0),
PlaceholderText = "Search...",
PlaceholderColor3 = Color3.fromRGB(120, 120, 120),
ClearTextOnFocus = false,
Text = "",
Parent = SearchFrame,
ThemeTag = {
TextColor3 = "Text",
PlaceholderColor3 = "SubText",
},
})
local SearchIcon = New("ImageLabel", {
Size = UDim2.fromOffset(16, 16),
Position = UDim2.new(1, -13, 0.5, 0),
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1,
Image = "rbxassetid://10734943674",
Parent = SearchFrame,
ImageTransparency = 0.3,
ThemeTag = {
ImageColor3 = "SubText",
},
})
local SearchTextbox = {
Input = SearchInput,
Frame = SearchFrame,
}
Creator.AddSignal(SearchTextbox.Input:GetPropertyChangedSignal("Text"), function()
local searchText = SearchTextbox.Input.Text or ""
UpdateElementVisibility(searchText)
end)
Creator.AddSignal(SearchTextbox.Input.FocusLost, function(enterPressed)
end)
Creator.AddSignal(UserInputService.InputBegan, function(input, gameProcessed)
if gameProcessed then return end
if input.KeyCode == Enum.KeyCode.Escape and SearchTextbox.Input:IsFocused() then
SearchTextbox.Input.Text = ""
SearchTextbox.Input:ReleaseFocus()
end
end)
Window.SearchElements = SearchElements
Window.AllElements = AllElements
Window.RegisterElement = RegisterElement
Window.UpdateElementVisibility = UpdateElementVisibility
local imageSize = Window.TabWidth - 24
local topOffset = Window.TopOffset or 25
local imageOffset = hasImage and (imageSize + 10 + topOffset) or topOffset
local searchHeight = 28
local totalOffset = (Window.ShowSearch and searchHeight or 0) + imageOffset
local TabFrame = New("Frame", {
Size = UDim2.new(0, Window.TabWidth, 1, Window.ShowSearch and -63 or -31),
Position = UDim2.new(0, 12, 0, Window.ShowSearch and 54 or 19),
BackgroundTransparency = 1,
ClipsDescendants = true,
}, {
ImageFrame,
SearchFrame,
Window.TabHolder,
Selector,
})
Window.TabFrame = TabFrame
Window.TabDisplay = New("TextLabel", {
RichText = true,
Text = "Tab",
TextTransparency = 0,
FontFace = Font.new("rbxassetid://12187365364", Enum.FontWeight.SemiBold, Enum.FontStyle.Normal),
TextSize = 28,
TextXAlignment = "Left",
TextYAlignment = "Center",
Size = UDim2.new(1, -16, 0, 28),
Position = UDim2.fromOffset(Window.TabWidth + 26, 56),
BackgroundTransparency = 1,
ThemeTag = {
TextColor3 = "Text",
},
})
Window.ContainerHolder = New("Frame", {
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = 1,
ClipsDescendants = true,
})
Window.ContainerAnim = New("CanvasGroup", {
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = 1,
})
Window.ContainerCanvas = New("Frame", {
Size = UDim2.new(1, -Window.TabWidth - 32, 1, -102),
Position = UDim2.fromOffset(Window.TabWidth + 26, 90),
BackgroundTransparency = 1,
ClipsDescendants = true,
}, {
Window.ContainerAnim,
Window.ContainerHolder
})
local backgroundTransparency = Config.BackgroundTransparency
if backgroundTransparency == nil then
backgroundTransparency = 0.5
end
Window.BackgroundTransparency = backgroundTransparency
local backgroundImageTransparency = Config.BackgroundImageTransparency
if backgroundImageTransparency == nil then
backgroundImageTransparency = backgroundTransparency
end
Window.BackgroundImageTransparency = backgroundImageTransparency
local rootChildren = {}
if Config.BackgroundImage then
local BackgroundImageFrame = New("ImageLabel", {
Name = "BackgroundImage",
Size = UDim2.fromScale(1, 1),
Position = UDim2.fromOffset(0, 0),
BackgroundTransparency = 1,
Image = Config.BackgroundImage,
ImageTransparency = math.max(0, math.min(1, backgroundImageTransparency)),
ZIndex = 0,
ScaleType = Enum.ScaleType.Stretch,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
})
Window.BackgroundImage = BackgroundImageFrame
table.insert(rootChildren, BackgroundImageFrame)
if Window.AcrylicPaint and Window.AcrylicPaint.Frame then
if backgroundImageTransparency <= 0.1 then
Window.AcrylicPaint.Frame.BackgroundTransparency = 1
if Window.AcrylicPaint.Model then
Window.AcrylicPaint.Model.Transparency = 1
end
local function makeTransparent(obj)
if obj:IsA("Frame") then
obj.BackgroundTransparency = 1
elseif obj:IsA("ImageLabel") then
obj.ImageTransparency = 1
end
for _, child in ipairs(obj:GetChildren()) do
if not child:IsA("UICorner") and not child:IsA("UIGradient") and not child:IsA("UIStroke") and not child:IsA("UIListLayout") and not child:IsA("UIPadding") then
makeTransparent(child)
end
end
end
makeTransparent(Window.AcrylicPaint.Frame)
elseif backgroundImageTransparency < 0.3 then
Window.AcrylicPaint.Frame.BackgroundTransparency = 0.99
if Window.AcrylicPaint.Model then
Window.AcrylicPaint.Model.Transparency = 0.99
end
else
Window.AcrylicPaint.Frame.BackgroundTransparency = 0.98
if Window.AcrylicPaint.Model then
Window.AcrylicPaint.Model.Transparency = 0.98
end
end
end
end
table.insert(rootChildren, Window.AcrylicPaint.Frame)
table.insert(rootChildren, Window.TabDisplay)
table.insert(rootChildren, Window.ContainerCanvas)
table.insert(rootChildren, TabFrame)
table.insert(rootChildren, ResizeStartFrame)
Window.Root = New("Frame", {
BackgroundTransparency = 1,
Size = Window.Size,
Position = Window.Position,
Parent = Config.Parent,
}, rootChildren)
CenterWindow()
Creator.AddSignal(Camera:GetPropertyChangedSignal("ViewportSize"), function()
CenterWindow()
end)
Window.TitleBar = Components.TitleBar({
Title = Config.Title,
SubTitle = Config.SubTitle,
Icon = Config.Icon,
Parent = Window.Root,
Window = Window,
UserInfoTitle = Config.UserInfoTitle,
UserInfo = Config.UserInfo,
UserInfoSubtitle = Config.UserInfoSubtitle,
UserInfoSubtitleColor = Config.UserInfoSubtitleColor,
})
if Config.UserInfo then
local function parseColor(value)
if typeof(value) == "Color3" then return value end
return Themes[Library.Theme].SubText or Color3.fromRGB(170,170,170)
end
local userInfoHeight = 56
Window.UserInfoHeight = userInfoHeight
Window.UserInfoTop = Config.UserInfoTop
local UserInfoSection = New("Frame", {
Name = "UserInfoSection",
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, userInfoHeight),
Position = Config.UserInfoTop and UDim2.fromOffset(0, 0) or UDim2.new(0, 0, 1, -(userInfoHeight + 2)),
ZIndex = 15,
Parent = TabFrame,
})
New("Frame", {
Name = "UserInfoSeparator",
BackgroundTransparency = 0.5,
Size = UDim2.new(1, 0, 0, 1),
Position = Config.UserInfoTop and UDim2.fromOffset(0, userInfoHeight + 4) or UDim2.new(0, 0, 1, -(userInfoHeight + 4)),
ZIndex = 15,
Parent = TabFrame,
ThemeTag = {
BackgroundColor3 = "TitleBarLine",
},
})
local avatarSize = 28
local Avatar = New("ImageLabel", {
Name = "Avatar",
BackgroundTransparency = 1,
Size = UDim2.fromOffset(avatarSize, avatarSize),
Position = UDim2.new(0, 0, 0.5, 0),
AnchorPoint = Vector2.new(0, 0.5),
Image = "rbxassetid://0",
Parent = UserInfoSection,
}, {
New("UICorner", { CornerRadius = UDim.new(1, 0) }),
New("UIStroke", { Transparency = 0.7, Thickness = 1, ThemeTag = { Color = "ElementBorder" } }),
})
pcall(function()
local Players = game:GetService("Players")
local content, isReady = Players:GetUserThumbnailAsync(Players.LocalPlayer.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size100x100)
if isReady and content then
Avatar.Image = content
end
end)
local titleText = tostring((Config.UserInfoTitle ~= nil and Config.UserInfoTitle) or (LocalPlayer.Name or "User"))
local subtitleText = (Config.UserInfoSubtitle ~= nil) and tostring(Config.UserInfoSubtitle) or ""
New("TextLabel", {
Name = "UserName",
BackgroundTransparency = 1,
TextXAlignment = Enum.TextXAlignment.Left,
TextYAlignment = Enum.TextYAlignment.Bottom,
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json", Enum.FontWeight.Medium, Enum.FontStyle.Normal),
TextSize = 13,
Text = titleText,
Size = UDim2.new(1, -avatarSize - 12, 0.5, 0),
Position = UDim2.new(0, avatarSize + 12, 0, -2),
Parent = UserInfoSection,
ThemeTag = { TextColor3 = "Text" },
})
New("TextLabel", {
Name = "UserSubtitle",
BackgroundTransparency = 1,
TextXAlignment = Enum.TextXAlignment.Left,
TextYAlignment = Enum.TextYAlignment.Top,
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json", Enum.FontWeight.Regular, Enum.FontStyle.Normal),
TextSize = 12,
TextTransparency = 0.2,
Text = subtitleText,
TextColor3 = parseColor(Config.UserInfoSubtitleColor),
Size = UDim2.new(1, -avatarSize - 12, 0.5, 0),
Position = UDim2.new(0, avatarSize + 12, 0.5, 2),
Parent = UserInfoSection,
})
if Config.UserInfoTop then
local topOffset = Window.TopOffset or 0
local imageOffset = hasImage and (imageSize + 10 + topOffset) or topOffset
TabFrame.Position = UDim2.new(0, 12, 0, 39)
TabFrame.Size = UDim2.new(0, Window.TabWidth, 1, -(31 + imageOffset + userInfoHeight))
local searchOffset = hasImage and (imageSize + 10 + topOffset) or topOffset
SearchFrame.Position = UDim2.new(0, 0, 0, userInfoHeight + 6 + searchOffset)
if ImageFrame then
ImageFrame.Position = UDim2.new(0.5, 0, 0, userInfoHeight + topOffset)
end
local newTabHolderTop = userInfoHeight + 6 + (hasImage and (imageSize + 10 + topOffset) or topOffset) + (Window.ShowSearch and (searchHeight + 6) or 0)
Window.TabHolderTop = newTabHolderTop
Window.TabHolder.Position = UDim2.new(0, 0, 0, newTabHolderTop)
Window.TabHolder.Size = UDim2.new(1, 0, 1, -(newTabHolderTop + 6 + userInfoHeight))
if Window.UpdateTabHolderLayout then
Window:UpdateTabHolderLayout(newTabHolderTop)
end
else
Window.TabHolder.Size = UDim2.new(1, 0, 1, -(tabHolderTop + 6 + userInfoHeight))
if Window.UpdateTabHolderLayout then
Window:UpdateTabHolderLayout(tabHolderTop)
end
end
end
if Library.UseAcrylic then
Window.AcrylicPaint.AddParent(Window.Root)
end
local SizeMotor = Flipper.GroupMotor.new({
X = Window.Size.X.Offset,
Y = Window.Size.Y.Offset,
})
local PosMotor = Flipper.GroupMotor.new({
X = Window.Position.X.Offset,
Y = Window.Position.Y.Offset,
})
_G.CDDrag = 0
Window.SelectorPosMotor = Flipper.SingleMotor.new(17)
Window.SelectorSizeMotor = Flipper.SingleMotor.new(0)
Window.ContainerBackMotor = Flipper.SingleMotor.new(0)
Window.ContainerPosMotor = Flipper.SingleMotor.new(94)
Window.ContainerXMotor = Flipper.SingleMotor.new(0)
SizeMotor:onStep(function(values)
task.wait(_G.CDDrag / 10)
Window.Root.Size = UDim2.new(0, values.X, 0, values.Y)
task.spawn(function()
task.wait(0.01)
if Window.UpdateTabHolderLayout then
Window:UpdateTabHolderLayout()
end
end)
end)
PosMotor:onStep(function(values)
task.wait(_G.CDDrag / 10)
Window.Root.Position = UDim2.new(0, values.X, 0, values.Y)
end)
local LastValue = 0
local LastTime = 0
Window.SelectorPosMotor:onStep(function(Value)
local base = Window.TabHolderTop or 45
local verticalInset = 16
local selectorY = base + Value + verticalInset
local searchOffset = Window.HasImage and (Window.ImageSize + Window.TopOffset + 10) or Window.TopOffset
local searchTop = searchOffset
local searchBottom = searchTop + 28
if Window.HasImage and Window.ImageSize then
local imageBottom = Window.ImageSize + Window.TopOffset + 10
if selectorY < imageBottom then
Selector.Visible = false
return
end
end
if Window.ShowSearch then
if selectorY >= searchTop and selectorY <= searchBottom then
Selector.Visible = false
return
end
end
if Window.UserInfoHeight then
local tabFrameSize = Window.TabFrame and Window.TabFrame.Size.Y.Offset or 0
local userInfoTop = Window.UserInfoTop and 0 or (tabFrameSize - Window.UserInfoHeight - 2)
local userInfoBottom = userInfoTop + Window.UserInfoHeight
if selectorY >= userInfoTop and selectorY <= userInfoBottom then
Selector.Visible = false
return
end
end
Selector.Visible = true
Selector.Position = UDim2.new(0, 0, 0, selectorY)
local Now = tick()
local DeltaTime = Now - LastTime
if LastValue ~= nil then
Window.SelectorSizeMotor:setGoal(Spring((math.abs(Value - LastValue) / (DeltaTime * 60)) + 16))
LastValue = Value
end
LastTime = Now
end)
Window.SelectorSizeMotor:onStep(function(Value)
Selector.Size = UDim2.new(0, 4, 0, Value)
end)
Window.ContainerBackMotor:onStep(function(Value)
Window.ContainerAnim.GroupTransparency = Value
end)
local ContainerXValue = 0
local ContainerYValue = 94
local function UpdateContainerPosition()
if Window.ContainerAnim then
Window.ContainerAnim.Position = UDim2.fromOffset(ContainerXValue, ContainerYValue)
end
end
Window.ContainerPosMotor:onStep(function(Value)
ContainerYValue = Value
UpdateContainerPosition()
end)
Window.ContainerXMotor:onStep(function(Value)
ContainerXValue = Value
UpdateContainerPosition()
end)
local OldSizeX
local OldSizeY
Window.Maximize = function(Value, NoPos, Instant)
Window.Maximized = Value
Window.TitleBar.MaxButton.Frame.Icon.Image = Value and Components.Assets.Restore or Components.Assets.Max
if Value then
OldSizeX = Window.Size.X.Offset
OldSizeY = Window.Size.Y.Offset
end
local SizeX = Value and Camera.ViewportSize.X or OldSizeX
local SizeY = Value and Camera.ViewportSize.Y or OldSizeY
SizeMotor:setGoal({
X = Flipper[Instant and "Instant" or "Spring"].new(SizeX, { frequency = 6 }),
Y = Flipper[Instant and "Instant" or "Spring"].new(SizeY, { frequency = 6 }),
})
Window.Size = UDim2.fromOffset(SizeX, SizeY)
if not NoPos then
PosMotor:setGoal({
X = Spring(Value and 0 or Window.Position.X.Offset, { frequency = 6 }),
Y = Spring(Value and 0 or Window.Position.Y.Offset, { frequency = 6 }),
})
end
end
Creator.AddSignal(Window.TitleBar.Frame.InputBegan, function(Input)
if
Input.UserInputType == Enum.UserInputType.MouseButton1
or Input.UserInputType == Enum.UserInputType.Touch
then
Dragging = true
MousePos = Input.Position
StartPos = Window.Root.Position
if Window.Maximized then
StartPos = UDim2.fromOffset(
Mouse.X - (Mouse.X * ((OldSizeX - 100) / Window.Root.AbsoluteSize.X)),
Mouse.Y - (Mouse.Y * (OldSizeY / Window.Root.AbsoluteSize.Y))
)
end
Input.Changed:Connect(function()
if Input.UserInputState == Enum.UserInputState.End then
Dragging = false
end
end)
end
end)
Creator.AddSignal(Window.TitleBar.Frame.InputChanged, function(Input)
if
Input.UserInputType == Enum.UserInputType.MouseMovement
or Input.UserInputType == Enum.UserInputType.Touch
then
DragInput = Input
end
end)
Creator.AddSignal(ResizeStartFrame.InputBegan, function(Input)
if
Input.UserInputType == Enum.UserInputType.MouseButton1
or Input.UserInputType == Enum.UserInputType.Touch
then
Resizing = true
ResizePos = Input.Position
end
end)
Creator.AddSignal(UserInputService.InputChanged, function(Input)
if Input == DragInput and Dragging then
local Delta = Input.Position - MousePos
Window.Position = UDim2.fromOffset(StartPos.X.Offset + Delta.X, StartPos.Y.Offset + Delta.Y)
PosMotor:setGoal({
X = Instant(Window.Position.X.Offset),
Y = Instant(Window.Position.Y.Offset),
})
if Window.Maximized then
Window.Maximize(false, true, true)
end
end
if
(Input.UserInputType == Enum.UserInputType.MouseMovement or Input.UserInputType == Enum.UserInputType.Touch)
and Resizing
then
local Delta = Input.Position - ResizePos
local StartSize = Window.Size
local TargetSize = Vector3.new(StartSize.X.Offset, StartSize.Y.Offset, 0) + Vector3.new(1, 1, 0) * Delta
local TargetSizeClamped =
Vector2.new(math.clamp(TargetSize.X, 470, 2048), math.clamp(TargetSize.Y, 380, 2048))
SizeMotor:setGoal({
X = Flipper.Instant.new(TargetSizeClamped.X),
Y = Flipper.Instant.new(TargetSizeClamped.Y),
})
end
end)
Creator.AddSignal(UserInputService.InputEnded, function(Input)
if Resizing == true or Input.UserInputType == Enum.UserInputType.Touch then
Resizing = false
Window.Size = UDim2.fromOffset(SizeMotor:getValue().X, SizeMotor:getValue().Y)
end
end)
Creator.AddSignal(Window.TabHolder.UIListLayout:GetPropertyChangedSignal("AbsoluteContentSize"), function()
if Window.TabHolder and Window.TabHolder.UIListLayout then
local padding = Window.TabHolder:FindFirstChild("UIPadding")
local paddingTop = padding and padding.PaddingTop.Offset or 6
local paddingBottom = padding and padding.PaddingBottom.Offset or 6
local contentSize = Window.TabHolder.UIListLayout.AbsoluteContentSize.Y + paddingTop + paddingBottom
if contentSize > 0 then
Window.TabHolder.CanvasSize = UDim2.new(0, 0, 0, contentSize)
end
end
end)
Creator.AddSignal(UserInputService.InputBegan, function(Input)
if
type(Library.MinimizeKeybind) == "table"
and Library.MinimizeKeybind.Type == "Keybind"
and not UserInputService:GetFocusedTextBox()
then
if Input.KeyCode.Name == Library.MinimizeKeybind.Value then
Window:Minimize()
end
elseif Input.KeyCode == Library.MinimizeKey and not UserInputService:GetFocusedTextBox() then
Window:Minimize()
end
end)
function Window:ToggleSearch()
Window.ShowSearch = not Window.ShowSearch
SearchFrame.Visible = Window.ShowSearch
local topOffset = Window.TopOffset or 25
local searchOffset = Window.HasImage and (Window.ImageSize + 10 + topOffset) or topOffset
SearchFrame.Position = UDim2.new(0, 0, 0, searchOffset)
local imageOffset = Window.HasImage and (Window.ImageSize + 10 + topOffset) or topOffset
local searchHeight = 28
local totalOffset = (Window.ShowSearch and searchHeight or 0) + imageOffset
TabFrame.Size = UDim2.new(0, Window.TabWidth, 1, -(totalOffset + 31))
if Window.UpdateTabHolderLayout then
Window:UpdateTabHolderLayout()
end
end
function Window:Minimize()
Window.Minimized = not Window.Minimized
Window.Root.Visible = not Window.Minimized
for _, Option in next, Library.Options do
if Option and Option.Type == "Dropdown" and Option.Opened then
pcall(function()
Option:Close()
end)
end
end
if not MinimizeNotif then
MinimizeNotif = true
local Key = Library.MinimizeKeybind and Library.MinimizeKeybind.Value or Library.MinimizeKey.Name
if not Mobile then Library:Notify({
Title = "Interface",
Content = "Press " .. Key .. " to toggle the interface.",
Duration = 6
})
else
Library:Notify({
Title = "Interface",
Content = "Tap to the button to toggle the interface.",
Duration = 6
})
end
end
if not RunService:IsStudio() and Library.Minimizer then
pcall(function()
if Mobile then
local mobileButton = Library.Minimizer:FindFirstChild("TextButton")
if mobileButton then
local imageLabel = mobileButton:FindFirstChild("ImageLabel")
if imageLabel then
imageLabel.Image = Window.Minimized and "rbxassetid://10734896384" or "rbxassetid://10734897102"
end
end
else
local desktopButton = Library.Minimizer:FindFirstChild("TextButton")
if desktopButton then
local imageLabel = desktopButton:FindFirstChild("ImageLabel")
if imageLabel then
imageLabel.Image = Window.Minimized and "rbxassetid://10734896384" or "rbxassetid://10734897102"
end
end
end
end)
end
end
function Window:Destroy()
if Library.UseAcrylic then
Window.AcrylicPaint.Model:Destroy()
end
Window.Root:Destroy()
end
function Window:SetBackgroundImage(imageUrl, imageTransparency)
if not Window.BackgroundImage then
local imgTransparency = imageTransparency or Window.BackgroundImageTransparency or Window.BackgroundTransparency or 0.5
local BackgroundImageFrame = New("ImageLabel", {
Name = "BackgroundImage",
Size = UDim2.fromScale(1, 1),
Position = UDim2.fromOffset(0, 0),
BackgroundTransparency = 1,
Image = imageUrl,
ImageTransparency = math.max(0, math.min(1, imgTransparency)),
ZIndex = 0,
ScaleType = Enum.ScaleType.Stretch,
Parent = Window.Root,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
})
Window.BackgroundImage = BackgroundImageFrame
if imageTransparency ~= nil then
Window.BackgroundImageTransparency = imageTransparency
end
else
Window.BackgroundImage.Image = imageUrl
Window.BackgroundImage.ScaleType = Enum.ScaleType.Stretch
if imageTransparency ~= nil then
Window.BackgroundImageTransparency = imageTransparency
Window.BackgroundImage.ImageTransparency = math.max(0, math.min(1, imageTransparency))
end
end
end
function Window:SetBackgroundTransparency(transparency)
transparency = transparency or 0.5
Window.BackgroundTransparency = transparency
end
function Window:SetBackgroundImageTransparency(transparency)
transparency = transparency or 0.5
Window.BackgroundImageTransparency = transparency
if Window.BackgroundImage then
Window.BackgroundImage.ImageTransparency = math.max(0, math.min(1, transparency))
end
if Window.AcrylicPaint and Window.AcrylicPaint.Frame then
if transparency <= 0.1 then
Window.AcrylicPaint.Frame.BackgroundTransparency = 1
if Window.AcrylicPaint.Model then
Window.AcrylicPaint.Model.Transparency = 1
end
local function makeTransparent(obj)
if obj:IsA("Frame") then
obj.BackgroundTransparency = 1
elseif obj:IsA("ImageLabel") then
obj.ImageTransparency = 1
end
for _, child in ipairs(obj:GetChildren()) do
if not child:IsA("UICorner") and not child:IsA("UIGradient") and not child:IsA("UIStroke") and not child:IsA("UIListLayout") and not child:IsA("UIPadding") then
makeTransparent(child)
end
end
end
makeTransparent(Window.AcrylicPaint.Frame)
elseif transparency < 0.3 then
Window.AcrylicPaint.Frame.BackgroundTransparency = 0.99
if Window.AcrylicPaint.Model then
Window.AcrylicPaint.Model.Transparency = 0.99
end
else
Window.AcrylicPaint.Frame.BackgroundTransparency = 0.98
if Window.AcrylicPaint.Model then
Window.AcrylicPaint.Model.Transparency = 0.98
end
end
end
end
local DialogModule = Components.Dialog:Init(Window)
function Window:Dialog(Config)
local Dialog = DialogModule:Create()
Dialog.Title.Text = Config.Title
local ContentHolder = New("ScrollingFrame", {
BackgroundTransparency = 1,
ScrollBarImageTransparency = 0.7,
ScrollBarThickness = 4,
BottomImage = "rbxassetid://6889812791",
MidImage = "rbxassetid://6889812721",
TopImage = "rbxassetid://6276641225",
Position = UDim2.fromOffset(20, 60),
Size = UDim2.new(1, -40, 1, -110),
CanvasSize = UDim2.fromOffset(0, 0),
AutomaticCanvasSize = Enum.AutomaticSize.Y,
Parent = Dialog.Root,
})
local Content = New("TextLabel", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
Text = Config.Content,
TextColor3 = Color3.fromRGB(240, 240, 240),
TextSize = 14,
TextXAlignment = Enum.TextXAlignment.Left,
TextYAlignment = Enum.TextYAlignment.Top,
AutomaticSize = Enum.AutomaticSize.Y,
TextWrapped = true,
Size = UDim2.new(1, -8, 0, 0),
BackgroundTransparency = 1,
Parent = ContentHolder,
ThemeTag = { TextColor3 = "Text" },
})
New("UISizeConstraint", {
MinSize = Vector2.new(300, 165),
MaxSize = Vector2.new(620, math.huge),
Parent = Dialog.Root,
})
local maxWidth = math.min(620, Window.Size.X.Offset - 120)
local baseWidth = math.max(300, math.min(maxWidth, Content.TextBounds.X + 40))
Dialog.Root.Size = UDim2.fromOffset(baseWidth, 165)
ContentHolder.Size = UDim2.new(1, -40, 1, -110)
task.defer(function()
local contentHeight = Content.TextBounds.Y
local desired = math.clamp(contentHeight + 110, 165, 420)
Dialog.Root.Size = UDim2.fromOffset(baseWidth, desired)
ContentHolder.CanvasSize = UDim2.fromOffset(0, contentHeight)
end)
for _, Button in next, Config.Buttons do
Dialog:Button(Button.Title, Button.Callback)
end
Dialog:Open()
end
local TabModule = Components.Tab:Init(Window)
function Window:AddTab(TabConfig)
local tab = TabModule:New(TabConfig.Title, TabConfig.Icon, Window.TabHolder)
return tab
end
function Window:SelectTab(Tab)
TabModule:SelectTab(Tab)
end
Creator.AddSignal(Window.TabHolder:GetPropertyChangedSignal("CanvasPosition"), function()
LastValue = TabModule:GetCurrentTabPos() + 16
LastTime = 0
Window.SelectorPosMotor:setGoal(Instant(TabModule:GetCurrentTabPos()))
end)
return Window
end
end)()
local ElementsTable = {}
local AddSignal = Creator.AddSignal
ElementsTable.Button = (function()
local Element = {}
Element.__index = Element
Element.__type = "Button"
function Element:New(Config)
assert(Config.Title, "Button - Missing Title")
Config.Callback = Config.Callback or function() end
local ButtonFrame = Components.Element(Config.Title, Config.Description, self.Container, true, Config)
local ButtonIco = New("ImageLabel", {
Image = "rbxassetid://10709791437",
Size = UDim2.fromOffset(16, 16),
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -10, 0.5, 0),
BackgroundTransparency = 1,
Parent = ButtonFrame.Frame,
ThemeTag = {
ImageColor3 = "Text",
},
})
Creator.AddSignal(ButtonFrame.Frame.MouseButton1Click, function()
Library:SafeCallback(Config.Callback)
end)
return ButtonFrame
end
return Element
end)()
ElementsTable.Toggle = (function()
local Element = {}
Element.__index = Element
Element.__type = "Toggle"
function Element:New(Idx, Config)
assert(Config.Title, "Toggle - Missing Title")
local Toggle = {
Value = Config.Default or false,
Callback = Config.Callback or function(Value) end,
Type = "Toggle",
}
local ToggleFrame = Components.Element(Config.Title, Config.Description, self.Container, true, Config)
ToggleFrame.DescLabel.Size = UDim2.new(1, -54, 0, 14)
Toggle.SetTitle = ToggleFrame.SetTitle
Toggle.SetDesc = ToggleFrame.SetDesc
Toggle.Visible = ToggleFrame.Visible
Toggle.Elements = ToggleFrame
local ToggleCircle = New("ImageLabel", {
AnchorPoint = Vector2.new(0, 0.5),
Size = UDim2.fromOffset(14, 14),
Position = UDim2.new(0, 2, 0.5, 0),
Image = "http://www.roblox.com/asset/?id=12266946128",
ImageTransparency = 0.5,
ThemeTag = {
ImageColor3 = "ToggleSlider",
},
})
local ToggleBorder = New("UIStroke", {
Transparency = 0.5,
ThemeTag = {
Color = "ToggleSlider",
},
})
local ToggleSlider = New("Frame", {
Size = UDim2.fromOffset(36, 18),
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -10, 0.5, 0),
Parent = ToggleFrame.Frame,
BackgroundTransparency = 1,
ThemeTag = {
BackgroundColor3 = "Accent",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 9),
}),
ToggleBorder,
ToggleCircle,
})
function Toggle:OnChanged(Func)
Toggle.Changed = Func
Func(Toggle.Value)
end
function Toggle:SetValue(Value)
Value = not not Value
Toggle.Value = Value
Creator.OverrideTag(ToggleBorder, { Color = Toggle.Value and "Accent" or "ToggleSlider" })
Creator.OverrideTag(ToggleCircle, { ImageColor3 = Toggle.Value and "ToggleToggled" or "ToggleSlider" })
TweenService:Create(
ToggleCircle,
TweenInfo.new(0.25, Enum.EasingStyle.Quint, Enum.EasingDirection.Out),
{ Position = UDim2.new(0, Toggle.Value and 19 or 2, 0.5, 0) }
):Play()
TweenService:Create(
ToggleSlider,
TweenInfo.new(0.25, Enum.EasingStyle.Quint, Enum.EasingDirection.Out),
{ BackgroundTransparency = Toggle.Value and 0.45 or 1 }
):Play()
ToggleCircle.ImageTransparency = Toggle.Value and 0 or 0.5
Library:SafeCallback(Toggle.Callback, Toggle.Value)
Library:SafeCallback(Toggle.Changed, Toggle.Value)
end
function Toggle:Destroy()
ToggleFrame:Destroy()
Library.Options[Idx] = nil
end
Creator.AddSignal(ToggleFrame.Frame.MouseButton1Click, function()
Toggle:SetValue(not Toggle.Value)
end)
Toggle:SetValue(Toggle.Value)
Library.Options[Idx] = Toggle
return Toggle
end
return Element
end)()
ElementsTable.Dropdown = (function()
local Element = {}
Element.__index = Element
Element.__type = "Dropdown"
local New = Creator.New
function Element:New(Idx, Config)
local windowDropdownsOutside = false
if Library.Window and Library.Window.DropdownsOutsideWindow ~= nil then
windowDropdownsOutside = Library.Window.DropdownsOutsideWindow
elseif Library.Windows and #Library.Windows > 0 then
for i = #Library.Windows, 1, -1 do
local window = Library.Windows[i]
if window and window.DropdownsOutsideWindow ~= nil then
windowDropdownsOutside = window.DropdownsOutsideWindow
break
end
end
end
local Dropdown = {
Values = Config.Values,
Value = Config.Default,
Multi = Config.Multi,
Buttons = {},
Opened = false,
Type = "Dropdown",
Callback = Config.Callback or function() end,
Search = (Config.Search == nil) and true or Config.Search,
KeepSearch = Config.KeepSearch == true,
OpenToRight = windowDropdownsOutside
}
if Dropdown.Multi and Config.AllowNull then
Dropdown.Value = {}
end
local DropdownFrame = Components.Element(Config.Title, Config.Description, self.Container, false, Config)
DropdownFrame.DescLabel.Size = UDim2.new(1, -170, 0, 14)
Dropdown.SetTitle = DropdownFrame.SetTitle
Dropdown.SetDesc = DropdownFrame.SetDesc
Dropdown.Visible = DropdownFrame.Visible
Dropdown.Elements = DropdownFrame
local container = self.Container
local DropdownDisplay = New("TextLabel", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json", Enum.FontWeight.Regular, Enum.FontStyle.Normal),
Text = "",
TextColor3 = Color3.fromRGB(240, 240, 240),
TextSize = 14,
AutomaticSize = Enum.AutomaticSize.Y,
TextYAlignment = Enum.TextYAlignment.Center,
TextXAlignment = Enum.TextXAlignment.Left,
Size = UDim2.new(1, -40, 0.5, 0),
Position = UDim2.new(0, 8, 0.5, 0),
AnchorPoint = Vector2.new(0, 0.5),
BackgroundTransparency = 1,
TextTruncate = Enum.TextTruncate.AtEnd,
ThemeTag = {
TextColor3 = "Text",
},
})
local initialRotation = 180
local openRotation = windowDropdownsOutside and -90 or 0
local closeRotation = 180
local DropdownIco = New("ImageLabel", {
Image = "rbxassetid://10709790948",
Size = UDim2.fromOffset(16, 16),
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -8, 0.5, 0),
BackgroundTransparency = 1,
Rotation = initialRotation,
ThemeTag = {
ImageColor3 = "SubText",
},
})
local DropdownInner = New("TextButton", {
Size = UDim2.fromOffset(160, 30),
Position = UDim2.new(1, -10, 0.5, 0),
AnchorPoint = Vector2.new(1, 0.5),
BackgroundTransparency = 0.9,
Parent = DropdownFrame.Frame,
ThemeTag = {
BackgroundColor3 = "DropdownFrame",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 5),
}),
New("UIStroke", {
Transparency = 0.5,
ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
ThemeTag = {
Color = "InElementBorder",
},
}),
DropdownIco,
DropdownDisplay,
})
local DropdownListLayout = New("UIListLayout", {
Padding = UDim.new(0, 3),
})
local DropdownScrollFrame = New("ScrollingFrame", {
Size = UDim2.new(1, -5, 1, -10),
Position = UDim2.fromOffset(5, 5),
BackgroundTransparency = 1,
BottomImage = "rbxassetid://6889812791",
MidImage = "rbxassetid://6889812721",
TopImage = "rbxassetid://6276641225",
ScrollBarImageColor3 = Color3.fromRGB(255, 255, 255),
ScrollBarImageTransparency = 0.75,
ScrollBarThickness = 5,
BorderSizePixel = 0,
CanvasSize = UDim2.fromScale(0, 0),
AutomaticCanvasSize = Enum.AutomaticSize.Y,
ScrollingDirection = Enum.ScrollingDirection.Y,
}, {
DropdownListLayout,
})
local SearchBar
local SearchBox
if Dropdown.Search then
SearchBar = New("Frame", {
Size = UDim2.new(1, -10, 0, 28),
Position = UDim2.fromOffset(5, 5),
BackgroundTransparency = 0.7,
BackgroundColor3 = Color3.fromRGB(20, 20, 20),
ThemeTag = { BackgroundColor3 = "Element" },
ZIndex = 24,
}, {
New("UICorner", { CornerRadius = UDim.new(0, 4) }),
})
SearchBox = New("TextBox", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
TextColor3 = Color3.fromRGB(200, 200, 200),
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left,
TextYAlignment = Enum.TextYAlignment.Center,
BackgroundTransparency = 1,
Size = UDim2.new(1, -36, 1, 0),
Position = UDim2.new(0, 8, 0, 0),
PlaceholderText = "Search...",
PlaceholderColor3 = Color3.fromRGB(120, 120, 120),
ClearTextOnFocus = false,
Text = "",
Parent = SearchBar,
ThemeTag = {
TextColor3 = "Text",
PlaceholderColor3 = "SubText",
},
ZIndex = 24,
})
local SearchIcon = New("ImageLabel", {
Size = UDim2.fromOffset(16, 16),
Position = UDim2.new(1, -13, 0.5, 0),
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1,
Image = "rbxassetid://10734943674",
Parent = SearchBar,
ImageTransparency = 0.3,
ZIndex = 25,
ThemeTag = {
ImageColor3 = "SubText",
},
})
DropdownScrollFrame.Position = UDim2.fromOffset(5, 38)
DropdownScrollFrame.Size = UDim2.new(1, -5, 1, -43)
local filterToken = 0
local function ApplyFilter()
filterToken = filterToken + 1
local myToken = filterToken
task.spawn(function()
task.wait(0.01)
if myToken ~= filterToken then return end
local text = (SearchBox.Text or ""):lower()
for _, element in next, DropdownScrollFrame:GetChildren() do
if not element:IsA("UIListLayout") then
local value = element:FindFirstChild("ButtonLabel") and element.ButtonLabel.Text or ""
element.Visible = text == "" or value:lower():find(text, 1, true) ~= nil
end
end
task.wait()
RecalculateCanvasSize()
task.wait()
RecalculateListSize()
task.wait()
RecalculateListPosition()
end)
end
Creator.AddSignal(SearchBox:GetPropertyChangedSignal("Text"), ApplyFilter)
end
local DropdownHolderFrame = New("Frame", {
Size = UDim2.fromScale(1, 0.6),
ThemeTag = {
BackgroundColor3 = "DropdownHolder",
},
}, {
SearchBar,
DropdownScrollFrame,
New("UICorner", {
CornerRadius = UDim.new(0, 7),
}),
New("UIStroke", {
ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
ThemeTag = {
Color = "DropdownBorder",
},
}),
New("ImageLabel", {
BackgroundTransparency = 1,
Image = "http://www.roblox.com/asset/?id=5554236805",
ScaleType = Enum.ScaleType.Slice,
SliceCenter = Rect.new(23, 23, 277, 277),
Size = UDim2.fromScale(1, 1) + UDim2.fromOffset(30, 30),
Position = UDim2.fromOffset(-15, -15),
ImageColor3 = Color3.fromRGB(0, 0, 0),
ImageTransparency = 0.1,
}),
})
local DropdownHolderCanvas = New("Frame", {
BackgroundTransparency = 1,
Size = UDim2.fromOffset(170, 300),
Parent = Library.GUI,
Visible = false,
}, {
DropdownHolderFrame,
New("UISizeConstraint", {
MinSize = Vector2.new(170, 0),
}),
})
table.insert(Library.OpenFrames, DropdownHolderCanvas)
local windowRoot = nil
if Library.Window and Library.Window.Root then
windowRoot = Library.Window.Root
elseif Library.Windows and #Library.Windows > 0 then
for i = #Library.Windows, 1, -1 do
local window = Library.Windows[i]
if window and window.Root then
windowRoot = window.Root
break
end
end
end
if not windowRoot and container then
local parent = container.Parent
while parent do
if parent:IsA("Frame") then
if parent:FindFirstChild("ContainerCanvas") or (parent.Name and parent:FindFirstChild("TitleBar")) then
windowRoot = parent
break
end
end
if parent:IsA("ScreenGui") then
break
end
parent = parent.Parent
end
end
local function RecalculateListPosition()
if not DropdownHolderCanvas or not DropdownInner then return end
local dropdownX = DropdownInner.AbsolutePosition.X
local dropdownY = DropdownInner.AbsolutePosition.Y
local dropdownWidth = DropdownInner.AbsoluteSize.X
local dropdownHeight = DropdownInner.AbsoluteSize.Y
local canvasWidth = DropdownHolderCanvas.AbsoluteSize.X
local canvasHeight = DropdownHolderCanvas.AbsoluteSize.Y
local viewportHeight = Camera.ViewportSize.Y
local viewportWidth = Camera.ViewportSize.X
if not windowRoot then
if Library.Window and Library.Window.Root then
windowRoot = Library.Window.Root
elseif Library.Windows and #Library.Windows > 0 then
for i = #Library.Windows, 1, -1 do
local window = Library.Windows[i]
if window and window.Root then
windowRoot = window.Root
break
end
end
end
if not windowRoot and container then
local parent = container.Parent
while parent do
if parent:IsA("Frame") then
if parent:FindFirstChild("ContainerCanvas") or (parent.Name and parent:FindFirstChild("TitleBar")) then
windowRoot = parent
break
end
end
if parent:IsA("ScreenGui") then
break
end
parent = parent.Parent
end
end
end
local targetX = dropdownX - 1
local useFixedY = false
if windowRoot then
local windowX = windowRoot.AbsolutePosition.X
local windowWidth = windowRoot.AbsoluteSize.X
local windowRight = windowX + windowWidth
if Dropdown.OpenToRight then
targetX = windowRight + 5
if Dropdown.SavedY == nil then
Dropdown.SavedY = dropdownY
end
useFixedY = true
else
local canvasRight = dropdownX + canvasWidth - 1
if canvasRight > windowRight then
targetX = math.max(windowX + 5, windowRight - canvasWidth - 5)
end
Dropdown.SavedY = nil
end
else
local canvasRight = dropdownX + canvasWidth - 1
if canvasRight > viewportWidth then
if Dropdown.OpenToRight then
targetX = viewportWidth + 5
if Dropdown.SavedY == nil then
Dropdown.SavedY = dropdownY
end
useFixedY = true
else
targetX = math.max(5, viewportWidth - canvasWidth - 5)
end
Dropdown.SavedY = nil
end
end
local targetY
if useFixedY and windowRoot then
local windowY = windowRoot.AbsolutePosition.Y
local windowHeight = windowRoot.AbsoluteSize.Y
local windowCenterY = windowY + windowHeight / 2
targetY = windowCenterY - canvasHeight / 2
local windowTop = windowY
local windowBottom = windowY + windowHeight
local viewportTop = 0
local viewportBottom = viewportHeight
if targetY + canvasHeight > viewportBottom then
targetY = viewportBottom - canvasHeight - 5
end
if targetY < viewportTop then
targetY = viewportTop + 5
end
if targetY + canvasHeight > windowBottom then
targetY = windowBottom - canvasHeight - 5
end
if targetY < windowTop then
targetY = windowTop + 5
end
elseif useFixedY and Dropdown.SavedY then
targetY = Dropdown.SavedY
local spaceBelow = viewportHeight - (Dropdown.SavedY + dropdownHeight)
local spaceAbove = Dropdown.SavedY
if canvasHeight > spaceBelow and canvasHeight <= spaceAbove then
targetY = Dropdown.SavedY - canvasHeight - 5
elseif canvasHeight > spaceBelow and canvasHeight > spaceAbove then
if spaceBelow > spaceAbove then
targetY = Dropdown.SavedY + dropdownHeight + 5
else
targetY = math.max(5, Dropdown.SavedY - canvasHeight - 5)
end
else
targetY = Dropdown.SavedY + dropdownHeight + 5
end
else
local spaceBelow = viewportHeight - (dropdownY + dropdownHeight)
local spaceAbove = dropdownY
if canvasHeight <= spaceBelow then
targetY = dropdownY + dropdownHeight + 5
elseif canvasHeight <= spaceAbove then
targetY = dropdownY - canvasHeight - 5
else
if spaceBelow > spaceAbove then
targetY = dropdownY + dropdownHeight + 5
else
targetY = math.max(5, dropdownY - canvasHeight - 5)
end
end
end
DropdownHolderCanvas.Position = UDim2.fromOffset(targetX, targetY)
end
local ListSizeX = 0
local function RecalculateListSize()
if not DropdownHolderCanvas or not DropdownHolderFrame then return end
local visibleCount = 0
for _, element in next, DropdownScrollFrame:GetChildren() do
if not element:IsA("UIListLayout") and element.Visible then
visibleCount = visibleCount + 1
end
end
local itemHeight = 32
local padding = 3
local searchHeight = Dropdown.Search and 38 or 0
local innerMargins = 10
local estimatedContent = (visibleCount > 0) and (visibleCount * itemHeight + (visibleCount - 1) * padding + innerMargins + searchHeight) or (innerMargins + searchHeight)
local maxHeight = 392
local targetHeight = math.min(estimatedContent, maxHeight)
local canvasWidth = math.max(170, ListSizeX > 0 and (ListSizeX + 20) or 170)
DropdownHolderCanvas.Size = UDim2.fromOffset(canvasWidth, targetHeight)
local many = visibleCount > 10
DropdownHolderFrame.Size = UDim2.fromScale(1, many and (targetHeight / math.max(targetHeight, 1)) or 1)
end
local function RecalculateCanvasSize()
DropdownScrollFrame.CanvasSize = UDim2.fromOffset(0, DropdownListLayout.AbsoluteContentSize.Y)
end
RecalculateListPosition()
RecalculateListSize()
RecalculateCanvasSize()
if Dropdown.OpenToRight then
if windowRoot then
Creator.AddSignal(windowRoot:GetPropertyChangedSignal("AbsolutePosition"), function()
if Dropdown.Opened then
Dropdown.SavedY = nil
RecalculateListPosition()
end
end)
Creator.AddSignal(windowRoot:GetPropertyChangedSignal("AbsoluteSize"), function()
if Dropdown.Opened then
RecalculateListPosition()
end
end)
end
else
Creator.AddSignal(DropdownInner:GetPropertyChangedSignal("AbsolutePosition"), RecalculateListPosition)
if windowRoot then
Creator.AddSignal(windowRoot:GetPropertyChangedSignal("AbsolutePosition"), function()
if Dropdown.Opened then
RecalculateListPosition()
end
end)
Creator.AddSignal(windowRoot:GetPropertyChangedSignal("AbsoluteSize"), function()
if Dropdown.Opened then
RecalculateListPosition()
end
end)
end
end
Creator.AddSignal(DropdownListLayout:GetPropertyChangedSignal("AbsoluteContentSize"), function()
RecalculateCanvasSize()
task.wait()
RecalculateListSize()
task.wait()
RecalculateListPosition()
end)
Creator.AddSignal(DropdownInner.MouseButton1Click, function()
if Dropdown.Opened then
Dropdown:Close()
else
Dropdown:Open()
end
end)
Creator.AddSignal(DropdownInner.InputBegan, function(Input)
if Input.UserInputType == Enum.UserInputType.Touch then
if Dropdown.Opened then
Dropdown:Close()
else
Dropdown:Open()
end
end
end)
Creator.AddSignal(DropdownDisplay:GetPropertyChangedSignal("Text"), function()
for _, Element in next, DropdownScrollFrame:GetChildren() do
if not Element:IsA("UIListLayout") then
Element.Visible = true
end
end
RecalculateListPosition()
RecalculateListSize()
end)
Creator.AddSignal(UserInputService.InputBegan, function(Input)
if
Input.UserInputType == Enum.UserInputType.MouseButton1
or Input.UserInputType == Enum.UserInputType.Touch
then
local mousePos = Input.UserInputType == Enum.UserInputType.MouseButton1 and Vector2.new(Mouse.X, Mouse.Y) or Input.Position
local AbsPos, AbsSize = DropdownHolderFrame.AbsolutePosition, DropdownHolderFrame.AbsoluteSize
local innerAbsPos, innerAbsSize = DropdownInner.AbsolutePosition, DropdownInner.AbsoluteSize
local clickedInsideDropdown = mousePos.X >= AbsPos.X and mousePos.X <= AbsPos.X + AbsSize.X and mousePos.Y >= AbsPos.Y and mousePos.Y <= AbsPos.Y + AbsSize.Y
local clickedInsideInner = mousePos.X >= innerAbsPos.X and mousePos.X <= innerAbsPos.X + innerAbsSize.X and mousePos.Y >= innerAbsPos.Y and mousePos.Y <= innerAbsPos.Y + innerAbsSize.Y
if not clickedInsideDropdown and not clickedInsideInner then
Dropdown:Close()
end
end
end)
local ScrollFrame = self.ScrollFrame
function Dropdown:Open()
if Dropdown.Opened then
return
end
Dropdown.Opened = true
if Dropdown.OpenToRight then
Dropdown.SavedY = nil
end
for _, frame in ipairs(Library.OpenFrames) do
if frame ~= DropdownHolderCanvas and frame.Visible then
frame.Visible = false
end
end
if SearchBox and not Dropdown.KeepSearch then
SearchBox.Text = ""
end
DropdownHolderCanvas.Visible = true
RecalculateListPosition()
RecalculateListSize()
RecalculateCanvasSize()
task.wait()
TweenService:Create(
DropdownHolderFrame,
TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out),
{ Size = UDim2.fromScale(1, 1) }
):Play()
TweenService:Create(
DropdownIco,
TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out),
{ Rotation = openRotation }
):Play()
end
function Dropdown:Close()
Dropdown.Opened = false
if Dropdown.OpenToRight then
Dropdown.SavedY = nil
end
DropdownHolderFrame.Size = UDim2.fromScale(1, 1)
DropdownHolderCanvas.Visible = false
TweenService:Create(
DropdownIco,
TweenInfo.new(0.3, Enum.EasingStyle.Quart, Enum.EasingDirection.Out),
{ Rotation = closeRotation }
):Play()
Dropdown:Display()
for _, element in next, DropdownScrollFrame:GetChildren() do
if not element:IsA("UIListLayout") then
element.Visible = true
end
end
end
function Dropdown:Display()
local Values = Dropdown.Values
local Str = ""
if Config.Multi then
for Idx, Value in next, Values do
if Dropdown.Value[Value] then
Str = Str .. Value .. ", "
end
end
Str = Str:sub(1, #Str - 2)
else
Str = Dropdown.Value or ""
end
DropdownDisplay.Text = (Str == "" and "--" or Str)
end
function Dropdown:GetActiveValues()
if Config.Multi then
local T = {}
for Value, Bool in next, Dropdown.Value do
table.insert(T, Value)
end
return T
else
return Dropdown.Value and 1 or 0
end
end
function Dropdown:SetActiveValues(Value)
Dropdown.Value = Value
Library:SafeCallback(Dropdown.Callback, Dropdown.Value)
Library:SafeCallback(Dropdown.Changed, Dropdown.Value)
Dropdown:BuildDropdownList()
end
function Dropdown:BuildDropdownList()
local Values = Dropdown.Values
local Buttons = {}
for _, Element in next, DropdownScrollFrame:GetChildren() do
if not Element:IsA("UIListLayout") then
Element:Destroy()
end
end
local Count = 0
for Idx, Value in next, Values do
local Table = {}
Count = Count + 1
local ButtonSelector = New("Frame", {
Size = UDim2.fromOffset(4, 14),
BackgroundColor3 = Color3.fromRGB(76, 194, 255),
Position = UDim2.fromOffset(-1, 16),
AnchorPoint = Vector2.new(0, 0.5),
ThemeTag = {
BackgroundColor3 = "Accent",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 2),
}),
})
local ButtonLabel = New("TextLabel", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
Text = Value,
TextColor3 = Color3.fromRGB(200, 200, 200),
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
AutomaticSize = Enum.AutomaticSize.Y,
BackgroundTransparency = 1,
Size = UDim2.fromScale(1, 1),
Position = UDim2.fromOffset(10, 0),
Name = "ButtonLabel",
ThemeTag = {
TextColor3 = "Text",
},
})
local Button = New("TextButton", {
Size = UDim2.new(1, -5, 0, 32),
BackgroundTransparency = 1,
ZIndex = 23,
Text = "",
Parent = DropdownScrollFrame,
ThemeTag = {
BackgroundColor3 = "DropdownOption",
},
}, {
ButtonSelector,
ButtonLabel,
New("UICorner", {
CornerRadius = UDim.new(0, 6),
}),
})
local Selected
if Config.Multi then
Selected = Dropdown.Value[Value]
else
Selected = Dropdown.Value == Value
end
local BackMotor, SetBackTransparency = Creator.SpringMotor(1, Button, "BackgroundTransparency")
local SelMotor, SetSelTransparency = Creator.SpringMotor(1, ButtonSelector, "BackgroundTransparency")
local SelectorSizeMotor = Flipper.SingleMotor.new(6)
SelectorSizeMotor:onStep(function(value)
ButtonSelector.Size = UDim2.new(0, 4, 0, value)
end)
Creator.AddSignal(Button.MouseEnter, function()
SetBackTransparency(Selected and 0.85 or 0.89)
end)
Creator.AddSignal(Button.MouseLeave, function()
SetBackTransparency(Selected and 0.89 or 1)
end)
Creator.AddSignal(Button.MouseButton1Down, function()
SetBackTransparency(0.92)
end)
Creator.AddSignal(Button.MouseButton1Up, function()
SetBackTransparency(Selected and 0.85 or 0.89)
end)
function Table:UpdateButton()
if Config.Multi then
Selected = Dropdown.Value[Value]
if Selected then
SetBackTransparency(0.89)
end
else
Selected = Dropdown.Value == Value
SetBackTransparency(Selected and 0.89 or 1)
end
SelectorSizeMotor:setGoal(Flipper.Spring.new(Selected and 14 or 6, { frequency = 6 }))
SetSelTransparency(Selected and 0 or 1)
end
AddSignal(Button.Activated, function()
local Try = not Selected
if Dropdown:GetActiveValues() == 1 and not Try and not Config.AllowNull then
else
if Config.Multi then
Selected = Try
Dropdown.Value[Value] = Selected and true or nil
else
Selected = Try
Dropdown.Value = Selected and Value or nil
for _, OtherButton in next, Buttons do
OtherButton:UpdateButton()
end
end
Table:UpdateButton()
Dropdown:Display()
Library:SafeCallback(Dropdown.Callback, Dropdown.Value)
Library:SafeCallback(Dropdown.Changed, Dropdown.Value)
end
end)
Table:UpdateButton()
Dropdown:Display()
Buttons[Button] = Table
end
ListSizeX = 0
for Button, Table in next, Buttons do
if Button.ButtonLabel then
local textSize = Button.ButtonLabel.TextBounds.X
if textSize > ListSizeX then
ListSizeX = textSize
end
end
end
ListSizeX = math.max(150, ListSizeX + 40)
RecalculateCanvasSize()
RecalculateListSize()
end
function Dropdown:SetValues(NewValues)
if NewValues then
Dropdown.Values = NewValues
end
Dropdown:BuildDropdownList()
end
function Dropdown:OnChanged(Func)
Dropdown.Changed = Func
Func(Dropdown.Value)
end
function Dropdown:SetValue(Val)
if Dropdown.Multi then
local nTable = {}
for Value, Bool in next, Val do
if table.find(Dropdown.Values, Value) then
nTable[Value] = true
end
end
Dropdown.Value = nTable
else
if not Val then
Dropdown.Value = nil
elseif table.find(Dropdown.Values, Val) then
Dropdown.Value = Val
end
end
Dropdown:BuildDropdownList()
Library:SafeCallback(Dropdown.Callback, Dropdown.Value)
Library:SafeCallback(Dropdown.Changed, Dropdown.Value)
end
function Dropdown:Destroy()
DropdownFrame:Destroy()
Library.Options[Idx] = nil
end
Dropdown:BuildDropdownList()
Dropdown:Display()
local Defaults = {}
if type(Config.Default) == "string" then
local Idx = table.find(Dropdown.Values, Config.Default)
if Idx then
table.insert(Defaults, Idx)
end
elseif type(Config.Default) == "table" then
for _, Value in next, Config.Default do
local Idx = table.find(Dropdown.Values, Value)
if Idx then
table.insert(Defaults, Idx)
end
end
elseif type(Config.Default) == "number" and Dropdown.Values[Config.Default] ~= nil then
table.insert(Defaults, Config.Default)
end
if next(Defaults) then
for i = 1, #Defaults do
local Index = Defaults[i]
if Config.Multi then
Dropdown.Value[Dropdown.Values[Index]] = true
else
Dropdown.Value = Dropdown.Values[Index]
end
if not Config.Multi then
break
end
end
Dropdown:BuildDropdownList()
Dropdown:Display()
end
Library.Options[Idx] = Dropdown
return Dropdown
end
return Element
end)()
ElementsTable.Paragraph = (function()
local Paragraph = {}
Paragraph.__index = Paragraph
Paragraph.__type = "Paragraph"
function Paragraph:New(Config)
Config.Content = Config.Content or ""
local Paragraph = Components.Element(Config.Title, Config.Content, Paragraph.Container, false, Config)
Paragraph.Frame.BackgroundTransparency = 0.92
Paragraph.Border.Transparency = 0.6
Paragraph.SetTitle = Paragraph.SetTitle
Paragraph.SetDesc = Paragraph.SetDesc
Paragraph.Visible = Paragraph.Visible
Paragraph.Elements = Paragraph
return Paragraph
end
return Paragraph
end)()
ElementsTable.Slider = (function()
local Element = {}
Element.__index = Element
Element.__type = "Slider"
function Element:New(Idx, Config)
assert(Config.Title, "Slider - Missing Title.")
assert(Config.Default, "Slider - Missing default value.")
assert(Config.Min, "Slider - Missing minimum value.")
assert(Config.Max, "Slider - Missing maximum value.")
assert(Config.Rounding, "Slider - Missing rounding value.")
local Slider = {
Value = nil,
Min = Config.Min,
Max = Config.Max,
Rounding = Config.Rounding,
Callback = Config.Callback or function(Value) end,
Type = "Slider",
}
local Dragging = false
local SliderFrame = Components.Element(Config.Title, Config.Description, self.Container, false, Config)
SliderFrame.DescLabel.Size = UDim2.new(1, -170, 0, 14)
Slider.Elements = SliderFrame
Slider.SetTitle = SliderFrame.SetTitle
Slider.SetDesc = SliderFrame.SetDesc
Slider.Visible = SliderFrame.Visible
local SliderDot = New("ImageLabel", {
AnchorPoint = Vector2.new(0, 0.5),
Position = UDim2.new(0, -7, 0.5, 0),
Size = UDim2.fromOffset(14, 14),
Image = "http://www.roblox.com/asset/?id=12266946128",
ThemeTag = {
ImageColor3 = "Accent",
},
})
local SliderRail = New("Frame", {
BackgroundTransparency = 1,
Position = UDim2.fromOffset(7, 0),
Size = UDim2.new(1, -14, 1, 0),
}, {
SliderDot,
})
local SliderFill = New("Frame", {
Size = UDim2.new(0, 0, 1, 0),
ThemeTag = {
BackgroundColor3 = "Accent",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(1, 0),
}),
})
local SliderDisplay = New("TextLabel", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
Text = "Value",
TextSize = 12,
TextWrapped = true,
TextXAlignment = Enum.TextXAlignment.Right,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BackgroundTransparency = 1,
Size = UDim2.new(0, 100, 0, 14),
Position = UDim2.new(0, -4, 0.5, 0),
AnchorPoint = Vector2.new(1, 0.5),
ThemeTag = {
TextColor3 = "SubText",
},
})
local SliderInput = New("TextBox", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json"),
Text = "",
TextSize = 12,
TextXAlignment = Enum.TextXAlignment.Right,
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BackgroundTransparency = 0.8,
Size = UDim2.new(0, 0, 0, 14),
Position = UDim2.new(0, -4, 0.5, 0),
AnchorPoint = Vector2.new(1, 0.5),
PlaceholderText = "Value",
ClearTextOnFocus = false,
Visible = true,
TextWrapped = false,
TextTransparency = 1,
BackgroundTransparency = 1,
ThemeTag = {
TextColor3 = "SubText",
BackgroundColor3 = "Element",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 3),
}),
New("UIStroke", {
ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
Color = Color3.fromRGB(0, 0, 0),
Transparency = 1,
Thickness = 1,
}),
})
local SliderInner = New("Frame", {
Size = UDim2.new(1, 0, 0, 4),
AnchorPoint = Vector2.new(1, 0.5),
Position = UDim2.new(1, -10, 0.5, 0),
BackgroundTransparency = 0.4,
Parent = SliderFrame.Frame,
ThemeTag = {
BackgroundColor3 = "SliderRail",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(1, 0),
}),
New("UISizeConstraint", {
MaxSize = Vector2.new(150, math.huge),
}),
SliderDisplay,
SliderInput,
SliderFill,
SliderRail,
})
local isHovering = false
local inputVisible = false
local currentWidthTween = nil
local function calculateInputWidth(text)
local textSize = game:GetService("TextService"):GetTextSize(
text or "0",
12,
Enum.Font.SourceSans,
Vector2.new(1000, 14)
)
local padding = 8
local minWidth = 25
local maxWidth = 80
return math.max(minWidth, math.min(maxWidth, textSize.X + padding))
end
local function updateInputWidth(text, animate)
if currentWidthTween then
currentWidthTween:Cancel()
currentWidthTween = nil
end
local targetWidth = calculateInputWidth(text)
local currentWidth = SliderInput.Size.X.Offset
if animate and math.abs(targetWidth - currentWidth) > 0.5 then
currentWidthTween = TweenService:Create(SliderInput, TweenInfo.new(0.15, Enum.EasingStyle.Quart, Enum.EasingDirection.Out), {
Size = UDim2.new(0, targetWidth, 0, 14)
})
currentWidthTween:Play()
currentWidthTween.Completed:Connect(function()
currentWidthTween = nil
end)
else
SliderInput.Size = UDim2.new(0, targetWidth, 0, 14)
end
end
Creator.AddSignal(SliderFrame.Frame.MouseEnter, function()
isHovering = true
if not SliderInput:IsFocused() then
SliderDisplay.Visible = false
SliderInput.Text = tostring(Slider.Value)
updateInputWidth(tostring(Slider.Value), false)
inputVisible = true
local tweenInfo = TweenInfo.new(0.25, Enum.EasingStyle.Quart, Enum.EasingDirection.Out)
TweenService:Create(SliderInput, tweenInfo, {
TextTransparency = 0,
BackgroundTransparency = 0.8
}):Play()
TweenService:Create(SliderInput.UIStroke, tweenInfo, {
Transparency = 0.7
}):Play()
end
end)
Creator.AddSignal(SliderFrame.Frame.MouseLeave, function()
isHovering = false
if not SliderInput:IsFocused() and inputVisible then
local tweenInfo = TweenInfo.new(0.2, Enum.EasingStyle.Quart, Enum.EasingDirection.In)
TweenService:Create(SliderInput, tweenInfo, {
TextTransparency = 1,
BackgroundTransparency = 1
}):Play()
TweenService:Create(SliderInput.UIStroke, tweenInfo, {
Transparency = 1
}):Play()
task.wait(0.2)
SliderDisplay.Visible = true
inputVisible = false
end
end)
Creator.AddSignal(SliderInput.Changed, function(property)
if property == "Text" then
local text = SliderInput.Text
local cleanText = text:gsub("[^%d%.%-]", "")
if cleanText:find("%-") and cleanText:find("%-") ~= 1 then
cleanText = cleanText:gsub("%-", "")
end
local dotCount = 0
cleanText = cleanText:gsub("%.", function()
dotCount = dotCount + 1
return dotCount == 1 and "." or ""
end)
if cleanText ~= text then
SliderInput.Text = cleanText
return
end
if inputVisible or SliderInput:IsFocused() then
updateInputWidth(cleanText, true)
end
end
end)
Creator.AddSignal(SliderInput.FocusLost, function(enterPressed)
local inputValue = tonumber(SliderInput.Text)
if inputValue then
Slider:SetValue(inputValue)
else
SliderInput.Text = tostring(Slider.Value)
updateInputWidth(tostring(Slider.Value), true)
end
if not isHovering then
local tweenInfo = TweenInfo.new(0.2, Enum.EasingStyle.Quart, Enum.EasingDirection.In)
TweenService:Create(SliderInput, tweenInfo, {
TextTransparency = 1,
BackgroundTransparency = 1
}):Play()
TweenService:Create(SliderInput.UIStroke, tweenInfo, {
Transparency = 1
}):Play()
task.wait(0.2)
SliderDisplay.Visible = true
inputVisible = false
end
end)
Creator.AddSignal(SliderInput.Focused, function()
SliderInput.Text = tostring(Slider.Value)
updateInputWidth(tostring(Slider.Value), false)
end)
Creator.AddSignal(SliderInput.InputBegan, function(Input)
if Input.UserInputType == Enum.UserInputType.MouseButton1 then
Dragging = false
end
end)
Creator.AddSignal(SliderDot.InputBegan, function(Input)
if
Input.UserInputType == Enum.UserInputType.MouseButton1
or Input.UserInputType == Enum.UserInputType.Touch
then
Dragging = true
end
end)
Creator.AddSignal(SliderDot.InputEnded, function(Input)
if
Input.UserInputType == Enum.UserInputType.MouseButton1
or Input.UserInputType == Enum.UserInputType.Touch
then
Dragging = false
end
end)
Creator.AddSignal(UserInputService.InputChanged, function(Input)
if Dragging then
local position = nil
if Input.UserInputType == Enum.UserInputType.MouseMovement then
position = Input.Position
elseif Input.UserInputType == Enum.UserInputType.Touch then
position = Input.Position
end
if position then
local SizeScale = math.clamp((position.X - SliderRail.AbsolutePosition.X) / SliderRail.AbsoluteSize.X, 0, 1)
Slider:SetValue(Slider.Min + ((Slider.Max - Slider.Min) * SizeScale))
end
end
end)
Creator.AddSignal(SliderRail.InputBegan, function(Input)
if Input.UserInputType == Enum.UserInputType.Touch then
Dragging = true
local SizeScale = math.clamp((Input.Position.X - SliderRail.AbsolutePosition.X) / SliderRail.AbsoluteSize.X, 0, 1)
Slider:SetValue(Slider.Min + ((Slider.Max - Slider.Min) * SizeScale))
end
end)
Creator.AddSignal(SliderRail.InputEnded, function(Input)
if Input.UserInputType == Enum.UserInputType.Touch then
Dragging = false
end
end)
function Slider:OnChanged(Func)
Slider.Changed = Func
Func(Slider.Value)
end
function Slider:SetValue(Value)
self.Value = Library:Round(math.clamp(Value, Slider.Min, Slider.Max), Slider.Rounding)
SliderDot.Position = UDim2.new((self.Value - Slider.Min) / (Slider.Max - Slider.Min), -7, 0.5, 0)
SliderFill.Size = UDim2.fromScale((self.Value - Slider.Min) / (Slider.Max - Slider.Min), 1)
SliderDisplay.Text = tostring(self.Value)
if inputVisible or SliderInput:IsFocused() then
SliderInput.Text = tostring(self.Value)
updateInputWidth(tostring(self.Value), not SliderInput:IsFocused())
end
if not inputVisible and not SliderInput:IsFocused() then
SliderInput.Text = tostring(self.Value)
end
Library:SafeCallback(Slider.Callback, self.Value)
Library:SafeCallback(Slider.Changed, self.Value)
end
function Slider:Destroy()
SliderFrame:Destroy()
Library.Options[Idx] = nil
end
Slider:SetValue(Config.Default)
Library.Options[Idx] = Slider
return Slider
end
return Element
end)()
ElementsTable.Keybind = (function()
local Element = {}
Element.__index = Element
Element.__type = "Keybind"
function Element:New(Idx, Config)
assert(Config.Title, "KeyBind - Missing Title")
assert(Config.Default, "KeyBind - Missing default value.")
local Keybind = {
Value = Config.Default,
Toggled = false,
Mode = Config.Mode or "Toggle",
Type = "Keybind",
Callback = Config.Callback or function(Value) end,
ChangedCallback = Config.ChangedCallback or function(New) end,
}
local Picking = false
local KeybindFrame = Components.Element(Config.Title, Config.Description, self.Container, true)
Keybind.SetTitle = KeybindFrame.SetTitle
Keybind.SetDesc = KeybindFrame.SetDesc
Keybind.Visible = KeybindFrame.Visible
Keybind.Elements = KeybindFrame
local KeybindDisplayLabel = New("TextLabel", {
FontFace = Font.new("rbxasset://fonts/families/GothamSSm.json", Enum.FontWeight.Regular, Enum.FontStyle.Normal),
Text = Config.Default,
TextColor3 = Color3.fromRGB(240, 240, 240),
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Center,
Size = UDim2.new(0, 0, 0, 14),
Position = UDim2.new(0, 0, 0.5, 0),
AnchorPoint = Vector2.new(0, 0.5),
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
AutomaticSize = Enum.AutomaticSize.X,
BackgroundTransparency = 1,
ThemeTag = {
TextColor3 = "Text",
},
})
local KeybindDisplayFrame = New("TextButton", {
Size = UDim2.fromOffset(0, 30),
Position = UDim2.new(1, -10, 0.5, 0),
AnchorPoint = Vector2.new(1, 0.5),
BackgroundTransparency = 0.9,
Parent = KeybindFrame.Frame,
AutomaticSize = Enum.AutomaticSize.X,
ThemeTag = {
BackgroundColor3 = "Keybind",
},
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 5),
}),
New("UIPadding", {
PaddingLeft = UDim.new(0, 8),
PaddingRight = UDim.new(0, 8),
}),
New("UIStroke", {
Transparency = 0.5,
ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
ThemeTag = {
Color = "InElementBorder",
},
}),
KeybindDisplayLabel,
})
function Keybind:GetState()
if UserInputService:GetFocusedTextBox() and Keybind.Mode ~= "Always" then
return false
end
if Keybind.Mode == "Always" then
return true
elseif Keybind.Mode == "Hold" then
if Keybind.Value == "None" then
return false
end
local Key = Keybind.Value
if Key == "MouseLeft" or Key == "MouseRight" then
return Key == "MouseLeft" and UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
or Key == "MouseRight"
and UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton2)
else
return UserInputService:IsKeyDown(Enum.KeyCode[Keybind.Value])
end
else
return Keybind.Toggled
end
end
function Keybind:SetValue(Key, Mode)
Key = Key or Keybind.Key
Mode = Mode or Keybind.Mode
KeybindDisplayLabel.Text = Key
Keybind.Value = Key
Keybind.Mode = Mode
end
function Keybind:OnClick(Callback)
Keybind.Clicked = Callback
end
function Keybind:OnChanged(Callback)
Keybind.Changed = Callback
Callback(Keybind.Value)
end
function Keybind:DoClick()
Library:SafeCallback(Keybind.Callback, Keybind.Toggled)
Library:SafeCallback(Keybind.Clicked, Keybind.Toggled)
end
function Keybind:Destroy()
KeybindFrame:Destroy()
Library.Options[Idx] = nil
end
Creator.AddSignal(KeybindDisplayFrame.InputBegan, function(Input)
if
Input.UserInputType == Enum.UserInputType.MouseButton1
or Input.UserInputType == Enum.UserInputType.Touch
then
Picking = true
KeybindDisplayLabel.Text = "..."
wait(0.2)
local Event
Event = UserInputService.InputBegan:Connect(function(Input)
local Key
if Input.UserInputType == Enum.UserInputType.Keyboard then
Key = Input.KeyCode.Name
elseif Input.UserInputType == Enum.UserInputType.MouseButton1 then
Key = "MouseLeft"
elseif Input.UserInputType == Enum.UserInputType.MouseButton2 then
Key = "MouseRight"
end
local EndedEvent
EndedEvent = UserInputService.InputEnded:Connect(function(Input)
if
Input.KeyCode.Name == Key
or Key == "MouseLeft" and Input.UserInputType == Enum.UserInputType.MouseButton1
or Key == "MouseRight" and Input.UserInputType == Enum.UserInputType.MouseButton2
then
Picking = false
KeybindDisplayLabel.Text = Key
Keybind.Value = Key
Library:SafeCallback(Keybind.ChangedCallback, Input.KeyCode or Input.UserInputType)
Library:SafeCallback(Keybind.Changed, Input.KeyCode or Input.UserInputType)
Event:Disconnect()
EndedEvent:Disconnect()
end
end)
end)
end
end)
Creator.AddSignal(UserInputService.InputBegan, function(Input)
if not Picking and not UserInputService:GetFocusedTextBox() then
if Keybind.Mode == "Toggle" then
local Key = Keybind.Value
if Key == "MouseLeft" or Key == "MouseRight" then
if
Key == "MouseLeft" and Input.UserInputType == Enum.UserInputType.MouseButton1
or Key == "MouseRight" and Input.UserInputType == Enum.UserInputType.MouseButton2
then
Keybind.Toggled = not Keybind.Toggled
Keybind:DoClick()
end
elseif Input.UserInputType == Enum.UserInputType.Keyboard then
if Input.KeyCode.Name == Key then
Keybind.Toggled = not Keybind.Toggled
Keybind:DoClick()
end
end
end
end
end)
Library.Options[Idx] = Keybind
return Keybind
end
return Element
end)()
ElementsTable.Colorpicker = (function()
local Element = {}
Element.__index = Element
Element.__type = "Colorpicker"
function Element:New(Idx, Config)
assert(Config.Title, "Colorpicker - Missing Title")
assert(Config.Default, "AddColorPicker: Missing default value.")
local Colorpicker = {
Value = Config.Default,
Transparency = Config.Transparency or 0,
Type = "Colorpicker",
Title = type(Config.Title) == "string" and Config.Title or "Colorpicker",
Callback = Config.Callback or function(Color) end,
}
function Colorpicker:SetHSVFromRGB(Color)
local H, S, V = Color3.toHSV(Color)
Colorpicker.Hue = H
Colorpicker.Sat = S
Colorpicker.Vib = V
end
Colorpicker:SetHSVFromRGB(Colorpicker.Value)
local ColorpickerFrame = Components.Element(Config.Title, Config.Description, self.Container, true)
Colorpicker.SetTitle = ColorpickerFrame.SetTitle
Colorpicker.SetDesc = ColorpickerFrame.SetDesc
Colorpicker.Visible = ColorpickerFrame.Visible
Colorpicker.Elements = ColorpickerFrame
local DisplayFrameColor = New("Frame", {
Size = UDim2.fromScale(1, 1),
BackgroundColor3 = Colorpicker.Value,
Parent = ColorpickerFrame.Frame,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
})
local DisplayFrame = New("ImageLabel", {
Size = UDim2.fromOffset(26, 26),
Position = UDim2.new(1, -10, 0.5, 0),
AnchorPoint = Vector2.new(1, 0.5),
Parent = ColorpickerFrame.Frame,
Image = "http://www.roblox.com/asset/?id=14204231522",
ImageTransparency = 0.45,
ScaleType = Enum.ScaleType.Tile,
TileSize = UDim2.fromOffset(40, 40),
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
DisplayFrameColor,
})
local function CreateColorDialog()
local Dialog = Components.Dialog:Create()
Dialog.Title.Text = Colorpicker.Title
Dialog.Root.Size = UDim2.fromOffset(430, 330)
local Hue, Sat, Vib = Colorpicker.Hue, Colorpicker.Sat, Colorpicker.Vib
local Transparency = Colorpicker.Transparency
local function CreateInput()
local Box = Components.Textbox()
Box.Frame.Parent = Dialog.Root
Box.Frame.Size = UDim2.new(0, 90, 0, 32)
return Box
end
local function CreateInputLabel(Text, Pos)
return New("TextLabel", {
FontFace = Font.new(
"rbxasset://fonts/families/GothamSSm.json",
Enum.FontWeight.Medium,
Enum.FontStyle.Normal
),
Text = Text,
TextColor3 = Color3.fromRGB(240, 240, 240),
TextSize = 13,
TextXAlignment = Enum.TextXAlignment.Left,
Size = UDim2.new(1, 0, 0, 32),
Position = Pos,
BackgroundTransparency = 1,
Parent = Dialog.Root,
ThemeTag = {
TextColor3 = "Text",
},
})
end
local function GetRGB()
local Value = Color3.fromHSV(Hue, Sat, Vib)
return { R = math.floor(Value.r * 255), G = math.floor(Value.g * 255), B = math.floor(Value.b * 255) }
end
local SatCursor = New("ImageLabel", {
Size = UDim2.new(0, 18, 0, 18),
ScaleType = Enum.ScaleType.Fit,
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1,
Image = "http://www.roblox.com/asset/?id=4805639000",
})
local SatVibMap = New("ImageLabel", {
Size = UDim2.fromOffset(180, 160),
Position = UDim2.fromOffset(20, 55),
Image = "rbxassetid://4155801252",
BackgroundColor3 = Colorpicker.Value,
BackgroundTransparency = 0,
Parent = Dialog.Root,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
SatCursor,
})
local OldColorFrame = New("Frame", {
BackgroundColor3 = Colorpicker.Value,
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = Colorpicker.Transparency,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
})
local OldColorFrameChecker = New("ImageLabel", {
Image = "http://www.roblox.com/asset/?id=14204231522",
ImageTransparency = 0.45,
ScaleType = Enum.ScaleType.Tile,
TileSize = UDim2.fromOffset(40, 40),
BackgroundTransparency = 1,
Position = UDim2.fromOffset(112, 220),
Size = UDim2.fromOffset(88, 24),
Parent = Dialog.Root,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
New("UIStroke", {
Thickness = 2,
Transparency = 0.75,
}),
OldColorFrame,
})
local DialogDisplayFrame = New("Frame", {
BackgroundColor3 = Colorpicker.Value,
Size = UDim2.fromScale(1, 1),
BackgroundTransparency = 0,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
})
local DialogDisplayFrameChecker = New("ImageLabel", {
Image = "http://www.roblox.com/asset/?id=14204231522",
ImageTransparency = 0.45,
ScaleType = Enum.ScaleType.Tile,
TileSize = UDim2.fromOffset(40, 40),
BackgroundTransparency = 1,
Position = UDim2.fromOffset(20, 220),
Size = UDim2.fromOffset(88, 24),
Parent = Dialog.Root,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 4),
}),
New("UIStroke", {
Thickness = 2,
Transparency = 0.75,
}),
DialogDisplayFrame,
})
local SequenceTable = {}
for Color = 0, 1, 0.1 do
table.insert(SequenceTable, ColorSequenceKeypoint.new(Color, Color3.fromHSV(Color, 1, 1)))
end
local HueSliderGradient = New("UIGradient", {
Color = ColorSequence.new(SequenceTable),
Rotation = 90,
})
local HueDragHolder = New("Frame", {
Size = UDim2.new(1, 0, 1, -10),
Position = UDim2.fromOffset(0, 5),
BackgroundTransparency = 1,
})
local HueDrag = New("ImageLabel", {
Size = UDim2.fromOffset(14, 14),
Image = "http://www.roblox.com/asset/?id=12266946128",
Parent = HueDragHolder,
ThemeTag = {
ImageColor3 = "DialogInput",
},
})
local HueSlider = New("Frame", {
Size = UDim2.fromOffset(12, 190),
Position = UDim2.fromOffset(210, 55),
Parent = Dialog.Root,
}, {
New("UICorner", {
CornerRadius = UDim.new(1, 0),
}),
HueSliderGradient,
HueDragHolder,
})
local HexInput = CreateInput()
HexInput.Frame.Position = UDim2.fromOffset(Config.Transparency and 260 or 240, 55)
CreateInputLabel("Hex", UDim2.fromOffset(Config.Transparency and 360 or 340, 55))
local RedInput = CreateInput()
RedInput.Frame.Position = UDim2.fromOffset(Config.Transparency and 260 or 240, 95)
CreateInputLabel("Red", UDim2.fromOffset(Config.Transparency and 360 or 340, 95))
local GreenInput = CreateInput()
GreenInput.Frame.Position = UDim2.fromOffset(Config.Transparency and 260 or 240, 135)
CreateInputLabel("Green", UDim2.fromOffset(Config.Transparency and 360 or 340, 135))
local BlueInput = CreateInput()
BlueInput.Frame.Position = UDim2.fromOffset(Config.Transparency and 260 or 240, 175)
CreateInputLabel("Blue", UDim2.fromOffset(Config.Transparency and 360 or 340, 175))
local AlphaInput
if Config.Transparency then
AlphaInput = CreateInput()
AlphaInput.Frame.Position = UDim2.fromOffset(260, 215)
CreateInputLabel("Alpha", UDim2.fromOffset(360, 215))
end
local TransparencySlider, TransparencyDrag, TransparencyColor
if Config.Transparency then
local TransparencyDragHolder = New("Frame", {
Size = UDim2.new(1, 0, 1, -10),
Position = UDim2.fromOffset(0, 5),
BackgroundTransparency = 1,
})
TransparencyDrag = New("ImageLabel", {
Size = UDim2.fromOffset(14, 14),
Image = "http://www.roblox.com/asset/?id=12266946128",
Parent = TransparencyDragHolder,
ThemeTag = {
ImageColor3 = "DialogInput",
},
})
TransparencyColor = New("Frame", {
Size = UDim2.fromScale(1, 1),
}, {
New("UIGradient", {
Transparency = NumberSequence.new({
NumberSequenceKeypoint.new(0, 0),
NumberSequenceKeypoint.new(1, 1),
}),
Rotation = 270,
}),
New("UICorner", {
CornerRadius = UDim.new(1, 0),
}),
})
TransparencySlider = New("Frame", {
Size = UDim2.fromOffset(12, 190),
Position = UDim2.fromOffset(230, 55),
Parent = Dialog.Root,
BackgroundTransparency = 1,
}, {
New("UICorner", {
CornerRadius = UDim.new(1, 0),
}),
New("ImageLabel", {
Image = "http://www.roblox.com/asset/?id=14204231522",
ImageTransparency = 0.45,
ScaleType = Enum.ScaleType.Tile,
TileSize = UDim2.fromOffset(40, 40),
BackgroundTransparency = 1,
Size = UDim2.fromScale(1, 1),
Parent = Dialog.Root,
}, {
New("UICorner", {
CornerRadius = UDim.new(1, 0),
}),
}),
TransparencyColor,
TransparencyDragHolder,
})
end
local function Display()
SatVibMap.BackgroundColor3 = Color3.fromHSV(Hue, 1, 1)
HueDrag.Position = UDim2.new(0, -1, Hue, -6)
SatCursor.Position = UDim2.new(Sat, 0, 1 - Vib, 0)
DialogDisplayFrame.BackgroundColor3 = Color3.fromHSV(Hue, Sat, Vib)
HexInput.Input.Text = "#" .. Color3.fromHSV(Hue, Sat, Vib):ToHex()
RedInput.Input.Text = GetRGB()["R"]
GreenInput.Input.Text = GetRGB()["G"]
BlueInput.Input.Text = GetRGB()["B"]
if Config.Transparency then
TransparencyColor.BackgroundColor3 = Color3.fromHSV(Hue, Sat, Vib)
DialogDisplayFrame.BackgroundTransparency = Transparency
TransparencyDrag.Position = UDim2.new(0, -1, 1 - Transparency, -6)
AlphaInput.Input.Text = Library:Round((1 - Transparency) * 100, 0) .. "%"
end
end
Creator.AddSignal(HexInput.Input.FocusLost, function(Enter)
if Enter then
local Success, Result = pcall(Color3.fromHex, HexInput.Input.Text)
if Success and typeof(Result) == "Color3" then
Hue, Sat, Vib = Color3.toHSV(Result)
end
end
Display()
end)
Creator.AddSignal(RedInput.Input.FocusLost, function(Enter)
if Enter then
local CurrentColor = GetRGB()
local Success, Result = pcall(Color3.fromRGB, RedInput.Input.Text, CurrentColor["G"], CurrentColor["B"])
if Success and typeof(Result) == "Color3" then
if tonumber(RedInput.Input.Text) <= 255 then
Hue, Sat, Vib = Color3.toHSV(Result)
end
end
end
Display()
end)
Creator.AddSignal(GreenInput.Input.FocusLost, function(Enter)
if Enter then
local CurrentColor = GetRGB()
local Success, Result =
pcall(Color3.fromRGB, CurrentColor["R"], GreenInput.Input.Text, CurrentColor["B"])
if Success and typeof(Result) == "Color3" then
if tonumber(GreenInput.Input.Text) <= 255 then
Hue, Sat, Vib = Color3.toHSV(Result)
end
end
end
Display()
end)
Creator.AddSignal(BlueInput.Input.FocusLost, function(Enter)
if Enter then
local CurrentColor = GetRGB()
local Success, Result =
pcall(Color3.fromRGB, CurrentColor["R"], CurrentColor["G"], BlueInput.Input.Text)
if Success and typeof(Result) == "Color3" then
if tonumber(BlueInput.Input.Text) <= 255 then
Hue, Sat, Vib = Color3.toHSV(Result)
end
end
end
Display()
end)
if Config.Transparency then
Creator.AddSignal(AlphaInput.Input.FocusLost, function(Enter)
if Enter then
pcall(function()
local Value = tonumber(AlphaInput.Input.Text)
if Value >= 0 and Value <= 100 then
Transparency = 1 - Value * 0.01
end
end)
end
Display()
end)
end
Creator.AddSignal(SatVibMap.InputBegan, function(Input)
if
Input.UserInputType == Enum.UserInputType.MouseButton1
or Input.UserInputType == Enum.UserInputType.Touch
then
while UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) do
local MinX = SatVibMap.AbsolutePosition.X
local MaxX = MinX + SatVibMap.AbsoluteSize.X
local MouseX = math.clamp(Mouse.X, MinX, MaxX)
local MinY = SatVibMap.AbsolutePosition.Y
local MaxY = MinY + SatVibMap.AbsoluteSize.Y
local MouseY = math.clamp(Mouse.Y, MinY, MaxY)
Sat = (MouseX - MinX) / (MaxX - MinX)
Vib = 1 - ((MouseY - MinY) / (MaxY - MinY))
Display()
RenderStepped:Wait()
end
end
end)
Creator.AddSignal(HueSlider.InputBegan, function(Input)
if
Input.UserInputType == Enum.UserInputType.MouseButton1
or Input.UserInputType == Enum.UserInputType.Touch
then
while UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) do
local MinY = HueSlider.AbsolutePosition.Y
local MaxY = MinY + HueSlider.AbsoluteSize.Y
local MouseY = math.clamp(Mouse.Y, MinY, MaxY)
Hue = ((MouseY - MinY) / (MaxY - MinY))
Display()
RenderStepped:Wait()
end
end
end)
if Config.Transparency then
Creator.AddSignal(TransparencySlider.InputBegan, function(Input)
if Input.UserInputType == Enum.UserInputType.MouseButton1 then
while UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) do
local MinY = TransparencySlider.AbsolutePosition.Y
local MaxY = MinY + TransparencySlider.AbsoluteSize.Y
local MouseY = math.clamp(Mouse.Y, MinY, MaxY)
Transparency = 1 - ((MouseY - MinY) / (MaxY - MinY))
Display()
RenderStepped:Wait()
end
end
end)
end
Display()
Dialog:Button("Done", function()
Colorpicker:SetValue({ Hue, Sat, Vib }, Transparency)
end)
Dialog:Button("Cancel")
Dialog:Open()
end
function Colorpicker:Display()
Colorpicker.Value = Color3.fromHSV(Colorpicker.Hue, Colorpicker.Sat, Colorpicker.Vib)
DisplayFrameColor.BackgroundColor3 = Colorpicker.Value
DisplayFrameColor.BackgroundTransparency = Colorpicker.Transparency
Element.Library:SafeCallback(Colorpicker.Callback, Colorpicker.Value)
Element.Library:SafeCallback(Colorpicker.Changed, Colorpicker.Value)
end
function Colorpicker:SetValue(HSV, Transparency)
local Color = Color3.fromHSV(HSV[1], HSV[2], HSV[3])
Colorpicker.Transparency = Transparency or 0
Colorpicker:SetHSVFromRGB(Color)
Colorpicker:Display()
end
function Colorpicker:SetValueRGB(Color, Transparency)
Colorpicker.Transparency = Transparency or 0
Colorpicker:SetHSVFromRGB(Color)
Colorpicker:Display()
end
function Colorpicker:OnChanged(Func)
Colorpicker.Changed = Func
Func(Colorpicker.Value)
end
function Colorpicker:Destroy()
ColorpickerFrame:Destroy()
Library.Options[Idx] = nil
end
Creator.AddSignal(ColorpickerFrame.Frame.MouseButton1Click, function()
CreateColorDialog()
end)
Creator.AddSignal(ColorpickerFrame.Frame.InputBegan, function(Input)
if Input.UserInputType == Enum.UserInputType.Touch then
CreateColorDialog()
end
end)
Colorpicker:Display()
Library.Options[Idx] = Colorpicker
return Colorpicker
end
return Element
end)()
ElementsTable.Input = (function()
local Element = {}
Element.__index = Element
Element.__type = "Input"
function Element:New(Idx, Config)
assert(Config.Title, "Input - Missing Title")
Config.Callback = Config.Callback or function() end
local Input = {
Value = Config.Default or "",
Numeric = Config.Numeric or false,
Finished = Config.Finished or false,
Callback = Config.Callback or function(Value) end,
Type = "Input",
}
local InputFrame = Components.Element(Config.Title, Config.Description, self.Container, false)
Input.SetTitle = InputFrame.SetTitle
Input.SetDesc = InputFrame.SetDesc
Input.Visible = InputFrame.Visible
Input.Elements = InputFrame
local Textbox = Components.Textbox(InputFrame.Frame, true)
Textbox.Frame.Position = UDim2.new(1, -10, 0.5, 0)
Textbox.Frame.AnchorPoint = Vector2.new(1, 0.5)
Textbox.Frame.Size = UDim2.fromOffset(160, 30)
Textbox.Input.Text = Config.Default or ""
Textbox.Input.PlaceholderText = Config.Placeholder or ""
local Box = Textbox.Input
function Input:SetValue(Text)
if Config.MaxLength and #Text > Config.MaxLength then
Text = Text:sub(1, Config.MaxLength)
end
if Input.Numeric then
if (not tonumber(Text)) and Text:len() > 0 then
Text = Input.Value
end
end
Input.Value = Text
Box.Text = Text
Library:SafeCallback(Input.Callback, Input.Value)
Library:SafeCallback(Input.Changed, Input.Value)
end
if Input.Finished then
AddSignal(Box.FocusLost, function(enter)
if not enter then
return
end
Input:SetValue(Box.Text)
end)
else
AddSignal(Box:GetPropertyChangedSignal("Text"), function()
Input:SetValue(Box.Text)
end)
end
function Input:OnChanged(Func)
Input.Changed = Func
Func(Input.Value)
end
function Input:Destroy()
InputFrame:Destroy()
Library.Options[Idx] = nil
end
Library.Options[Idx] = Input
return Input
end
return Element
end)()
local NotificationModule = Components.Notification
NotificationModule:Init(GUI)
local New = Creator.New
local Icons = {
["lucide-accessibility"] = "rbxassetid://10709751939",
["lucide-activity"] = "rbxassetid://10709752035",
["lucide-air-vent"] = "rbxassetid://10709752131",
["lucide-airplay"] = "rbxassetid://10709752254",
["lucide-alarm-check"] = "rbxassetid://10709752405",
["lucide-alarm-clock"] = "rbxassetid://10709752630",
["lucide-alarm-clock-off"] = "rbxassetid://10709752508",
["lucide-alarm-minus"] = "rbxassetid://10709752732",
["lucide-alarm-plus"] = "rbxassetid://10709752825",
["lucide-album"] = "rbxassetid://10709752906",
["lucide-alert-circle"] = "rbxassetid://10709752996",
["lucide-alert-octagon"] = "rbxassetid://10709753064",
["lucide-alert-triangle"] = "rbxassetid://10709753149",
["lucide-align-center"] = "rbxassetid://10709753570",
["lucide-align-center-horizontal"] = "rbxassetid://10709753272",
["lucide-align-center-vertical"] = "rbxassetid://10709753421",
["lucide-align-end-horizontal"] = "rbxassetid://10709753692",
["lucide-align-end-vertical"] = "rbxassetid://10709753808",
["lucide-align-horizontal-distribute-center"] = "rbxassetid://10747779791",
["lucide-align-horizontal-distribute-end"] = "rbxassetid://10747784534",
["lucide-align-horizontal-distribute-start"] = "rbxassetid://10709754118",
["lucide-align-horizontal-justify-center"] = "rbxassetid://10709754204",
["lucide-align-horizontal-justify-end"] = "rbxassetid://10709754317",
["lucide-align-horizontal-justify-start"] = "rbxassetid://10709754436",
["lucide-align-horizontal-space-around"] = "rbxassetid://10709754590",
["lucide-align-horizontal-space-between"] = "rbxassetid://10709754749",
["lucide-align-justify"] = "rbxassetid://10709759610",
["lucide-align-left"] = "rbxassetid://10709759764",
["lucide-align-right"] = "rbxassetid://10709759895",
["lucide-align-start-horizontal"] = "rbxassetid://10709760051",
["lucide-align-start-vertical"] = "rbxassetid://10709760244",
["lucide-align-vertical-distribute-center"] = "rbxassetid://10709760351",
["lucide-align-vertical-distribute-end"] = "rbxassetid://10709760434",
["lucide-align-vertical-distribute-start"] = "rbxassetid://10709760612",
["lucide-align-vertical-justify-center"] = "rbxassetid://10709760814",
["lucide-align-vertical-justify-end"] = "rbxassetid://10709761003",
["lucide-align-vertical-justify-start"] = "rbxassetid://10709761176",
["lucide-align-vertical-space-around"] = "rbxassetid://10709761324",
["lucide-align-vertical-space-between"] = "rbxassetid://10709761434",
["lucide-anchor"] = "rbxassetid://10709761530",
["lucide-angry"] = "rbxassetid://10709761629",
["lucide-annoyed"] = "rbxassetid://10709761722",
["lucide-aperture"] = "rbxassetid://10709761813",
["lucide-apple"] = "rbxassetid://10709761889",
["lucide-archive"] = "rbxassetid://10709762233",
["lucide-archive-restore"] = "rbxassetid://10709762058",
["lucide-armchair"] = "rbxassetid://10709762327",
["lucide-anvil"] = "rbxassetid://77943964625400",
["lucide-arrow-big-down"] = "rbxassetid://10747796644",
["lucide-arrow-big-left"] = "rbxassetid://10709762574",
["lucide-arrow-big-right"] = "rbxassetid://10709762727",
["lucide-arrow-big-up"] = "rbxassetid://10709762879",
["lucide-arrow-down"] = "rbxassetid://10709767827",
["lucide-arrow-down-circle"] = "rbxassetid://10709763034",
["lucide-arrow-down-left"] = "rbxassetid://10709767656",
["lucide-arrow-down-right"] = "rbxassetid://10709767750",
["lucide-arrow-left"] = "rbxassetid://10709768114",
["lucide-arrow-left-circle"] = "rbxassetid://10709767936",
["lucide-arrow-left-right"] = "rbxassetid://10709768019",
["lucide-arrow-right"] = "rbxassetid://10709768347",
["lucide-arrow-right-circle"] = "rbxassetid://10709768226",
["lucide-arrow-up"] = "rbxassetid://10709768939",
["lucide-arrow-up-circle"] = "rbxassetid://10709768432",
["lucide-arrow-up-down"] = "rbxassetid://10709768538",
["lucide-arrow-up-left"] = "rbxassetid://10709768661",
["lucide-arrow-up-right"] = "rbxassetid://10709768787",
["lucide-asterisk"] = "rbxassetid://10709769095",
["lucide-at-sign"] = "rbxassetid://10709769286",
["lucide-award"] = "rbxassetid://10709769406",
["lucide-axe"] = "rbxassetid://10709769508",
["lucide-axis-3d"] = "rbxassetid://10709769598",
["lucide-baby"] = "rbxassetid://10709769732",
["lucide-backpack"] = "rbxassetid://10709769841",
["lucide-baggage-claim"] = "rbxassetid://10709769935",
["lucide-banana"] = "rbxassetid://10709770005",
["lucide-banknote"] = "rbxassetid://10709770178",
["lucide-bar-chart"] = "rbxassetid://10709773755",
["lucide-bar-chart-2"] = "rbxassetid://10709770317",
["lucide-bar-chart-3"] = "rbxassetid://10709770431",
["lucide-bar-chart-4"] = "rbxassetid://10709770560",
["lucide-bar-chart-horizontal"] = "rbxassetid://10709773669",
["lucide-barcode"] = "rbxassetid://10747360675",
["lucide-baseline"] = "rbxassetid://10709773863",
["lucide-bath"] = "rbxassetid://10709773963",
["lucide-battery"] = "rbxassetid://10709774640",
["lucide-battery-charging"] = "rbxassetid://10709774068",
["lucide-battery-full"] = "rbxassetid://10709774206",
["lucide-battery-low"] = "rbxassetid://10709774370",
["lucide-battery-medium"] = "rbxassetid://10709774513",
["lucide-beaker"] = "rbxassetid://10709774756",
["lucide-bed"] = "rbxassetid://10709775036",
["lucide-bed-double"] = "rbxassetid://10709774864",
["lucide-bed-single"] = "rbxassetid://10709774968",
["lucide-beer"] = "rbxassetid://10709775167",
["lucide-bell"] = "rbxassetid://10709775704",
["lucide-bell-minus"] = "rbxassetid://10709775241",
["lucide-bell-off"] = "rbxassetid://10709775320",
["lucide-bell-plus"] = "rbxassetid://10709775448",
["lucide-bell-ring"] = "rbxassetid://10709775560",
["lucide-bike"] = "rbxassetid://10709775894",
["lucide-binary"] = "rbxassetid://10709776050",
["lucide-bitcoin"] = "rbxassetid://10709776126",
["lucide-bluetooth"] = "rbxassetid://10709776655",
["lucide-bluetooth-connected"] = "rbxassetid://10709776240",
["lucide-bluetooth-off"] = "rbxassetid://10709776344",
["lucide-bluetooth-searching"] = "rbxassetid://10709776501",
["lucide-bold"] = "rbxassetid://10747813908",
["lucide-bomb"] = "rbxassetid://10709781460",
["lucide-bone"] = "rbxassetid://10709781605",
["lucide-book"] = "rbxassetid://10709781824",
["lucide-book-open"] = "rbxassetid://10709781717",
["lucide-bookmark"] = "rbxassetid://10709782154",
["lucide-bookmark-minus"] = "rbxassetid://10709781919",
["lucide-bookmark-plus"] = "rbxassetid://10709782044",
["lucide-bot"] = "rbxassetid://10709782230",
["lucide-box"] = "rbxassetid://10709782497",
["lucide-box-select"] = "rbxassetid://10709782342",
["lucide-boxes"] = "rbxassetid://10709782582",
["lucide-briefcase"] = "rbxassetid://10709782662",
["lucide-brush"] = "rbxassetid://10709782758",
["lucide-bug"] = "rbxassetid://10709782845",
["lucide-building"] = "rbxassetid://10709783051",
["lucide-building-2"] = "rbxassetid://10709782939",
["lucide-bus"] = "rbxassetid://10709783137",
["lucide-cake"] = "rbxassetid://10709783217",
["lucide-calculator"] = "rbxassetid://10709783311",
["lucide-calendar"] = "rbxassetid://10709789505",
["lucide-calendar-check"] = "rbxassetid://10709783474",
["lucide-calendar-check-2"] = "rbxassetid://10709783392",
["lucide-calendar-clock"] = "rbxassetid://10709783577",
["lucide-calendar-days"] = "rbxassetid://10709783673",
["lucide-calendar-heart"] = "rbxassetid://10709783835",
["lucide-calendar-minus"] = "rbxassetid://10709783959",
["lucide-calendar-off"] = "rbxassetid://10709788784",
["lucide-calendar-plus"] = "rbxassetid://10709788937",
["lucide-calendar-range"] = "rbxassetid://10709789053",
["lucide-calendar-search"] = "rbxassetid://10709789200",
["lucide-calendar-x"] = "rbxassetid://10709789407",
["lucide-calendar-x-2"] = "rbxassetid://10709789329",
["lucide-camera"] = "rbxassetid://10709789686",
["lucide-camera-off"] = "rbxassetid://10747822677",
["lucide-car"] = "rbxassetid://10709789810",
["lucide-carrot"] = "rbxassetid://10709789960",
["lucide-cast"] = "rbxassetid://10709790097",
["lucide-charge"] = "rbxassetid://10709790202",
["lucide-check"] = "rbxassetid://10709790644",
["lucide-check-circle"] = "rbxassetid://10709790387",
["lucide-check-circle-2"] = "rbxassetid://10709790298",
["lucide-check-square"] = "rbxassetid://10709790537",
["lucide-chef-hat"] = "rbxassetid://10709790757",
["lucide-cherry"] = "rbxassetid://10709790875",
["lucide-chevron-down"] = "rbxassetid://10709790948",
["lucide-chevron-first"] = "rbxassetid://10709791015",
["lucide-chevron-last"] = "rbxassetid://10709791130",
["lucide-chevron-left"] = "rbxassetid://10709791281",
["lucide-chevron-right"] = "rbxassetid://10709791437",
["lucide-chevron-up"] = "rbxassetid://10709791523",
["lucide-chevrons-down"] = "rbxassetid://10709796864",
["lucide-chevrons-down-up"] = "rbxassetid://10709791632",
["lucide-chevrons-left"] = "rbxassetid://10709797151",
["lucide-chevrons-left-right"] = "rbxassetid://10709797006",
["lucide-chevrons-right"] = "rbxassetid://10709797382",
["lucide-chevrons-right-left"] = "rbxassetid://10709797274",
["lucide-chevrons-up"] = "rbxassetid://10709797622",
["lucide-chevrons-up-down"] = "rbxassetid://10709797508",
["lucide-chrome"] = "rbxassetid://10709797725",
["lucide-circle"] = "rbxassetid://10709798174",
["lucide-circle-dot"] = "rbxassetid://10709797837",
["lucide-circle-ellipsis"] = "rbxassetid://10709797985",
["lucide-circle-slashed"] = "rbxassetid://10709798100",
["lucide-citrus"] = "rbxassetid://10709798276",
["lucide-clapperboard"] = "rbxassetid://10709798350",
["lucide-clipboard"] = "rbxassetid://10709799288",
["lucide-clipboard-check"] = "rbxassetid://10709798443",
["lucide-clipboard-copy"] = "rbxassetid://10709798574",
["lucide-clipboard-edit"] = "rbxassetid://10709798682",
["lucide-clipboard-list"] = "rbxassetid://10709798792",
["lucide-clipboard-signature"] = "rbxassetid://10709798890",
["lucide-clipboard-type"] = "rbxassetid://10709798999",
["lucide-clipboard-x"] = "rbxassetid://10709799124",
["lucide-clock"] = "rbxassetid://10709805144",
["lucide-clock-1"] = "rbxassetid://10709799535",
["lucide-clock-10"] = "rbxassetid://10709799718",
["lucide-clock-11"] = "rbxassetid://10709799818",
["lucide-clock-12"] = "rbxassetid://10709799962",
["lucide-clock-2"] = "rbxassetid://10709803876",
["lucide-clock-3"] = "rbxassetid://10709803989",
["lucide-clock-4"] = "rbxassetid://10709804164",
["lucide-clock-5"] = "rbxassetid://10709804291",
["lucide-clock-6"] = "rbxassetid://10709804435",
["lucide-clock-7"] = "rbxassetid://10709804599",
["lucide-clock-8"] = "rbxassetid://10709804784",
["lucide-clock-9"] = "rbxassetid://10709804996",
["lucide-cloud"] = "rbxassetid://10709806740",
["lucide-cloud-cog"] = "rbxassetid://10709805262",
["lucide-cloud-drizzle"] = "rbxassetid://10709805371",
["lucide-cloud-fog"] = "rbxassetid://10709805477",
["lucide-cloud-hail"] = "rbxassetid://10709805596",
["lucide-cloud-lightning"] = "rbxassetid://10709805727",
["lucide-cloud-moon"] = "rbxassetid://10709805942",
["lucide-cloud-moon-rain"] = "rbxassetid://10709805838",
["lucide-cloud-off"] = "rbxassetid://10709806060",
["lucide-cloud-rain"] = "rbxassetid://10709806277",
["lucide-cloud-rain-wind"] = "rbxassetid://10709806166",
["lucide-cloud-snow"] = "rbxassetid://10709806374",
["lucide-cloud-sun"] = "rbxassetid://10709806631",
["lucide-cloud-sun-rain"] = "rbxassetid://10709806475",
["lucide-cloudy"] = "rbxassetid://10709806859",
["lucide-clover"] = "rbxassetid://10709806995",
["lucide-code"] = "rbxassetid://10709810463",
["lucide-code-2"] = "rbxassetid://10709807111",
["lucide-codepen"] = "rbxassetid://10709810534",
["lucide-codesandbox"] = "rbxassetid://10709810676",
["lucide-coffee"] = "rbxassetid://10709810814",
["lucide-cog"] = "rbxassetid://10709810948",
["lucide-coins"] = "rbxassetid://10709811110",
["lucide-columns"] = "rbxassetid://10709811261",
["lucide-command"] = "rbxassetid://10709811365",
["lucide-compass"] = "rbxassetid://10709811445",
["lucide-component"] = "rbxassetid://10709811595",
["lucide-concierge-bell"] = "rbxassetid://10709811706",
["lucide-connection"] = "rbxassetid://10747361219",
["lucide-contact"] = "rbxassetid://10709811834",
["lucide-contrast"] = "rbxassetid://10709811939",
["lucide-cookie"] = "rbxassetid://10709812067",
["lucide-copy"] = "rbxassetid://10709812159",
["lucide-copyleft"] = "rbxassetid://10709812251",
["lucide-copyright"] = "rbxassetid://10709812311",
["lucide-corner-down-left"] = "rbxassetid://10709812396",
["lucide-corner-down-right"] = "rbxassetid://10709812485",
["lucide-corner-left-down"] = "rbxassetid://10709812632",
["lucide-corner-left-up"] = "rbxassetid://10709812784",
["lucide-corner-right-down"] = "rbxassetid://10709812939",
["lucide-corner-right-up"] = "rbxassetid://10709813094",
["lucide-corner-up-left"] = "rbxassetid://10709813185",
["lucide-corner-up-right"] = "rbxassetid://10709813281",
["lucide-cpu"] = "rbxassetid://10709813383",
["lucide-croissant"] = "rbxassetid://10709818125",
["lucide-crop"] = "rbxassetid://10709818245",
["lucide-cross"] = "rbxassetid://10709818399",
["lucide-crosshair"] = "rbxassetid://10709818534",
["lucide-crown"] = "rbxassetid://10709818626",
["lucide-cup-soda"] = "rbxassetid://10709818763",
["lucide-curly-braces"] = "rbxassetid://10709818847",
["lucide-currency"] = "rbxassetid://10709818931",
["lucide-container"] = "rbxassetid://17466205552",
["lucide-database"] = "rbxassetid://10709818996",
["lucide-delete"] = "rbxassetid://10709819059",
["lucide-diamond"] = "rbxassetid://10709819149",
["lucide-dice-1"] = "rbxassetid://10709819266",
["lucide-dice-2"] = "rbxassetid://10709819361",
["lucide-dice-3"] = "rbxassetid://10709819508",
["lucide-dice-4"] = "rbxassetid://10709819670",
["lucide-dice-5"] = "rbxassetid://10709819801",
["lucide-dice-6"] = "rbxassetid://10709819896",
["lucide-dices"] = "rbxassetid://10723343321",
["lucide-diff"] = "rbxassetid://10723343416",
["lucide-disc"] = "rbxassetid://10723343537",
["lucide-divide"] = "rbxassetid://10723343805",
["lucide-divide-circle"] = "rbxassetid://10723343636",
["lucide-divide-square"] = "rbxassetid://10723343737",
["lucide-dollar-sign"] = "rbxassetid://10723343958",
["lucide-download"] = "rbxassetid://10723344270",
["lucide-download-cloud"] = "rbxassetid://10723344088",
["lucide-door-open"] = "rbxassetid://124179241653522",
["lucide-droplet"] = "rbxassetid://10723344432",
["lucide-droplets"] = "rbxassetid://10734883356",
["lucide-drumstick"] = "rbxassetid://10723344737",
["lucide-edit"] = "rbxassetid://10734883598",
["lucide-edit-2"] = "rbxassetid://10723344885",
["lucide-edit-3"] = "rbxassetid://10723345088",
["lucide-egg"] = "rbxassetid://10723345518",
["lucide-egg-fried"] = "rbxassetid://10723345347",
["lucide-electricity"] = "rbxassetid://10723345749",
["lucide-electricity-off"] = "rbxassetid://10723345643",
["lucide-equal"] = "rbxassetid://10723345990",
["lucide-equal-not"] = "rbxassetid://10723345866",
["lucide-eraser"] = "rbxassetid://10723346158",
["lucide-euro"] = "rbxassetid://10723346372",
["lucide-expand"] = "rbxassetid://10723346553",
["lucide-external-link"] = "rbxassetid://10723346684",
["lucide-eye"] = "rbxassetid://10723346959",
["lucide-eye-off"] = "rbxassetid://10723346871",
["lucide-factory"] = "rbxassetid://10723347051",
["lucide-fan"] = "rbxassetid://10723354359",
["lucide-fast-forward"] = "rbxassetid://10723354521",
["lucide-feather"] = "rbxassetid://10723354671",
["lucide-figma"] = "rbxassetid://10723354801",
["lucide-file"] = "rbxassetid://10723374641",
["lucide-file-archive"] = "rbxassetid://10723354921",
["lucide-file-audio"] = "rbxassetid://10723355148",
["lucide-file-audio-2"] = "rbxassetid://10723355026",
["lucide-file-axis-3d"] = "rbxassetid://10723355272",
["lucide-file-badge"] = "rbxassetid://10723355622",
["lucide-file-badge-2"] = "rbxassetid://10723355451",
["lucide-file-bar-chart"] = "rbxassetid://10723355887",
["lucide-file-bar-chart-2"] = "rbxassetid://10723355746",
["lucide-file-box"] = "rbxassetid://10723355989",
["lucide-file-check"] = "rbxassetid://10723356210",
["lucide-file-check-2"] = "rbxassetid://10723356100",
["lucide-file-clock"] = "rbxassetid://10723356329",
["lucide-file-code"] = "rbxassetid://10723356507",
["lucide-file-cog"] = "rbxassetid://10723356830",
["lucide-file-cog-2"] = "rbxassetid://10723356676",
["lucide-file-diff"] = "rbxassetid://10723357039",
["lucide-file-digit"] = "rbxassetid://10723357151",
["lucide-file-down"] = "rbxassetid://10723357322",
["lucide-file-edit"] = "rbxassetid://10723357495",
["lucide-file-heart"] = "rbxassetid://10723357637",
["lucide-file-image"] = "rbxassetid://10723357790",
["lucide-file-input"] = "rbxassetid://10723357933",
["lucide-file-json"] = "rbxassetid://10723364435",
["lucide-file-json-2"] = "rbxassetid://10723364361",
["lucide-file-key"] = "rbxassetid://10723364605",
["lucide-file-key-2"] = "rbxassetid://10723364515",
["lucide-file-line-chart"] = "rbxassetid://10723364725",
["lucide-file-lock"] = "rbxassetid://10723364957",
["lucide-file-lock-2"] = "rbxassetid://10723364861",
["lucide-file-minus"] = "rbxassetid://10723365254",
["lucide-file-minus-2"] = "rbxassetid://10723365086",
["lucide-file-output"] = "rbxassetid://10723365457",
["lucide-file-pie-chart"] = "rbxassetid://10723365598",
["lucide-file-plus"] = "rbxassetid://10723365877",
["lucide-file-plus-2"] = "rbxassetid://10723365766",
["lucide-file-question"] = "rbxassetid://10723365987",
["lucide-file-scan"] = "rbxassetid://10723366167",
["lucide-file-search"] = "rbxassetid://10723366550",
["lucide-file-search-2"] = "rbxassetid://10723366340",
["lucide-file-signature"] = "rbxassetid://10723366741",
["lucide-file-spreadsheet"] = "rbxassetid://10723366962",
["lucide-file-symlink"] = "rbxassetid://10723367098",
["lucide-file-terminal"] = "rbxassetid://10723367244",
["lucide-file-text"] = "rbxassetid://10723367380",
["lucide-file-type"] = "rbxassetid://10723367606",
["lucide-file-type-2"] = "rbxassetid://10723367509",
["lucide-file-up"] = "rbxassetid://10723367734",
["lucide-file-video"] = "rbxassetid://10723373884",
["lucide-file-video-2"] = "rbxassetid://10723367834",
["lucide-file-volume"] = "rbxassetid://10723374172",
["lucide-file-volume-2"] = "rbxassetid://10723374030",
["lucide-file-warning"] = "rbxassetid://10723374276",
["lucide-file-x"] = "rbxassetid://10723374544",
["lucide-file-x-2"] = "rbxassetid://10723374378",
["lucide-files"] = "rbxassetid://10723374759",
["lucide-film"] = "rbxassetid://10723374981",
["lucide-filter"] = "rbxassetid://10723375128",
["lucide-fingerprint"] = "rbxassetid://10723375250",
["lucide-flag"] = "rbxassetid://10723375890",
["lucide-flag-off"] = "rbxassetid://10723375443",
["lucide-flag-triangle-left"] = "rbxassetid://10723375608",
["lucide-flag-triangle-right"] = "rbxassetid://10723375727",
["lucide-flame"] = "rbxassetid://10723376114",
["lucide-flashlight"] = "rbxassetid://10723376471",
["lucide-flashlight-off"] = "rbxassetid://10723376365",
["lucide-flask-conical"] = "rbxassetid://10734883986",
["lucide-flask-round"] = "rbxassetid://10723376614",
["lucide-flip-horizontal"] = "rbxassetid://10723376884",
["lucide-flip-horizontal-2"] = "rbxassetid://10723376745",
["lucide-flip-vertical"] = "rbxassetid://10723377138",
["lucide-flip-vertical-2"] = "rbxassetid://10723377026",
["lucide-flower"] = "rbxassetid://10747830374",
["lucide-flower-2"] = "rbxassetid://10723377305",
["lucide-focus"] = "rbxassetid://10723377537",
["lucide-folder"] = "rbxassetid://10723387563",
["lucide-folder-archive"] = "rbxassetid://10723384478",
["lucide-folder-check"] = "rbxassetid://10723384605",
["lucide-folder-clock"] = "rbxassetid://10723384731",
["lucide-folder-closed"] = "rbxassetid://10723384893",
["lucide-folder-cog"] = "rbxassetid://10723385213",
["lucide-folder-cog-2"] = "rbxassetid://10723385036",
["lucide-folder-down"] = "rbxassetid://10723385338",
["lucide-folder-edit"] = "rbxassetid://10723385445",
["lucide-folder-heart"] = "rbxassetid://10723385545",
["lucide-folder-input"] = "rbxassetid://10723385721",
["lucide-folder-key"] = "rbxassetid://10723385848",
["lucide-folder-lock"] = "rbxassetid://10723386005",
["lucide-folder-minus"] = "rbxassetid://10723386127",
["lucide-folder-open"] = "rbxassetid://10723386277",
["lucide-folder-output"] = "rbxassetid://10723386386",
["lucide-folder-plus"] = "rbxassetid://10723386531",
["lucide-folder-search"] = "rbxassetid://10723386787",
["lucide-folder-search-2"] = "rbxassetid://10723386674",
["lucide-folder-symlink"] = "rbxassetid://10723386930",
["lucide-folder-tree"] = "rbxassetid://10723387085",
["lucide-folder-up"] = "rbxassetid://10723387265",
["lucide-folder-x"] = "rbxassetid://10723387448",
["lucide-folders"] = "rbxassetid://10723387721",
["lucide-form-input"] = "rbxassetid://10723387841",
["lucide-forward"] = "rbxassetid://10723388016",
["lucide-frame"] = "rbxassetid://10723394389",
["lucide-framer"] = "rbxassetid://10723394565",
["lucide-frown"] = "rbxassetid://10723394681",
["lucide-fuel"] = "rbxassetid://10723394846",
["lucide-function-square"] = "rbxassetid://10723395041",
["lucide-gamepad"] = "rbxassetid://10723395457",
["lucide-gamepad-2"] = "rbxassetid://10723395215",
["lucide-gauge"] = "rbxassetid://10723395708",
["lucide-gavel"] = "rbxassetid://10723395896",
["lucide-gem"] = "rbxassetid://10723396000",
["lucide-ghost"] = "rbxassetid://10723396107",
["lucide-gift"] = "rbxassetid://10723396402",
["lucide-gift-card"] = "rbxassetid://10723396225",
["lucide-git-branch"] = "rbxassetid://10723396676",
["lucide-git-branch-plus"] = "rbxassetid://10723396542",
["lucide-git-commit"] = "rbxassetid://10723396812",
["lucide-git-compare"] = "rbxassetid://10723396954",
["lucide-git-fork"] = "rbxassetid://10723397049",
["lucide-git-merge"] = "rbxassetid://10723397165",
["lucide-git-pull-request"] = "rbxassetid://10723397431",
["lucide-git-pull-request-closed"] = "rbxassetid://10723397268",
["lucide-git-pull-request-draft"] = "rbxassetid://10734884302",
["lucide-glass"] = "rbxassetid://10723397788",
["lucide-glass-2"] = "rbxassetid://10723397529",
["lucide-glass-water"] = "rbxassetid://10723397678",
["lucide-glasses"] = "rbxassetid://10723397895",
["lucide-globe"] = "rbxassetid://10723404337",
["lucide-globe-2"] = "rbxassetid://10723398002",
["lucide-grab"] = "rbxassetid://10723404472",
["lucide-graduation-cap"] = "rbxassetid://10723404691",
["lucide-grape"] = "rbxassetid://10723404822",
["lucide-grid"] = "rbxassetid://10723404936",
["lucide-grip-horizontal"] = "rbxassetid://10723405089",
["lucide-grip-vertical"] = "rbxassetid://10723405236",
["lucide-hammer"] = "rbxassetid://10723405360",
["lucide-hand"] = "rbxassetid://10723405649",
["lucide-hand-metal"] = "rbxassetid://10723405508",
["lucide-hard-drive"] = "rbxassetid://10723405749",
["lucide-hard-hat"] = "rbxassetid://10723405859",
["lucide-hash"] = "rbxassetid://10723405975",
["lucide-haze"] = "rbxassetid://10723406078",
["lucide-headphones"] = "rbxassetid://10723406165",
["lucide-heart"] = "rbxassetid://10723406885",
["lucide-heart-crack"] = "rbxassetid://10723406299",
["lucide-heart-handshake"] = "rbxassetid://10723406480",
["lucide-heart-off"] = "rbxassetid://10723406662",
["lucide-heart-pulse"] = "rbxassetid://10723406795",
["lucide-help-circle"] = "rbxassetid://10723406988",
["lucide-hexagon"] = "rbxassetid://10723407092",
["lucide-highlighter"] = "rbxassetid://10723407192",
["lucide-history"] = "rbxassetid://10723407335",
["lucide-home"] = "rbxassetid://10723407389",
["lucide-hourglass"] = "rbxassetid://10723407498",
["lucide-ice-cream"] = "rbxassetid://10723414308",
["lucide-image"] = "rbxassetid://10723415040",
["lucide-image-minus"] = "rbxassetid://10723414487",
["lucide-image-off"] = "rbxassetid://10723414677",
["lucide-image-plus"] = "rbxassetid://10723414827",
["lucide-import"] = "rbxassetid://10723415205",
["lucide-inbox"] = "rbxassetid://10723415335",
["lucide-indent"] = "rbxassetid://10723415494",
["lucide-indian-rupee"] = "rbxassetid://10723415642",
["lucide-infinity"] = "rbxassetid://10723415766",
["lucide-info"] = "rbxassetid://10723415903",
["lucide-inspect"] = "rbxassetid://10723416057",
["lucide-italic"] = "rbxassetid://10723416195",
["lucide-japanese-yen"] = "rbxassetid://10723416363",
["lucide-joystick"] = "rbxassetid://10723416527",
["lucide-key"] = "rbxassetid://10723416652",
["lucide-keyboard"] = "rbxassetid://10723416765",
["lucide-lamp"] = "rbxassetid://10723417513",
["lucide-lamp-ceiling"] = "rbxassetid://10723416922",
["lucide-lamp-desk"] = "rbxassetid://10723417016",
["lucide-lamp-floor"] = "rbxassetid://10723417131",
["lucide-lamp-wall-down"] = "rbxassetid://10723417240",
["lucide-lamp-wall-up"] = "rbxassetid://10723417356",
["lucide-landmark"] = "rbxassetid://10723417608",
["lucide-languages"] = "rbxassetid://10723417703",
["lucide-laptop"] = "rbxassetid://10723423881",
["lucide-laptop-2"] = "rbxassetid://10723417797",
["lucide-lasso"] = "rbxassetid://10723424235",
["lucide-lasso-select"] = "rbxassetid://10723424058",
["lucide-laugh"] = "rbxassetid://10723424372",
["lucide-layers"] = "rbxassetid://10723424505",
["lucide-layout"] = "rbxassetid://10723425376",
["lucide-layout-dashboard"] = "rbxassetid://10723424646",
["lucide-layout-grid"] = "rbxassetid://10723424838",
["lucide-layout-list"] = "rbxassetid://10723424963",
["lucide-layout-template"] = "rbxassetid://10723425187",
["lucide-leaf"] = "rbxassetid://10723425539",
["lucide-library"] = "rbxassetid://10723425615",
["lucide-life-buoy"] = "rbxassetid://10723425685",
["lucide-lightbulb"] = "rbxassetid://10723425852",
["lucide-lightbulb-off"] = "rbxassetid://10723425762",
["lucide-line-chart"] = "rbxassetid://10723426393",
["lucide-link"] = "rbxassetid://10723426722",
["lucide-link-2"] = "rbxassetid://10723426595",
["lucide-link-2-off"] = "rbxassetid://10723426513",
["lucide-list"] = "rbxassetid://10723433811",
["lucide-list-checks"] = "rbxassetid://10734884548",
["lucide-list-end"] = "rbxassetid://10723426886",
["lucide-list-minus"] = "rbxassetid://10723426986",
["lucide-list-music"] = "rbxassetid://10723427081",
["lucide-list-ordered"] = "rbxassetid://10723427199",
["lucide-list-plus"] = "rbxassetid://10723427334",
["lucide-list-start"] = "rbxassetid://10723427494",
["lucide-list-video"] = "rbxassetid://10723427619",
["lucide-list-todo"] = "rbxassetid://17376008003",
["lucide-list-x"] = "rbxassetid://10723433655",
["lucide-loader"] = "rbxassetid://10723434070",
["lucide-loader-2"] = "rbxassetid://10723433935",
["lucide-locate"] = "rbxassetid://10723434557",
["lucide-locate-fixed"] = "rbxassetid://10723434236",
["lucide-locate-off"] = "rbxassetid://10723434379",
["lucide-lock"] = "rbxassetid://10723434711",
["lucide-log-in"] = "rbxassetid://10723434830",
["lucide-log-out"] = "rbxassetid://10723434906",
["lucide-luggage"] = "rbxassetid://10723434993",
["lucide-magnet"] = "rbxassetid://10723435069",
["lucide-mail"] = "rbxassetid://10734885430",
["lucide-mail-check"] = "rbxassetid://10723435182",
["lucide-mail-minus"] = "rbxassetid://10723435261",
["lucide-mail-open"] = "rbxassetid://10723435342",
["lucide-mail-plus"] = "rbxassetid://10723435443",
["lucide-mail-question"] = "rbxassetid://10723435515",
["lucide-mail-search"] = "rbxassetid://10734884739",
["lucide-mail-warning"] = "rbxassetid://10734885015",
["lucide-mail-x"] = "rbxassetid://10734885247",
["lucide-mails"] = "rbxassetid://10734885614",
["lucide-map"] = "rbxassetid://10734886202",
["lucide-map-pin"] = "rbxassetid://10734886004",
["lucide-map-pin-off"] = "rbxassetid://10734885803",
["lucide-maximize"] = "rbxassetid://10734886735",
["lucide-maximize-2"] = "rbxassetid://10734886496",
["lucide-medal"] = "rbxassetid://10734887072",
["lucide-megaphone"] = "rbxassetid://10734887454",
["lucide-megaphone-off"] = "rbxassetid://10734887311",
["lucide-meh"] = "rbxassetid://10734887603",
["lucide-menu"] = "rbxassetid://10734887784",
["lucide-message-circle"] = "rbxassetid://10734888000",
["lucide-message-square"] = "rbxassetid://10734888228",
["lucide-mic"] = "rbxassetid://10734888864",
["lucide-mic-2"] = "rbxassetid://10734888430",
["lucide-mic-off"] = "rbxassetid://10734888646",
["lucide-microscope"] = "rbxassetid://10734889106",
["lucide-microwave"] = "rbxassetid://10734895076",
["lucide-milestone"] = "rbxassetid://10734895310",
["lucide-minimize"] = "rbxassetid://10734895698",
["lucide-minimize-2"] = "rbxassetid://10734895530",
["lucide-minus"] = "rbxassetid://10734896206",
["lucide-minus-circle"] = "rbxassetid://10734895856",
["lucide-minus-square"] = "rbxassetid://10734896029",
["lucide-monitor"] = "rbxassetid://10734896881",
["lucide-monitor-off"] = "rbxassetid://10734896360",
["lucide-monitor-speaker"] = "rbxassetid://10734896512",
["lucide-moon"] = "rbxassetid://10734897102",
["lucide-more-horizontal"] = "rbxassetid://10734897250",
["lucide-more-vertical"] = "rbxassetid://10734897387",
["lucide-mountain"] = "rbxassetid://10734897956",
["lucide-mountain-snow"] = "rbxassetid://10734897665",
["lucide-mouse"] = "rbxassetid://10734898592",
["lucide-mouse-pointer"] = "rbxassetid://10734898476",
["lucide-mouse-pointer-2"] = "rbxassetid://10734898194",
["lucide-mouse-pointer-click"] = "rbxassetid://10734898355",
["lucide-move"] = "rbxassetid://10734900011",
["lucide-move-3d"] = "rbxassetid://10734898756",
["lucide-move-diagonal"] = "rbxassetid://10734899164",
["lucide-move-diagonal-2"] = "rbxassetid://10734898934",
["lucide-move-horizontal"] = "rbxassetid://10734899414",
["lucide-move-vertical"] = "rbxassetid://10734899821",
["lucide-music"] = "rbxassetid://10734905958",
["lucide-music-2"] = "rbxassetid://10734900215",
["lucide-music-3"] = "rbxassetid://10734905665",
["lucide-music-4"] = "rbxassetid://10734905823",
["lucide-navigation"] = "rbxassetid://10734906744",
["lucide-navigation-2"] = "rbxassetid://10734906332",
["lucide-navigation-2-off"] = "rbxassetid://10734906144",
["lucide-navigation-off"] = "rbxassetid://10734906580",
["lucide-network"] = "rbxassetid://10734906975",
["lucide-newspaper"] = "rbxassetid://10734907168",
["lucide-octagon"] = "rbxassetid://10734907361",
["lucide-option"] = "rbxassetid://10734907649",
["lucide-outdent"] = "rbxassetid://10734907933",
["lucide-package"] = "rbxassetid://10734909540",
["lucide-package-2"] = "rbxassetid://10734908151",
["lucide-package-check"] = "rbxassetid://10734908384",
["lucide-package-minus"] = "rbxassetid://10734908626",
["lucide-package-open"] = "rbxassetid://10734908793",
["lucide-package-plus"] = "rbxassetid://10734909016",
["lucide-package-search"] = "rbxassetid://10734909196",
["lucide-package-x"] = "rbxassetid://10734909375",
["lucide-paint-bucket"] = "rbxassetid://10734909847",
["lucide-paintbrush"] = "rbxassetid://10734910187",
["lucide-paintbrush-2"] = "rbxassetid://10734910030",
["lucide-palette"] = "rbxassetid://10734910430",
["lucide-palmtree"] = "rbxassetid://10734910680",
["lucide-paperclip"] = "rbxassetid://10734910927",
["lucide-party-popper"] = "rbxassetid://10734918735",
["lucide-pause"] = "rbxassetid://10734919336",
["lucide-pause-circle"] = "rbxassetid://10735024209",
["lucide-pause-octagon"] = "rbxassetid://10734919143",
["lucide-pen-tool"] = "rbxassetid://10734919503",
["lucide-pencil"] = "rbxassetid://10734919691",
["lucide-percent"] = "rbxassetid://10734919919",
["lucide-person-standing"] = "rbxassetid://10734920149",
["lucide-phone"] = "rbxassetid://10734921524",
["lucide-phone-call"] = "rbxassetid://10734920305",
["lucide-phone-forwarded"] = "rbxassetid://10734920508",
["lucide-phone-incoming"] = "rbxassetid://10734920694",
["lucide-phone-missed"] = "rbxassetid://10734920845",
["lucide-phone-off"] = "rbxassetid://10734921077",
["lucide-phone-outgoing"] = "rbxassetid://10734921288",
["lucide-pie-chart"] = "rbxassetid://10734921727",
["lucide-piggy-bank"] = "rbxassetid://10734921935",
["lucide-pin"] = "rbxassetid://10734922324",
["lucide-pin-off"] = "rbxassetid://10734922180",
["lucide-pipette"] = "rbxassetid://10734922497",
["lucide-pizza"] = "rbxassetid://10734922774",
["lucide-plane"] = "rbxassetid://10734922971",
["lucide-plane-landing"] = "rbxassetid://17376029914",
["lucide-play"] = "rbxassetid://10734923549",
["lucide-play-circle"] = "rbxassetid://10734923214",
["lucide-plus"] = "rbxassetid://10734924532",
["lucide-plus-circle"] = "rbxassetid://10734923868",
["lucide-plus-square"] = "rbxassetid://10734924219",
["lucide-podcast"] = "rbxassetid://10734929553",
["lucide-pointer"] = "rbxassetid://10734929723",
["lucide-pound-sterling"] = "rbxassetid://10734929981",
["lucide-power"] = "rbxassetid://10734930466",
["lucide-power-off"] = "rbxassetid://10734930257",
["lucide-printer"] = "rbxassetid://10734930632",
["lucide-puzzle"] = "rbxassetid://10734930886",
["lucide-quote"] = "rbxassetid://10734931234",
["lucide-radio"] = "rbxassetid://10734931596",
["lucide-radio-receiver"] = "rbxassetid://10734931402",
["lucide-rectangle-horizontal"] = "rbxassetid://10734931777",
["lucide-rectangle-vertical"] = "rbxassetid://10734932081",
["lucide-recycle"] = "rbxassetid://10734932295",
["lucide-redo"] = "rbxassetid://10734932822",
["lucide-redo-2"] = "rbxassetid://10734932586",
["lucide-refresh-ccw"] = "rbxassetid://10734933056",
["lucide-refresh-cw"] = "rbxassetid://10734933222",
["lucide-refrigerator"] = "rbxassetid://10734933465",
["lucide-regex"] = "rbxassetid://10734933655",
["lucide-repeat"] = "rbxassetid://10734933966",
["lucide-repeat-1"] = "rbxassetid://10734933826",
["lucide-reply"] = "rbxassetid://10734934252",
["lucide-reply-all"] = "rbxassetid://10734934132",
["lucide-rewind"] = "rbxassetid://10734934347",
["lucide-rocket"] = "rbxassetid://10734934585",
["lucide-rocking-chair"] = "rbxassetid://10734939942",
["lucide-rotate-3d"] = "rbxassetid://10734940107",
["lucide-rotate-ccw"] = "rbxassetid://10734940376",
["lucide-rotate-cw"] = "rbxassetid://10734940654",
["lucide-rss"] = "rbxassetid://10734940825",
["lucide-ruler"] = "rbxassetid://10734941018",
["lucide-russian-ruble"] = "rbxassetid://10734941199",
["lucide-sailboat"] = "rbxassetid://10734941354",
["lucide-save"] = "rbxassetid://10734941499",
["lucide-scale"] = "rbxassetid://10734941912",
["lucide-scale-3d"] = "rbxassetid://10734941739",
["lucide-scaling"] = "rbxassetid://10734942072",
["lucide-scan"] = "rbxassetid://10734942565",
["lucide-scan-face"] = "rbxassetid://10734942198",
["lucide-scan-line"] = "rbxassetid://10734942351",
["lucide-scissors"] = "rbxassetid://10734942778",
["lucide-screen-share"] = "rbxassetid://10734943193",
["lucide-screen-share-off"] = "rbxassetid://10734942967",
["lucide-scroll"] = "rbxassetid://10734943448",
["lucide-search"] = "rbxassetid://10734943674",
["lucide-send"] = "rbxassetid://10734943902",
["lucide-separator-horizontal"] = "rbxassetid://10734944115",
["lucide-separator-vertical"] = "rbxassetid://10734944326",
["lucide-server"] = "rbxassetid://10734949856",
["lucide-server-cog"] = "rbxassetid://10734944444",
["lucide-server-crash"] = "rbxassetid://10734944554",
["lucide-server-off"] = "rbxassetid://10734944668",
["lucide-settings"] = "rbxassetid://10734950309",
["lucide-settings-2"] = "rbxassetid://10734950020",
["lucide-share"] = "rbxassetid://10734950813",
["lucide-share-2"] = "rbxassetid://10734950553",
["lucide-sheet"] = "rbxassetid://10734951038",
["lucide-shield"] = "rbxassetid://10734951847",
["lucide-shield-alert"] = "rbxassetid://10734951173",
["lucide-shield-check"] = "rbxassetid://10734951367",
["lucide-shield-close"] = "rbxassetid://10734951535",
["lucide-shield-off"] = "rbxassetid://10734951684",
["lucide-shirt"] = "rbxassetid://10734952036",
["lucide-shopping-bag"] = "rbxassetid://10734952273",
["lucide-shopping-cart"] = "rbxassetid://10734952479",
["lucide-shovel"] = "rbxassetid://10734952773",
["lucide-shower-head"] = "rbxassetid://10734952942",
["lucide-shrink"] = "rbxassetid://10734953073",
["lucide-shrub"] = "rbxassetid://10734953241",
["lucide-shuffle"] = "rbxassetid://10734953451",
["lucide-sidebar"] = "rbxassetid://10734954301",
["lucide-sidebar-close"] = "rbxassetid://10734953715",
["lucide-sidebar-open"] = "rbxassetid://10734954000",
["lucide-sigma"] = "rbxassetid://10734954538",
["lucide-signal"] = "rbxassetid://10734961133",
["lucide-signal-high"] = "rbxassetid://10734954807",
["lucide-signal-low"] = "rbxassetid://10734955080",
["lucide-signal-medium"] = "rbxassetid://10734955336",
["lucide-signal-zero"] = "rbxassetid://10734960878",
["lucide-siren"] = "rbxassetid://10734961284",
["lucide-skip-back"] = "rbxassetid://10734961526",
["lucide-skip-forward"] = "rbxassetid://10734961809",
["lucide-skull"] = "rbxassetid://10734962068",
["lucide-slack"] = "rbxassetid://10734962339",
["lucide-slash"] = "rbxassetid://10734962600",
["lucide-slice"] = "rbxassetid://10734963024",
["lucide-sliders"] = "rbxassetid://10734963400",
["lucide-sliders-horizontal"] = "rbxassetid://10734963191",
["lucide-smartphone"] = "rbxassetid://10734963940",
["lucide-smartphone-charging"] = "rbxassetid://10734963671",
["lucide-smile"] = "rbxassetid://10734964441",
["lucide-smile-plus"] = "rbxassetid://10734964188",
["lucide-snowflake"] = "rbxassetid://10734964600",
["lucide-sofa"] = "rbxassetid://10734964852",
["lucide-sort-asc"] = "rbxassetid://10734965115",
["lucide-sort-desc"] = "rbxassetid://10734965287",
["lucide-speaker"] = "rbxassetid://10734965419",
["lucide-sprout"] = "rbxassetid://10734965572",
["lucide-square"] = "rbxassetid://10734965702",
["lucide-star"] = "rbxassetid://10734966248",
["lucide-star-half"] = "rbxassetid://10734965897",
["lucide-star-off"] = "rbxassetid://10734966097",
["lucide-stethoscope"] = "rbxassetid://10734966384",
["lucide-sticker"] = "rbxassetid://10734972234",
["lucide-sticky-note"] = "rbxassetid://10734972463",
["lucide-stop-circle"] = "rbxassetid://10734972621",
["lucide-stretch-horizontal"] = "rbxassetid://10734972862",
["lucide-stretch-vertical"] = "rbxassetid://10734973130",
["lucide-strikethrough"] = "rbxassetid://10734973290",
["lucide-subscript"] = "rbxassetid://10734973457",
["lucide-sun"] = "rbxassetid://10734974297",
["lucide-sun-dim"] = "rbxassetid://10734973645",
["lucide-sun-medium"] = "rbxassetid://10734973778",
["lucide-sun-moon"] = "rbxassetid://10734973999",
["lucide-sun-snow"] = "rbxassetid://10734974130",
["lucide-sunrise"] = "rbxassetid://10734974522",
["lucide-sunset"] = "rbxassetid://10734974689",
["lucide-superscript"] = "rbxassetid://10734974850",
["lucide-swiss-franc"] = "rbxassetid://10734975024",
["lucide-switch-camera"] = "rbxassetid://10734975214",
["lucide-sword"] = "rbxassetid://10734975486",
["lucide-swords"] = "rbxassetid://10734975692",
["lucide-syringe"] = "rbxassetid://10734975932",
["lucide-table"] = "rbxassetid://10734976230",
["lucide-table-2"] = "rbxassetid://10734976097",
["lucide-tablet"] = "rbxassetid://10734976394",
["lucide-tag"] = "rbxassetid://10734976528",
["lucide-tags"] = "rbxassetid://10734976739",
["lucide-target"] = "rbxassetid://10734977012",
["lucide-tent"] = "rbxassetid://10734981750",
["lucide-terminal"] = "rbxassetid://10734982144",
["lucide-terminal-square"] = "rbxassetid://10734981995",
["lucide-text-cursor"] = "rbxassetid://10734982395",
["lucide-text-cursor-input"] = "rbxassetid://10734982297",
["lucide-thermometer"] = "rbxassetid://10734983134",
["lucide-thermometer-snowflake"] = "rbxassetid://10734982571",
["lucide-thermometer-sun"] = "rbxassetid://10734982771",
["lucide-thumbs-down"] = "rbxassetid://10734983359",
["lucide-thumbs-up"] = "rbxassetid://10734983629",
["lucide-ticket"] = "rbxassetid://10734983868",
["lucide-timer"] = "rbxassetid://10734984606",
["lucide-timer-off"] = "rbxassetid://10734984138",
["lucide-timer-reset"] = "rbxassetid://10734984355",
["lucide-toggle-left"] = "rbxassetid://10734984834",
["lucide-toggle-right"] = "rbxassetid://10734985040",
["lucide-tornado"] = "rbxassetid://10734985247",
["lucide-toy-brick"] = "rbxassetid://10747361919",
["lucide-train"] = "rbxassetid://10747362105",
["lucide-trash"] = "rbxassetid://10747362393",
["lucide-trash-2"] = "rbxassetid://10747362241",
["lucide-tree-deciduous"] = "rbxassetid://10747362534",
["lucide-tree-pine"] = "rbxassetid://10747362748",
["lucide-trees"] = "rbxassetid://10747363016",
["lucide-trending-down"] = "rbxassetid://10747363205",
["lucide-trending-up"] = "rbxassetid://10747363465",
["lucide-triangle"] = "rbxassetid://10747363621",
["lucide-trophy"] = "rbxassetid://10747363809",
["lucide-truck"] = "rbxassetid://10747364031",
["lucide-tv"] = "rbxassetid://10747364593",
["lucide-tv-2"] = "rbxassetid://10747364302",
["lucide-type"] = "rbxassetid://10747364761",
["lucide-umbrella"] = "rbxassetid://10747364971",
["lucide-underline"] = "rbxassetid://10747365191",
["lucide-undo"] = "rbxassetid://10747365484",
["lucide-undo-2"] = "rbxassetid://10747365359",
["lucide-unlink"] = "rbxassetid://10747365771",
["lucide-unlink-2"] = "rbxassetid://10747397871",
["lucide-unlock"] = "rbxassetid://10747366027",
["lucide-upload"] = "rbxassetid://10747366434",
["lucide-upload-cloud"] = "rbxassetid://10747366266",
["lucide-usb"] = "rbxassetid://10747366606",
["lucide-user"] = "rbxassetid://10747373176",
["lucide-user-check"] = "rbxassetid://10747371901",
["lucide-user-cog"] = "rbxassetid://10747372167",
["lucide-user-minus"] = "rbxassetid://10747372346",
["lucide-user-plus"] = "rbxassetid://10747372702",
["lucide-user-x"] = "rbxassetid://10747372992",
["lucide-users"] = "rbxassetid://10747373426",
["lucide-utensils"] = "rbxassetid://10747373821",
["lucide-utensils-crossed"] = "rbxassetid://10747373629",
["lucide-venetian-mask"] = "rbxassetid://10747374003",
["lucide-verified"] = "rbxassetid://10747374131",
["lucide-vibrate"] = "rbxassetid://10747374489",
["lucide-vibrate-off"] = "rbxassetid://10747374269",
["lucide-video"] = "rbxassetid://10747374938",
["lucide-video-off"] = "rbxassetid://10747374721",
["lucide-view"] = "rbxassetid://10747375132",
["lucide-voicemail"] = "rbxassetid://10747375281",
["lucide-volume"] = "rbxassetid://10747376008",
["lucide-volume-1"] = "rbxassetid://10747375450",
["lucide-volume-2"] = "rbxassetid://10747375679",
["lucide-volume-x"] = "rbxassetid://10747375880",
["lucide-wheat"] = "rbxassetid://80877624162595",
["lucide-wallet"] = "rbxassetid://10747376205",
["lucide-wand"] = "rbxassetid://10747376565",
["lucide-wand-2"] = "rbxassetid://10747376349",
["lucide-watch"] = "rbxassetid://10747376722",
["lucide-waves"] = "rbxassetid://10747376931",
["lucide-webcam"] = "rbxassetid://10747381992",
["lucide-wifi"] = "rbxassetid://10747382504",
["lucide-wifi-off"] = "rbxassetid://10747382268",
["lucide-wind"] = "rbxassetid://10747382750",
["lucide-wrap-text"] = "rbxassetid://10747383065",
["lucide-wrench"] = "rbxassetid://10747383470",
["lucide-x"] = "rbxassetid://10747384394",
["lucide-x-circle"] = "rbxassetid://10747383819",
["lucide-x-octagon"] = "rbxassetid://10747384037",
["lucide-x-square"] = "rbxassetid://10747384217",
["lucide-zoom-in"] = "rbxassetid://10747384552",
["lucide-zoom-out"] = "rbxassetid://10747384679",
["lucide-cat"] = "rbxassetid://16935650691",
["lucide-message-circle-question"] = "rbxassetid://16970049192",
["lucide-webhook"] = "rbxassetid://17320556264",
["lucide-dumbbell"] = "rbxassetid://18273453053"
}
function Library:GetIcon(Name)
if Name ~= nil and Icons["lucide-" .. Name] then
return Icons["lucide-" .. Name]
end
return nil
end
local Elements = {}
Elements.__index = Elements
Elements.__namecall = function(Table, Key, ...)
return Elements[Key](...)
end
for _, ElementComponent in pairs(ElementsTable) do
Elements["Add" .. ElementComponent.__type] = function(self, Idx, Config)
ElementComponent.Container = self.Container
ElementComponent.Type = self.Type
ElementComponent.ScrollFrame = self.ScrollFrame
ElementComponent.Library = Library
return ElementComponent:New(Idx, Config)
end
end
Library.Elements = Elements
if RunService:IsStudio() then
makefolder = function(...) return ... end;
makefile = function(...) return ... end;
isfile = function(...) return ... end;
isfolder = function(...) return ... end;
readfile = function(...) return ... end;
writefile = function(...) return ... end;
listfiles = function (...) return {...} end;
end
local SaveManager = {} do
SaveManager.Folder = "FluentSettings"
SaveManager.Ignore = {}
SaveManager.Parser = {
Toggle = {
Save = function(idx, object)
return { type = "Toggle", idx = idx, value = object.Value }
end,
Load = function(idx, data)
if SaveManager.Options[idx] then
SaveManager.Options[idx]:SetValue(data.value)
end
end,
},
Slider = {
Save = function(idx, object)
return { type = "Slider", idx = idx, value = tostring(object.Value) }
end,
Load = function(idx, data)
if SaveManager.Options[idx] then
SaveManager.Options[idx]:SetValue(data.value)
end
end,
},
Dropdown = {
Save = function(idx, object)
return { type = "Dropdown", idx = idx, value = object.Value, mutli = object.Multi }
end,
Load = function(idx, data)
if SaveManager.Options[idx] then
SaveManager.Options[idx]:SetValue(data.value)
end
end,
},
Colorpicker = {
Save = function(idx, object)
return { type = "Colorpicker", idx = idx, value = object.Value:ToHex(), transparency = object.Transparency }
end,
Load = function(idx, data)
if SaveManager.Options[idx] then
SaveManager.Options[idx]:SetValueRGB(Color3.fromHex(data.value), data.transparency)
end
end,
},
Keybind = {
Save = function(idx, object)
return { type = "Keybind", idx = idx, mode = object.Mode, key = object.Value }
end,
Load = function(idx, data)
if SaveManager.Options[idx] then
SaveManager.Options[idx]:SetValue(data.key, data.mode)
end
end,
},
Input = {
Save = function(idx, object)
return { type = "Input", idx = idx, text = object.Value }
end,
Load = function(idx, data)
if SaveManager.Options[idx] and type(data.text) == "string" then
SaveManager.Options[idx]:SetValue(data.text)
end
end,
},
}
function SaveManager:SetIgnoreIndexes(list)
for _, key in next, list do
self.Ignore[key] = true
end
end
function SaveManager:SetFolder(folder)
self.Folder = folder;
self:BuildFolderTree()
end
function SaveManager:Save(name)
if (not name) then
return false, "no config file is selected"
end
local fullPath = self.Folder .. "/" .. name .. ".json"
local data = {
objects = {}
}
for idx, option in next, SaveManager.Options do
if self.Parser[option.Type] and not self.Ignore[idx] then
table.insert(data.objects, self.Parser[option.Type].Save(idx, option))
end
end
local success, encoded = pcall(httpService.JSONEncode, httpService, data)
if not success then
return false, "failed to encode data"
end
writefile(fullPath, encoded)
return true
end
if not RunService:IsStudio() then
function SaveManager:Load(name)
if (not name) then
return false, "no config file is selected"
end
local file = self.Folder .. "/" .. name .. ".json"
if not isfile(file) then return false, "Create Config Save File" end
local success, decoded = pcall(httpService.JSONDecode, httpService, readfile(file))
if not success then return false, "decode error" end
for _, option in next, decoded.objects do
if self.Parser[option.type] and not self.Ignore[option.idx] then
task.spawn(function() self.Parser[option.type].Load(option.idx, option) end)
end
end
Fluent.SettingLoaded = true
return true, decoded
end
end
SaveManager.IgnoreThemeSettings = function(self)
self:SetIgnoreIndexes({
"InterfaceTheme", "AcrylicToggle", "TransparentToggle", "MenuKeybind"
})
end
function SaveManager:BuildFolderTree()
local paths = {
self.Folder,
self.Folder .. "/"
}
for i = 1, #paths do
local str = paths[i]
if not isfolder(str) then
makefolder(str)
end
end
end
function SaveManager:RefreshConfigList()
local list = listfiles(self.Folder .. "/")
local out = {}
for i = 1, #list do
local file = list[i]
if file:sub(-5) == ".json" then
local pos = file:find(".json", 1, true)
local start = pos
local char = file:sub(pos, pos)
while char ~= "/" and char ~= "\\" and char ~= "" do
pos = pos - 1
char = file:sub(pos, pos)
end
if char == "/" or char == "\\" then
local name = file:sub(pos + 1, start - 1)
if name ~= "options" then
table.insert(out, name)
end
end
end
end
return out
end
function SaveManager:SetLibrary(library)
self.Library = library
self.Options = library.Options
end
if not RunService:IsStudio() then
function SaveManager:LoadAutoloadConfig()
if isfile(self.Folder .. "/autoload.txt") then
local name = readfile(self.Folder .. "/autoload.txt")
local success, err = self:Load(name)
if not success then
return self.Library:Notify({
Title = "Interface",
Content = "Config loader",
SubContent = "Failed to load autoload config: " .. err,
Duration = 7
})
end
self.Library:Notify({
Title = "Interface",
Content = "Config loader",
SubContent = string.format("Auto loaded config %q", name),
Duration = 7
})
end
end
end
function SaveManager:BuildConfigSection(tab)
assert(self.Library, "Must set SaveManager.Library")
local section = tab:AddSection("Configuration", "settings")
section:AddInput("SaveManager_ConfigName", { Title = "Config name" })
section:AddDropdown("SaveManager_ConfigList", { Title = "Config list", Values = self:RefreshConfigList(), AllowNull = true })
section:AddButton({
Title = "Create config",
Callback = function()
local name = SaveManager.Options.SaveManager_ConfigName.Value
if name:gsub(" ", "") == "" then
return self.Library:Notify({
Title = "Interface",
Content = "Config loader",
SubContent = "Invalid config name (empty)",
Duration = 7
})
end
local success, err = self:Save(name)
if not success then
return self.Library:Notify({
Title = "Interface",
Content = "Config loader",
SubContent = "Failed to save config: " .. err,
Duration = 7
})
end
self.Library:Notify({
Title = "Interface",
Content = "Config loader",
SubContent = string.format("Created config %q", name),
Duration = 7
})
SaveManager.Options.SaveManager_ConfigList:SetValues(self:RefreshConfigList())
SaveManager.Options.SaveManager_ConfigList:SetValue(nil)
end
})
section:AddButton({Title = "Load config", Callback = function()
local name = SaveManager.Options.SaveManager_ConfigList.Value
local success, err = self:Load(name)
if not success then
return self.Library:Notify({
Title = "Interface",
Content = "Config loader",
SubContent = "Failed to load config: " .. err,
Duration = 7
})
end
self.Library:Notify({
Title = "Interface",
Content = "Config loader",
SubContent = string.format("Loaded config %q", name),
Duration = 7
})
end})
section:AddButton({Title = "Save config", Callback = function()
local name = SaveManager.Options.SaveManager_ConfigList.Value
local success, err = self:Save(name)
if not success then
return self.Library:Notify({
Title = "Interface",
Content = "Config loader",
SubContent = "Failed to overwrite config: " .. err,
Duration = 7
})
end
self.Library:Notify({
Title = "Interface",
Content = "Config loader",
SubContent = string.format("Overwrote config %q", name),
Duration = 7
})
end})
section:AddButton({Title = "Refresh list", Callback = function()
SaveManager.Options.SaveManager_ConfigList:SetValues(self:RefreshConfigList())
SaveManager.Options.SaveManager_ConfigList:SetValue(nil)
end})
local AutoloadButton
AutoloadButton = section:AddButton({Title = "Set as autoload", Description = "Current autoload config: none", Callback = function()
local name = SaveManager.Options.SaveManager_ConfigList.Value
writefile(self.Folder .. "/autoload.txt", name)
AutoloadButton:SetDesc("Current autoload config: " .. name)
self.Library:Notify({
Title = "Interface",
Content = "Config loader",
SubContent = string.format("Set %q to auto load", name),
Duration = 7
})
end})
if isfile(self.Folder .. "/autoload.txt") then
local name = readfile(self.Folder .. "/autoload.txt")
AutoloadButton:SetDesc("Current autoload config: " .. name)
end
SaveManager:SetIgnoreIndexes({ "SaveManager_ConfigList", "SaveManager_ConfigName" })
end
if not RunService:IsStudio() then
SaveManager:BuildFolderTree()
end
end
local InterfaceManager = {} do
InterfaceManager.Folder = "FluentSettings"
InterfaceManager.Settings = {
Acrylic = true,
Transparency = true,
MenuKeybind = "M"
}
function InterfaceManager:SetTheme(name)
InterfaceManager.Settings.Theme = name
end
function InterfaceManager:SetFolder(folder)
self.Folder = folder;
self:BuildFolderTree()
end
function InterfaceManager:SetLibrary(library)
self.Library = library
end
function InterfaceManager:BuildFolderTree()
local paths = {}
local parts = self.Folder:split("/")
for idx = 1, #parts do
paths[#paths + 1] = table.concat(parts, "/", 1, idx)
end
table.insert(paths, self.Folder)
table.insert(paths, self.Folder .. "/")
for i = 1, #paths do
local str = paths[i]
if not isfolder(str) then
makefolder(str)
end
end
end
function InterfaceManager:SaveSettings()
writefile(self.Folder .. "/options.json", httpService:JSONEncode(InterfaceManager.Settings))
end
function InterfaceManager:LoadSettings()
local path = self.Folder .. "/options.json"
if isfile(path) then
local data = readfile(path)
if not RunService:IsStudio() then local success, decoded = pcall(httpService.JSONDecode, httpService, data) end
if success then
for i, v in next, decoded do
InterfaceManager.Settings[i] = v
end
end
end
end
function InterfaceManager:BuildInterfaceSection(tab)
assert(self.Library, "Must set InterfaceManager.Library")
local Library = self.Library
local Settings = InterfaceManager.Settings
InterfaceManager:LoadSettings()
local section = tab:AddSection("Interface", "monitor")
local InterfaceTheme = section:AddDropdown("InterfaceTheme", {
Title = "Theme",
Description = "Changes the interface theme.",
Values = Library.Themes,
Default = self.Library.Theme,
Callback = function(Value)
Library:SetTheme(Value)
Settings.Theme = Value
InterfaceManager:SaveSettings()
end
})
InterfaceTheme:SetValue(Settings.Theme)
if Library.UseAcrylic and not Mobile then
section:AddToggle("AcrylicToggle", {
Title = "Acrylic",
Description = "The blurred background requires graphic quality 8+",
Default = Settings.Acrylic,
Callback = function(Value)
Library:ToggleAcrylic(Value)
Settings.Acrylic = Value
InterfaceManager:SaveSettings()
end
})
elseif Mobile then
Settings.Acrylic = false
end
section:AddSlider("WindowTransparency", {
Title = "Window Transparency",
Description = "Adjusts the window transparency.",
Default = 1,
Min = 0,
Max = 3,
Rounding = 1,
Callback = function(Value)
Library:SetWindowTransparency(Value)
end
})
local MenuKeybind = section:AddKeybind("MenuKeybind", { Title = "Minimize Bind", Default = Library.MinimizeKey.Name or Settings.MenuKeybind })
MenuKeybind:OnChanged(function()
Settings.MenuKeybind = MenuKeybind.Value
InterfaceManager:SaveSettings()
end)
Library.MinimizeKeybind = MenuKeybind
end
end
Library.CreateWindow = function(self, Config)
assert(Config.Title, "Window - Missing Title")
if Library.Window then
print("You cannot create more than one window.")
return
end
Library.MinimizeKey = Config.MinimizeKey or Enum.KeyCode.LeftControl
Library.UseAcrylic = Config.Acrylic or false
Library.Acrylic = Config.Acrylic or false
Library.Theme = Config.Theme or "Dark"
if Config.BackgroundImage == nil then
Config.BackgroundImage = "rbxassetid://13196113628"
end
if Config.BackgroundTransparency == nil then
Config.BackgroundTransparency = 0.5
end
if Config.Acrylic then
Acrylic.init()
end
local Icon = Config.Icon
if not fischbypass then
if Library:GetIcon(Icon) then
Icon = Library:GetIcon(Icon)
end
if Icon == "" or Icon == nil then
Icon = nil
end
end
local Window = Components.Window({
Parent = GUI,
Size = Config.Size,
Title = Config.Title,
Icon = Icon,
Image = Config.Image,
BackgroundImage = Config.BackgroundImage,
BackgroundTransparency = Config.BackgroundTransparency,
BackgroundImageTransparency = Config.BackgroundImageTransparency,
SubTitle = Config.SubTitle,
TabWidth = Config.TabWidth,
DropdownsOutsideWindow = Config.DropdownsOutsideWindow,
Search = Config.Search,
UserInfoTitle = Config.UserInfoTitle,
UserInfo = Config.UserInfo,
UserInfoTop = Config.UserInfoTop,
UserInfoSubtitle = Config.UserInfoSubtitle,
UserInfoSubtitleColor = Config.UserInfoSubtitleColor,
})
Library.Window = Window
table.insert(Library.Windows, Window)
InterfaceManager:SetTheme(Config.Theme)
Library:SetTheme(Config.Theme)
return Window
end
function Library:CreateMinimizer(Config)
Config = Config or {}
if self.Minimizer and self.Minimizer.Parent then
return self.Minimizer
end
local parentGui = Library.GUI or GUI
if parentGui then parentGui.DisplayOrder = 1000 end
local isMobile = Mobile and true or false
local iconAsset = "rbxassetid://10734897102"
if type(Config.Icon) == "string" and Config.Icon ~= "" then
pcall(function()
local resolved = Library:GetIcon(Config.Icon)
if resolved then
iconAsset = resolved
elseif string.match(Config.Icon, "^rbxassetid://%d+$") then
iconAsset = Config.Icon
end
end)
end
local useAcrylic = (Config.Acrylic == true)
local cornerRadius = tonumber(Config.Corner)
local backgroundTransparency = (typeof(Config.Transparency) == "number") and math.clamp(Config.Transparency, 0, 1) or 0
local draggableWhole = (Config.Draggable == true)
local holder
local function createButton(isDesktop)
return New("TextButton", {
Name = "MinimizeButton",
Size = UDim2.new(1, 0, 1, 0),
BorderSizePixel = 0,
BackgroundTransparency = backgroundTransparency or 0,
AutoButtonColor = true,
ThemeTag = {
BackgroundColor3 = "Element",
},
}, {
New("UICorner", { CornerRadius = UDim.new(0, cornerRadius or (isDesktop and 14 or 12)) }),
New("UIStroke", {
ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
Transparency = isDesktop and 0.6 or 0.7,
Thickness = isDesktop and 2 or 1.5,
ThemeTag = {
Color = "ElementBorder",
},
}),
New("ImageLabel", {
Name = "Icon",
Image = iconAsset,
Size = UDim2.new(0.8, 0, 0.8, 0),
Position = UDim2.new(0.5, 0, 0.5, 0),
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1,
ThemeTag = {
ImageColor3 = "Text",
},
}, {
New("UIAspectRatioConstraint", { AspectRatio = 1, AspectType = Enum.AspectType.FitWithinMaxSize }),
New("UICorner", { CornerRadius = UDim.new(0, 0) })
}),
})
end
if isMobile then
holder = New("Frame", {
Name = "FluentMinimizer",
Parent = parentGui,
Size = Config.Size or UDim2.fromOffset(36, 36),
Position = Config.Position or UDim2.new(0.45, 0, 0.025, 0),
BackgroundTransparency = 1,
ZIndex = 999999999,
Visible = (Config.Visible ~= false),
})
else
holder = New("Frame", {
Name = "FluentMinimizer",
Parent = parentGui,
Size = Config.Size or UDim2.fromOffset(36, 36),
Position = Config.Position or UDim2.new(0, 300, 0, 20),
BackgroundTransparency = 1,
ZIndex = 999999999,
Visible = (Config.Visible ~= false),
})
end
if useAcrylic then
local miniAcrylic = Acrylic.AcrylicPaint()
miniAcrylic.Frame.Parent = holder
miniAcrylic.Frame.Size = UDim2.fromScale(1, 1)
pcall(function() miniAcrylic.AddParent(holder) end)
local desiredCorner = UDim.new(0, cornerRadius or 0)
pcall(function()
for _, descendant in ipairs(miniAcrylic.Frame:GetDescendants()) do
if descendant.ClassName == "UICorner" then
descendant.CornerRadius = desiredCorner
elseif descendant.ClassName == "ImageLabel" then
descendant.Size = UDim2.fromScale(1, 1)
descendant.Position = UDim2.new(0.5, 0, 0.5, 0)
descendant.AnchorPoint = Vector2.new(0.5, 0.5)
end
end
end)
self.MinimizerAcrylic = miniAcrylic
end
local btnInstance = createButton(not isMobile)
btnInstance.Parent = holder
btnInstance.ZIndex = (holder.ZIndex or 0) + 1
local button = holder:FindFirstChildOfClass("TextButton")
if button then
local isDragging = false
local dragStart, dragOffset
if draggableWhole then
Creator.AddSignal(button.InputBegan, function(Input)
if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then
isDragging = true
local pos = Input.Position
dragStart = Vector2.new(pos.X, pos.Y)
dragOffset = holder.Position
local conn
conn = Input.Changed:Connect(function()
if Input.UserInputState == Enum.UserInputState.End then
isDragging = false
dragStart = nil
dragOffset = nil
conn:Disconnect()
end
end)
end
end)
Creator.AddSignal(RunService.Heartbeat, function()
if isDragging and dragStart and dragOffset and holder and holder.Parent then
local mouse = LocalPlayer:GetMouse()
local current = Vector2.new(mouse.X, mouse.Y)
local delta = current - dragStart
local newX = dragOffset.X.Offset + delta.X
local newY = dragOffset.Y.Offset + delta.Y
local viewport = workspace.Camera.ViewportSize
local size = holder.AbsoluteSize
if newX < 0 then newX = 0 end
if newY < 0 then newY = 0 end
if newX > viewport.X - size.X then newX = viewport.X - size.X end
if newY > viewport.Y - size.Y then newY = viewport.Y - size.Y end
holder.Position = UDim2.new(0, newX, 0, newY)
end
end)
end
AddSignal(button.MouseButton1Click, function()
task.wait(0.1)
if not isDragging and Library.Window then
Library.Window:Minimize()
end
end)
end
self.Minimizer = holder
return holder
end
function Library:SetTheme(Value)
if Library.Window and table.find(Library.Themes, Value) then
Library.Theme = Value
Creator.UpdateTheme()
if Value == "Glass" then
Library:SetWindowTransparency(0.9)
end
end
end
function Library:Destroy()
if Library.Window then
Library.Unloaded = true
if Library.UseAcrylic then
Library.Window.AcrylicPaint.Model:Destroy()
end
Creator.Disconnect()
Library.GUI:Destroy()
end
end
function Library:ToggleAcrylic(Value)
if Library.Window then
if Library.UseAcrylic then
Library.Acrylic = Value
if Library.Window.AcrylicPaint and Library.Window.AcrylicPaint.Model then
Library.Window.AcrylicPaint.Model.Transparency = Value and 0.95 or 1
end
end
end
end
function Library:ToggleTransparency(Value)
if Library.Window then
Library.Window.AcrylicPaint.Frame.Background.BackgroundTransparency = Value and 0.35 or 0
end
end
function Library:SetWindowTransparency(Value)
if Library.Window and Library.UseAcrylic then
Value = math.clamp(Value, 0, 3)
if Library.Theme == "Glass" then
local glassTransparency = 0.8 + (Value * 0.05)
if Value > 1 then
glassTransparency = 0.85 + ((Value - 1) * 0.04)
end
if Value > 2 then
glassTransparency = 0.93 + ((Value - 2) * 0.04)
end
Library.Window.AcrylicPaint.Model.Transparency = math.min(glassTransparency, 0.99)
local backgroundTransparency = 0.7 + (Value * 0.08)
if Value > 1 then
backgroundTransparency = 0.78 + ((Value - 1) * 0.07)
end
if Value > 2 then
backgroundTransparency = 0.85 + ((Value - 2) * 0.1)
end
Library.Window.AcrylicPaint.Frame.Background.BackgroundTransparency = math.min(backgroundTransparency, 0.99)
Library.NotificationTransparency = Value
for _, notification in pairs(Library.ActiveNotifications or {}) do
if notification and notification.ApplyTransparency then
notification:ApplyTransparency()
end
end
else
Library.Window.AcrylicPaint.Model.Transparency = 0.98
Library.Window.AcrylicPaint.Frame.Background.BackgroundTransparency = Value * 0.3
end
end
end
function Library:Notify(Config)
return NotificationModule:New(Config)
end
if getgenv then
getgenv().Fluent = Library
else
Fluent = Library
end
local MinimizeButton = New("TextButton", {
BackgroundColor3 = Color3.fromRGB(25, 25, 30),
Size = UDim2.new(1, 0, 1, 0),
BorderSizePixel = 0,
BackgroundTransparency = 0.05,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 14),
}),
New("UIGradient", {
Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, Color3.fromRGB(40, 40, 50)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(20, 20, 25))
},
Rotation = 45,
}),
New("UIStroke", {
ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
Color = Color3.fromRGB(100, 150, 255),
Transparency = 0.6,
Thickness = 2,
}),
New("Frame", {
BackgroundColor3 = Color3.fromRGB(100, 150, 255),
BackgroundTransparency = 0.9,
Size = UDim2.new(1, -6, 1, -6),
Position = UDim2.new(0, 3, 0, 3),
BorderSizePixel = 0,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 11),
}),
}),
New("Frame", {
BackgroundColor3 = Color3.fromRGB(255, 255, 255),
BackgroundTransparency = 0.94,
Size = UDim2.new(0.7, 0, 0.3, 0),
Position = UDim2.new(0.15, 0, 0.1, 0),
BorderSizePixel = 0,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 8),
}),
}),
New("ImageLabel", {
Image = "rbxassetid://10734897102",
Size = UDim2.new(0.8, 0, 0.8, 0),
Position = UDim2.new(0.5, 0, 0.5, 0),
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1,
ImageColor3 = Color3.fromRGB(255, 255, 255),
ImageTransparency = 0.1,
}, {
New("UIAspectRatioConstraint", {
AspectRatio = 1,
AspectType = Enum.AspectType.FitWithinMaxSize,
})
})
})
local MobileMinimizeButton = New("TextButton", {
BackgroundColor3 = Color3.fromRGB(25, 25, 30),
Size = UDim2.new(1, 0, 1, 0),
BorderSizePixel = 0,
BackgroundTransparency = 0.05,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 12),
}),
New("UIGradient", {
Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, Color3.fromRGB(40, 40, 50)),
ColorSequenceKeypoint.new(1, Color3.fromRGB(20, 20, 25))
},
Rotation = 45,
}),
New("UIStroke", {
ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
Color = Color3.fromRGB(100, 150, 255),
Transparency = 0.7,
Thickness = 1.5,
}),
New("Frame", {
BackgroundColor3 = Color3.fromRGB(100, 150, 255),
BackgroundTransparency = 0.92,
Size = UDim2.new(1, -4, 1, -4),
Position = UDim2.new(0, 2, 0, 2),
BorderSizePixel = 0,
}, {
New("UICorner", {
CornerRadius = UDim.new(0, 10),
}),
}),
New("ImageLabel", {
Image = "rbxassetid://10734897102",
Size = UDim2.new(0.8, 0, 0.8, 0),
Position = UDim2.new(0.5, 0, 0.5, 0),
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1,
ImageColor3 = Color3.fromRGB(255, 255, 255),
ImageTransparency = 0.1,
}, {
New("UIAspectRatioConstraint", {
AspectRatio = 1,
AspectType = Enum.AspectType.FitWithinMaxSize,
})
})
})
local Minimizer
local isDragging = false
local dragStart = nil
local dragOffset = nil
Creator.AddSignal(MinimizeButton.InputBegan, function(Input)
if Input.UserInputType == Enum.UserInputType.MouseButton1 then
isDragging = true
dragStart = Vector2.new(Input.Position.X, Input.Position.Y)
dragOffset = (Library.Minimizer or Minimizer).Position
local connection
connection = Input.Changed:Connect(function()
if Input.UserInputState == Enum.UserInputState.End then
isDragging = false
dragStart = nil
dragOffset = nil
connection:Disconnect()
end
end)
end
end)
Creator.AddSignal(MobileMinimizeButton.InputBegan, function(Input)
if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then
isDragging = true
dragStart = Vector2.new(Input.Position.X, Input.Position.Y)
dragOffset = (Library.Minimizer or Minimizer).Position
local connection
connection = Input.Changed:Connect(function()
if Input.UserInputState == Enum.UserInputState.End then
isDragging = false
dragStart = nil
dragOffset = nil
connection:Disconnect()
end
end)
end
end)
local debugCount = 0
Creator.AddSignal(RunService.Heartbeat, function()
local activeMin = Library.Minimizer or Minimizer
if isDragging and dragStart and dragOffset and activeMin and activeMin.Parent then
debugCount = debugCount + 1
if debugCount % 30 == 1 then
end
local Mouse = game:GetService("Players").LocalPlayer:GetMouse()
local currentMousePos = Vector2.new(Mouse.X, Mouse.Y)
local delta = currentMousePos - dragStart
local newX = dragOffset.X.Offset + delta.X
local newY = dragOffset.Y.Offset + delta.Y
local viewportSize = workspace.Camera.ViewportSize
local minimizerSize = activeMin.AbsoluteSize
if newX < 0 then newX = 0 end
if newY < 0 then newY = 0 end
if newX > viewportSize.X - minimizerSize.X then
newX = viewportSize.X - minimizerSize.X
end
if newY > viewportSize.Y - minimizerSize.Y then
newY = viewportSize.Y - minimizerSize.Y
end
activeMin.Position = UDim2.new(0, newX, 0, newY)
end
end)
AddSignal(MinimizeButton.MouseButton1Click, function()
task.wait(0.1)
if not isDragging then
Library.Window:Minimize()
end
end)
AddSignal(MobileMinimizeButton.MouseButton1Click, function()
task.wait(0.1)
if not isDragging then
Library.Window:Minimize()
end
end)
if RunService:IsStudio() then task.wait(0.01) end
return Library, SaveManager, InterfaceManager, Mobile