{"id":"emdomanus/plinth","name":"plinth","scope":"emdomanus","platform":"roblox","description":"Reusable Plinth module for Roblox projects.","version":"0.1.3","latest":"0.1.3","versions":["0.1.0","0.1.1","0.1.2","0.1.3"],"license":"MIT","licenseRating":"safe","licenseCaveats":[],"licenseVerified":true,"dependencies":{"emdomanus/hook":{"version":"^0.1.0","alias":"hook"},"emdomanus/tempo":{"version":"^0.1.0","alias":"tempo"},"pepeeltoro41/ui-labs":{"version":"^2.4.2","alias":"ui-labs"},"centau/vide":{"version":"^0.4.0","alias":"vide"}},"integrity":"1e0006986329753f981cc0cf396f709745e9506736526569020bc496d3691d2a","likes":0,"downloads":0,"install":"forest install emdomanus/plinth","url":"https://forest.dev/p/roblox/emdomanus/plinth","files":"https://api.forest.dev/ai/package/roblox/emdomanus/plinth/files","readme":"# Plinth\n\nPlinth is a reactive Roblox UI package built around themed primitives, component-owned interaction state, and low-overhead runtime helpers.\n\n## Install\n\n```sh\naftman install\nwally install\n```\n\nPlinth's direct Wally dependencies are:\n\n```toml\nvide = \"centau/vide@0.4.0\"\nui-labs = \"pepeeltoro41/ui-labs@2.4.2\"\ntempo = \"emdomanus/tempo@0.1.0\"\nhook = \"emdomanus/hook@0.1.0\"\n```\n\nPlinth uses Tempo for internal scheduling and Hook for its shared pressable release fan-out.\n\n## Migration Notes\n\nThis package includes `MIGRATION.md` for developers and code agents updating older callers. The short version:\n\n- `Surface` and mount helpers are gone from the public path.\n- Parent content directly into `panel.content`, `button.content`, `tooltip.content`, or a handle's `host`.\n- Use `vTransparency`, `vScale`, and `vVisible` as explicit reactive channels instead of wrapper frames, `UIScale`, or `CanvasGroup` when possible.\n- Optional visual layers such as panel stroke and shadow may be unparented while invisible.\n\n## Runtime\n\nPlinth 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.\n\nConsumers do not need to step this Tempo manually; Plinth binds its internal heartbeat phase when the package runtime is required.\n\n## Assets\n\nPlinth 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:\n\n```lua\nlocal ReplicatedStorage = game:GetService(\"ReplicatedStorage\")\nlocal Plinth = require(Packages.plinth)\n\nPlinth.config.pathToImages = ReplicatedStorage.Assets.UI.Images\nPlinth.config.pathToSounds = ReplicatedStorage.Assets.UI.Sounds\n```\n\nIf an asset path is missing, lookups resolve blank/nil instead of throwing during package load.\n\n## Editor Sourcemap\n\nAfter `wally install`, regenerate the dev sourcemap and patch package thunks for Luau types:\n\n```powershell\nrojo sourcemap dev.project.json -o dev-sourcemap.json\nwally-package-types --sourcemap dev-sourcemap.json Packages\n```\n\nIf `rojo` is not on PATH:\n\n```powershell\n& $env:USERPROFILE\\.aftman\\tool-storage\\rojo-rbx\\rojo\\7.7.0-rc.1\\rojo.exe sourcemap dev.project.json -o dev-sourcemap.json\nwally-package-types --sourcemap dev-sourcemap.json Packages\n```\n\n## Build\n\n```sh\nrojo build default.project.json -o plinth.rbxm\n```\n\nThe package entrypoint is `src/init.luau`, which re-exports `src/plinth`.\n","readmeTruncated":false}