Tags
Creators
Details
All versions
3.2.0-0.19.3
Release
HomeGui 3.2.04 months ago 15
Compatibility
Minecraft: Java Edition
1.21.10
Platform
Fabric
Supported environments
Client-side
Required content
Any compatible version
Changes
Interface
- Full rewrite of the rendering pipeline with a centralized dark theme palette (
Theme.java) replacing all default Minecraft widget styles - Custom
StyledButtonwidget extendingButtonwith per-instance background, border, accent, and text color overrides - Panel glow effect using a 2px semi-transparent accent layer rendered behind the main panel fill
- Favorite homes marked with a gold 3px left accent bar and persistent star glyph overlay
- Per-home teleport count rendered as a right-aligned dim overlay on each row
- Editable search field with placeholder text and real-time filtering via
EditBox.setResponder() - Contextual empty states with descriptive text depending on whether homes are missing or search returned no results
- Custom scrollbar with proportional thumb, accent-colored fill and border, positioned at the right edge of the list area
- Font-aware text truncation with ellipsis using
Theme.truncate()to prevent overflow in constrained layouts - Tooltip overlay drawn on top of all widgets with accent border, dark background, and multi-line content
Architecture
Theme.java— static utility class holding all color constants (BG,PANEL,CARD,ACCENT,GOLD,DANGER,SUCCESS,TEXT,DIM,FAINT,BORDER,BTN,BTN_HOV) and shared drawing primitives (fillBorder,drawPanel,drawCard,drawSeparator,drawTextCentered,truncate)StyledButton.java— extendsnet.minecraft.client.gui.components.Button(Mojang mappings), overrides onlyrenderWidget()for custom visual output while delegating click handling and narration to the parent classModConfig.getConfigPath()— lazy method replacing the former staticCONFIG_PATHfield to avoidFabricLoader.getInstance()invocation during class loading before Fabric runtime initialization- All screen interaction routed through widget
onClickcallbacks, eliminating method signature dependencies onmouseClicked(double, double, int),mouseClicked(MouseButtonEvent, boolean), andkeyPressed(int, int, int)which differ across Minecraft versions and mapping sets - Scroll state managed by
scrollOffsetwithneedsRebuildflag triggering full widget reconstruction on change to keep visible buttons in sync with the filtered list
Fixes
- Scroll input not reaching the home list because no
mouseClickedoverride could safely target the list area — resolved by routing all clicks throughStyledButtonwidgets that are rebuilt on scroll - Bottom navigation buttons rendering on top of home list entries due to missing vertical space allocation between the list area and the button row — resolved with explicit
listAreaTop/listAreaBottombounds mouseClicked(double, double, int)andkeyPressed(int, int, int)overrides causing compilation failures under Mojang mappings for Minecraft 1.21.10 whereScreenexpectsMouseButtonEventandKeyEventparameter types — removed entirely in favor of widget delegationrebuildWidgets()method name conflicting with an existingprotectedmethod inScreenbase class causing an access privilege error — renamed torebuildUI()CONFIG_PATHevaluated at static field initialization time causingNullPointerExceptionorNoClassDefFoundErrorwhenFabricLoaderwas not yet available — replaced with a lazygetConfigPath()method
Performance
- GitHub Actions workflow configured with Gradle build cache (
--build-cache) and dependency caching viagradle/actions/setup-gradle@v4 - Parallel task execution enabled with
--parallelflag - Virtualized list rendering limited to visible rows within
[scrollOffset, scrollOffset + visibleRows]with a ±1 margin for smooth scrolling - Widget rebuilds gated behind a
needsRebuildboolean checked once pertick()frame, preventing redundantclearWidgets()+ reconstruction cycles
Links
- 💬 Discord
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:AyBYdiRl:J7yKkvpq"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:AyBYdiRl:J7yKkvpq"
}

