Volver al catálogo

CookiesLib

CookiesLib.lua · v3.5.0

La librería de UI con la que está hecho Cookies Hub. Ventanas arrastrables, pestañas, 20 elementos, 8 temas en vivo, notificaciones, diálogos y configs, para PC y móvil.

En esta página

Pruébala antes de usarla

Pega esta línea en tu executor y se abre un menú de prueba con todos los elementos conectados a notificaciones. No tienes que escribir nada.

CookiesDemo.lua
loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesDemo.lua"))()
PestañaQué puedes probar
InicioAviso de bienvenida, estadísticas en vivo (FPS, ping, jugadores, hora), párrafo, campo para copiar e imagen.
ControlesBotones (normal, principal, con confirmación, en columnas, desactivado), toggles con tecla, sliders, cajas de texto, keybinds y dropdowns.
AvanzadoSelector de pastillas, slider de rango, campos numéricos, barra de progreso, selector de color, alertas y secciones con scroll.
AvisosLos 4 tipos de notificación, una que se actualiza sola, diálogos, marca de agua, lista de keybinds y badges.
PersonalizarTema, color de acento, título, tamaño de la ventana y el Key System de prueba.
AjustesLa pestaña de ajustes de la librería: tema, acento, escala, tecla del menú, configs y auto-carga.

La key del Key System de prueba es COOKIES-DEMO. RightShift oculta o muestra el menú y Ctrl+F abre la búsqueda.

Instalación

CookiesLib se carga desde GitHub con una línea. Funciona en cualquier executor que tenga loadstring y game:HttpGet:

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

El resto de funciones del executor son opcionales. Si faltan, la librería se adapta:

FunciónPara qué se usaSi no existe
gethuiColocar la UI en un contenedor ocultoUsa PlayerGui
writefile, readfile, isfolder, makefolderConfigs, estado guardado y key recordadaSe desactivan
listfilesListar configsLa lista sale vacía
delfileBorrar configs y la key guardadaBorrar se desactiva
setclipboardCampos para copiar y enlacesMuestra el texto
requestAbrir la invitación de DiscordSolo copia el enlace

Inicio rápido

Una ventana con una pestaña, una sección y un toggle con tecla. Es el punto de partida de cualquier 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()

Al ejecutarlo:

  1. 1Se reproduce la intro (logo y barra de carga; un clic la salta) y aparece la ventana.
  2. 2Aparece el botón flotante con el logo. Un clic abre o cierra la ventana, y se puede arrastrar.
  3. 3RightShift muestra u oculta la ventana y Ctrl+F abre la búsqueda.
  4. 4La próxima vez que lo ejecutes, la ventana vuelve con el mismo tamaño, posición, pestaña y tema.

Ventana

Library:CreateWindow crea la ventana principal. Todas las opciones son opcionales:

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) },
})
OpciónPor defectoQué hace
Title / Subtitle"Cookies Hub" / versiónTextos de la barra superior
Logologo de CookiesImagen del título y del botón flotante. false lo quita
Width, Height740, 500Tamaño inicial
ToggleKeyRightShiftTecla para mostrar u ocultar
FloatingButtontrueBotón flotante para abrir la ventana (importante en móvil)
Resizable / DraggabletrueRedimensionar desde la esquina y arrastrar desde la barra
SearchabletrueBotón de lupa y búsqueda global
ShowProfiletrueTarjeta con avatar y nombre en la barra lateral
RememberLayouttrueRecuerda tamaño, posición, pestaña y tema entre ejecuciones
ConfigFolder"CookiesHub"Carpeta de configs y del estado guardado
CompactBelow600Por debajo de este ancho la barra lateral muestra solo iconos

Intro

La ventana queda oculta mientras dura la intro. Configúrala con Intro = { ... }: Enabled, Duration (segundos), Skippable, OncePerSession (no se repite al re-ejecutar en la misma partida), Logo y 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()

Detener tus loops al descargar

Cuando el jugador pulsa Unload UI en Ajustes, OnUnload te avisa para que pares tus bucles:

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

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

Pestañas

Se crean con un nombre y un icono, o con una tabla de opciones. La primera pestaña creada se abre sola.

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",
})
OpciónPor defectoQué hace
Iconprimera letraIcono de Lucide, asset id o una letra (ver Iconos)
IconColoracentoColor del icono cuando la pestaña está activa
Columns2Columnas de secciones (1 en pantallas estrechas)
BadgenilEtiqueta junto al nombre, como "NEW" o un número

Usa Window:AddTabCategory("Nombre") para poner un separador de texto en la barra lateral, como General o Automation.

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

Iconos

Pestañas y secciones aceptan iconos de Lucide a través de lucide-roblox. Usa tamaño 48; el helper con pcall evita errores si el nombre no 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")Icono de Lucide (recomendado)
123456789Asset id → rbxassetid://123456789
"rbxassetid://123"Asset id como texto
"H"Letra dentro de un recuadro (máx. 2 caracteres)
nilPestañas: primera letra del nombre. Secciones: punto de color

lucide-roblox usa nombres antiguos de Lucide: "home" en vez de "house", "line-chart" en vez de "chart-line".

Secciones

Las secciones agrupan elementos dentro de una pestaña. Se reparten solas entre las columnas, o puedes elegir dónde va cada una:

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

Se pliegan pulsando su cabecera. Opciones y 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 hace que el contenido tenga scroll al superar esa altura, y Minimized = true hace que empiece plegada.

Varias columnas dentro de una sección

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 se crean desde una sección con Section:AddXxx({ ... }). Los que tienen Flag se guardan en las configs.

ElementoPara quéSe guarda
AddButtonEjecutar una acción—
AddToggleEncendido / apagado, con tecla opcionalSí
AddSliderElegir un número arrastrandoSí
AddRangeSliderElegir un rango mínimo – máximoSí
AddNumberNúmero con botones − / +Sí
AddDropdownElegir una o varias opcionesSí
AddPlayerDropdownElegir jugadores del servidorOpcional
AddSegmentedElegir entre 2–5 opciones con pastillasSí
AddKeybindAsignar una teclaSí
AddTextBoxEscribir texto o númerosSí
AddColorPickerElegir un colorSí
AddProgress, AddStatMostrar progreso o un valor—
AddAlert, AddCopyField, AddImageAvisos, texto para copiar e imágenes—
AddLabel, AddParagraph, AddDivider, AddSpacerTexto y diseño—

Opciones y métodos comunes

Casi todos aceptan Name, Flag, Callback, Description (texto bajo el nombre y tooltip), Tooltip, Visible y Enabled. Y comparten estos 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()

Los Callback se ejecutan con task.spawn: un error en tu función no rompe la interfaz. :Set(valor, true) cambia el valor sin ejecutar el callback.

Button

Style puede ser Default, Primary o Danger. Con Confirm = true el primer clic pide un segundo clic durante 2,5 segundos; ideal para acciones peligrosas.

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 o casilla (Style = "Checkbox"). Con Keybind aparece un chip con la tecla dentro de la misma fila:

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` de la teclaQué hace
Toggle (por defecto)Cada pulsación enciende o apaga
HoldEncendido solo mientras se mantiene pulsada

Para cambiar la tecla, el jugador hace clic en el chip y pulsa otra. Esc cancela y Backspace la quita.

Slider

La caja numérica de la derecha también se puede escribir. Los decimales se deducen de Increment (0.25 → 2 decimales). El callback se llama mientras se arrastra.

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

Dos manijas para elegir un rango. El valor es una tabla { min, max }; si pasas los valores al revés se ordenan solos.

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 con − y +. Mantener presionado un botón repite el cambio. Min y Max son opcionales.

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 con los jugadores del servidor que se actualiza solo cuando alguien entra o sale. El valor es el nombre; GetPlayer() devuelve el objeto Player. No se guarda en configs salvo que pongas Savable = true.

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

local player = victim:GetPlayer()

Segmented

Pastillas con un indicador que se desliza. Mejor que un dropdown cuando hay de 2 a 5 opciones.

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` recibe
PressNada; se llama una vez al pulsar
Toggletrue / false alternando en cada pulsación
Holdtrue al pulsar y false al soltar

Changed se ejecuta cuando el jugador reasigna la tecla. Las teclas no se disparan mientras se escribe en una caja de texto.

TextBox

Con Numeric = true el valor es un número. Por defecto el callback se ejecuta al pulsar Enter o al salir de la caja (CallbackOnBlur).

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

ColorPicker

Selector de saturación y brillo, barra de tono, caja hexadecimal y colores predefinidos opcionales.

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 información

Progress

Barra de progreso de solo lectura. Con ShowPercent = false muestra el valor en bruto.

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

Stat

Fila con nombre a la izquierda y valor a la derecha: dinero, nivel, estado del 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 destacado. Type puede ser Info, Success, Warning o Error, y el contenido acepta 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 (un enlace, un código) con un botón Copy que lo copia al portapapeles.

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 y 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 y configs

Un elemento con Flag queda registrado en Library.Flags y entra en las configs. Desde cualquier parte del script puedes leerlo o cambiarlo:

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()

Auto-carga

Una config marcada como auto-carga se aplica sola cada vez que el jugador ejecuta el script:

lua
Window:SetAutoload("my-config")
Window:GetAutoload()
Window:LoadAutoloadConfig()
  • Las configs son archivos JSON dentro de ConfigFolder.
  • LoadConfig ejecuta los callbacks de cada elemento, como si el jugador los hubiera cambiado.
  • No se guardan Progress, Stat, CopyField ni PlayerDropdown.
  • Library.Flags es global: usa nombres de Flag únicos si tienes varias ventanas.

Crea la pestaña de ajustes al final del script: así la auto-carga encuentra todos tus flags. Si no la usas, llama a Window:LoadAutoloadConfig() al terminar el menú.

Notificaciones

Type puede ser Info, Success, Warning o Error, cada uno con su icono. Duration = 0 hace que no se cierre sola. La notificación devuelta se puede actualizar:

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")
  • Un clic la cierra (y ejecuta su Callback, si tiene).
  • Con el mouse encima, el tiempo se pausa.
  • Posición y límite: Notify = { Position = "TopRight", Max = 5 } al crear la ventana.

Diálogos

Ventana modal para confirmar acciones. Sin Buttons muestra Cancel y Confirm; con Buttons puedes poner los que quieras, cada uno con su 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 evita que se cierre al hacer clic fuera.

Marca de agua y lista de keybinds

Paneles flotantes que se pueden arrastrar y recuerdan su posición. La lista muestra las teclas de los toggles y se ilumina cuando están activos.

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 y colores

Los temas se aplican en vivo: toda la interfaz se repinta sin recrearse. Hay 8 incluidos: Cookies, Mocha, Midnight, Ocean, Matcha, Strawberry, Grape y 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

También puedes elegirlo al crear la ventana: Library:CreateWindow({ Theme = "Ocean" }).

Si el jugador elige un tema o un acento en Ajustes, su elección se guarda y tiene prioridad sobre el tema del script.

Crear tu propio 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")

El tema nuevo aparece también en el selector de Ajustes. Usa colores distintos para cada clave: si dos comparten el mismo color, la librería no sabe cuál repintar al cambiar de tema.

Configuración global

Library:Configure cambia los valores por defecto de todas las ventanas que crees después: animaciones, tamaños, notificaciones, 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 },
})

Pestaña de ajustes

Window:CreateSettingsTab() crea una pestaña lista para usar:

  • Appearance: tema, color de acento y escala de la UI.
  • Interface: tecla del menú, botón flotante, animaciones, tooltips, marca de agua, lista de keybinds, Reset Layout y Unload UI.
  • Configs: guardar, cargar, borrar y marcar una config como auto-carga.
lua
Window:CreateSettingsTab("Settings", icon("settings"))

Con RememberLayout = true la librería guarda en ConfigFolder/_ui_state.txt el tamaño, la posición, la pestaña abierta, el tema y la tecla del menú. Window:ResetLayout() lo borra.

Ejemplo completo

Un hub de ejemplo con iconos, estadísticas en vivo, sliders, toggles con tecla, diálogos, ESP de prueba y la pestaña de ajustes. Cópialo y ejecútalo tal cual:

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 comunes

  • No veo la ventana al ejecutar: la intro la mantiene oculta unos 2 segundos (un clic la salta). Con Intro = { Enabled = false } aparece al instante.
  • La intro no sale al re-ejecutar: es intencional (OncePerSession). Pon Intro = { OncePerSession = false } para verla siempre.
  • Cerré la ventana y no puedo abrirla: usa la ToggleKey o el botón flotante. En móvil no desactives FloatingButton.
  • La ventana sale en otro sitio o con otro tema: la librería recuerda lo que dejó el jugador. Usa Reset Layout, Window:ResetLayout() o RememberLayout = false.
  • Mi callback se ejecuta al cargar una config: es lo normal en LoadConfig. Usa :Set(valor, true) para cambios silenciosos.
  • Mis loops siguen después de Unload UI: detenlos con Window:OnUnload.
  • `Lucide.GetAsset` falla: el icono no existe; usa el helper con pcall.