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:

  • Surface and mount helpers are gone from the public path.
  • Parent content directly into panel.content, button.content, tooltip.content, or a handle's host.
  • Use vTransparency, vScale, and vVisible as explicit reactive channels instead of wrapper frames, UIScale, or CanvasGroup when 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.