Tags
Creators
Details
Licensed Apache-2.0
Published 5 months ago
Updated 6 months ago
All versions
0.1.5
Alpha
VoxelUI 0.1.56 months ago 27
Compatibility
Minecraft: Java Edition
1.21.1
Platform
NeoForge
Supported environments
Client and server
Changes
Changelog
[0.1.5]
Added
- reusable UI shader rendering subsystem with
UiRenderService,UiShaderPipeline,UiShaderManager, render commands, layers, and CPU fallback renderers - shader resources for procedural UI shapes and masked textures under
assets/voxelui/shaders/core Herocomponent with hexagonal rendering, masked image slot, accent line, XML support, and showcase examples- shared shader-based rendering path for
Badge - unit coverage for
Heroand the shader pipeline fallback/service flow - generic render style hooks on
UINodefor shape, border, fill, accent, mask shape, corner style, and shader variant resolution - lightweight writable XML bindings through
UiWritableBinding, including bidirectionalselected-indexsynchronization for components such asDropdown,Tabs, andInventoryGrid - framework-wide reactive state primitives through
UiObservableValue<T>,UiWritableValue<T>, andUiState - node-level invalidation APIs on
UINodewithinvalidateRender(),invalidateLayout(), andinvalidateMeasure() - XML-exposed
dialogsupport, including reactivevisible="{{...}}"integration with the existing modal layer - protected
notify(...)helpers onXmlUIScreenfor toast-like overlay notifications from XML screen actions <if condition="...">structural XML tag for conditional rendering; wraps its children in a transparent panel whose visibility reacts to the bound condition without rebuilding the layout tree- optional
<else>child inside<if>for a two-branch conditional; the two branches are toggled reactively when the condition changes findById(String id)andfindById(String id, Class<T> type)methods onXmlUIScreen, backed by a recursive tree search onUINode; removes the need for manual tree traversal inafterBuildUi(...)idattribute set onUINodeduring XML mapping so any node declared withid="foo"in XML is immediately findable viafindById- host-agnostic
UiRuntime/UiHostruntime layer shared betweenUIScreenand global overlays - global overlay system with
GlobalUiOverlayManager,GlobalUiOverlayOptions, andVoxelUiOverlays - public APIs for global
showToast(...),showOverlay(...),showModal(...),close(...), andcloseAll() - demo XML resources for a global overlay and a global modal under
assets/voxelui/ui - client dev commands
/voxelui toast,/voxelui overlay,/voxelui modal,/voxelui closeall, and/voxelui reload UiOverlayContextandUiXmlDialogControllerabstractions to keep modals and notifications on one coherent system
Changed
- VoxelUI now compensates for Minecraft
gui scaleat the screen level so custom UI stays readable without being truncated when the player increases the game GUI scale UIScreennow renders the UI in a virtual layout space with consistent mouse coordinate remapping, overlay layering, and centered root layout resolution- many base components now scale more consistently with the UI system, including
Button,Checkbox,Dialog,Divider,Dropdown,Grid,Label,NumberInput,Panel,ProgressBar,ScrollPanel,TextInput, and notifications - buttons now support dynamic sizing, percentage widths, size presets, and XML-driven width values such as
15% - the XML mapper now accepts more reusable UI attributes, including button sizing fields and generic render/shader-related style properties
- XML screen action registration now accepts typed handlers, allowing XML events to resolve either
Runnablecallbacks orConsumer<T>listeners depending on the component event payload UIScreen.ensureLayoutCurrent()now reacts to dirty nodes in the existing tree instead of relying only on screen-wide layout dirtiness- XML bindings can now subscribe directly to observable values and invalidate the mapped component without rebuilding the whole screen
UiWritableBindingis now aligned with the new observable state API instead of being a standalone binding model- value-driven updates on
Label,TextInput,NumberInput,Checkbox,Slider,Dropdown,Tabs,ProgressBar, andInventoryGridnow use local invalidation rather than full layout reloads - dialogs declared in XML are now mounted outside the normal layout flow and synchronized automatically with
UIScreen.showModal(...) Dialognow supports XML-driven custom content without forcing the built-in confirm/cancel button row- the showcase screen and MCSS demo content were expanded to cover dynamic button sizing and hero visual variants
- the hero rendering geometry was consolidated so the shader, content layout, image placement, and accent line all use the same computed bounds
UINodenow stores its declaredidand exposessetId,getId, andfindByIdfor programmatic node lookupUIScreennow delegates layout, render, notifications, modal management, and input dispatch to the sharedUiRuntimeXmlUIScreennow reuses the shared runtime and synchronizes XML<dialog>nodes throughUiXmlDialogControllerModalandNotificationnow target a shared overlay context instead of depending directly onUIScreen
Fixed
- UI clipping and inconsistent perceived sizing across higher Minecraft
gui scalevalues - root layout centering drift that made some screens appear to shift horizontally as the GUI scale changed
- missing and limited XML change-event support on interactive inputs;
Dropdown,TextInput,NumberInput,Checkbox, andSlidercan now propagate typed values directly from XML-declared handlers - the previous limitation where common Java state changes required
reloadLayout()even for simple value updates; observable bindings can now trigger targeted relayouts on existing nodes - the previous XML gap where confirmation dialogs required
afterBuildUi(...)and manual Java wiring even for simple modal flows - XML validation gaps for newer component attributes such as button
size,height, and percentage width fields - several hero rendering issues around hexagon proportions, content overlap, internal insets, and top/bottom truncation
- shader/log noise caused by uniforms declared or pushed inconsistently between the pipeline and shader JSON definitions
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:G9IleGGI:pYdukLIq"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:G9IleGGI:pYdukLIq"
}

