emdomanus/plinth
Reactive Roblox UI primitives, modifiers, and components.
Plinth
Plinth is a reactive Roblox UI package built around themed primitives, component-owned interaction state, and low-overhead runtime helpers.
Install
aftman install
pesde install
Plinth's direct pesde dependencies are:
vide = { name = "centau/vide", version = "^0.4.0" }
tempo = { name = "emdomanus/tempo", version = "^0.1.1" }
advancedUtils = { name = "emdomanus/advanced_utils", version = "^0.1.0" }
Plinth uses Tempo for internal scheduling and advancedUtils Hook for its shared pressable release fan-out. Local stories use uiLabs as a pesde dev dependency.
Migration Notes
This package includes MIGRATION.md for developers and code agents updating older callers. The short version:
Surfaceand mount helpers are gone from the public path.- Parent content directly into
panel.content,button.content,tooltip.content, or a handle'shost. - Use
vTransparency,vScale, andvVisibleas explicit reactive channels instead of wrapper frames,UIScale, orCanvasGroupwhen possible. - Optional visual layers such as panel stroke and shadow may be unparented while invisible.
Runtime
Plinth owns a private Tempo instance for internal UI timing. Components use it for delayed visibility and interaction cleanup instead of spawning per-component delay threads or using Plinth's old scheduler utility.
Consumers do not need to step this Tempo manually; Plinth binds its internal heartbeat phase when the package runtime is required.
Assets
Plinth can load without asset folders. If you use named image or sound assets, set these after requiring the package and before creating components that resolve named assets:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Plinth = require(ReplicatedStorage.packages.plinth)
Plinth.config.pathToImages = ReplicatedStorage.Assets.UI.Images
Plinth.config.pathToSounds = ReplicatedStorage.Assets.UI.Sounds
If an asset path is missing, lookups resolve blank/nil instead of throwing during package load.
Editor Sourcemap
After pesde install, regenerate the dev sourcemap:
rojo sourcemap dev.project.json -o dev-sourcemap.json
If rojo is not on PATH:
& $env:USERPROFILE\.aftman\tool-storage\rojo-rbx\rojo\7.7.0-rc.1\rojo.exe sourcemap dev.project.json -o dev-sourcemap.json
Build
rojo build default.project.json -o plinth.rbxm
The package entrypoint is src/init.luau, which re-exports src/plinth.