Repository navigation
CompixelUI 0.1.10
This release combines the changes developed in 0.1.10-alpha.1 through 0.1.10-alpha.17. Those development versions were not released separately.
0.1.10 changes
- Changed: screens and HUD layers own the game state their content shows through immutable snapshots. Screen actions sent during mouse and keyboard input run before the event returns, so the next frame shows the result. Breaking: screens and HUD layers are now abstract; replace the old content lambda with a subclass that implements
snapshot,Contentand, for screens with actions,handle. See Show game data. - Added:
ScreenTransitionanimates screens in and out, and dialogs fade with their screen throughLocalOverlayVisibility. Closing returns control to the player while the exit plays above the game. Container screens covered by recipe viewers retain their Compose state, andmenuClosed()runs when their menu closes. Every Minecraft adapter uses the sharedUiLayerfor its screens and HUD layers. See Screen transitions. - Added: mod-owned color schemes and an in-game color editor with live previews, saved player choices and resource-pack export. CompixelUI's Config button in the mod list opens the editor for its own Ore schemes. Breaking:
ColorSchemaand schemes replace the old theme API and file format. Mods can supply their ownUiDesign, colors and preview. See Color schemes. - Changed: Ore uses the bundled Compixel font, preserving Monocraft's glyphs and adding Unifont pixel glyphs for Chinese, Japanese, Korean and other supported Minecraft languages. Emoji, unsupported scripts and rare characters continue to use system fonts. Stray control characters no longer draw boxes. See Colors and text.
- Changed: menu synchronization uses one shared implementation across Minecraft versions. Large values and states arrive in batches and apply atomically; state starts immediately after the menu opens, and transfers advance as received bytes are acknowledged. Breaking: synchronization settings, size limits, rate budgets and timeouts are removed; bind with
MenuSync.bind(menu, schema). Actions still declare their maximum size, and the server accepts at most 16 new actions per tick. The wire protocol is version 6, so both sides need this version of CompixelUI. See Menu synchronization. - Added: custom slot content and overlays that retain native container gestures and tooltips. Ore slot amounts use white digits with a pixel shadow, with editable colors and the shared
OreSlotAmountcontrol. A slot has one hover state, and its tooltip stays visible while a mouse button is held. Breaking:MenuSlotState.highlightedandComposeMenuSlots.interactingare removed. See Container screens. - Changed:
NativeItemOptions.preparationsPerFrameaccepts up to 1024 preparations, allowing several atlas pages to be drawn in one frame when many icons become visible. See Item icons. - Fixed: the color editor fits short screens and keeps its preview scrollable. The color picker retains its chosen hue, saturation and brightness, avoiding pointer jitter and keyboard drift even when changes return from the host a few frames later. Ore's pencil glyph is easier to recognize at small sizes.
- Removed: the built-in configuration editor and its
ComposeConfigScreenandConfigEditorAPIs. Consumers use their loader's configuration screen or a configuration library. Unused session and design APIs, includingUiSession.setActive,SessionState.SUSPENDED,UiSession.diagnosticThread()andUiDesign.None, are also removed.
Unreleased development history
These entries describe each development version as it existed at the time. The temporary theme API introduced in alpha.4 was replaced by color schemes in alpha.10, and alpha.8's background warm-up was reverted.
0.1.10-alpha.17
- Fixed: a container slot's tooltip stays visible while a mouse button is held, as in a vanilla container. It hid on every press, so it flickered while shift-clicking stacks out of a storage.
- Breaking:
ComposeMenuSlots.interactingis removed. It only told whether a button was held over the slots.
0.1.10-alpha.16
- Breaking: menu sync has no settings anymore.
MenuSyncOptions,SyncLimits,ActionLimitsandTransferBudgetare gone, andMenuSync.bind(menu, schema)is the only way to bind a menu.SyncCodecs.string(maxBytes)is nowSyncCodecs.STRING, andMinecraftSyncCodecs.registry(bufferon Forge 1.20.1) no longer takes a size. An action still declares its largest value withMenuAction.of(id, codec, maxBytes, handler). See Menu synchronization. - Changed: values of any size synchronize. A state or a single value larger than any Minecraft packet arrives in batches and takes effect all at once, and nothing in menu sync times out.
- Changed: menu sync paces a menu's state by what the client has received: at most 512 KiB that the client has not acknowledged is on its way, with no rate budget. Large states reach fast connections much sooner, and on slow connections other game traffic keeps moving. An action sent in parts waits in the same way for the server to confirm what arrived.
- Changed: a menu's state follows its opening at once instead of after a reply from the client, so the menu has its data one round trip sooner.
- Removed: the
ActionFailurevaluesQUEUE_BYTES,PENDING_ACTIONS,QUEUE_TIMEOUT,SEND_TIMEOUT,REPLY_TIMEOUTandASSEMBLY_TIMEOUT, andActionStatus.EXPIRED. - Changed: the menu sync protocol version is now 6, so the client and the server need this version of CompixelUI.
0.1.10-alpha.15
- Fixed: dragging through the dark part of
OreColorPicker's plane no longer shakes the pointer sideways, and arrow-key steps no longer drift. The picker keeps the hue, saturation and brightness it chose instead of reading them back from the 8-bit color, including while a host returns the value a few frames later; a color it did not choose, such as a typed hex value or a restored default, still moves the pointer to that color.
0.1.10-alpha.14
- Changed:
OreGlyph.Pencilis drawn as a pencil, with an eraser, a body and a sharpened point parted by gaps, so it reads as one at small sizes instead of a slanted bar.
0.1.10-alpha.13
- Changed: slot amounts in Ore's look are white digits over a one-pixel shadow, like vanilla item counts, about two thirds of vanilla's size. They stay legible over light and dark items in every scheme, and the decimal point takes vanilla's narrow width, so amounts such as
1.2Kfit the slot. - Added: the Ore colors
slotAmountandslotAmountShadowset the digits and their shadow, and can be changed in the color editor. See Ore color names. - Added:
OreSlotAmountdraws an amount the same way in slots you draw yourself. See Draw slots yourself.
0.1.10-alpha.12
- Fixed: the color editor fits short screens, such as 1080p at Minecraft's automatic GUI scale. A design's preview keeps its size and scrolls instead of being squeezed, and the picker gets shorter so the color list keeps its rows. See Color schemes for mod developers.
- Changed: the color editor has no bottom bar. Export sits next to the scheme list, Restore all next to Restore, and the export dialog shows the result.
- Added:
OreColorPicker(planeHeight = …)sets the height of the saturation and brightness plane.
0.1.10-alpha.11
- Added: CompixelUI's Config button in the mod list opens the color editor for CompixelUI's own color schemes, which screens in plain Ore style use. Players can switch them and change any color without a mod offering its own entry. See Change colors in game.
0.1.10-alpha.10
- Added: a color editor. Players switch color schemes and change any color, including its opacity, while a preview of the mod's screens shows the result, and every screen of that mod follows at once. Their choices are saved in
config/compixel-colors.json. Screens offer it throughLocalColorEditor, which mods call from a control of their own; other code opensColorEditorScreen. See Change colors in game. - Added: the editor exports the player's colors as a resource pack that replaces a scheme or adds a new one, and can make it the default, ready to share or to include in a modpack. See Export for a resource pack or modpack.
- Changed: themes are replaced by color schemes, which belong to each mod. A scheme file at
assets/<namespace>/compixel/schemes/<name>.jsonsetscolorsand mayextendsanother scheme of the mod, andassets/<namespace>/compixel/schemes.jsonchooses the default scheme and the editor's order. Theme files undercompixel/themes/are no longer read. See Write a scheme file. - Changed: a design system declares its colors as a
ColorSchema: base colors, and colors that follow others through a rule until a file or the player sets them. Code reads a color ascolors[role], for exampleOreTheme.colors[OreColors.panel]. AUiDesignnames theownerof its schemes and gives the editor apreview().OreDesignis now a class, andOreDesign("examplemod")gives a mod's Ore screens schemes of their own.ThemeId,ThemeSection,ThemeCatalog, thethemeparameters of screens and HUD layers, and Ore'spaletteandpresetare removed. See For mod developers. - Changed: Ore's colors include the scrim behind dialogs and the selected text in text fields, and
OreThemegives text fields Ore's selection colors and a right-click menu in Ore's style.
0.1.10-alpha.9
- Added:
CompixelGuiLayers.SCREEN_EXITSnames the HUD layer in which closed screens play their exit. Register a layer of your own below it to draw beneath closing screens, for example an effect that should last until their exit has finished. See Screen transitions. - Added:
slots.Slot(id, overlay = { slot -> ... })keeps Ore's look and draws a mark of your own above it, with the same slot state as a slot you draw yourself. See Container screens. - Changed:
NativeItemOptions.preparationsPerFrameaccepts up to 1024. An atlas page still holds up to 64 icons; a larger budget draws several pages in one frame, so a screen that scrolls through many icons can draw them all at once. See Item icons. - Changed: a slot has one hover state.
MenuSlotState.hoveredmarks the slot a click would reach: it follows Minecraft's pointer, also while a button is held, and is false while the screen's slot interactions are disabled. Slots in Ore's look light up by the same state.highlightedis removed: it was described as a drag highlight but marked the hovered slot by another route, so the two could disagree while dragging.
0.1.10-alpha.8 (reverted)
- Experimental: background Compose warm-up was added to reduce the pause when opening the first screen. The change was reverted before release and is not included in 0.1.10.
0.1.10-alpha.7
- Changed: Ore text uses the new bundled Compixel font. It keeps Monocraft's glyphs and adds GNU Unifont, which Minecraft also uses, for the other characters of Minecraft's languages. Chinese, Japanese, Korean and other scripts now appear as pixel text on every computer instead of in the system's fonts. Emoji, scripts that pixel glyphs cannot lay out, such as Devanagari, and rare characters still use the system's fonts. See Ore UI.
- Changed: the font makes the mod files about 2 MB larger.
- Fixed: a stray control character in text, such as a carriage return, no longer draws a box.
0.1.10-alpha.6
- New:
ScreenTransitionanimates a screen's content in when the screen opens and out when it closes, using Compose's enter and exit transitions, which can differ. Closing gives the player control back at once while the exit plays above the game. See Screen transitions. - New:
LocalOverlayVisibilitygives popups and dialogs, which draw in layers of their own, the screen's visibility during its transition. Ore's dialogs fade with the screen, scrim included. - Changed: a container screen that a recipe viewer or another screen covers while its menu stays open keeps its Compose session. When it shows again, its content is as it was, including
rememberstate, scroll positions and typed text, and its entrance doesn't play again. - Fixed:
menuClosed()now runs when the menu closes while another screen covers the container screen. - Fixed: an enter animation that starts with a screen's content, such as
AnimatedVisibilitywith aMutableTransitionState, now plays from the first frame instead of jumping to its end.
0.1.10-alpha.5
- Breaking: CompixelUI no longer ships a config screen.
ComposeConfigScreen,ConfigEditorand their translations are removed, because editing config files is not a UI framework's job. On NeoForge, register NeoForge's own screen from your client mod constructor withcontainer.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new). Forge 1.20.1 has no built-in config screen: use a config library's screen, or let players edit the config files. - Breaking: removed unused API.
UiSession.setActive,SessionState.SUSPENDED,UiSession.diagnosticThread()andUiDesign.Noneare gone, and aUiLayerSurfacealways takes its item, tooltip and drawing image sources.
0.1.10-alpha.4
- Breaking: theme files moved to
assets/<namespace>/compixel/themes/<path>.json, and Ore'spreset,paletteandcolorsnow sit in an"ore"section next to"format": 1. A mod can add a section of its own to the same files withThemeSection, so resource packs recolor the parts it draws itself without borrowing Ore's color names. An invalid section is ignored on its own, while the file's other sections still apply. See Themes. - Screens and HUD layers take a
design, Ore by default, which sets up a design system around their content;UiDesign.Noneshows content without one. Any control can give the native click sound, as Ore's buttons do, throughLocalUiFeedback. See Use your own design system. - Slots can take a look of their own:
slots.Slot(id, Modifier.size(18.dp)) { slot -> … }draws from aMenuSlotStatewith the icon, amount labels, marking, drag highlight and hover, while clicks, drags, shift-clicks and tooltips work as before.slots.Slot(id)keeps Ore's look. See Draw slots yourself. - Screens and HUD layers of every Minecraft version now run one shared Compose layer,
UiLayerinhost, with the same behavior. Hosts outside Minecraft can build on it too: it owns the session, frames, input, clipboard, feedback, themes and the content's actions, and a subclass supplies the window, renderer and native images. - Breaking: the new
ui-coremodule holds what design systems share.OreThemeIdis nowdev.compixel.ui.theme.ThemeId,OreThemeCatalogandOreThemeResourcesbecameThemeCatalogandLocalThemeCatalog, andOreFeedbackandOreTheme'sfeedbackparameter becameUiFeedbackandLocalUiFeedback.
0.1.10-alpha.3
- Breaking: menu synchronization's client and server sessions moved into the shared
menu-syncmodule, so all Minecraft versions run one implementation; the wire format is unchanged.MenuSync.Statusis nowdev.compixel.sync.session.SyncStatus,MenuSync.StatisticsisSyncStatistics, andMenuSync.ActionStatusandMenuSync.ActionResultareActionStatusandActionResultindev.compixel.sync.action.MenuSync.bind,MenuAction.ofand the rest of the binding work as before. See Menu synchronization.
0.1.10-alpha.2
- Actions that content sends during a click, key press or typed character are now handled before that input event returns, as vanilla buttons act, and a new snapshot follows, so the next frame already shows the result. Before, they waited for the next client tick: up to 50 ms, or longer while a server slows ticks with
/tick rate. Clicks no longer sound before the screen responds, and dragged sliders and scrollbars bound to the snapshot move every frame. Actions sent at other times, for example from a coroutine, still wait for the next tick. See Show game data. requestClose()called during a click now closes the screen before the click returns. Because a click's actions run at once, pressing Escape or opening a recipe viewer right after a click no longer discards them.snapshotcan now run more than once per tick, so it should only read the game.- When
sendis refused because 64 actions are already waiting, the screen logs a warning once per session instead of dropping the action silently.
0.1.10-alpha.1
- Screens and HUD layers now own the game state their content shows.
ComposeScreen<S, A>,ComposeMenuScreen<M, S, A>,ComposeInventoryScreen<M, S, A>andComposeHudLayer<S>are abstract: overridesnapshotto read the game on the game thread,Contentto draw the latest snapshot, andhandleto run the actions the content sends withsend. HUD layers have no actions. See Show game data. - The host takes the first snapshot before the first frame, handles each tick's actions before the next snapshot, stops once
handlecloses the screen, and starts again from a new snapshot when the screen returns, for example from a recipe viewer. HUD layers take a snapshot every client tick. - Breaking: the
contentlambda parameter is gone. Move the content into a subclass'sContent; a screen without game state extendsComposeScreen<Unit, Nothing>. - Add
requestClose()to Compose screens, so content can close its screen from the Compose thread. - Add
menuClosed()toComposeMenuScreenandComposeInventoryScreen. It runs once when the screen closes for good, not while a recipe viewer covers it, so consumers no longer need to check which menu is still open. - A
ComposeInventoryScreenfor the player's own inventory menu now releases its slots when it closes; before, it treated every close like a recipe viewer covering it. - The built-in config screen uses the same state handling.
Choose the file matching your Minecraft version and loader. Install one variant only:
- Standard: requires a compatible external Kotlin provider.
with-kotlin: includes Kotlin; do not combine it with KFF or another Kotlin runtime.
Runtime compatibility
SHA-256 checksums are provided in SHA256SUMS.