Welcome to the Hangar Open Beta. Please report any issue you encounter on GitHub!
Avatar for wrightix

Easy-to-use, flexible GUI library with reusable components for building rich interfaces.

Report wmenus?

WMenus

A modern, extensible GUI framework for building rich inventory interfaces with minimal boilerplate. Ships with reusable components, dialogs, and pickers, while making custom component development straightforward. All using Vanilla / Paper. No custom resource packs or client-side mods.

Testing releases of the library are being constantly uploaded. You can check them at the Testing Channel. Any recommendations, bug reports and testing results are always welcomed.

To use this library:

  • add the jar to the classpath of your project
  • add depend: [WMenus] to plugin.yml
  • have the jar in the plugins directory of the server

Wojo menus

Showcase

Wojo example

Minimal example

WojoDialog.builder()
				.title("Wojo Dialog")
				.entries(List.of(
						WojoEntry.item("item")
								.categories(List.of(
										ItemPickerCategory.ARMOR,
										ItemPickerCategory.FOOD,
										ItemPickerCategory.TOOLS,
										ItemPickerCategory.WEAPONS))
								.initial(ItemType.DIAMOND_SWORD)
								.label("Item")
								.title("Select item type")
								.tooltip("Choose the item to be given to the player."),
						WojoEntry.amount("count")
								.start(1)
								.end(64)
								.step(1)
								.initial(16)
								.label("Count")
								.title("Select item count")
								.tooltip("Choose how many items are to be given to the player."),
						WojoEntry.duration("cooldown")
								.allowNull(true)
								.initial(null)
								.label("Cooldown")
								.title("Select the cooldown period")
								.tooltip("Choose the time to wait before making the reward available again.")))
				.callback(view -> {
					player.sendMessage(Component.join(JoinConfiguration.newlines(),
							Component.text("Wojo selection:"),
							Component.text("Item: ").append(Component.translatable(view.getItemType("item"))),
							Component.text("Count: ").append(Component.text(view.getFloat("count"))),
							Component.text("Cooldown: ")
									.append(Component.text(String.valueOf(view.getDuration("cooldown"))))));
				})
				.cancel(() -> player.sendMessage("Wojo picker cancelled."))
				.open(player);

Amount picker:

Amount picker example

AmountPicker
    .builder()
    .title("Select amount")
    .start(1)
    .end(64)
    .step(1)
    .initial(16)
    .callback(amount -> {
        player.sendMessage("Selected amount: " + amount);
    })
    .cancel(() -> {
        player.sendMessage("Amount selection cancelled.");
    })
    .open(player);

World picker:

WorldPicker
    .builder()
    .title("Select destination world")
    .callback(world -> {
        player.teleport(world.getSpawnLocation());
        player.sendMessage("Teleported to " + world.getName());
    })
    .open(player);

Dialogs

Confirmation Dialog

Message Dialog

Text Input Dialog

Pickers

Amount Picker

Biome Picker

Block Picker

Difficulty Picker

Dye Color Picker

Enchantment Picker

Entity Picker

Game Mode Picker

Instrument Picker

Item Picker

Mirror Picker

Particle Picker

Rotation Picker

Sound Picker

Duration Picker

Weather Picker

World Picker

Information

CategoryMiscellaneous
Published onJune 16, 2026
LicenseLGPL
Downloads2
Stars1
Watchers1
Library

Members