Skip to main content
Start with a built-in design preset. Change only the details you need. You can create a polished interface with the library’s existing options; a separate UI fork is unnecessary for a different palette, navigation style, spacing, or motion. This guide uses the GabibouUI ModuleScript installed in ReplicatedStorage.

1. Pick a starting design

Local rc.23 controls in a running Windows Roblox client These local-candidate screenshots show the interface in a Windows Roblox client. They document rendering; the game and other overlays are background content. Physical mobile rendering remains to be tested. Choose one of the four built-in presets: This small setup creates a window with two labeled pages and ordinary UI controls. It performs no game actions.
The presets are starting points, not locked templates. UI:Design accepts overrides such as Accent, Density, Radius, Tabs, Navigation, and Transparency.

2. Fit a phone or narrow panel

Responsive layout is on by default. The default breakpoint is 620 px, so a 375 px wide viewport uses the mobile layout. Keep tab titles visible: Rail keeps a distinct icon treatment while retaining the label, and the navigation scrolls when its tabs do not fit. Do not rely on icons alone to name a page. Keep touch targets at least 44 px high. The library’s default is 44 px; set it explicitly with Responsive when documenting or tuning a mobile window. Let controls stack under their labels on narrow rows, and leave the default 12 px screen margin unless your host requires a different safe area.
Width and Height are the preferred desktop size; responsive layout fits the window to smaller viewports. Tabs accepts Left, Right, Top, or Bottom. On mobile, MobileTabPosition accepts Top or Bottom. Check both a 375 × 667 viewport and the same viewport with the on-screen keyboard open. Verify labels, control descriptions, and the focused text field remain visible.

3. Adjust the details

Use a preset and override the actual option you want. Transparency and Layout.PanelTransparency range from 0 (opaque) to 1 (fully transparent); a value such as 0.08 keeps the panel readable while showing a little background through it. This affects the panel surface, not each control row.
Navigation.Variant accepts Classic, Soft, Pill, or Rail. Navigation.IconVariant accepts Outline, Soft, or Duotone. A tab can set its own IconVariant while keeping its title:
SetPosition takes a UDim2 position and optional Vector2 anchor. The example centers the window. For responsive panels, avoid hard-coded part offsets unless you have checked them at phone width and with the keyboard open. SetMotion accepts a duration in seconds and Roblox easing enums. window:SetReducedMotion(true) disables managed movement animations and is a good default when motion is not essential. Call SetMotion on the window to preview a transition; call SetReducedMotion when you want the reduced-motion setting to take precedence. The ZIP’s gabibou_ui source folder includes the complete design_showcase.luau example. It demonstrates a preset, responsive settings, a ready-to-use Appearance tab, labeled navigation, icon variants, and reduced-motion controls without connecting to game actions.

4. Reuse a named design

Register a design once when several windows share the same visual choices:
Use window:SetTheme, window:SetStyle, window:SetLayout, and window:SetNavigation to refine an existing window. Use window:Destroy() when it should be removed. See Appearance and responsive layout for valid ranges and Icons and branding for the icon catalogue.

Add a ready-to-use appearance tab

window:Appearance() adds a tab with controls for this window’s theme and accent, panel transparency, navigation style, tab placement, reduced motion, and animation duration. It uses the existing window setters. Changes affect this window only and the editor controls are not automatically saved. Configuration export only includes controls marked persistent; the appearance editor’s controls are nonpersistent.
Appearance accepts only Title, Icon, and Id. Title changes the tab label, Icon accepts a registered icon name or ID, and Id sets the prefix for the editor’s control IDs. If you omit Id, the library chooses an unused appearance prefix. The call returns a normal tab; appearanceTab:Destroy() removes the tab and its controls. No separate settings window, extra persistence layer, or UI fork is needed. The opt-in appearance editor showing its theme and accent controls

Matching access and loading screens

Apply the same Design preset to your window, key gate and loader. Their specific options remain independent: see Key systems and Loading screens for complete examples. Local rc.23 key-gate preview with player avatar and Verify, Get key, Cancel, and Discord actions The key preview uses a local validator that always rejects. The image does not demonstrate authentication, URL access or clipboard behavior. Local rc.23 centered loading preview at 68 percent The loading preview uses a manually supplied progress value. It does not measure asset-download progress. The editor includes Graphite, Aurora, Ember, and Custom theme choices. Custom restores the window’s opening theme colors before accent changes. Panel transparency ranges from 0 (opaque) to 1 (fully transparent). Navigation, tab position, reduced motion, and animation duration update this window through existing APIs. The ZIP includes appearance_example.luau in its gabibou_ui source folder as a complete UI-only setup.