Voltar ao catálogo

CookiesLib

CookiesLib.lua · v3.5.0

A biblioteca de UI com que o Cookies Hub é feito. Janelas arrastáveis, abas, 20 elementos, 8 temas ao vivo, notificações, diálogos e configs, para PC e celular.

Nesta página

Teste antes de usar

Cole esta linha no seu executor e abre um menu de teste com todos os elementos ligados a notificações. Você não precisa escrever nada.

CookiesDemo.lua
loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesDemo.lua"))()
AbaO que dá para testar
Inicio (Início)Aviso de boas-vindas, estatísticas ao vivo (FPS, ping, jogadores, hora), parágrafo, campo para copiar e imagem.
ControlesBotões (normal, principal, com confirmação, em colunas, desativado), toggles com tecla, sliders, caixas de texto, keybinds e dropdowns.
Avanzado (Avançado)Seletor de pílulas, slider de intervalo, campos numéricos, barra de progresso, seletor de cor, alertas e seções com rolagem.
AvisosOs 4 tipos de notificação, uma que se atualiza sozinha, diálogos, marca d'água, lista de keybinds e badges.
PersonalizarTema, cor de destaque, título, tamanho da janela e o Key System de teste.
AjustesA aba de ajustes da biblioteca: tema, destaque, escala, tecla do menu, configs e carregamento automático.

O menu de teste está em espanhol. A key do Key System de teste é COOKIES-DEMO. RightShift esconde ou mostra o menu e Ctrl+F abre a busca.

Instalação

A CookiesLib carrega do GitHub em uma linha. Funciona em qualquer executor que tenha loadstring e game:HttpGet:

lua
local Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesLib.lua"))()

As outras funções do executor são opcionais. Se faltar alguma, a biblioteca se adapta:

FunçãoPara que serveSe não existir
gethuiColocar a UI num contêiner ocultoUsa PlayerGui
writefile, readfile, isfolder, makefolderConfigs, estado salvo e key lembradaDesativados
listfilesListar configsA lista fica vazia
delfileApagar configs e a key salvaApagar fica desativado
setclipboardCampos para copiar e linksMostra o texto
requestAbrir o convite do DiscordSó copia o link

Início rápido

Uma janela com uma aba, uma seção e um toggle com tecla. É o ponto de partida de qualquer hub:

lua
local Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesLib.lua"))()

local Window = Library:CreateWindow({
    Title = "Cookies Hub",
    ToggleKey = Enum.KeyCode.RightShift,
})

local Main = Window:CreateTab("Main", "H")
local Section = Main:CreateSection("Combat")

Section:AddToggle({
    Name = "Auto Farm",
    Flag = "AutoFarm",
    Default = false,
    Keybind = "F",
    Callback = function(value)
        print("Auto Farm:", value)
    end,
})

Window:CreateSettingsTab()

Ao executar:

  1. 1A intro toca (logo e barra de carregamento; um clique pula) e a janela aparece.
  2. 2Aparece o botão flutuante com o logo. Um clique abre ou fecha a janela, e dá para arrastar.
  3. 3RightShift mostra ou esconde a janela e Ctrl+F abre a busca.
  4. 4Na próxima vez que você executar, a janela volta com o mesmo tamanho, posição, aba e tema.

Janela

Library:CreateWindow cria a janela principal. Todas as opções são opcionais:

lua
local Window = Library:CreateWindow({
    Title = "Cookies Hub",
    Subtitle = "v1.0",
    Logo = "rbxassetid://76143769732706",
    Width = 740, Height = 500,
    ToggleKey = Enum.KeyCode.RightShift,
    ConfigFolder = "CookiesHub",

    Intro  = { Enabled = true, Duration = 2 },
    Notify = { Duration = 4, Position = "TopRight" },
    Theme  = { Accent = Color3.fromRGB(245, 194, 12) },
})
OpçãoPadrãoO que faz
Title / Subtitle"Cookies Hub" / versãoTextos da barra superior
Logologo do CookiesImagem do título e do botão flutuante. false remove
Width, Height740, 500Tamanho inicial
ToggleKeyRightShiftTecla para mostrar ou esconder
FloatingButtontrueBotão flutuante para abrir a janela (importante no celular)
Resizable / DraggabletrueRedimensionar pelo canto e arrastar pela barra
SearchabletrueBotão de lupa e busca global
ShowProfiletrueCartão com avatar e nome na barra lateral
RememberLayouttrueLembra tamanho, posição, aba e tema entre execuções
ConfigFolder"CookiesHub"Pasta das configs e do estado salvo
CompactBelow600Abaixo dessa largura a barra lateral mostra só ícones

Intro

A janela fica oculta enquanto a intro toca. Configure com Intro = { ... }: Enabled, Duration (segundos), Skippable, OncePerSession (não repete ao executar de novo na mesma partida), Logo e ShowBar.

Métodos

lua
Window:Toggle()   Window:Show()   Window:Hide()
Window:Minimize()
Window:Resize(800, 520)
Window:SetUIScale(1.2)
Window:ResetPosition()
Window:ResetLayout()

Window:SetTitle("New title")
Window:SetSubtitle("Text")
Window:SetToggleKey(Enum.KeyCode.K)
Window:SetFloatingButton(false)

Window:AddTabCategory("Combat")
Window:GetTab("Main")
Window:SelectTab("Main")

Window:Destroy()

Parar seus loops ao descarregar

Quando o jogador clica em Unload UI nos Ajustes, OnUnload avisa você para parar seus loops:

lua
local running = true
Window:OnUnload(function() running = false end)

task.spawn(function()
    while running do
        task.wait(0.1)
    end
end)

Abas

Crie com um nome e um ícone, ou com uma tabela de opções. A primeira aba criada abre sozinha.

lua
local Main = Window:CreateTab("Main", "H")

local Combat = Window:CreateTab({
    Name = "Combat",
    Icon = icon("swords"),
    IconColor = Color3.fromRGB(245, 194, 12),
    Columns = 2,
    Badge = "NEW",
})
OpçãoPadrãoO que faz
Iconprimeira letraÍcone do Lucide, asset id ou uma letra (veja Ícones)
IconColordestaqueCor do ícone quando a aba está ativa
Columns2Colunas de seções (1 em telas estreitas)
BadgenilEtiqueta ao lado do nome, como "NEW" ou um número

Use Window:AddTabCategory("Nome") para colocar um separador de texto na barra lateral, como General ou Automation.

lua
Combat:Select()
Combat:SetName("Fight")
Combat:SetIcon(icon("flame"))
Combat:SetBadge(3)
Combat:SetBadge(nil)
Combat:SetVisible(false)
Combat:ScrollToTop()
Combat:Destroy()

Ícones

Abas e seções aceitam ícones do Lucide através do lucide-roblox. Use tamanho 48; o helper com pcall evita erros quando o nome não existe:

lua
local Lucide = loadstring(game:HttpGet(
    "https://github.com/latte-soft/lucide-roblox/releases/latest/download/lucide-roblox.luau"
))()

local function icon(name)
    local ok, asset = pcall(Lucide.GetAsset, name, 48)
    return ok and asset or nil
end

local Home   = Window:CreateTab("Home", icon("home"))
local Combat = Window:CreateTab("Combat", icon("swords"))

local Aimbot = Combat:CreateSection({
    Name = "Aimbot",
    Icon = icon("crosshair"),
})
Valor de `Icon`Resultado
icon("home")Ícone do Lucide (recomendado)
123456789Asset id → rbxassetid://123456789
"rbxassetid://123"Asset id como texto
"H"Letra dentro de um quadrado (máx. 2 caracteres)
nilAbas: primeira letra do nome. Seções: ponto colorido

O lucide-roblox usa nomes antigos do Lucide: "home" em vez de "house", "line-chart" em vez de "chart-line".

Seções

As seções agrupam elementos dentro de uma aba. Elas se distribuem sozinhas entre as colunas, ou você escolhe onde cada uma fica:

lua
Tab:CreateSection({ Name = "Left", Column = "Left" })
Tab:CreateSection({ Name = "Right", Column = "Right" })
Tab:CreateSection({ Name = "Wide", Full = true })
Tab:CreateSection("Name only")

Elas recolhem ao clicar no cabeçalho. Opções e métodos:

lua
local Section = Tab:CreateSection({
    Name = "Aimbot",
    Icon = icon("crosshair"),
    Color = Color3.fromRGB(245, 194, 12),
    Minimized = true,
    Collapsible = true,
    MaxHeight = 220,
})

Section:Minimize()   Section:Expand()   Section:Toggle()
Section:SetTitle("Another name")
Section:OnToggle(function(open) print(open) end)

MaxHeight faz o conteúdo rolar passando dessa altura, e Minimized = true faz a seção começar recolhida.

Várias colunas dentro de uma seção

lua
local Grid = Tab:CreateSection({ Name = "Grid", Columns = 2 })
Grid:AddButton({ Name = "A" })
Grid:AddButton({ Name = "B", Column = 2 })

local left, right = Grid:AddColumns(2)
left:AddButton({ Name = "Left" })
right:AddButton({ Name = "Right" })

Elementos

Todos são criados a partir de uma seção com Section:AddXxx({ ... }). Os que têm Flag são salvos nas configs.

ElementoPara que serveSalva
AddButtonExecutar uma ação—
AddToggleLiga / desliga, com tecla opcionalSim
AddSliderEscolher um número arrastandoSim
AddRangeSliderEscolher um intervalo mín. – máx.Sim
AddNumberNúmero com botões − / +Sim
AddDropdownEscolher uma ou várias opçõesSim
AddPlayerDropdownEscolher jogadores do servidorOpcional
AddSegmentedEscolher entre 2–5 opções com pílulasSim
AddKeybindAtribuir uma teclaSim
AddTextBoxDigitar texto ou númerosSim
AddColorPickerEscolher uma corSim
AddProgress, AddStatMostrar progresso ou um valor—
AddAlert, AddCopyField, AddImageAvisos, texto para copiar e imagens—
AddLabel, AddParagraph, AddDivider, AddSpacerTexto e layout—

Opções e métodos comuns

Quase todos aceitam Name, Flag, Callback, Description (texto abaixo do nome e tooltip), Tooltip, Visible e Enabled. E compartilham estes métodos:

lua
element:Set(value, silent)
element:Get()
element:SetText("New name")
element:SetVisible(true)
element:SetEnabled(false)
element:SetCallback(function(value) end)
element:OnChanged(function(value) end)
element:Destroy()

Todo Callback roda com task.spawn: um erro na sua função não quebra a interface. :Set(valor, true) muda o valor sem executar o callback.

Button

Style pode ser Default, Primary ou Danger. Com Confirm = true o primeiro clique pede um segundo clique em até 2,5 segundos; ótimo para ações perigosas.

lua
local btn = Section:AddButton({
    Name = "Run",
    Description = "Optional text",
    Style = "Primary",
    Confirm = true,
    Callback = function()
        print("clicked")
    end,
})

btn:Click()

Toggle

Interruptor estilo iOS ou caixa de seleção (Style = "Checkbox"). Com Keybind aparece um chip com a tecla na mesma linha:

lua
local esp = Section:AddToggle({
    Name = "ESP",
    Description = "Shows players",
    Default = false,
    Style = "Switch",
    Keybind = { Default = "F", Mode = "Toggle", Flag = "ESPKey" },
    Flag = "ESP",
    Callback = function(on)
        print("ESP:", on)
    end,
})

esp:Set(true)   esp:Toggle()   esp:Get()
`Mode` da teclaO que faz
Toggle (padrão)Cada toque liga ou desliga
HoldLigado só enquanto a tecla está pressionada

Para trocar a tecla, o jogador clica no chip e aperta outra. Esc cancela e Backspace remove.

Slider

A caixa numérica da direita também aceita digitação. As casas decimais vêm de Increment (0.25 → 2 casas). O callback roda enquanto arrasta.

lua
local speed = Section:AddSlider({
    Name = "Speed",
    Min = 16, Max = 100, Increment = 1, Default = 16,
    Suffix = " ws",
    Flag = "Speed",
    Callback = function(v)
        local h = game.Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
        if h then h.WalkSpeed = v end
    end,
})

speed:Set(50)   speed:SetRange(0, 200)

RangeSlider

Duas alças para escolher um intervalo. O valor é uma tabela { min, max }; se você passar os valores invertidos, eles são ordenados.

lua
local levels = Section:AddRangeSlider({
    Name = "Enemy level",
    Min = 1, Max = 100,
    Default = { 10, 60 },
    Flag = "LevelRange",
    Callback = function(v)
        print(v[1], v[2])
    end,
})

levels:Set({ 20, 80 })

Number

Campo numérico com − e +. Segurar um botão repete a mudança. Min e Max são opcionais.

lua
local amount = Section:AddNumber({
    Name = "Amount",
    Min = 0, Max = 99, Increment = 1, Default = 5,
    Suffix = "x",
    Flag = "Amount",
    Callback = function(v) end,
})

amount:Set(10)

PlayerDropdown

Dropdown com os jogadores do servidor que se atualiza sozinho quando alguém entra ou sai. O valor é o nome; GetPlayer() retorna o objeto Player. Não é salvo nas configs, a menos que você use Savable = true.

lua
local victim = Section:AddPlayerDropdown({
    Name = "Player",
    IncludeSelf = false,
    Callback = function(name)
        print("Picked:", name)
    end,
})

local player = victim:GetPlayer()

Segmented

Pílulas com um indicador que desliza. Melhor que um dropdown quando há de 2 a 5 opções.

lua
local mode = Section:AddSegmented({
    Name = "Mode",
    Options = { "Safe", "Normal", "Fast" },
    Default = "Normal",
    Flag = "Mode",
    Callback = function(v) end,
})

mode:Set("Fast")

Keybind

lua
local aim = Section:AddKeybind({
    Name = "Aim key",
    Default = Enum.KeyCode.E,
    Mode = "Hold",
    Flag = "AimKey",
    Callback = function(holding) end,
    Changed = function(key) end,
})

aim:Set(Enum.KeyCode.Q)   aim:SetMode("Toggle")
`Mode``Callback` recebe
PressNada; roda uma vez por toque
Toggletrue / false, alternando a cada toque
Holdtrue ao apertar e false ao soltar

Changed roda quando o jogador troca a tecla. As teclas não disparam enquanto o jogador digita numa caixa de texto.

TextBox

Com Numeric = true o valor é um número. Por padrão o callback roda ao apertar Enter ou ao sair da caixa (CallbackOnBlur).

lua
local msg = Section:AddTextBox({
    Name = "Message",
    Placeholder = "Type here...",
    Default = "",
    Numeric = false,
    Flag = "Msg",
    Callback = function(text) end,
})

ColorPicker

Seletor de saturação e brilho, barra de matiz, caixa hexadecimal e cores predefinidas opcionais.

lua
local tint = Section:AddColorPicker({
    Name = "ESP color",
    Default = Color3.fromRGB(245, 194, 12),
    Presets = { Color3.fromRGB(255, 80, 80), Color3.fromRGB(80, 200, 120) },
    Flag = "ESPColor",
    Callback = function(c) end,
})

tint:SetHex("#FF0000")   tint:GetHex()

Elementos para mostrar informação

Progress

Barra de progresso só de leitura. Com ShowPercent = false mostra o valor bruto.

lua
local bar = Section:AddProgress({ Name = "Loading", Min = 0, Max = 100, Default = 40 })
bar:Set(75)

Stat

Linha com o nome à esquerda e o valor à direita: dinheiro, nível, status do farm…

lua
local money = Section:AddStat({ Name = "Money", Value = "$0", Color = Color3.fromRGB(96, 196, 124) })

money:Set("$1500")
money:SetColor(Color3.fromRGB(224, 92, 92))

Alert

Aviso em destaque. Type pode ser Info, Success, Warning ou Error, e o conteúdo aceita RichText.

lua
local warning = Section:AddAlert({
    Type = "Warning",
    Title = "Careful",
    Content = "This option can get you <b>kicked</b>.",
})

warning:Set("New title", "New content")
warning:SetType("Success")

CopyField

Texto (um link, um código) com um botão Copy que copia para a área de transferência.

lua
Section:AddCopyField({
    Name = "Discord",
    Text = "discord.gg/cookieshub",
    Callback = function(text) end,
})

Image

lua
Section:AddImage({
    Image = 76143769732706,
    Height = 120,
    ScaleType = Enum.ScaleType.Fit,
    Caption = "Text below",
})

Label, Paragraph, Divider e Spacer

lua
local info = Section:AddLabel("Info text")
Section:AddLabel({ Text = "Notice with <b>bold</b>", RichText = true, Color = Color3.fromRGB(232, 148, 58) })

local about = Section:AddParagraph({ Title = "Title", Content = "Longer description" })
about:Set("New title", "New content")

Section:AddDivider()
Section:AddDivider("Options")
Section:AddSpacer(8)

Flags e configs

Um elemento com Flag fica registrado em Library.Flags e entra nas configs. Você pode ler ou mudar o valor de qualquer parte do script:

lua
Library:GetFlag("ESP")
Library:SetFlag("ESP", true)
Library:GetObject("ESP")

Window:SaveConfig("my-config")
Window:LoadConfig("my-config")
Window:DeleteConfig("my-config")
Window:GetConfigs()

Carregamento automático

Uma config marcada como auto-load é aplicada sozinha toda vez que o jogador executa o script:

lua
Window:SetAutoload("my-config")
Window:GetAutoload()
Window:LoadAutoloadConfig()
  • As configs são arquivos JSON dentro de ConfigFolder.
  • LoadConfig executa o callback de cada elemento, como se o jogador tivesse mudado.
  • Progress, Stat, CopyField e PlayerDropdown não são salvos.
  • Library.Flags é global: use nomes de Flag únicos se tiver várias janelas.

Crie a aba de ajustes no final do script para que o carregamento automático encontre todos os seus flags. Se não usar, chame Window:LoadAutoloadConfig() quando o menu estiver pronto.

Notificações

Type pode ser Info, Success, Warning ou Error, cada um com seu ícone. Duration = 0 deixa aberta. A notificação retornada pode ser atualizada:

lua
Window:Notify({
    Title = "Cookies Hub",
    Content = "Config <b>loaded</b>",
    Type = "Success",
    Duration = 4,
})

local download = Window:Notify({ Title = "Downloading...", Content = "0%", Duration = 0 })
for i = 1, 10 do
    task.wait(0.3)
    download:SetContent(i * 10 .. "%")
end
download:SetTitle("Done")
  • Um clique fecha (e executa o Callback, se tiver).
  • Com o mouse em cima, o tempo pausa.
  • Posição e limite: Notify = { Position = "TopRight", Max = 5 } ao criar a janela.

Diálogos

Janela modal para confirmar ações. Sem Buttons mostra Cancel e Confirm; com Buttons você coloca os que quiser, cada um com seu Style.

lua
Window:Dialog({
    Title = "Teleport?",
    Content = "You will go to the final boss.",
    Callback = function()
        print("confirmed")
    end,
})

Window:Dialog({
    Title = "Save changes",
    Content = "You have unsaved changes.",
    Buttons = {
        { Name = "Cancel" },
        { Name = "Discard", Style = "Danger", Callback = function() end },
        { Name = "Save", Style = "Primary", Callback = function() end },
    },
})

Dismissible = false impede que feche ao clicar fora.

Marca d'água e lista de keybinds

Painéis flutuantes que dá para arrastar e que lembram a posição. A lista mostra as teclas dos toggles e acende quando estão ativos.

lua
local wm = Window:CreateWatermark({ Text = "Cookies Hub", ShowFPS = true, ShowPing = true, ShowTime = true })
wm:SetText("My Hub")   wm:SetVisible(false)

local binds = Window:CreateKeybindList({ Title = "Keybinds", ShowAll = false })
binds:Destroy()

Temas e cores

Os temas se aplicam ao vivo: a interface inteira é repintada sem ser recriada. Há 8 incluídos: Cookies, Mocha, Midnight, Ocean, Matcha, Strawberry, Grape e Graphite.

lua
Library:SetTheme("Midnight")
Library:SetAccent(Color3.fromRGB(170, 120, 255))
Library:SetTheme({ Accent = Color3.fromRGB(255, 80, 80) })

local themes = Library:GetThemes()
local current = Library.CurrentTheme

Você também pode escolher ao criar a janela: Library:CreateWindow({ Theme = "Ocean" }).

Se o jogador escolher um tema ou destaque nos Ajustes, a escolha dele é salva e tem prioridade sobre o tema do script.

Criar seu próprio tema

lua
Library:AddTheme("Lava", {
    Background = Color3.fromRGB(20, 10, 8),  Panel = Color3.fromRGB(30, 14, 10),
    Element = Color3.fromRGB(38, 18, 12),    Row = Color3.fromRGB(48, 22, 14),
    RowHover = Color3.fromRGB(60, 28, 18),   Input = Color3.fromRGB(16, 8, 6),
    Stroke = Color3.fromRGB(90, 40, 24),     Outline = Color3.fromRGB(10, 5, 4),
    Accent = Color3.fromRGB(255, 110, 40),
    Text = Color3.fromRGB(250, 236, 228),    Muted = Color3.fromRGB(190, 150, 130),
    Dim = Color3.fromRGB(130, 100, 86),
    Success = Color3.fromRGB(96, 196, 124),  Warning = Color3.fromRGB(232, 148, 58),
    Error = Color3.fromRGB(224, 92, 92),
})

Library:SetTheme("Lava")

O novo tema também aparece no seletor dos Ajustes. Use uma cor diferente para cada chave: se duas chaves tiverem a mesma cor, a biblioteca não sabe qual repintar ao trocar de tema.

Configuração global

Library:Configure muda os valores padrão de todas as janelas que você criar depois: animações, tamanhos, notificações, tooltips, intro…

lua
Library:Configure({
    Animations = true,
    AnimationSpeed = 1,

    Window   = { Width = 740, Height = 500, Shadow = true, RememberLayout = true, UIScale = 1 },
    Tab      = { Columns = 2, Padding = 12, Gap = 10, IconSize = 20 },
    Section  = { Collapsible = true, Minimized = false },
    Element  = { Height = 32, Corner = 7 },
    Notify   = { Duration = 4, Position = "BottomRight", Max = 5 },
    Tooltip  = { Enabled = true, Delay = 0.55 },
    Dropdown = { SearchThreshold = 7, MaxVisible = 5 },
    Intro    = { Enabled = true, Duration = 2, OncePerSession = true },
})

Aba de ajustes

Window:CreateSettingsTab() cria uma aba pronta para usar:

  • Appearance: tema, cor de destaque e escala da UI.
  • Interface: tecla do menu, botão flutuante, animações, tooltips, marca d'água, lista de keybinds, Reset Layout e Unload UI.
  • Configs: salvar, carregar, apagar e marcar uma config como auto-load.
lua
Window:CreateSettingsTab("Settings", icon("settings"))

Com RememberLayout = true a biblioteca salva em ConfigFolder/_ui_state.txt o tamanho, a posição, a aba aberta, o tema e a tecla do menu. Window:ResetLayout() apaga esse arquivo.

Exemplo completo

Um hub de exemplo com ícones, estatísticas ao vivo, sliders, toggles com tecla, diálogos, uma aba de ESP de exemplo e a aba de ajustes. Copie e execute do jeito que está:

MyHub.lua
local Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesLib.lua"))()
local Lucide = loadstring(game:HttpGet(
    "https://github.com/latte-soft/lucide-roblox/releases/latest/download/lucide-roblox.luau"
))()

local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer

local function icon(name)
    local ok, asset = pcall(Lucide.GetAsset, name, 48)
    return ok and asset or nil
end

local Window = Library:CreateWindow({
    Title = "My Hub",
    Subtitle = "Demo",
    ToggleKey = Enum.KeyCode.RightShift,
    Theme = "Cookies",
    Notify = { Position = "TopRight" },
})

local running = true
Window:OnUnload(function() running = false end)

Window:AddTabCategory("General")
local Home = Window:CreateTab("Home", icon("home"))

local Info = Home:CreateSection({ Name = "Welcome", Full = true })
Info:AddAlert({ Type = "Info", Title = "My Hub", Content = "Press <b>RightShift</b> to hide the menu." })

local Stats = Home:CreateSection({ Name = "Live", Icon = icon("line-chart"), Column = "Left" })
local sPlayers = Stats:AddStat({ Name = "Players", Value = #Players:GetPlayers() })
local sTime = Stats:AddStat({ Name = "Time", Value = os.date("%H:%M:%S") })

local Links = Home:CreateSection({ Name = "Community", Icon = icon("users"), Column = "Right" })
Links:AddCopyField({ Name = "Discord", Text = "discord.gg/xxxxxx" })

task.spawn(function()
    while running do
        sPlayers:Set(#Players:GetPlayers())
        sTime:Set(os.date("%H:%M:%S"))
        task.wait(1)
    end
end)

Window:AddTabCategory("Game")
local Player = Window:CreateTab({ Name = "Player", Icon = icon("user"), Badge = "NEW" })

local Move = Player:CreateSection({ Name = "Movement", Icon = icon("footprints"), Column = "Left" })
Move:AddSlider({
    Name = "Walk speed", Min = 16, Max = 200, Default = 16, Suffix = " ws", Flag = "WalkSpeed",
    Callback = function(v)
        local h = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
        if h then h.WalkSpeed = v end
    end,
})
Move:AddSegmented({ Name = "Mode", Options = { "Safe", "Normal", "Fast" }, Default = "Normal", Flag = "Mode" })
Move:AddToggle({
    Name = "Infinite jump", Flag = "InfJump",
    Keybind = { Default = "J", Flag = "InfJumpKey" },
    Callback = function(on)
        Window:Notify({ Title = "Infinite jump", Content = on and "On" or "Off", Type = on and "Success" or "Info" })
    end,
})

local Tp = Player:CreateSection({ Name = "Teleport", Icon = icon("map-pin"), Column = "Right" })
local target = Tp:AddPlayerDropdown({ Name = "Target" })
Tp:AddButton({ Name = "Go to target", Primary = true, Callback = function()
    local p = target:GetPlayer()
    if not p then
        return Window:Notify({ Title = "Teleport", Content = "Pick a player first", Type = "Warning" })
    end
    Window:Dialog({
        Title = "Teleport?",
        Content = "You will go next to <b>" .. p.DisplayName .. "</b>.",
        Callback = function()
            local mine = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
            local theirs = p.Character and p.Character:FindFirstChild("HumanoidRootPart")
            if mine and theirs then mine.CFrame = theirs.CFrame * CFrame.new(0, 0, 3) end
        end,
    })
end })
Tp:AddButton({ Name = "Reset character", Style = "Danger", Confirm = true, Callback = function()
    local h = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
    if h then h.Health = 0 end
end })

local Visuals = Window:CreateTab("Visuals", icon("eye"))
local Esp = Visuals:CreateSection({ Name = "ESP", Icon = icon("scan-eye") })
local c1, c2 = Esp:AddColumns(2)
c1:AddToggle({ Name = "Boxes", Style = "Checkbox", Flag = "EspBoxes" })
c2:AddToggle({ Name = "Names", Style = "Checkbox", Flag = "EspNames" })
Esp:AddColorPicker({ Name = "Color", Default = Color3.fromRGB(245, 194, 12), Flag = "EspColor" })
Esp:AddRangeSlider({ Name = "Distance", Min = 0, Max = 5000, Default = { 0, 1000 }, Flag = "EspRange" })

Window:CreateSettingsTab("Settings", icon("settings"))
Window:Notify({ Title = "My Hub", Content = "Loaded", Type = "Success" })

Problemas comuns

  • Não vejo a janela ao executar: a intro a mantém oculta por uns 2 segundos (um clique pula). Com Intro = { Enabled = false } ela aparece na hora.
  • A intro não aparece ao executar de novo: é de propósito (OncePerSession). Use Intro = { OncePerSession = false } para ver sempre.
  • Fechei a janela e não consigo abrir: use a ToggleKey ou o botão flutuante. No celular, não desative FloatingButton.
  • A janela abre em outro lugar ou com outro tema: a biblioteca lembra o que o jogador deixou. Use Reset Layout, Window:ResetLayout() ou RememberLayout = false.
  • Meu callback roda ao carregar uma config: é normal no LoadConfig. Use :Set(valor, true) para mudanças silenciosas.
  • Meus loops continuam depois do Unload UI: pare-os com Window:OnUnload.
  • `Lucide.GetAsset` falha: o ícone não existe; use o helper com pcall.