Introduction
This is the written documentation for the ArrayField Interface Suite.
Why choose ArrayField?
🎨 Fully Themeable — Multiple built-in themes with custom theme support, switchable in-app
📂 Category System — Organize tabs into collapsible sidebar groups
🖥️ Built-in Console — Terminal-style log viewer with color coded entries
🔔 Rich Notifications — Notifications with action buttons and icons
💾 Auto Configuration Saving — Togglable from the in-app settings panel
🔓 Open Source — Fully open source and free to use
💃 Excellent Performance
Getting Started
To get started with ArrayField, check out the sidebar on the left. It provides quick links to help you use all ArrayField features in your project.
Found a missing feature? Please suggest it on Discord and even consider contributing on GitHub!
Booting the Library
Loading ArrayField
local ArrayField = loadstring(game:HttpGet('https://raw.githubusercontent.com/vqmpjayZ/laboratory/refs/heads/main/ArrayField/ArrayField.lua'))()Enabling Configuration Saving
- Set a
FolderNameandFileNamein theConfigurationSavingtable ofCreateWindow - Choose a unique
Flagidentifier for each supported element you create - The user can enable or disable config saving from the in-app settings panel
ArrayField will automatically save and load the configuration when the user enables it from settings.
Windows
Creating a Window
local Window = ArrayField:CreateWindow({
Name = "My Script Hub",
Icon = "shield",
LoadingTitle = "Loading Script Hub",
LoadingSubtitle = "by YourName",
ConfigurationSaving = {
FolderName = "MyScriptHub",
FileName = "Config"
}
})Creating a Tab
local Tab = Window:CreateTab("Tab Example", "home")Lucide Icon Support
Use Lucide Icons by passing the icon name as a string:
local Tab = Window:CreateTab("Combat", "sword")Or Roblox asset IDs:
local Tab = Window:CreateTab("Tab Example", 4483362458)All Lucide Icons · Supported Lucide Icons
Creating a Category
Categories organize tabs into collapsible groups in the sidebar.
local MainCategory = Window:CreateCategory("Main Features", {DefaultOpen = true})Pass the category as the third argument to CreateTab:
local PlayerTab = Window:CreateTab("Player", "user", MainCategory)Creating a Section
local Section = Tab:CreateSection("Section Example")Updating a Section
Section:Set("New Title")Separators & Spacing
Tab:CreateSeparator(Section, {
Title = "Advanced Settings",
Width = 0.9,
Padding = 10
})
Tab:CreateSpacing(Section, 15)Visibility & Destroying
ArrayField:SetVisibility(false)
ArrayField:IsVisible()
ArrayField:Destroy()Themes
All themes are designed to display ArrayField in its best form. Users can switch themes at any time from the in-app settings panel.
Using Themes
Optionally set a default theme via DefaultTheme in CreateWindow:
local Window = ArrayField:CreateWindow({
Name = "My Hub",
DefaultTheme = "Ocean"
})Setting DefaultTheme overrides the user's previously selected theme on every execution. Omit it to let users keep their choice.
Themes Available
Default, AmberGlow, Amethyst, Bloom, DarkBlue, Green, Light, Ocean, SerenityCustom Themes
Create your own theme by defining a table with all color properties:
{
TextColor = Color3.fromRGB(240, 240, 240),
Background = Color3.fromRGB(25, 25, 25),
Topbar = Color3.fromRGB(34, 34, 34),
Shadow = Color3.fromRGB(20, 20, 20),
NotificationBackground = Color3.fromRGB(20, 20, 20),
NotificationActionsBackground = Color3.fromRGB(230, 230, 230),
TabBackground = Color3.fromRGB(80, 80, 80),
TabStroke = Color3.fromRGB(85, 85, 85),
TabBackgroundSelected = Color3.fromRGB(210, 210, 210),
TabTextColor = Color3.fromRGB(240, 240, 240),
SelectedTabTextColor = Color3.fromRGB(50, 50, 50),
ElementBackground = Color3.fromRGB(35, 35, 35),
ElementBackgroundHover = Color3.fromRGB(40, 40, 40),
SecondaryElementBackground = Color3.fromRGB(25, 25, 25),
ElementStroke = Color3.fromRGB(50, 50, 50),
SecondaryElementStroke = Color3.fromRGB(40, 40, 40),
SliderBackground = Color3.fromRGB(50, 138, 220),
SliderProgress = Color3.fromRGB(50, 138, 220),
SliderStroke = Color3.fromRGB(58, 163, 255),
ToggleBackground = Color3.fromRGB(30, 30, 30),
ToggleEnabled = Color3.fromRGB(0, 146, 214),
ToggleDisabled = Color3.fromRGB(100, 100, 100),
ToggleEnabledStroke = Color3.fromRGB(0, 170, 255),
ToggleDisabledStroke = Color3.fromRGB(125, 125, 125),
ToggleEnabledOuterStroke = Color3.fromRGB(100, 100, 100),
ToggleDisabledOuterStroke = Color3.fromRGB(65, 65, 65),
DropdownSelected = Color3.fromRGB(40, 40, 40),
DropdownUnselected = Color3.fromRGB(30, 30, 30),
InputBackground = Color3.fromRGB(30, 30, 30),
InputStroke = Color3.fromRGB(65, 65, 65),
PlaceholderColor = Color3.fromRGB(178, 178, 178)
}Buttons
Tab:CreateButton({
Name = "Click Me",
Description = "Appears on hover",
Interact = "click",
SectionParent = Section,
Callback = function()
print("Button clicked!")
end
})Toggles
local Toggle = Tab:CreateToggle({
Name = "Speed Boost",
Description = "Increases movement speed",
CurrentValue = false,
Flag = "SpeedToggle",
SectionParent = Section,
Callback = function(Value)
print("Speed Boost:", Value)
end
})
Toggle:Set(true)
Toggle:Lock("Premium feature")
Toggle:Unlock()Sliders
local Slider = Tab:CreateSlider({
Name = "Speed Multiplier",
Range = {1, 10},
Increment = 0.5,
Suffix = "x",
CurrentValue = 1,
Flag = "SpeedValue",
Callback = function(Value)
print("Speed:", Value)
end
})
Slider:Set(5)Text Inputs
local Input = Tab:CreateInput({
Name = "Username",
PlaceholderText = "Type here...",
RemoveTextAfterFocusLost = false,
NumbersOnly = false,
CharacterLimit = 20,
Callback = function(Text)
print("Input:", Text)
end
})
Input:Set("NewUsername")Keybinds
local Keybind = Tab:CreateKeybind({
Name = "Fly Key",
CurrentKeybind = "F",
HoldToInteract = false,
Flag = "FlyKey",
Callback = function()
print("Fly key pressed!")
end
})
Keybind:Set("G")Dropdowns
Single Selection
local Dropdown = Tab:CreateDropdown({
Name = "Select Weapon",
Options = {"Sword", "Axe", "Spear", "Bow"},
CurrentOption = "Sword",
MultiSelection = false,
Callback = function(Option)
print("Selected:", Option)
end
})Multi Selection
local Features = Tab:CreateDropdown({
Name = "Enable Features",
Options = {"Auto Heal", "Auto Attack", "Auto Block"},
CurrentOption = {"Auto Heal"},
MultiSelection = true,
Callback = function(Option)
print("Toggled:", Option)
end
})Methods
Dropdown:Set("Bow")
Dropdown:Add({"Dagger", "Staff"})
Dropdown:Remove("Sword")
Dropdown:Refresh({"Katana", "Claymore"}, "Katana")Color Pickers
local ColorPicker = Tab:CreateColorPicker({
Name = "ESP Color",
Color = Color3.fromRGB(255, 0, 0),
Flag = "ESPColor",
Callback = function(Color)
print("Color:", Color)
end
})
ColorPicker:Set(Color3.fromRGB(0, 255, 0))Labels
Tab:CreateLabel({
Text = "Welcome to my script!",
Icon = "keyboard",
Background = "warn", -- "warn", "success", "error", or hex "#FF69B4"
SectionParent = Section
})Paragraphs
local Paragraph = Tab:CreateParagraph({
Title = "<b>Getting Started</b>",
Content = "This script includes powerful features.",
Icon = "info",
Background = "success",
SectionParent = Section
})
Paragraph:Set({Title = "Updated", Content = "New content"})Supports RichText in both Title and Content. Same Background options as Labels.
Images
Tab:CreateImage(Section, {
Image = "https://example.com/image.png",
Width = 200,
Height = 200,
Transparency = 0
})Accepts URLs, asset IDs, or file paths.
Console
A built-in terminal-style log viewer with color coded entries, timestamps, auto-scroll, selectable text, and a configurable max line limit.
Creating a Console
local Console = Tab:CreateConsole({
Title = "Remote Logger",
Icon = "terminal",
MaxLines = 200,
Height = 150,
Timestamps = true,
SectionParent = Section
})Logging Methods
Console:Log("Script initialized") -- Gray [LOG]
Console:Info("Listening for remotes") -- Blue [INFO]
Console:Success("Connected") -- Green [OK]
Console:Warn("Rate limit near") -- Yellow [WARN]
Console:Error("Failed to fetch") -- Red [ERROR]
Console:Clear()The console has a copy button to copy all entries and a trash button to clear (click once to confirm, click again within 2 seconds to clear). Entries are selectable — click any line to select and copy text from it. It also auto-scrolls to the latest entry.
Notifications
Simple Notification
ArrayField:Notify({
Title = "Success",
Content = "Script loaded!",
Duration = 5,
Image = "check-circle"
})With Actions
ArrayField:Notify({
Title = "Update Available",
Content = "A new version is ready.",
Image = "download",
Actions = {
{Name = "Update", Callback = function() print("Updating") end},
{Name = "Later", Callback = function() print("Dismissed") end}
}
})Prompts & Dialogs
Note Prompt
Window:NotePrompt({
Title = "Welcome!",
Description = "Thanks for using this script",
Icon = "sparkles",
Callback = function() print("OK") end
})Confirmation Dialog
Window:Prompt({
Title = "Confirm Action",
SubTitle = "Are you sure?",
Content = "This cannot be undone.",
Actions = {
Confirm = {Name = "Yes", Callback = function() print("Yes") end},
Cancel = {Name = "No", Callback = function() print("No") end}
}
})Universal Methods
All interactive elements support these common methods:
Element:Lock("Reason text")
Element:Unlock()
Element:Visible(false)
Element:Visible(true)
Element:Destroy()Saving & Loading
When ConfigurationSaving is set and the user enables it from settings, ArrayField automatically saves and loads element values using Flag identifiers.
ArrayField.SaveConfiguration()
ArrayField.LoadConfiguration()
print(ArrayField.Flags["SpeedToggle"].CurrentValue)Destroying the UI
ArrayField:Destroy()Completely removes the interface and cleans up all connections.
Full Template
A complete usage example demonstrating all ArrayField features. Copy this as a starting point.
local ArrayField = loadstring(game:HttpGet('https://raw.githubusercontent.com/vqmpjayZ/laboratory/refs/heads/main/ArrayField/ArrayField.lua'))()
-- ============================
-- WINDOW CREATION
-- ============================
local Window = ArrayField:CreateWindow({
Name = "My Script Hub",
Icon = "shield",
LoadingTitle = "Loading Script Hub",
LoadingSubtitle = "by YourName",
-- DefaultTheme = "Default",
ConfigurationSaving = {
FolderName = "MyScriptHub",
FileName = "Config"
}
})
-- ============================
-- CATEGORIES & TABS
-- ============================
local MainTab = Window:CreateTab("Main", "home")
local CombatTab = Window:CreateTab("Combat", "sword")
local VisualsTab = Window:CreateTab("Visuals", "eye")
local MainCategory = Window:CreateCategory("Main Features", {DefaultOpen = true})
local SettingsCategory = Window:CreateCategory("Settings", {DefaultOpen = false})
local PlayerTab = Window:CreateTab("Player", "user", MainCategory)
local ConfigTab = Window:CreateTab("Config", "settings", SettingsCategory)
-- ============================
-- SECTIONS
-- ============================
local WelcomeSection = MainTab:CreateSection("Welcome")
local MovementSection = MainTab:CreateSection("Movement")
-- ============================
-- LABELS & PARAGRAPHS
-- ============================
MainTab:CreateLabel({
Text = "Welcome to my script!",
SectionParent = WelcomeSection
})
MainTab:CreateLabel({
Text = "Press K to toggle the UI",
Icon = "keyboard",
SectionParent = WelcomeSection
})
MainTab:CreateLabel({
Text = "Warning: Use at your own risk!",
Background = "warn",
SectionParent = WelcomeSection
})
MainTab:CreateParagraph({
Title = "<b>Getting Started</b>",
Content = "This script includes <i>powerful features</i> for your game.",
Icon = "info",
Background = "success",
SectionParent = WelcomeSection
})
-- ============================
-- CONSOLE
-- ============================
local MyConsole = MainTab:CreateConsole({
Title = "Event Logger",
Icon = "terminal",
MaxLines = 200,
Height = 150,
Timestamps = true,
SectionParent = WelcomeSection
})
MyConsole:Log("Script initialized")
MyConsole:Info("Listening for events")
MyConsole:Success("Connected to server")
MyConsole:Warn("Rate limit approaching")
MyConsole:Error("Failed to fetch data")
-- ============================
-- BUTTONS
-- ============================
MainTab:CreateButton({
Name = "Click Me",
Description = "This description appears on hover",
Interact = "click",
SectionParent = MovementSection,
Callback = function()
print("Button clicked!")
end
})
-- ============================
-- TOGGLES
-- ============================
local SpeedToggle = MainTab:CreateToggle({
Name = "Speed Boost",
Description = "Increases your movement speed",
CurrentValue = false,
Flag = "SpeedToggle",
SectionParent = MovementSection,
Callback = function(Value)
print("Speed Boost:", Value)
end
})
SpeedToggle:Set(true)
SpeedToggle:Lock("Feature disabled")
SpeedToggle:Unlock()
-- ============================
-- SLIDERS
-- ============================
local SpeedSlider = MainTab:CreateSlider({
Name = "Speed Multiplier",
Description = "Adjust your speed from 1x to 10x",
Range = {1, 10},
Increment = 0.5,
Suffix = "x",
CurrentValue = 1,
Flag = "SpeedValue",
SectionParent = MovementSection,
Callback = function(Value)
print("Speed set to:", Value)
end
})
SpeedSlider:Set(5)
-- ============================
-- TEXT INPUTS
-- ============================
local UsernameInput = MainTab:CreateInput({
Name = "Username",
Description = "Enter a player's username",
PlaceholderText = "Type here...",
RemoveTextAfterFocusLost = false,
NumbersOnly = false,
CharacterLimit = 20,
OnEnter = false,
SectionParent = WelcomeSection,
Callback = function(Text)
print("Input text:", Text)
end
})
UsernameInput:Set("NewUsername")
-- ============================
-- KEYBINDS
-- ============================
local FlyKeybind = MainTab:CreateKeybind({
Name = "Fly Key",
Description = "Press to toggle flight",
CurrentKeybind = "F",
HoldToInteract = false,
Flag = "FlyKey",
SectionParent = MovementSection,
Callback = function(IsHeld)
print("Fly key pressed!")
end
})
FlyKeybind:Set("G")
-- ============================
-- DROPDOWNS
-- ============================
local WeaponDropdown = CombatTab:CreateDropdown({
Name = "Select Weapon",
Options = {"Sword", "Axe", "Spear", "Bow"},
CurrentOption = "Sword",
MultiSelection = false,
Flag = "SelectedWeapon",
Callback = function(Option)
print("Selected:", Option)
end
})
local FeaturesDropdown = CombatTab:CreateDropdown({
Name = "Enable Features",
Options = {"Auto Heal", "Auto Attack", "Auto Block", "Auto Dodge"},
CurrentOption = {"Auto Heal"},
MultiSelection = true,
Flag = "EnabledFeatures",
Callback = function(Option)
print("Toggled:", Option)
end
})
WeaponDropdown:Set("Bow")
WeaponDropdown:Add({"Dagger", "Staff"})
WeaponDropdown:Remove("Sword")
WeaponDropdown:Refresh({"Katana", "Claymore"}, "Katana")
-- ============================
-- COLOR PICKERS
-- ============================
local ESPColor = VisualsTab:CreateColorPicker({
Name = "ESP Color",
Color = Color3.fromRGB(255, 0, 0),
Flag = "ESPColor",
Callback = function(Color)
print("Color changed:", Color)
end
})
ESPColor:Set(Color3.fromRGB(0, 255, 0))
-- ============================
-- IMAGES
-- ============================
MainTab:CreateImage(WelcomeSection, {
Image = "https://example.com/image.png",
Width = 200,
Height = 200,
Transparency = 0
})
-- ============================
-- SEPARATORS & SPACING
-- ============================
MainTab:CreateSeparator(MovementSection, {
Title = "Advanced Settings",
Width = 0.9,
Padding = 10
})
MainTab:CreateSpacing(MovementSection, 15)
-- ============================
-- NOTIFICATIONS
-- ============================
ArrayField:Notify({
Title = "Success",
Content = "Script loaded successfully!",
Duration = 5,
Image = "check-circle"
})
ArrayField:Notify({
Title = "Update Available",
Content = "A new version is ready. Update now?",
Image = "download",
Actions = {
{Name = "Update", Callback = function() print("Updating...") end},
{Name = "Later", Callback = function() print("Cancelled") end}
}
})
-- ============================
-- PROMPTS & DIALOGS
-- ============================
Window:NotePrompt({
Title = "Welcome!",
Description = "Thanks for using this script",
Icon = "sparkles",
Callback = function()
print("User clicked OK")
end
})
Window:Prompt({
Title = "Confirm Action",
SubTitle = "Are you sure?",
Content = "This action cannot be undone.",
Actions = {
Confirm = {Name = "Yes", Callback = function() print("Confirmed") end},
Cancel = {Name = "No", Callback = function() print("Cancelled") end}
}
})
-- ============================
-- UNIVERSAL ELEMENT METHODS
-- ============================
SpeedToggle:Lock("Premium feature")
SpeedToggle:Unlock()
SpeedToggle:Visible(false)
SpeedToggle:Visible(true)
-- ============================
-- SAVING & LOADING
-- ============================
ArrayField.SaveConfiguration()
ArrayField.LoadConfiguration()
print(ArrayField.Flags["SpeedToggle"].CurrentValue)
-- ArrayField:Destroy()