Making Your First UI
This guide walks you through how to build your first UI layout using BDUK’s Lua-based config system.
No HTML or JS needed — just declare what you want using simple tables, then call build().
Basic Structure
A complete UI is made up of:
header– sits at the top of your UI with 3 sections (left/center/right)footer– fixed to the bottom, also with left/center/rightcontent– contains all main pages and components(optional)
sidebar– can be added later for tools or quick actions
Step 1: Define a UI Layout
Here’s a stripped-down version to start with:
local my_ui = {
header = {
layout = {
left = { justify = "flex-start" },
center = { justify = "center" },
right = { justify = "flex-end" },
},
elements = {
left = {
{
type = "group",
items = {
{ type = "logo", image = "bd_100.png" },
{ type = "text", title = "My UI", subtitle = "Made with BDUK" }
}
}
},
center = { { type = "tabs" } },
right = { { type = "namecard", avatar = "avatar_placeholder.jpg", name = "Player", title = "Developer", level = 1, tier = "gold" } }
}
},
content = {
pages = {
main_page = {
index = 1,
title = "Main Page",
layout = { center = 6 },
center = {
type = "input_groups",
title = "Options",
id = "basic_inputs",
layout = { columns = 1 },
groups = {
{
header = "General Settings",
inputs = {
{ id = "setting_1", type = "text", label = "Your Name" },
{ id = "setting_2", type = "number", label = "Age" }
}
}
},
buttons = {
{ id = "save", label = "Save", on_click = function(data) ... end, class = "primary" }
}
}
}
}
},
footer = {
layout = {
left = { justify = "flex-start" },
center = { justify = "center" },
right = { justify = "flex-end" },
},
elements = {
left = {
{
type = "buttons",
buttons = {
{ id = "back", label = "Back", on_click = function(data) ... end, class = "secondary" }
}
}
},
center = { { type = "text", text = "Made with 💙 by BOII Development" } },
right = {
{ type = "actions", actions = { { key = "E", label = "Confirm", on_keypress = function(data) ... end, }, { key = "ESC", label = "Close", on_keypress = function(data) ... end, } } }
}
}
}
}Step 2: Show the UI
Just trigger it using:
RegisterCommand("open_my_ui", function()
exports.bduk:build(my_ui)
end)Adding Components
Here’s a few things you can use inside your layout sections:
Type
Description
text
Shows a label or info line
logo
Displays a logo image
tabs
Adds tabbed navigation (auto-handled)
namecard
Shows a styled player profile card
buttons
One or more clickable buttons
input_groups
Grouped form fields (number/text/etc.)
cards
Panel cards with image, info, and buttons
actions
Shows keys like E or ESC to guide users
Pages Explained
The content.pages section defines every page in your UI:
content = {
pages = {
my_page = {
index = 1,
title = "My Page",
layout = { left = 3, center = 6, right = 3 },
center = {
type = "cards",
title = "Items",
layout = { columns = 2 },
cards = { ... }
}
}
}
}Each page has:
index: Page ordertitle: Page label (used in tabs)layout: Grid sizes forleft,center, andright(adds up to 12)left,center,right: Each holds a single component (e.g.cards,input_groups, etc.)
Tips
All
buttonscan include modals or datasetsTooltips and keybinds are built into cards via
on_hoverUse
datasetfields to pass IDs, source names, or action context
You’re Ready!
Try running:
/test_ui_builderOr rename your config and register it under your own command to test.
Last updated