{"id":"luminalabsgames/iris","name":"iris","scope":"luminalabsgames","platform":"roblox","description":"SirMallard/iris 2.5.1 plus upstream main's later fixes and LuminaLabs patches: combos and other hit tests stay aligned when Iris loads before the topbar, late tabs show the right page, crowded tab bars scroll, and new widgets keep their call order","version":"2.5.3","latest":"2.5.3","versions":["2.5.2","2.5.3"],"license":"MIT","licenseRating":"safe","licenseCaveats":[],"licenseVerified":true,"dependencies":{},"integrity":"d6f686418b78139d4ced739325a2bf61d29c6901c562b4764f550791a261618b","likes":0,"downloads":0,"install":"forest install luminalabsgames/iris","url":"https://forest.dev/p/roblox/luminalabsgames/iris","files":"https://api.forest.dev/ai/package/roblox/luminalabsgames/iris/files","readme":"# Iris (LuminaLabs)\n\n[SirMallard/iris](https://github.com/SirMallard/Iris), the immediate-mode debug UI library, with the\nfixes every LuminaLabs game had been carrying in its own vendored copy. Use it in place of\n`sirmallard/iris`; the API is unchanged.\n\n```toml\n# wally.toml\n[dependencies]\nIris = \"luminalabsgames/iris@2.5.3\"\n```\n\n## What's in it\n\nThe base is upstream `main` at `1043909` (2026-10-19), which is the 2.5.1 release plus these fixes\nfrom after it:\n\n- A widget whose type changes under the same ID is now rebuilt instead of reused (#124).\n- A Table that has been removed no longer errors in its per-frame border update (#129).\n- `Iris.Init`'s `allowMultipleInits` argument is typed as optional (#127).\n\nOn top of that, four LuminaLabs patches, each marked with a comment in the source:\n\n- **Mouse offset** (`widgets/init.lua`). Upstream reads the topbar inset once, when Iris loads. If\n  that happens during client startup before the topbar has settled, the inset reads as (0, 0) and\n  every mouse position comes in about 58px too low for the rest of the session. Combos close\n  whenever a click or wheel scroll lands outside their rectangles, so items near the bottom of a\n  dropdown could not be picked, and scrolling the list closed it. The patch keeps listening for\n  topbar changes and reads the inset fresh on each `getMouseLocation`.\n- **Late tabs** (`widgets/Tab.lua`). A Tab added to a TabBar after its first frame showed its\n  contents even while another tab was selected, because nothing changed the index state to hide it.\n  It now takes its visibility from the current index when it is added.\n- **Scrolling tab bar** (`widgets/Tab.lua`). The tab strip is a horizontal ScrollingFrame, so a\n  crowded TabBar scrolls sideways instead of overflowing the window.\n- **New widget order** (`Internal.lua`, `_GenNewWidget`). Upstream works out a new widget's\n  position among its siblings but only writes it to the Instance's `ZIndex` and `LayoutOrder` when\n  an existing widget moves, so every new widget started at `LayoutOrder` 0. The parent's\n  UIListLayout then fell back to creation order, and a row that first appeared among older siblings\n  (a conditional row, a filtered list) drew at the bottom. New widgets now get both on creation,\n  before they are parented, so Window's MenuBar override still applies. Window and Tooltip are\n  skipped, as `_Insert` skips them.\n\n`Internal._version` reads `2.5.3`, so the demo window shows which build is running.\n\n## Updating from upstream\n\nThe files keep upstream's names (`.lua`) and layout so they diff cleanly against\n`SirMallard/Iris/lib`. To take a new upstream release, copy its `lib/` over `src/`, put the four\npatches back (search for `Patched (luminalabsgames/iris): upstream uses a one-shot TopbarInset`,\n`Tabs added after the TabBar's first frame`, `horizontally-scrolling frame` and `Patched\n(luminalabsgames/iris): upstream sets thisWidget.ZIndex` in this version), check whether upstream\nfixed any of them itself, then bump `version` here and `Internal._version`. Publish with `wally publish` from this\nfolder.\n\nAlready fixed upstream, so no longer patched here: the Combo dropdown spilling off the bottom of the\nscreen (2.4 measures it with the list's `AbsoluteContentSize` and flips or scrolls it), and\n`Iris.ComboEnum`'s default state (`enumType:GetEnumItems()[1]`). SlayABaddie's copy, based on\n2.3.1, still patches both by hand.\n\n## License\n\nMIT, from upstream. See [LICENSE](LICENSE).\n","readmeTruncated":false}