Tags
Creators
Details
0.3.0
Compatibility
Changes
Changelog
[0.3.0] - Unreleased
Added
-
maxHeight/max-heightsupport across XML mapping andUINode, including fluent API accessors and layout/runtime height clamping for screen roots and children -
offline SDF text pipeline based on
msdf-atlas-genassets withroboto_mono_sdf.png/json -
SdfFontAtlasresource loading andSdfUiTextRendereras the primary UI text path, with compatibility fallback kept as safety -
frame-level text command batching with
UiTextCommand,UiTextRenderService, and runtime text flush integration -
clip-aware text rendering so batched text respects
ScrollPanel,ListView, and other viewport constraints -
phase showcases dedicated to migration progress, including phase 4 coverage for
ItemSlot -
explicit dropdown sub-part styling hooks for header, menu, option, and hover-related visual states
-
partial-corner support in the shape shader path, enabling menu/tab indicators to follow parent rounding more closely
-
refactored
ItemSlotas a standalone interactive slot widget with states such asselected,disabled,highlighted,empty, optional badges, empty labels, and tooltip overlay handling -
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 -
public extension point for third-party mods to register custom XML components via
ComponentMapper,MappingContext, andComponentMapperRegistry -
BoxDecorationandVisualEffectsincom.alexandregrz.voxelui.client.ui.core -
UINode.decoration(),UINode.effects(),UINode.hasDecoration(), andUINode.hasEffects()for lazy decoration/effect diagnostics -
expanded
/docscoverage for XML custom components, mapper-supported MCSS propagation, and shared render/effect attributes
Changed
-
the default custom text path is now SDF-backed rather than bitmap- or software-generated
-
UiXmlMapperhas been internally refactored from a monolithic switch-based class into registry-backed per-tagComponentMapperimplementations while preserving the public entry points -
major layout and control surfaces now render through the shader pipeline instead of
GuiGraphics.fill(), includingDivider,Grid,Stack,ScrollPanel,Checkbox,Dropdown,Slider,Tabs,KeybindDisplay,Chart,ListView, andInventoryGrid -
ScrollPanelscrolling was retuned for smoother inertial motion and frame-aligned visual layout, reducing the earlier choppy feel during wheel scrolling -
dropdown menu hover rendering now supports parent-aware clipping and sub-part styling instead of relying on hardcoded fallback geometry
-
tab selection indicators now follow the selected tab silhouette rather than drawing as detached rectangular bars
-
ItemSlottooltips now render in the runtime overlay pass, ensuring vanilla item tooltips stay above neighboring UI cards and overlays -
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 lookup -
UINodeinternal decoration storage has been refactored: shape, fill, border, accent, and visual effect data now live in lazily allocatedBoxDecorationandVisualEffectsinstances while preserving the existing fluent setters and getters -
UIScreennow delegates layout, render, notifications, modal management, and input dispatch to the sharedUiRuntime -
XmlUIScreennow reuses the shared runtime and synchronizes XML<dialog>nodes throughUiXmlDialogController -
ModalandNotificationnow target a shared overlay context instead of depending directly onUIScreen -
Heronow renders without the former decorative top accent line so hex surfaces stay visually clean in showcase and production layouts -
developer-facing Javadocs and inline comments in the touched XML/UI core areas have been standardized to English
Fixed
-
catastrophic FPS loss from the earlier per-string software SDF prototype by replacing it with batched GPU text rendering
-
multiple SDF integration issues around atlas polarity, UV convention, sampler declaration, and top-origin atlas coordinates
-
missing clipping for batched text inside scrolling containers
-
Dropdownhover/selection layering issues where internal highlights broke the perceived parent radius -
Tabsactive indicator mismatch against rounded tab shells -
ItemSlottooltip z-order so vanilla Minecraft tooltips no longer appear under adjacent cards -
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
-
ghost white borders caused by component default styles using
unsetvalues that were incorrectly resolved as opaque white in shader-rendered surfaces -
ProgressBarfill rendering so generic fill and gradient styles apply only to the active fill band instead of leaking onto the full-width track -
shader border masking on shared shape rendering, which previously produced overly strong contour artifacts and exaggerated hex borders
-
default
Heroborder thickness after the generic fill migration, bringing hex outlines back to a thinner visual weight
[0.1.0] - Initial public beta
First public beta release of the VoxelUI framework.
This release is intended to expose the framework to real usage, collect bug reports, and stabilize the API before a future stable release.
Added
- core UI engine with the
measure() -> layout() -> render()pipeline - foundational components:
Panel,Label,Button,ProgressBar,Spacer,Divider - advanced layout components:
Grid,Stack,Tabs,ScrollPanel,ListView - input components:
TextInput,Checkbox,Slider,Dropdown - Minecraft-oriented components:
ItemStackView,InventoryGrid,ItemSlot - centralized theming through
Theme - XML UI support via
UiXmlParser,UiXmlMapper, andUiXmlResourceLoader - runtime bindings for XML-driven screens
- inline and external MCSS stylesheet support
- computed style tracking and style inspection
- UI inspector and development-only debug tooling
- hot reload for XML and MCSS in development mode
- safe XML / MCSS error fallback panels
- basic UI animations such as hover transitions, smooth scroll, and screen entrance
- unit tests and early integration coverage
Notes
- this is a beta release, not a stable API freeze
- bugs, rough edges, and breaking changes between beta versions are still expected
- development-only showcase and debug tooling are disabled by default in release builds
- some parts of the public API are still explicitly marked
BETAorEXPERIMENTAL
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:q6s99nrH"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:G9IleGGI:q6s99nrH"
}

