diff --git a/Library/JustHub (1).lua b/Library/JustHub (1).lua new file mode 100644 index 0000000..d44c81f --- /dev/null +++ b/Library/JustHub (1).lua @@ -0,0 +1,708 @@ +local TweenService = game:GetService("TweenService") +local UserInputService = game:GetService("UserInputService") +local RunService = game:GetService("RunService") +local HttpService = game:GetService("HttpService") +local Players = game:GetService("Players") +local StarterGui = game:GetService("StarterGui") + +local JustHub = {} +JustHub.Themes = { + Darker = { + ["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(25,25,25)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(32,32,32)), ColorSequenceKeypoint.new(1, Color3.fromRGB(25,25,25))}), + ["Color Hub 2"] = Color3.fromRGB(30,30,30), + ["Color Stroke"] = Color3.fromRGB(40,40,40), + ["Color Theme"] = Color3.fromRGB(88,101,242), + ["Color Text"] = Color3.fromRGB(243,243,243), + ["Color Dark Text"] = Color3.fromRGB(180,180,180) + }, + Dark = { + ["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(40,40,40)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(47,47,47)), ColorSequenceKeypoint.new(1, Color3.fromRGB(40,40,40))}), + ["Color Hub 2"] = Color3.fromRGB(45,45,45), + ["Color Stroke"] = Color3.fromRGB(65,65,65), + ["Color Theme"] = Color3.fromRGB(65,150,255), + ["Color Text"] = Color3.fromRGB(245,245,245), + ["Color Dark Text"] = Color3.fromRGB(190,190,190) + }, + Purple = { + ["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(28,25,30)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(32,32,32)), ColorSequenceKeypoint.new(1, Color3.fromRGB(28,25,30))}), + ["Color Hub 2"] = Color3.fromRGB(30,30,30), + ["Color Stroke"] = Color3.fromRGB(40,40,40), + ["Color Theme"] = Color3.fromRGB(150,0,255), + ["Color Text"] = Color3.fromRGB(240,240,240), + ["Color Dark Text"] = Color3.fromRGB(180,180,180) + }, + Light = { + ["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(230,230,230)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(245,245,245)), ColorSequenceKeypoint.new(1, Color3.fromRGB(230,230,230))}), + ["Color Hub 2"] = Color3.fromRGB(240,240,240), + ["Color Stroke"] = Color3.fromRGB(200,200,200), + ["Color Theme"] = Color3.fromRGB(0,120,255), + ["Color Text"] = Color3.fromRGB(30,30,30), + ["Color Dark Text"] = Color3.fromRGB(80,80,80) + }, + Neon = { + ["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(10,10,10)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0,200,200)), ColorSequenceKeypoint.new(1, Color3.fromRGB(10,10,10))}), + ["Color Hub 2"] = Color3.fromRGB(15,15,15), + ["Color Stroke"] = Color3.fromRGB(0,255,255), + ["Color Theme"] = Color3.fromRGB(0,255,0), + ["Color Text"] = Color3.fromRGB(255,255,255), + ["Color Dark Text"] = Color3.fromRGB(200,200,200) + }, + Forest = { + ["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(0,50,0)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0,80,0)), ColorSequenceKeypoint.new(1, Color3.fromRGB(0,50,0))}), + ["Color Hub 2"] = Color3.fromRGB(0,60,0), + ["Color Stroke"] = Color3.fromRGB(0,80,0), + ["Color Theme"] = Color3.fromRGB(0,120,0), + ["Color Text"] = Color3.fromRGB(220,220,220), + ["Color Dark Text"] = Color3.fromRGB(160,160,160) + }, + Aqua = { + ["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(0,100,100)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0,150,150)), ColorSequenceKeypoint.new(1, Color3.fromRGB(0,100,100))}), + ["Color Hub 2"] = Color3.fromRGB(0,110,110), + ["Color Stroke"] = Color3.fromRGB(0,180,180), + ["Color Theme"] = Color3.fromRGB(0,220,220), + ["Color Text"] = Color3.fromRGB(255,255,255), + ["Color Dark Text"] = Color3.fromRGB(200,200,200) + } +} +JustHub.Info = {Version="1.1.0"} +JustHub.Save = {UISize={550,380},TabSize=100,Theme="Darker"} +JustHub.ConfigData = {} +JustHub.ControlRegistry = {} + +local function createInstance(c,p,par) + local i=Instance.new(c) + if p then + for k,v in pairs(p) do + i[k]=v + end + end + if par then + i.Parent=par + end + return i +end + +local function tweenProperty(o,t,d) + local ti=TweenInfo.new(d,Enum.EasingStyle.Quad,Enum.EasingDirection.Out) + local tw=TweenService:Create(o,ti,t) + tw:Play() + return tw +end + +local function getCurrentTheme(c) + if type(c)=="table" then + return c + else + return JustHub.Themes[c or JustHub.Save.Theme] + end +end + +local function clampPosition(pos,sz) + local x=math.clamp(pos.X.Offset,0,sz.X) + local y=math.clamp(pos.Y.Offset,0,sz.Y) + return UDim2.new(pos.X.Scale,x,pos.Y.Scale,y) +end + +local function addBorder(o,col,th) + return createInstance("UIStroke",{Color=col,Thickness=th},o) +end + +function JustHub:RegisterControl(k,u) + JustHub.ControlRegistry[k]=u +end + +function JustHub:ApplyConfig(cf) + for k,v in pairs(cf) do + if JustHub.ControlRegistry[k] then + JustHub.ControlRegistry[k](v) + end + end +end + +local function parseKey(str) + for _,kc in pairs(Enum.KeyCode:GetEnumItems()) do + if kc.Name:lower()==str:lower() then + return kc + end + end + return nil +end + +local SectionMethods={} + +function SectionMethods:addMenu(n) + n=n or "Menu" + local f=createInstance("Frame",{Name=n,Size=UDim2.new(1,0,0,40),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],BackgroundTransparency=0.3},self.Content) + createInstance("UICorner",{CornerRadius=UDim.new(0,6)},f) + createInstance("TextLabel",{Name="MenuLabel",Text=n,Size=UDim2.new(1,0,1,0),BackgroundTransparency=1,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.GothamBold,TextSize=16},f) + return f +end + +function SectionMethods:addToggle(o) + o=o or {} + local t=o.Name or "Toggle" + local d=o.Default or false + local cb=o.Callback or function(x)end + local f=createInstance("Frame",{Name=t.."Toggle",Size=UDim2.new(1,0,0,20),BackgroundColor3=Color3.fromRGB(40,40,40)},self.Content) + createInstance("UICorner",{CornerRadius=UDim.new(0,20)},f) + addBorder(f,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1) + local l=createInstance("TextLabel",{Size=UDim2.new(0.7,0,1,0),Position=UDim2.new(0,0,0,0),BackgroundTransparency=1,Text=t,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.Gotham,TextSize=12,TextXAlignment=Enum.TextXAlignment.Left},f) + local sep=createInstance("Frame",{Size=UDim2.new(0,2,1,0),Position=UDim2.new(0.7,0,0,0),BackgroundColor3=Color3.fromRGB(255,255,255)},f) + createInstance("UICorner",{CornerRadius=UDim.new(0,1)},sep) + local tc=createInstance("Frame",{Size=UDim2.new(0.3,0,1,0),Position=UDim2.new(0.7,0,0,0),BackgroundTransparency=1},f) + local sw=createInstance("Frame",{Size=UDim2.new(0,35,0,15),Position=UDim2.new(1,-35,0.5,-7.5),BackgroundColor3=d and Color3.fromRGB(0,200,0) or Color3.fromRGB(100,100,100),BorderSizePixel=0},tc) + sw.Active=true + sw.Selectable=true + createInstance("UICorner",{CornerRadius=UDim.new(0,15)},sw) + local c=createInstance("Frame",{Size=UDim2.new(0,13,0,13),Position=d and UDim2.new(0,20,0.5,-6.5) or UDim2.new(0,2,0.5,-6.5),BackgroundColor3=Color3.new(1,1,1),BorderSizePixel=0},sw) + createInstance("UICorner",{CornerRadius=UDim.new(1,0)},c) + local s=d + if d then cb(true) else cb(false) end + JustHub.ConfigData[t]=s + JustHub:RegisterControl(t,function(v) + s=v + if s then + c.Position=UDim2.new(0,20,0.5,-6.5) + sw.BackgroundColor3=Color3.fromRGB(0,200,0) + l.TextColor3=Color3.fromRGB(0,255,0) + else + c.Position=UDim2.new(0,2,0.5,-6.5) + sw.BackgroundColor3=Color3.fromRGB(100,100,100) + l.TextColor3=Color3.fromRGB(255,255,255) + end + end) + sw.InputBegan:Connect(function(i) + if i.UserInputType==Enum.UserInputType.MouseButton1 or i.UserInputType==Enum.UserInputType.Touch then + if not s then + tweenProperty(c,{Position=UDim2.new(0,20,0.5,-6.5)},0.3) + tweenProperty(sw,{BackgroundColor3=Color3.fromRGB(0,200,0)},0.3) + tweenProperty(l,{TextColor3=Color3.fromRGB(0,255,0)},0.3) + else + tweenProperty(c,{Position=UDim2.new(0,2,0.5,-6.5)},0.3) + tweenProperty(sw,{BackgroundColor3=Color3.fromRGB(100,100,100)},0.3) + tweenProperty(l,{TextColor3=Color3.fromRGB(255,255,255)},0.3) + end + s=not s + JustHub.ConfigData[t]=s + cb(s) + end + end) + return f +end + +function SectionMethods:addSlider(o) + o=o or {} + local n=o.Name or "Slider" + local mi=o.Min or 0 + local ma=o.Max or 100 + local df=o.Default or mi + if JustHub.ConfigData[n]~=nil then + df=JustHub.ConfigData[n] + else + JustHub.ConfigData[n]=df + end + local cb=o.Callback or function(x)end + local f=createInstance("Frame",{Name=n.."Slider",Size=UDim2.new(1,0,0,25),BackgroundTransparency=1},self.Content) + addBorder(f,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1) + local l=createInstance("TextLabel",{Name="Label",Text=n,Size=UDim2.new(0.7,0,1,0),Position=UDim2.new(0,0,0,0),BackgroundTransparency=1,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.Gotham,TextSize=10},f) + local sep=createInstance("Frame",{Size=UDim2.new(0,2,1,0),Position=UDim2.new(0.7,0,0,0),BackgroundColor3=Color3.fromRGB(255,255,255)},f) + createInstance("UICorner",{CornerRadius=UDim.new(0,1)},sep) + local sc=createInstance("Frame",{Name="SliderContainer",Size=UDim2.new(0.3,0,1,0),Position=UDim2.new(0.7,0,0,0),BackgroundTransparency=1},f) + local sb=createInstance("Frame",{Name="SliderBar",Size=UDim2.new(1,-20,0,4),Position=UDim2.new(0,10,0.5,-2),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Stroke"]},sc) + createInstance("UICorner",{CornerRadius=UDim.new(0,4)},sb) + local sh=createInstance("Frame",{Name="SliderHandle",Size=UDim2.new(0,12,0,12),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Theme"],Position=UDim2.new((df-mi)/(ma-mi),-6,0.5,-6)},sb) + createInstance("UICorner",{CornerRadius=UDim.new(0,4)},sh) + local drag=false + sh.InputBegan:Connect(function(i) + if i.UserInputType==Enum.UserInputType.MouseButton1 or i.UserInputType==Enum.UserInputType.Touch then drag=true end + end) + sh.InputEnded:Connect(function(i) + if i.UserInputType==Enum.UserInputType.MouseButton1 or i.UserInputType==Enum.UserInputType.Touch then drag=false end + end) + UserInputService.InputChanged:Connect(function(i) + if drag and (i.UserInputType==Enum.UserInputType.MouseMovement or i.UserInputType==Enum.UserInputType.Touch) then + local bp=sb.AbsolutePosition.X + local bw=sb.AbsoluteSize.X + local rp=math.clamp((i.Position.X-bp)/bw,0,1) + sh.Position=UDim2.new(rp,-6,sh.Position.Y.Scale,sh.Position.Y.Offset) + local val=mi+rp*(ma-mi) + JustHub.ConfigData[n]=val + cb(val) + end + end) + JustHub:RegisterControl(n,function(sv) + local nr=(sv-mi)/(ma-mi) + sh.Position=UDim2.new(nr,-6,0.5,-6) + end) + return f +end + +function SectionMethods:addTextBox(o) + o=o or {} + local n=o.Name or "TextBox" + local d=o.Default or "" + local cb=o.Callback or function(x)end + local f=createInstance("Frame",{Name=n.."TextBox",Size=UDim2.new(1,0,0,20),BackgroundTransparency=1},self.Content) + addBorder(f,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1) + local l=createInstance("TextLabel",{Name="Label",Text=n,Size=UDim2.new(0.7,0,1,0),Position=UDim2.new(0,0,0,0),BackgroundTransparency=1,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.Gotham,TextSize=10},f) + local tb=createInstance("TextBox",{Name="Input",Text=d,Size=UDim2.new(0.3,0,1,0),Position=UDim2.new(0.7,0,0,0),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.Gotham,TextSize=10},f) + tb.FocusLost:Connect(function(e) + JustHub.ConfigData[n]=tb.Text + cb(tb.Text) + end) + JustHub:RegisterControl(n,function(sv) + tb.Text=sv + end) + return f +end + +function SectionMethods:addDropdown(o) + o=o or {} + local t=o.Name or "Dropdown" + local df=o.Default or "" + local it=o.Items or {} + local cb=o.Callback or function(x)end + local ch=20 + local oh=ch+(#it*20+((#it-1)*2)) + local f=createInstance("Frame",{Name=t.."Dropdown",BackgroundTransparency=1},self.Content) + f.Size=UDim2.new(1,0,0,ch) + addBorder(f,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1) + local l=createInstance("TextLabel",{Name="Label",Text=t,Size=UDim2.new(0.7,0,0,ch),Position=UDim2.new(0,0,0,0),BackgroundTransparency=1,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.Gotham,TextSize=10},f) + local b=createInstance("TextButton",{Name="DropdownButton",Text=(df~="" and (df.." ▼") or "Select ▼"),Size=UDim2.new(0.3,0,0,ch),Position=UDim2.new(0.7,0,0,0),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],Font=Enum.Font.GothamBold,TextSize=10},f) + local lf=createInstance("Frame",{Name="DropdownList",BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Hub 2"],Visible=false,Position=UDim2.new(0,0,0,ch)},f) + lf.Size=UDim2.new(1,0,0,#it*20+((#it-1)*2)) + createInstance("UIListLayout",{Padding=UDim.new(0,2),SortOrder=Enum.SortOrder.LayoutOrder,HorizontalAlignment=Enum.HorizontalAlignment.Left},lf) + local dt=false + b.MouseButton1Click:Connect(function() + if dt then + tweenProperty(f,{Size=UDim2.new(1,0,0,ch)},0.2) + tweenProperty(b,{TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"]},0.2) + tweenProperty(lf,{Position=UDim2.new(0,0,0,ch-10)},0.2) + wait(0.2) + lf.Visible=false + else + lf.Position=UDim2.new(0,0,0,ch-10) + lf.Visible=true + tweenProperty(f,{Size=UDim2.new(1,0,0,oh)},0.2) + tweenProperty(b,{TextColor3=Color3.fromRGB(0,255,0)},0.2) + tweenProperty(lf,{Position=UDim2.new(0,0,0,ch)},0.2) + end + dt=not dt + end) + for _,op in ipairs(it) do + local btn=createInstance("TextButton",{Size=UDim2.new(1,0,0,20),Text=op,TextColor3=Color3.fromRGB(255,255,255),BackgroundTransparency=1,Font=Enum.Font.Gotham,TextSize=10},lf) + btn.MouseButton1Click:Connect(function() + l.Text=t.." - "..op + JustHub.ConfigData[t]=op + pcall(cb,op) + tweenProperty(f,{Size=UDim2.new(1,0,0,ch)},0.2) + dt=false + wait(0.2) + lf.Visible=false + end) + end + JustHub.ConfigData[t]=df + JustHub:RegisterControl(t,function(sv) + l.Text=t.." - "..sv + end) + local upd={} + function upd:Clear() + for i,v in pairs(lf:GetChildren()) do + if v:IsA("TextButton") then + v:Destroy() + dt=false + l.Text=t + tweenProperty(f,{Size=UDim2.new(1,0,0,ch)},0.2) + end + end + end + function upd:Refresh(nl) + nl=nl or {} + for i,v in pairs(nl) do + local btn=createInstance("TextButton",{Size=UDim2.new(1,0,0,25),Text=v,TextColor3=Color3.fromRGB(255,255,255),BackgroundTransparency=1,Font=Enum.Font.SourceSansSemibold,TextSize=12},lf) + btn.MouseButton1Click:Connect(function() + dt=false + l.Text=t.." - "..v + pcall(cb,v) + tweenProperty(f,{Size=UDim2.new(1,0,0,ch)},0.2) + end) + end + end + return upd +end + +function SectionMethods:addButton(o) + o=o or {} + local n=o.Name or "Button" + local bt=o.ButtonText or "Click" + local cb=o.Callback or function()end + local c=createInstance("Frame",{Name=n.."ButtonControl",Size=UDim2.new(1,0,0,30),BackgroundTransparency=1},self.Content) + addBorder(c,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1) + local l=createInstance("TextLabel",{Name="Label",Text=n,Size=UDim2.new(0.7,0,1,0),Position=UDim2.new(0,0,0,0),BackgroundTransparency=1,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.Gotham,TextSize=10,TextXAlignment=Enum.TextXAlignment.Left},c) + local b=createInstance("TextButton",{Name="ActionButton",Text=bt,Size=UDim2.new(0.3,0,0.8,0),Position=UDim2.new(0.7,0,0.1,0),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Theme"],TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.GothamBold,TextSize=10},c) + createInstance("UICorner",{CornerRadius=UDim.new(0,6)},b) + b.MouseButton1Click:Connect(function() + pcall(cb) + end) + return c +end + +function SectionMethods:addBind(o) + o=o or {} + local n=o.Name or "KeyBind" + local d=o.Default or "RightShift" + local cb=o.Callback or function()end + local c=createInstance("Frame",{Name=n.."BindControl",Size=UDim2.new(1,0,0,30),BackgroundTransparency=1},self.Content) + addBorder(c,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1) + local l=createInstance("TextLabel",{Name="Label",Text=n,Size=UDim2.new(0.7,0,1,0),Position=UDim2.new(0,0,0,0),BackgroundTransparency=1,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.Gotham,TextSize=10,TextXAlignment=Enum.TextXAlignment.Left},c) + local tb=createInstance("TextBox",{Name="BindInput",Text=d,Size=UDim2.new(0.3,0,1,0),Position=UDim2.new(0.7,0,0,0),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.Gotham,TextSize=10},c) + local currentKey + local conn + local function parseKey(str) + for _,k in pairs(Enum.KeyCode:GetEnumItems()) do + if k.Name:lower()==str:lower() then + return k + end + end + return nil + end + local function setKey(k) + local kc=parseKey(k) + if kc then + if conn then conn:Disconnect() end + currentKey=kc + conn=UserInputService.InputBegan:Connect(function(i,g) + if not g and i.KeyCode==currentKey then + pcall(cb) + end + end) + JustHub.ConfigData[n]=k + end + end + setKey(d) + tb.FocusLost:Connect(function(enterPressed) + setKey(tb.Text) + end) + JustHub:RegisterControl(n,function(sv) + tb.Text=sv + setKey(sv) + end) + return c +end + +function JustHub:addSection(sn,sh) + sn=sn or "Section" + sh=sh or 100 + local sf=createInstance("Frame",{Name=sn,Size=UDim2.new(1,0,0,sh),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Hub 2"],BackgroundTransparency=0},nil) + addBorder(sf,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],2) + createInstance("UICorner",{CornerRadius=UDim.new(0,8)},sf) + local st=createInstance("TextLabel",{Name="SectionTitle",Text=sn,Size=UDim2.new(1,0,0,30),BackgroundTransparency=1,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.GothamBold,TextSize=16,TextXAlignment=Enum.TextXAlignment.Left},sf) + local sc=createInstance("Frame",{Name="SectionContent",Size=UDim2.new(1,0,1,-30),Position=UDim2.new(0,0,0,30),BackgroundTransparency=1},sf) + createInstance("UIListLayout",{FillDirection=Enum.FillDirection.Vertical,Padding=UDim.new(0,5),SortOrder=Enum.SortOrder.LayoutOrder,HorizontalAlignment=Enum.HorizontalAlignment.Left},sc) + local so={Frame=sf,Title=st,Content=sc} + setmetatable(so,{__index=SectionMethods}) + return so +end + +function JustHub:CreateWindow(o) + o=o or {} + local wn=o.Name or "JustHub Window" + local th=getCurrentTheme(o.Theme) + local gid=HttpService:GenerateGUID(false) + local ft=wn.." ["..gid.."]" + local pl=Players.LocalPlayer + local pg=pl:WaitForChild("PlayerGui") + local sg=createInstance("ScreenGui",{Name="JustHub",ResetOnSpawn=false},pg) + self.ScreenGui=sg + local uw=JustHub.Save.UISize[1] + local uh=JustHub.Save.UISize[2] + local mf=createInstance("Frame",{Name="MainFrame",AnchorPoint=Vector2.new(0.5,0.5),Position=UDim2.new(0.5,0,-0.5,0),Size=UDim2.new(0,uw,0,uh),BackgroundColor3=th["Color Hub 2"]},sg) + createInstance("UICorner",{CornerRadius=UDim.new(0,12)},mf) + addBorder(mf,th["Color Stroke"],2) + local tb=createInstance("Frame",{Name="TopBar",Size=UDim2.new(1,0,0,60),BackgroundColor3=th["Color Hub 2"]},mf) + createInstance("UICorner",{CornerRadius=UDim.new(0,12)},tb) + local tl=createInstance("TextLabel",{Name="TitleLabel",Size=UDim2.new(1,-180,1,0),Position=UDim2.new(0,10,0,0),BackgroundTransparency=1,Text=ft,TextColor3=th["Color Text"],Font=Enum.Font.GothamBold,TextSize=18,TextXAlignment=Enum.TextXAlignment.Left},tb) + local wl=createInstance("TextLabel",{Name="WelcomeLabel",Size=UDim2.new(0,150,0,20),AnchorPoint=Vector2.new(0,1),Position=UDim2.new(0,10,1,-30),BackgroundTransparency=1,Text="Welcome, "..pl.Name,TextColor3=th["Color Text"],Font=Enum.Font.GothamBold,TextSize=16,TextXAlignment=Enum.TextXAlignment.Left},mf) + local function ccb(n,s,p) + local b=createInstance("TextButton",{Name=n,Text=s,Size=UDim2.new(0,40,0,40),Position=p,BackgroundTransparency=1,TextColor3=th["Color Text"],Font=Enum.Font.GothamBold,TextSize=24},tb) + return b + end + local hb=ccb("HideButton","–",UDim2.new(1,-110,0,10)) + local xb=ccb("MaxButton","□",UDim2.new(1,-70,0,10)) + local cb=ccb("CloseButton","X",UDim2.new(1,-30,0,10)) + local sw=JustHub.Save.TabSize + local sb=createInstance("Frame",{Name="Sidebar",Size=UDim2.new(0,sw,1,-60),Position=UDim2.new(0,0,0,60),BackgroundColor3=th["Color Hub 2"]},mf) + createInstance("UICorner",{CornerRadius=UDim.new(0,10)},sb) + createInstance("UIListLayout",{FillDirection=Enum.FillDirection.Vertical,Padding=UDim.new(0,10),HorizontalAlignment=Enum.HorizontalAlignment.Center,VerticalAlignment=Enum.VerticalAlignment.Top},sb) + local cc=createInstance("Frame",{Name="ContentContainer",Size=UDim2.new(1,-sw,1,-60),Position=UDim2.new(0,sw,0,60),BackgroundColor3=th["Color Hub 2"]},mf) + createInstance("UICorner",{CornerRadius=UDim.new(0,10)},cc) + local sf=createInstance("ScrollingFrame",{Size=UDim2.new(1,0,1,0),BackgroundTransparency=1,ScrollBarThickness=8,BorderSizePixel=0},cc) + createInstance("UIListLayout",{SortOrder=Enum.SortOrder.LayoutOrder,Padding=UDim.new(0,10),HorizontalAlignment=Enum.HorizontalAlignment.Left},sf) + local fl=createInstance("TextLabel",{Name="FPSLabel",Size=UDim2.new(0,100,0,20),AnchorPoint=Vector2.new(1,1),Position=UDim2.new(1,-10,1,-10),BackgroundTransparency=1,TextColor3=th["Color Text"],Font=Enum.Font.Gotham,TextSize=14,Text="FPS: Calculating..."},mf) + RunService.Heartbeat:Connect(function(d) + local fps=math.floor(1/d) + fl.Text="FPS: "..fps + end) + local i=TweenInfo.new(0.5,Enum.EasingStyle.Back,Enum.EasingDirection.Out) + local tin=TweenService:Create(mf,i,{Position=UDim2.new(0.5,0,0.5,0)}) + tin:Play() + local minimized=false + local maximized=false + local osz=mf.Size + local op=mf.Position + hb.MouseButton1Click:Connect(function() + if not minimized then + tweenProperty(mf,{Size=UDim2.new(osz.X.Scale,osz.X.Offset,0,60)},0.3) + wl.Visible=false + sb.Visible=false + cc.Visible=false + fl.Visible=false + minimized=true + else + tweenProperty(mf,{Size=osz},0.3) + wait(0.3) + wl.Visible=true + sb.Visible=true + cc.Visible=true + fl.Visible=true + minimized=false + end + end) + xb.MouseButton1Click:Connect(function() + if not maximized then + tweenProperty(mf,{Size=UDim2.new(1,0,1,0),Position=UDim2.new(0.5,0,0.5,0)},0.3) + maximized=true + else + tweenProperty(mf,{Size=osz,Position=op},0.3) + maximized=false + end + end) + cb.MouseButton1Click:Connect(function() + local toi=TweenInfo.new(0.5,Enum.EasingStyle.Back,Enum.EasingDirection.In) + local tout=TweenService:Create(mf,toi,{Position=UDim2.new(0.5,0,-0.5,0)}) + tout:Play() + tout.Completed:Connect(function() + mf.Visible=false + local plr=Players.LocalPlayer + local pg2=plr:WaitForChild("PlayerGui") + local sg2=Instance.new("ScreenGui") + sg2.Name="ShowUI" + sg2.ResetOnSpawn=false + sg2.Parent=pg2 + local showBtn=Instance.new("TextButton") + showBtn.Name="ShowUIButton" + showBtn.Size=UDim2.new(0,150,0,50) + showBtn.Position=UDim2.new(0.5,-75,0,0) + showBtn.BackgroundColor3=th["Color Hub 2"] + showBtn.Text="Show UI" + showBtn.TextColor3=Color3.fromRGB(128,0,128) + showBtn.Font=Enum.Font.GothamBold + showBtn.TextSize=20 + createInstance("UICorner",{CornerRadius=UDim.new(0,25)},showBtn) + createInstance("UIStroke",{Color=th["Color Theme"],Thickness=1},showBtn) + showBtn.Parent=sg2 + showBtn.MouseButton1Click:Connect(function() + mf.Visible=true + tweenProperty(mf,{Position=UDim2.new(0.5,0,0.5,0)},0.5) + sg2:Destroy() + end) + end) + end) + mf.Active=true + local dragging=false + local dragStart,startPos + mf.InputBegan:Connect(function(input) + if input.UserInputType==Enum.UserInputType.MouseButton1 or input.UserInputType==Enum.UserInputType.Touch then + dragging=true + dragStart=input.Position + startPos=mf.Position + end + end) + mf.InputChanged:Connect(function(input) + if dragging and (input.UserInputType==Enum.UserInputType.MouseMovement or input.UserInputType==Enum.UserInputType.Touch) then + local delta=input.Position-dragStart + local np=UDim2.new(startPos.X.Scale,startPos.X.Offset+delta.X,startPos.Y.Scale,startPos.Y.Offset+delta.Y) + np=clampPosition(np,Vector2.new(sg.AbsoluteSize.X,sg.AbsoluteSize.Y)) + mf.Position=np + end + end) + UserInputService.InputEnded:Connect(function(input) + if input.UserInputType==Enum.UserInputType.MouseButton1 or input.UserInputType==Enum.UserInputType.Touch then + dragging=false + end + end) + local notiContainer=createInstance("Frame",{Name="NotificationContainer",AnchorPoint=Vector2.new(1,1),Position=UDim2.new(1,-10,1,-10),Size=UDim2.new(0,300,1,-20),BackgroundTransparency=1},sg) + local notiLayout=createInstance("UIListLayout",{Padding=UDim.new(0,8),HorizontalAlignment=Enum.HorizontalAlignment.Right,VerticalAlignment=Enum.VerticalAlignment.Bottom,SortOrder=Enum.SortOrder.LayoutOrder},notiContainer) + self.NotificationContainer=notiContainer + local wObj={ScreenGui=sg,MainFrame=mf,TopBar=tb,Sidebar=sb,ContentContainer=cc,Tabs={}} + function wObj:addTab(tn) + tn=tn or "Tab" + local b=createInstance("TextButton",{Name=tn.."Button",Text=tn,Size=UDim2.new(1,0,0,20),BackgroundColor3=th["Color Stroke"],TextColor3=Color3.fromRGB(128,0,128),Font=Enum.Font.GothamBold,TextSize=12},sb) + createInstance("UICorner",{CornerRadius=UDim.new(0,10)},b) + createInstance("UIStroke",{Color=th["Color Theme"],Thickness=1},b) + local tc=createInstance("Frame",{Name=tn.."Content",Size=UDim2.new(1,0,1,0),BackgroundTransparency=1,Visible=false},sf) + local tObj={Name=tn,Button=b,Content=tc,Sections={}} + table.insert(wObj.Tabs,tObj) + b.MouseButton1Click:Connect(function() + for _,tt in ipairs(wObj.Tabs) do + tt.Content.Visible=false + end + tObj.Content.Visible=true + end) + if #wObj.Tabs==1 then + tObj.Content.Visible=true + end + function tObj:addSection(sn,sh) + sn=sn or "Section" + sh=sh or 80 + local sframe=createInstance("Frame",{Name=sn,Size=UDim2.new(1,0,0,sh),BackgroundColor3=th["Color Hub 2"],BackgroundTransparency=0.0},tc) + createInstance("UICorner",{CornerRadius=UDim.new(0,8)},sframe) + addBorder(sframe,th["Color Stroke"],2) + local st=createInstance("TextLabel",{Name="SectionTitle",Text=sn,Size=UDim2.new(1,0,0,30),BackgroundTransparency=1,TextColor3=th["Color Text"],Font=Enum.Font.GothamBold,TextSize=14,TextXAlignment=Enum.TextXAlignment.Left},sframe) + local sc=createInstance("Frame",{Name="SectionContent",Size=UDim2.new(1,0,1,-30),Position=UDim2.new(0,0,0,30),BackgroundTransparency=1},sframe) + createInstance("UIListLayout",{FillDirection=Enum.FillDirection.Vertical,Padding=UDim.new(0,5),SortOrder=Enum.SortOrder.LayoutOrder,HorizontalAlignment=Enum.HorizontalAlignment.Left},sc) + local sObj={Frame=sframe,Title=st,Content=sc} + table.insert(tObj.Sections,sObj) + setmetatable(sObj,{__index=SectionMethods}) + return sObj + end + return tObj + end + return wObj +end + +function JustHub:ShowLoadingScreen(d,cb) + d=d or 5 + cb=cb or function()end + local pl=Players.LocalPlayer + local pg=pl:WaitForChild("PlayerGui") + local lg=createInstance("ScreenGui",{Name="LoadingScreen",ResetOnSpawn=false,IgnoreGuiInset=true},pg) + local bg=createInstance("Frame",{Size=UDim2.new(1,0,1,0),Position=UDim2.new(0,0,0,0),BackgroundColor3=Color3.new(0,0,0),BackgroundTransparency=0.5,BorderSizePixel=0},lg) + local tl=createInstance("TextLabel",{Text="JustHub Library",Font=Enum.Font.SourceSansSemibold,TextSize=20,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],BackgroundTransparency=1,Size=UDim2.new(0,200,0,50),AnchorPoint=Vector2.new(0.5,0.5),Position=UDim2.new(0.5,0,0.5,-50)},lg) + local wl=createInstance("TextLabel",{Text="Welcome, "..pl.Name,Font=Enum.Font.SourceSansSemibold,TextSize=16,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],BackgroundTransparency=1,Size=UDim2.new(0,200,0,30),AnchorPoint=Vector2.new(0.5,0),Position=UDim2.new(0.5,0,0.5,10)},lg) + local pbc=createInstance("Frame",{Size=UDim2.new(0.5,0,0,20),Position=UDim2.new(0.5,0,0.5,50),AnchorPoint=Vector2.new(0.5,0.5),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],BackgroundTransparency=0.5,BorderSizePixel=0},lg) + createInstance("UICorner",{CornerRadius=UDim.new(0,4)},pbc) + local pbf=createInstance("Frame",{Size=UDim2.new(0,0,1,0),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Theme"],BorderSizePixel=0},pbc) + createInstance("UICorner",{CornerRadius=UDim.new(0,4)},pbf) + local tinfo=TweenInfo.new(d,Enum.EasingStyle.Quad,Enum.EasingDirection.Out) + local pt=TweenService:Create(pbf,tinfo,{Size=UDim2.new(1,0,1,0)}) + pt:Play() + spawn(function() + while pt.PlaybackState==Enum.PlaybackState.Playing do + tweenProperty(tl,{TextTransparency=0.5},0.5) + wait(0.5) + tweenProperty(tl,{TextTransparency=0},0.5) + wait(0.5) + end + end) + pt.Completed:Connect(function() + wait(0.5) + lg:Destroy() + cb() + end) +end + +function JustHub:InitializeUI(o) + self:ShowLoadingScreen(5,function() + local w=self:CreateWindow(o) + self.Window=w + end) +end + +function JustHub:SaveConfig(f) + f=f or "JustHub_Config.json" + if writefile then + local j=HttpService:JSONEncode(JustHub.ConfigData) + writefile(f,j) + StarterGui:SetCore("SendNotification",{Title="Save Config",Text="Config berhasil disimpan ke "..f,Duration=5}) + else + warn("Saving config is not supported in this environment.") + end +end + +function JustHub:LoadConfig(f) + f=f or "JustHub_Config.json" + if readfile then + local d=readfile(f) + local c=HttpService:JSONDecode(d) + JustHub.ConfigData=c + JustHub:ApplyConfig(c) + StarterGui:SetCore("SendNotification",{Title="Load Config",Text="Config berhasil dimuat dari "..f,Duration=5}) + return c + else + warn("Loading config is not supported in this environment.") + return {} + end +end + +function JustHub:UpdateTheme(nt) + JustHub.Save.Theme=nt + local th=getCurrentTheme(nt) + if self.Window then + local mf=self.Window.MainFrame + mf.BackgroundColor3=th["Color Hub 2"] + local tb=self.Window.TopBar + tb.BackgroundColor3=th["Color Hub 2"] + local tl=tb:FindFirstChild("TitleLabel") + if tl then tl.TextColor3=th["Color Text"] end + local sb=self.Window.Sidebar + sb.BackgroundColor3=th["Color Hub 2"] + local cc=self.Window.ContentContainer + cc.BackgroundColor3=th["Color Hub 2"] + for _,tab in ipairs(self.Window.Tabs) do + if tab.Button then + tab.Button.BackgroundColor3=th["Color Stroke"] + tab.Button.TextColor3=th["Color Text"] + end + end + local fl=mf:FindFirstChild("FPSLabel",true) + if fl then + fl.TextColor3=th["Color Text"] + end + end +end + +function JustHub:SetTheme(nt) + self:UpdateTheme(nt) +end + +function JustHub:ToggleUIVisibility() + if self.ScreenGui and self.ScreenGui.Parent then + self.ScreenGui.Enabled=not self.ScreenGui.Enabled + end +end + +function JustHub:Notify(o) + o=o or {} + local t=o.Title or "" + local m=o.Message or "" + local d=o.Duration or 5 + local theme=getCurrentTheme(JustHub.Save.Theme) + if not self.NotificationContainer then + return + end + local nf=createInstance("Frame",{Size=UDim2.new(0,300,0,0),BackgroundTransparency=0,ClipsDescendants=true},self.NotificationContainer) + local corner=createInstance("UICorner",{CornerRadius=UDim.new(0,8)},nf) + local stroke=addBorder(nf,theme["Color Stroke"],2) + local grad=createInstance("UIGradient",{Color=theme["Color Hub 1"]},nf) + local tLabel=createInstance("TextLabel",{Text=t,Size=UDim2.new(1,-10,0,20),Position=UDim2.new(0,5,0,5),BackgroundTransparency=1,TextColor3=theme["Color Text"],Font=Enum.Font.GothamBold,TextSize=14,TextXAlignment=Enum.TextXAlignment.Left},nf) + local mLabel=createInstance("TextLabel",{Text=m,Size=UDim2.new(1,-10,0,0),Position=UDim2.new(0,5,0,25),BackgroundTransparency=1,TextColor3=theme["Color Text"],Font=Enum.Font.Gotham,TextSize=12,TextWrapped=true,TextXAlignment=Enum.TextXAlignment.Left},nf) + mLabel.Size=UDim2.new(1,-10,0,mLabel.TextBounds.Y+5) + local fullHeight=mLabel.AbsolutePosition.Y+mLabel.AbsoluteSize.Y-nf.AbsolutePosition.Y+10 + nf.Size=UDim2.new(0,300,0,fullHeight) + nf.BackgroundColor3=theme["Color Hub 2"] + nf.BackgroundTransparency=0.1 + nf.Position=UDim2.new(1,0,1,0) + local inTween=TweenService:Create(nf,TweenInfo.new(0.3,Enum.EasingStyle.Quad,Enum.EasingDirection.Out),{Size=UDim2.new(0,300,0,fullHeight)}) + inTween:Play() + spawn(function() + inTween.Completed:Wait() + wait(d) + local outTween=TweenService:Create(nf,TweenInfo.new(0.3,Enum.EasingStyle.Quad,Enum.EasingDirection.In),{BackgroundTransparency=1,Size=UDim2.new(0,300,0,0)}) + outTween:Play() + outTween.Completed:Wait() + nf:Destroy() + end) +end + +return JustHub