Skip to content

Text

Build and read styled chat text: colors, clicks, hovers, translations.

Constructors return a text handle. Styling methods mutate it and return it, so calls chain:

local msg = text.empty()
    :append(text.literal("[wiki] "):color("gold"))
    :append(text.literal("diamond ore"):color(0x55FFFF):underlined()
        :open_url("https://minecraft.wiki/w/Diamond_Ore")
        :hover_text("Click to open the wiki"))
chat.print(msg)

Text handles are snapshots, unlike the live handles elsewhere in the API. Wrapping game text (e:display_name(), item:tooltip()) copies it, and appending one handle to another appends a copy, so later edits never reach what you already built or printed.

tostring(t) gives the plain string, and .. joins handles and strings into a new component.

Constructors

Function Builds
text.literal(s) Fixed text
text.empty() Empty root, so a root style cannot bleed into the children
text.translatable(key, ...) Translatable key; extra args fill %s (strings, numbers, booleans, handles)
text.translatable_fallback(key, fb, ...) Same, showing fb when the key is missing
text.keybind(key) The key bound to an action, e.g. text.keybind("key.jump")
text.legacy(s[, alt_char]) Parses § codes; pass "&" to accept & codes too
text.from_json(json) JSON text format, raises on invalid input

Styling

Method Effect
:append(text_or_string) Appends a child component
:color(c) 0xRRGGBB, a name like "red", or "#RRGGBB"
:shadow_color(argb) Shadow color, 0xAARRGGBB
:bold(b?), :italic(b?), :underlined(b?) No argument means true
:strikethrough(b?), :obfuscated(b?) obfuscated is §k
:font(id) Font, e.g. "minecraft:alt"
:insertion(s) Text inserted into chat on shift-click
:formatting(...) Formattings by name: "red", "bold", "underline", "reset", …

Click and hover

Method On click or hover
:run_command(cmd) Runs a command, leading / included
:suggest_command(cmd) Puts it in the chat box
:open_url(url) Opens a URL
:copy_to_clipboard(s) Copies a string
:change_page(n) Book page, meaningful only inside books
:hover_text(text_or_str) Text tooltip
:hover_item(item) Item tooltip
:hover_entity(entity) Entity tooltip

Click and hover work only where the game renders real chat lines (chat.print, server chat). The HUD canvas draws plain strings, so use :string() there.

Reading

Method Returns
:string() Plain string of the whole tree
:truncated(n) Plain string capped at n characters
:kind() "literal", "translatable", "keybind" or "other"
:literal() Own literal string without siblings, or nil
:key() Translation key or keybind name, or nil
:siblings() Child snapshots
:style() {color, color_name, shadow_color, bold, italic, underlined, strikethrough, obfuscated, insertion, font, click, hover}
:copy() Deep copy
:to_json() JSON text format, or nil on failure

Game text arrives as snapshots too: e:name_text(), e:display_name(), e:custom_name(), item:name_text(), item:formatted_name(), item:hover_text(), item:tooltip(), and name_text on effect entries.

Display

A handle (or a plain string) goes to chat.print, hud.actionbar, hud.title and hud.subtitle. Server chat (chat.say, chat.command) takes plain strings only.

local held = player:held_item()
for _, line in ipairs(held:tooltip()) do
    print(line:string())
end

hud.actionbar(text.legacy("&6gold &r/ &b&laqua bold", "&"))
Navigation

Type to search…

↑↓ navigate↵ selectEsc close