local repo = 'https://[Log in to view URL]'

local Library = loadstring(game:HttpGet(repo .. 'Library.lua'))()
local ThemeManager = loadstring(game:HttpGet(repo .. 'addons/ThemeManager.lua'))()
local SaveManager = loadstring(game:HttpGet(repo .. 'addons/SaveManager.lua'))()

local Window = Library:CreateWindow({
    -- Set Center to true if you want the menu to appear in the center
    -- Set AutoShow to true if you want the menu to appear when it is created
    -- Position and Size are also valid options here
    -- but you do not need to define them unless you are changing them :)

    Title = 'light.cc',
    Center = true,
    AutoShow = true,
    TabPadding = 8
})

-- CALLBACK NOTE:
-- Passing in callback functions via the initial element parameters (i.e. Callback = function(Value)...) works
-- HOWEVER, using Toggles/Options.INDEX:OnChanged(function(Value) ... ) is the RECOMMENDED way to do this.
-- I strongly recommend decoupling UI code from logic code. i.e. Create your UI elements FIRST, and THEN setup :OnChanged functions later.

-- You do not have to set your tabs & groups up this way, just a prefrence.
local Tabs = {
    -- Creates a new tab titled Main
    Main = Window:AddTab('Combat'),
    Visuals = Window:AddTab('Visuals'),
    Misc = Window:AddTab('Misc'),
    Players = Window:AddTab('Players'),
    ['UI Settings'] = Window:AddTab('UI Settings'),
}

local TabBox = Tabs.Main:AddLeftTabbox()

local Tab1 = TabBox:AddTab('Legit')
local Tab2 = TabBox:AddTab('Mouse')
local Tab3 = TabBox:AddTab('Silent')

local RightGroupBox = Tabs.Main:AddRightGroupbox('Checks')

RightGroupBox:AddToggle('WallCheckToggle', {
    Text = 'Wall check',
    Default = false, -- Default value (true / false)
    Tooltip = 'Checks if behind wall', -- Information shown when you hover over the toggle

    Callback = function(Value)
    end
})

RightGroupBox:AddToggle('AliveCheckToggle', {
    Text = 'Alive check',
    Default = false, -- Default value (true / false)
    Tooltip = 'Checks if target is dead/alive', -- Information shown when you hover over the toggle

    Callback = function(Value)
    end
})

RightGroupBox:AddLabel('Femboys <3333333')
RightGroupBox:AddLabel('  :3')

local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local RunService = game:GetService("RunService")
local LocalPlayer = Players.LocalPlayer
local Camera = Workspace.CurrentCamera

local PlayersGroupBox = Tabs.Players:AddLeftGroupbox('Players')
local PlayerSettingsGroupBox = Tabs.Players:AddRightGroupbox('Settings')

local selectedPlayer = nil
local spectating = false

PlayersGroupBox:AddDropdown('MyPlayerDropdown', {
    SpecialType = 'Player',
    Text = 'Players dropdown',
    Tooltip = 'Select the player',
    Callback = function(Value)
        selectedPlayer = Players:FindFirstChild(Value)
    end
})

PlayerSettingsGroupBox:AddButton({
    Text = 'Teleport',
    Func = function()
        if selectedPlayer and selectedPlayer.Character and selectedPlayer.Character:FindFirstChild("Head") and LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
            LocalPlayer.Character.HumanoidRootPart.CFrame = selectedPlayer.Character.Head.CFrame + Vector3.new(0, 10, 0)
        end
    end,
    DoubleClick = false,
    Tooltip = 'Teleport to the player'
})

PlayerSettingsGroupBox:AddButton({
    Text = 'Spectate',
    Func = function()
        if not selectedPlayer or not selectedPlayer.Character then return end

        spectating = not spectating

        if spectating then
            Camera.CameraSubject = selectedPlayer.Character:FindFirstChild("Humanoid")
        else
            if LocalPlayer.Character then
                Camera.CameraSubject = LocalPlayer.Character:FindFirstChild("Humanoid")
            end
        end
    end,
    DoubleClick = false,
    Tooltip = 'Spectate the player'
})

local HealthSlider = PlayerSettingsGroupBox:AddSlider('MySlider', {
    Text = 'Health',
    Default = 0,
    Min = 0,
    Max = 100,
    Rounding = 1,
    Compact = false,
    Callback = function(Value)
    end
})

-- Real-time health update (old fast Heartbeat style)
RunService.Heartbeat:Connect(function()
    if selectedPlayer and selectedPlayer.Character and selectedPlayer.Character:FindFirstChild("Humanoid") then
        local health = selectedPlayer.Character.Humanoid.Health
        HealthSlider:SetValue(math.clamp(math.floor(health), 0, 100))
    else
        HealthSlider:SetValue(0)
    end
end)

PlayerSettingsGroupBox:AddLabel('I fixed the health view so ur welcome :3 <3')

-- Library functions
-- Sets the watermark visibility
Library:SetWatermarkVisibility(true)

-- Notif
Library:Notify("Hello World!", 5) -- Text, Time

-- Sets the watermark text
Library:SetWatermarkVisibility(true)
Library:SetWatermark('Light.cc | fps: 60 / --') -- initial

task.spawn(function()
    local RunService = game:GetService("RunService")
    local currentFPS = 60

    RunService.RenderStepped:Connect(function(delta)
        if delta > 0 then
            currentFPS = math.floor(1 / delta)
        end
    end)

    while task.wait(0.1) do
        Library:SetWatermark('Light.cc | fps: ' .. currentFPS .. ' / --')
    end 
end)

Library.KeybindFrame.Visible = false; -- todo: add a function for this

Library:OnUnload(function()
    print('Unloaded!')
    Library.Unloaded = true
end)

-- UI Settings
local MenuGroup = Tabs['UI Settings']:AddLeftGroupbox('Menu')

-- I set NoUI so it does not show up in the keybinds menu
MenuGroup:AddButton('Unload', function() Library:Unload() end)
MenuGroup:AddLabel('Menu bind'):AddKeyPicker('MenuKeybind', { Default = 'End', NoUI = true, Text = 'Menu keybind' })

Library.ToggleKeybind = Options.MenuKeybind -- Allows you to have a custom keybind for the menu

-- Addons:
-- SaveManager (Allows you to have a configuration system)
-- ThemeManager (Allows you to have a menu theme system)

-- Hand the library over to our managers
ThemeManager:SetLibrary(Library)
SaveManager:SetLibrary(Library)

-- Ignore keys that are used by ThemeManager.
-- (we dont want configs to save themes, do we?)
SaveManager:IgnoreThemeSettings()

-- Adds our MenuKeybind to the ignore list
-- (do you want each config to have a different menu key? probably not.)
SaveManager:SetIgnoreIndexes({ 'MenuKeybind' })

-- use case for doing it this way:
-- a script hub could have themes in a global folder
-- and game configs in a separate folder per game
ThemeManager:SetFolder('MyScriptHub')
SaveManager:SetFolder('MyScriptHub/specific-game')

-- Builds our config menu on the right side of our tab
SaveManager:BuildConfigSection(Tabs['UI Settings'])

-- Builds our theme menu (with plenty of built in themes) on the left side
-- NOTE: you can also call ThemeManager:ApplyToGroupbox to add it to a specific groupbox
ThemeManager:ApplyToTab(Tabs['UI Settings'])

-- You can use the SaveManager:LoadAutoloadConfig() to load a config
-- which has been marked to be one that auto loads!
SaveManager:LoadAutoloadConfig()

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: