Skip to content

Element Loading System

Basalt's Element Loading System allows you to load elements from different sources: local files, disk mounts, and even directly from the web.

Getting the Element Manager

lua
local basalt = require("basalt")
local elementManager = basalt.getElementManager()

Configuration

Configure the loading behavior:

lua
elementManager.configure({
    autoLoadMissing = true,           -- Auto-load elements that aren't found
    allowRemoteLoading = true,        -- Enable loading from URLs
    allowDiskLoading = true,          -- Enable loading from disk mounts
    useGlobalCache = true,            -- Cache loaded elements in _G
    globalCacheName = "_BASALT_CACHE" -- Name of the global cache variable
})

Loading from Disk

Register disk mount points to load elements from external locations:

lua
-- Register a disk mount
elementManager.registerDiskMount("/disk/basalt-elements")

-- Elements in /disk/basalt-elements/elements/ are now available
local main = basalt.getMainFrame()
local customButton = main:addCustomButton()  -- Loads from disk

Loading from Remote URLs

Load elements directly from the web:

lua
-- Enable remote loading
elementManager.configure({
    allowRemoteLoading = true
})

-- Register a remote source
elementManager.registerRemoteSource(
    "CustomElement",
    "https://example.com/elements/CustomElement.lua"
)

-- Use the element
local main = basalt.getMainFrame()
local custom = main:addCustomElement()

Manual Element Loading

Load elements manually when needed:

lua
-- Load a specific element
elementManager.loadElement("Button")

-- Get an element (loads it if not already loaded)
local ButtonClass = elementManager.getElement("Button")

-- Check if an element exists
if elementManager.hasElement("CustomWidget") then
    elementManager.loadElement("CustomWidget")
end

-- Check if an element is loaded
if not elementManager.isElementLoaded("Label") then
    elementManager.loadElement("Label")
end

Preloading Elements

Preload multiple elements at startup for better performance:

lua
-- Preload commonly used elements
elementManager.preloadElements({
    "Button",
    "Label",
    "Frame",
    "Input"
})

Cache Management

When using useGlobalCache, elements are cached in _G for reuse:

lua
-- Get cache statistics
local stats = elementManager.getCacheStats()
print("Cached elements: " .. stats.size)
for _, name in ipairs(stats.elements) do
    print("- " .. name)
end

-- Clear the cache
elementManager.clearGlobalCache()

Complete Example

lua
local basalt = require("basalt")
local elementManager = basalt.getElementManager()

-- Configure loading system
elementManager.configure({
    autoLoadMissing = true,
    allowRemoteLoading = true,
    allowDiskLoading = true,
    useGlobalCache = true
})

-- Register disk mount for custom elements
if fs.exists("/disk") then
    elementManager.registerDiskMount("/disk")
end

-- Register remote element
elementManager.registerRemoteSource(
    "SpecialButton",
    "https://raw.githubusercontent.com/user/repo/main/SpecialButton.lua"
)

-- Preload common elements
elementManager.preloadElements({"Button", "Label", "Frame"})

-- Use elements normally
local main = basalt.getMainFrame()

local btn = main:addButton()
    :setText("Standard Button")
    :setPosition(2, 2)

-- This will be loaded from disk or remote if available
local special = main:addSpecialButton()
    :setText("Special Button")
    :setPosition(2, 4)

basalt.run()

Use Cases

Remote Element Library

Load elements from a central repository:

lua
local repository = "https://raw.githubusercontent.com/Basalt2/main/src/elements/"

elementManager.configure({allowRemoteLoading = true})
elementManager.registerRemoteSource("Chart", repository .. "Chart.lua")
elementManager.registerRemoteSource("DataGrid", repository .. "DataGrid.lua")

Notes

  • Remote loading requires HTTP API to be enabled in CC:Tweaked config
  • Disk loading looks for elements/ subfolder in the mount path
  • Elements must follow Basalt's element structure
  • Global cache persists across basalt.run() calls if not cleared
  • Auto-loading tries disk mounts first, then remote sources

Released under the MIT License.