Embers Text APIСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачатьСкачать
ВЕРСИИ (132)
release
Ember's Text API 3.0.4 (Forge 1.20.1)
3.0.4+forge-1.20.117 сент. 2026 г.158,5 тыс.Minecraft: 1.20.1forge
Что нового
# Changelog
## v3.0.4 (2026-09-16)
- Markup renders in text that mods draw as a plain string, such as Better Advancements
titles, which come from `getString()` and never reached the component parser.
`Font.drawInBatch(String)`, `Font.prepareText(String)` and `Font.width(String)` route
strings with real markup through the component path. Plain text with a stray `<` or
`>` is untouched. `Font.split(String)` and `wordWrapHeight(String)` still measure the
raw string, so a wrapped plain-string label may wrap early.
- `<neon>` halos now follow every drawn quad of a glyph: they rotate with `<pendulum>`
and `<swing>`, clip to each `<glitch>` slice, use the fill colour and grow by the
border width with `<outline>`, and match the random glyph drawn by `<obfuscate>`.
- SDF fonts render with a cleaner edge. The text shader now measures the pixel
footprint of each glyph from the atlas mapping itself, so rotated text (`<pendulum>`,
`<swing>`) gets the same one pixel edge as straight text, the old edge sharpening that
thinned every stroke is gone, and small text gets a light stem darkening that fades out
above roughly GUI scale 4. `<bold>` on an SDF font that has no `_bold` variant now
emboldens instead of drawing nothing extra, and a custom `px_range` in a font manifest
is honoured by the shader rather than assumed to be 8. Glyph bearings now use the real
margin of each baked glyph instead of a fixed pad, so wide and narrow letters no longer
sit up to half a unit apart from where the font places them. The on-disk SDF cache
format bumped to version 2 and rebuilds itself on first launch.
- Unknown or out-of-range effect params log one warning per effect and param per
session, with a pointer to the docs.
- The KubeJS binding now ships on Forge 1.20.1, Fabric 1.20.1 and NeoForge 26.1 as well
as NeoForge 1.21.1. The `EmbersText` global and the `EmbersTextEvents.itemTooltip`
client event are the same on all four. The remaining targets have no KubeJS release to
bind to.
- `EmbersText.effects()` returns a sorted list of every registered effect name, so a
script can see what the installed version accepts.
- `EmbersText.clearItemNames()` drops every rule registered with `itemName`, so a startup
script can reload from a clean rule set.
release
Ember's Text API 3.0.4 (NeoForge 26.2)
3.0.4+neoforge-26.217 сент. 2026 г.125Minecraft: 26.2neoforge
Что нового
# Changelog
## v3.0.4 (2026-09-16)
- Markup renders in text that mods draw as a plain string, such as Better Advancements
titles, which come from `getString()` and never reached the component parser.
`Font.drawInBatch(String)`, `Font.prepareText(String)` and `Font.width(String)` route
strings with real markup through the component path. Plain text with a stray `<` or
`>` is untouched. `Font.split(String)` and `wordWrapHeight(String)` still measure the
raw string, so a wrapped plain-string label may wrap early.
- `<neon>` halos now follow every drawn quad of a glyph: they rotate with `<pendulum>`
and `<swing>`, clip to each `<glitch>` slice, use the fill colour and grow by the
border width with `<outline>`, and match the random glyph drawn by `<obfuscate>`.
- SDF fonts render with a cleaner edge. The text shader now measures the pixel
footprint of each glyph from the atlas mapping itself, so rotated text (`<pendulum>`,
`<swing>`) gets the same one pixel edge as straight text, the old edge sharpening that
thinned every stroke is gone, and small text gets a light stem darkening that fades out
above roughly GUI scale 4. `<bold>` on an SDF font that has no `_bold` variant now
emboldens instead of drawing nothing extra, and a custom `px_range` in a font manifest
is honoured by the shader rather than assumed to be 8. Glyph bearings now use the real
margin of each baked glyph instead of a fixed pad, so wide and narrow letters no longer
sit up to half a unit apart from where the font places them. The on-disk SDF cache
format bumped to version 2 and rebuilds itself on first launch.
- Unknown or out-of-range effect params log one warning per effect and param per
session, with a pointer to the docs.
- The KubeJS binding now ships on Forge 1.20.1, Fabric 1.20.1 and NeoForge 26.1 as well
as NeoForge 1.21.1. The `EmbersText` global and the `EmbersTextEvents.itemTooltip`
client event are the same on all four. The remaining targets have no KubeJS release to
bind to.
- `EmbersText.effects()` returns a sorted list of every registered effect name, so a
script can see what the installed version accepts.
- `EmbersText.clearItemNames()` drops every rule registered with `itemName`, so a startup
script can reload from a clean rule set.
release
Ember's Text API 3.0.4 (NeoForge 26.1)
3.0.4+neoforge-26.117 сент. 2026 г.50Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
# Changelog
## v3.0.4 (2026-09-16)
- Markup renders in text that mods draw as a plain string, such as Better Advancements
titles, which come from `getString()` and never reached the component parser.
`Font.drawInBatch(String)`, `Font.prepareText(String)` and `Font.width(String)` route
strings with real markup through the component path. Plain text with a stray `<` or
`>` is untouched. `Font.split(String)` and `wordWrapHeight(String)` still measure the
raw string, so a wrapped plain-string label may wrap early.
- `<neon>` halos now follow every drawn quad of a glyph: they rotate with `<pendulum>`
and `<swing>`, clip to each `<glitch>` slice, use the fill colour and grow by the
border width with `<outline>`, and match the random glyph drawn by `<obfuscate>`.
- SDF fonts render with a cleaner edge. The text shader now measures the pixel
footprint of each glyph from the atlas mapping itself, so rotated text (`<pendulum>`,
`<swing>`) gets the same one pixel edge as straight text, the old edge sharpening that
thinned every stroke is gone, and small text gets a light stem darkening that fades out
above roughly GUI scale 4. `<bold>` on an SDF font that has no `_bold` variant now
emboldens instead of drawing nothing extra, and a custom `px_range` in a font manifest
is honoured by the shader rather than assumed to be 8. Glyph bearings now use the real
margin of each baked glyph instead of a fixed pad, so wide and narrow letters no longer
sit up to half a unit apart from where the font places them. The on-disk SDF cache
format bumped to version 2 and rebuilds itself on first launch.
- Unknown or out-of-range effect params log one warning per effect and param per
session, with a pointer to the docs.
- The KubeJS binding now ships on Forge 1.20.1, Fabric 1.20.1 and NeoForge 26.1 as well
as NeoForge 1.21.1. The `EmbersText` global and the `EmbersTextEvents.itemTooltip`
client event are the same on all four. The remaining targets have no KubeJS release to
bind to.
- `EmbersText.effects()` returns a sorted list of every registered effect name, so a
script can see what the installed version accepts.
- `EmbersText.clearItemNames()` drops every rule registered with `itemName`, so a startup
script can reload from a clean rule set.
release
Ember's Text API 3.0.4 (NeoForge 1.21.1)
3.0.4+neoforge-1.21.117 сент. 2026 г.3,3 тыс.Minecraft: 1.21.1neoforge
Что нового
# Changelog
## v3.0.4 (2026-09-16)
- Markup renders in text that mods draw as a plain string, such as Better Advancements
titles, which come from `getString()` and never reached the component parser.
`Font.drawInBatch(String)`, `Font.prepareText(String)` and `Font.width(String)` route
strings with real markup through the component path. Plain text with a stray `<` or
`>` is untouched. `Font.split(String)` and `wordWrapHeight(String)` still measure the
raw string, so a wrapped plain-string label may wrap early.
- `<neon>` halos now follow every drawn quad of a glyph: they rotate with `<pendulum>`
and `<swing>`, clip to each `<glitch>` slice, use the fill colour and grow by the
border width with `<outline>`, and match the random glyph drawn by `<obfuscate>`.
- SDF fonts render with a cleaner edge. The text shader now measures the pixel
footprint of each glyph from the atlas mapping itself, so rotated text (`<pendulum>`,
`<swing>`) gets the same one pixel edge as straight text, the old edge sharpening that
thinned every stroke is gone, and small text gets a light stem darkening that fades out
above roughly GUI scale 4. `<bold>` on an SDF font that has no `_bold` variant now
emboldens instead of drawing nothing extra, and a custom `px_range` in a font manifest
is honoured by the shader rather than assumed to be 8. Glyph bearings now use the real
margin of each baked glyph instead of a fixed pad, so wide and narrow letters no longer
sit up to half a unit apart from where the font places them. The on-disk SDF cache
format bumped to version 2 and rebuilds itself on first launch.
- Unknown or out-of-range effect params log one warning per effect and param per
session, with a pointer to the docs.
- The KubeJS binding now ships on Forge 1.20.1, Fabric 1.20.1 and NeoForge 26.1 as well
as NeoForge 1.21.1. The `EmbersText` global and the `EmbersTextEvents.itemTooltip`
client event are the same on all four. The remaining targets have no KubeJS release to
bind to.
- `EmbersText.effects()` returns a sorted list of every registered effect name, so a
script can see what the installed version accepts.
- `EmbersText.clearItemNames()` drops every rule registered with `itemName`, so a startup
script can reload from a clean rule set.
release
Ember's Text API 3.0.4 (Fabric 26.2)
3.0.4+fabric-26.217 сент. 2026 г.182Minecraft: 26.2fabric
Что нового
# Changelog
## v3.0.4 (2026-09-16)
- Markup renders in text that mods draw as a plain string, such as Better Advancements
titles, which come from `getString()` and never reached the component parser.
`Font.drawInBatch(String)`, `Font.prepareText(String)` and `Font.width(String)` route
strings with real markup through the component path. Plain text with a stray `<` or
`>` is untouched. `Font.split(String)` and `wordWrapHeight(String)` still measure the
raw string, so a wrapped plain-string label may wrap early.
- `<neon>` halos now follow every drawn quad of a glyph: they rotate with `<pendulum>`
and `<swing>`, clip to each `<glitch>` slice, use the fill colour and grow by the
border width with `<outline>`, and match the random glyph drawn by `<obfuscate>`.
- SDF fonts render with a cleaner edge. The text shader now measures the pixel
footprint of each glyph from the atlas mapping itself, so rotated text (`<pendulum>`,
`<swing>`) gets the same one pixel edge as straight text, the old edge sharpening that
thinned every stroke is gone, and small text gets a light stem darkening that fades out
above roughly GUI scale 4. `<bold>` on an SDF font that has no `_bold` variant now
emboldens instead of drawing nothing extra, and a custom `px_range` in a font manifest
is honoured by the shader rather than assumed to be 8. Glyph bearings now use the real
margin of each baked glyph instead of a fixed pad, so wide and narrow letters no longer
sit up to half a unit apart from where the font places them. The on-disk SDF cache
format bumped to version 2 and rebuilds itself on first launch.
- Unknown or out-of-range effect params log one warning per effect and param per
session, with a pointer to the docs.
- The KubeJS binding now ships on Forge 1.20.1, Fabric 1.20.1 and NeoForge 26.1 as well
as NeoForge 1.21.1. The `EmbersText` global and the `EmbersTextEvents.itemTooltip`
client event are the same on all four. The remaining targets have no KubeJS release to
bind to.
- `EmbersText.effects()` returns a sorted list of every registered effect name, so a
script can see what the installed version accepts.
- `EmbersText.clearItemNames()` drops every rule registered with `itemName`, so a startup
script can reload from a clean rule set.
release
Ember's Text API 3.0.4 (Fabric 26.1)
3.0.4+fabric-26.117 сент. 2026 г.87Minecraft: 26.1, 26.1.1, 26.1.2fabric
Что нового
# Changelog
## v3.0.4 (2026-09-16)
- Markup renders in text that mods draw as a plain string, such as Better Advancements
titles, which come from `getString()` and never reached the component parser.
`Font.drawInBatch(String)`, `Font.prepareText(String)` and `Font.width(String)` route
strings with real markup through the component path. Plain text with a stray `<` or
`>` is untouched. `Font.split(String)` and `wordWrapHeight(String)` still measure the
raw string, so a wrapped plain-string label may wrap early.
- `<neon>` halos now follow every drawn quad of a glyph: they rotate with `<pendulum>`
and `<swing>`, clip to each `<glitch>` slice, use the fill colour and grow by the
border width with `<outline>`, and match the random glyph drawn by `<obfuscate>`.
- SDF fonts render with a cleaner edge. The text shader now measures the pixel
footprint of each glyph from the atlas mapping itself, so rotated text (`<pendulum>`,
`<swing>`) gets the same one pixel edge as straight text, the old edge sharpening that
thinned every stroke is gone, and small text gets a light stem darkening that fades out
above roughly GUI scale 4. `<bold>` on an SDF font that has no `_bold` variant now
emboldens instead of drawing nothing extra, and a custom `px_range` in a font manifest
is honoured by the shader rather than assumed to be 8. Glyph bearings now use the real
margin of each baked glyph instead of a fixed pad, so wide and narrow letters no longer
sit up to half a unit apart from where the font places them. The on-disk SDF cache
format bumped to version 2 and rebuilds itself on first launch.
- Unknown or out-of-range effect params log one warning per effect and param per
session, with a pointer to the docs.
- The KubeJS binding now ships on Forge 1.20.1, Fabric 1.20.1 and NeoForge 26.1 as well
as NeoForge 1.21.1. The `EmbersText` global and the `EmbersTextEvents.itemTooltip`
client event are the same on all four. The remaining targets have no KubeJS release to
bind to.
- `EmbersText.effects()` returns a sorted list of every registered effect name, so a
script can see what the installed version accepts.
- `EmbersText.clearItemNames()` drops every rule registered with `itemName`, so a startup
script can reload from a clean rule set.
release
Ember's Text API 3.0.4 (Fabric 1.20.1)
3.0.4+fabric-1.20.117 сент. 2026 г.144Minecraft: 1.20.1fabric
Что нового
# Changelog
## v3.0.4 (2026-09-16)
- Markup renders in text that mods draw as a plain string, such as Better Advancements
titles, which come from `getString()` and never reached the component parser.
`Font.drawInBatch(String)`, `Font.prepareText(String)` and `Font.width(String)` route
strings with real markup through the component path. Plain text with a stray `<` or
`>` is untouched. `Font.split(String)` and `wordWrapHeight(String)` still measure the
raw string, so a wrapped plain-string label may wrap early.
- `<neon>` halos now follow every drawn quad of a glyph: they rotate with `<pendulum>`
and `<swing>`, clip to each `<glitch>` slice, use the fill colour and grow by the
border width with `<outline>`, and match the random glyph drawn by `<obfuscate>`.
- SDF fonts render with a cleaner edge. The text shader now measures the pixel
footprint of each glyph from the atlas mapping itself, so rotated text (`<pendulum>`,
`<swing>`) gets the same one pixel edge as straight text, the old edge sharpening that
thinned every stroke is gone, and small text gets a light stem darkening that fades out
above roughly GUI scale 4. `<bold>` on an SDF font that has no `_bold` variant now
emboldens instead of drawing nothing extra, and a custom `px_range` in a font manifest
is honoured by the shader rather than assumed to be 8. Glyph bearings now use the real
margin of each baked glyph instead of a fixed pad, so wide and narrow letters no longer
sit up to half a unit apart from where the font places them. The on-disk SDF cache
format bumped to version 2 and rebuilds itself on first launch.
- Unknown or out-of-range effect params log one warning per effect and param per
session, with a pointer to the docs.
- The KubeJS binding now ships on Forge 1.20.1, Fabric 1.20.1 and NeoForge 26.1 as well
as NeoForge 1.21.1. The `EmbersText` global and the `EmbersTextEvents.itemTooltip`
client event are the same on all four. The remaining targets have no KubeJS release to
bind to.
- `EmbersText.effects()` returns a sorted list of every registered effect name, so a
script can see what the installed version accepts.
- `EmbersText.clearItemNames()` drops every rule registered with `itemName`, so a startup
script can reload from a clean rule set.
release
Ember's Text API 3.0.4 (Fabric 1.21.1)
3.0.4+fabric-1.21.117 сент. 2026 г.8,1 тыс.Minecraft: 1.21.1fabric
Что нового
# Changelog
## v3.0.4 (2026-09-16)
- Markup renders in text that mods draw as a plain string, such as Better Advancements
titles, which come from `getString()` and never reached the component parser.
`Font.drawInBatch(String)`, `Font.prepareText(String)` and `Font.width(String)` route
strings with real markup through the component path. Plain text with a stray `<` or
`>` is untouched. `Font.split(String)` and `wordWrapHeight(String)` still measure the
raw string, so a wrapped plain-string label may wrap early.
- `<neon>` halos now follow every drawn quad of a glyph: they rotate with `<pendulum>`
and `<swing>`, clip to each `<glitch>` slice, use the fill colour and grow by the
border width with `<outline>`, and match the random glyph drawn by `<obfuscate>`.
- SDF fonts render with a cleaner edge. The text shader now measures the pixel
footprint of each glyph from the atlas mapping itself, so rotated text (`<pendulum>`,
`<swing>`) gets the same one pixel edge as straight text, the old edge sharpening that
thinned every stroke is gone, and small text gets a light stem darkening that fades out
above roughly GUI scale 4. `<bold>` on an SDF font that has no `_bold` variant now
emboldens instead of drawing nothing extra, and a custom `px_range` in a font manifest
is honoured by the shader rather than assumed to be 8. Glyph bearings now use the real
margin of each baked glyph instead of a fixed pad, so wide and narrow letters no longer
sit up to half a unit apart from where the font places them. The on-disk SDF cache
format bumped to version 2 and rebuilds itself on first launch.
- Unknown or out-of-range effect params log one warning per effect and param per
session, with a pointer to the docs.
- The KubeJS binding now ships on Forge 1.20.1, Fabric 1.20.1 and NeoForge 26.1 as well
as NeoForge 1.21.1. The `EmbersText` global and the `EmbersTextEvents.itemTooltip`
client event are the same on all four. The remaining targets have no KubeJS release to
bind to.
- `EmbersText.effects()` returns a sorted list of every registered effect name, so a
script can see what the installed version accepts.
- `EmbersText.clearItemNames()` drops every rule registered with `itemName`, so a startup
script can reload from a clean rule set.
release
Ember's Text API 3.0.3 (Fabric 26.1)
3.0.3+fabric-26.110 авг. 2026 г.215Minecraft: 26.1, 26.1.1, 26.1.2fabric
Что нового
# Changelog
## v3.0.3 (2026-08-10)
- A `<scroll>` span is now a single unbreakable unit of layout. Multi-line scroll
content garbled into overlapping tiles because the effect measured its width
from the per-frame `x` progression, which restarts on every wrapped line, so it
sized the whole marquee from the first line alone. A scroll span no longer wraps
and reserves only its viewport width. Text written after `</scroll>` therefore
starts one viewport past the marquee rather than past the entire hidden string.
- New `[clamp]` attribute and `clampToScreen(boolean)` builder method. Screen
clamping stays on by default; turn it off for a message that is meant to sit
partly off screen. Clamping also no longer inverts on a message larger than the
window, which used to snap it to the wrong corner.
- The anvil rename limit now counts visible characters. Vanilla's 50 still applies,
but markup tags no longer count toward it, so `<rainbow>Excalibur</rainbow>` is
9 characters rather than 28. A 256-character raw ceiling keeps a name from being
padded with unlimited markup. On 1.20.1 and 1.21.1 the text field rejects an
over-long name as you type; on 26.1 and 26.2 the server declines the rename,
because those versions removed the text-field filter hook.
- **Removed** the `anvil.nameMaxLength` server config option. It is replaced by the
rule above and needs no setting. On 1.20.1 it never worked at all, because the
mixin targeted `setItemName` while the length constant lives in `validateName`.
- The continuous message effects `breathe`, `drift`, `float`, `grow`, `rock`,
`spin` and `vibrate` take three new timing params, so they can run in bursts
instead of looping forever: `every` (seconds between bursts, 0 for continuous),
`hold` (seconds a burst lasts) and `delay` (seconds before the first burst).
Each burst restarts the effect's own clock at zero, so a sine-driven effect
enters and leaves at rest rather than snapping mid-swing. Existing messages are
unaffected; `every` defaults to 0.
- `<item>` and `<entity>` now take hover and click from an enclosing `<hover>` or
`<click>` tag. The parser rebuilt icon spans from scratch and dropped everything
but the icon's own attributes, so wrapping an icon in `<click>` did nothing.
- New `tooltip` attribute on `<item>` and `<entity>`. `tooltip=true` shows the
game's own tooltip for that item or entity, built from the tag's `count` and
`nbt`; any other value is used as literal tooltip text.
- `<hover>` accepts `action=show_item` and `action=show_entity`, so ordinary text
can carry an item or entity tooltip too.
- The hover region of an inline icon now matches the sprite. It was the icon's
layout advance, which is deliberately 4px narrower than the 16px sprite so icons
tuck into surrounding text, leaving the right edge dead. Chat is now hit-tested
from the drawn sprite rather than the advance.
- Hover tooltips now work in mod GUIs, not just chat. Vanilla only hit-tests text
in the handful of screens that implement it, so interactive markup in FTB Quests
or any other custom UI had nothing to hook. Each interactive glyph's on-screen
rect is now recorded as it is drawn and tested against the cursor in any screen,
clipped to the active scissor so scrolled-out text is not hoverable. 1.20.1 and
1.21.1 only; 26.1 and 26.2 use a different text pipeline and are not covered yet.
- Fixed inline icons vanishing once they carried a hover or click event. Deriving
a style through `withHoverEvent`/`withClickEvent` dropped the icon's registry id,
so the tooltip appeared over empty space. This also restores icons combined with
`<type>` and `<obfuscate>`, which lost them the same way.
- Fixed the hover and click region of an inline icon. Icons draw 16px wide but rode
on a single space, so only about 4px responded to the cursor, and line wrapping
measured them the same way.
release
Ember's Text API 3.0.3 (NeoForge 26.2)
3.0.3+neoforge-26.210 авг. 2026 г.143Minecraft: 26.2neoforge
Что нового
# Changelog
## v3.0.3 (2026-08-10)
- A `<scroll>` span is now a single unbreakable unit of layout. Multi-line scroll
content garbled into overlapping tiles because the effect measured its width
from the per-frame `x` progression, which restarts on every wrapped line, so it
sized the whole marquee from the first line alone. A scroll span no longer wraps
and reserves only its viewport width. Text written after `</scroll>` therefore
starts one viewport past the marquee rather than past the entire hidden string.
- New `[clamp]` attribute and `clampToScreen(boolean)` builder method. Screen
clamping stays on by default; turn it off for a message that is meant to sit
partly off screen. Clamping also no longer inverts on a message larger than the
window, which used to snap it to the wrong corner.
- The anvil rename limit now counts visible characters. Vanilla's 50 still applies,
but markup tags no longer count toward it, so `<rainbow>Excalibur</rainbow>` is
9 characters rather than 28. A 256-character raw ceiling keeps a name from being
padded with unlimited markup. On 1.20.1 and 1.21.1 the text field rejects an
over-long name as you type; on 26.1 and 26.2 the server declines the rename,
because those versions removed the text-field filter hook.
- **Removed** the `anvil.nameMaxLength` server config option. It is replaced by the
rule above and needs no setting. On 1.20.1 it never worked at all, because the
mixin targeted `setItemName` while the length constant lives in `validateName`.
- The continuous message effects `breathe`, `drift`, `float`, `grow`, `rock`,
`spin` and `vibrate` take three new timing params, so they can run in bursts
instead of looping forever: `every` (seconds between bursts, 0 for continuous),
`hold` (seconds a burst lasts) and `delay` (seconds before the first burst).
Each burst restarts the effect's own clock at zero, so a sine-driven effect
enters and leaves at rest rather than snapping mid-swing. Existing messages are
unaffected; `every` defaults to 0.
- `<item>` and `<entity>` now take hover and click from an enclosing `<hover>` or
`<click>` tag. The parser rebuilt icon spans from scratch and dropped everything
but the icon's own attributes, so wrapping an icon in `<click>` did nothing.
- New `tooltip` attribute on `<item>` and `<entity>`. `tooltip=true` shows the
game's own tooltip for that item or entity, built from the tag's `count` and
`nbt`; any other value is used as literal tooltip text.
- `<hover>` accepts `action=show_item` and `action=show_entity`, so ordinary text
can carry an item or entity tooltip too.
- The hover region of an inline icon now matches the sprite. It was the icon's
layout advance, which is deliberately 4px narrower than the 16px sprite so icons
tuck into surrounding text, leaving the right edge dead. Chat is now hit-tested
from the drawn sprite rather than the advance.
- Hover tooltips now work in mod GUIs, not just chat. Vanilla only hit-tests text
in the handful of screens that implement it, so interactive markup in FTB Quests
or any other custom UI had nothing to hook. Each interactive glyph's on-screen
rect is now recorded as it is drawn and tested against the cursor in any screen,
clipped to the active scissor so scrolled-out text is not hoverable. 1.20.1 and
1.21.1 only; 26.1 and 26.2 use a different text pipeline and are not covered yet.
- Fixed inline icons vanishing once they carried a hover or click event. Deriving
a style through `withHoverEvent`/`withClickEvent` dropped the icon's registry id,
so the tooltip appeared over empty space. This also restores icons combined with
`<type>` and `<obfuscate>`, which lost them the same way.
- Fixed the hover and click region of an inline icon. Icons draw 16px wide but rode
on a single space, so only about 4px responded to the cursor, and line wrapping
measured them the same way.
release
Ember's Text API 3.0.3 (NeoForge 26.1)
3.0.3+neoforge-26.110 авг. 2026 г.72Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
# Changelog
## v3.0.3 (2026-08-10)
- A `<scroll>` span is now a single unbreakable unit of layout. Multi-line scroll
content garbled into overlapping tiles because the effect measured its width
from the per-frame `x` progression, which restarts on every wrapped line, so it
sized the whole marquee from the first line alone. A scroll span no longer wraps
and reserves only its viewport width. Text written after `</scroll>` therefore
starts one viewport past the marquee rather than past the entire hidden string.
- New `[clamp]` attribute and `clampToScreen(boolean)` builder method. Screen
clamping stays on by default; turn it off for a message that is meant to sit
partly off screen. Clamping also no longer inverts on a message larger than the
window, which used to snap it to the wrong corner.
- The anvil rename limit now counts visible characters. Vanilla's 50 still applies,
but markup tags no longer count toward it, so `<rainbow>Excalibur</rainbow>` is
9 characters rather than 28. A 256-character raw ceiling keeps a name from being
padded with unlimited markup. On 1.20.1 and 1.21.1 the text field rejects an
over-long name as you type; on 26.1 and 26.2 the server declines the rename,
because those versions removed the text-field filter hook.
- **Removed** the `anvil.nameMaxLength` server config option. It is replaced by the
rule above and needs no setting. On 1.20.1 it never worked at all, because the
mixin targeted `setItemName` while the length constant lives in `validateName`.
- The continuous message effects `breathe`, `drift`, `float`, `grow`, `rock`,
`spin` and `vibrate` take three new timing params, so they can run in bursts
instead of looping forever: `every` (seconds between bursts, 0 for continuous),
`hold` (seconds a burst lasts) and `delay` (seconds before the first burst).
Each burst restarts the effect's own clock at zero, so a sine-driven effect
enters and leaves at rest rather than snapping mid-swing. Existing messages are
unaffected; `every` defaults to 0.
- `<item>` and `<entity>` now take hover and click from an enclosing `<hover>` or
`<click>` tag. The parser rebuilt icon spans from scratch and dropped everything
but the icon's own attributes, so wrapping an icon in `<click>` did nothing.
- New `tooltip` attribute on `<item>` and `<entity>`. `tooltip=true` shows the
game's own tooltip for that item or entity, built from the tag's `count` and
`nbt`; any other value is used as literal tooltip text.
- `<hover>` accepts `action=show_item` and `action=show_entity`, so ordinary text
can carry an item or entity tooltip too.
- The hover region of an inline icon now matches the sprite. It was the icon's
layout advance, which is deliberately 4px narrower than the 16px sprite so icons
tuck into surrounding text, leaving the right edge dead. Chat is now hit-tested
from the drawn sprite rather than the advance.
- Hover tooltips now work in mod GUIs, not just chat. Vanilla only hit-tests text
in the handful of screens that implement it, so interactive markup in FTB Quests
or any other custom UI had nothing to hook. Each interactive glyph's on-screen
rect is now recorded as it is drawn and tested against the cursor in any screen,
clipped to the active scissor so scrolled-out text is not hoverable. 1.20.1 and
1.21.1 only; 26.1 and 26.2 use a different text pipeline and are not covered yet.
- Fixed inline icons vanishing once they carried a hover or click event. Deriving
a style through `withHoverEvent`/`withClickEvent` dropped the icon's registry id,
so the tooltip appeared over empty space. This also restores icons combined with
`<type>` and `<obfuscate>`, which lost them the same way.
- Fixed the hover and click region of an inline icon. Icons draw 16px wide but rode
on a single space, so only about 4px responded to the cursor, and line wrapping
measured them the same way.
release
Ember's Text API 3.0.3 (NeoForge 1.21.1)
3.0.3+neoforge-1.21.110 авг. 2026 г.3,9 тыс.Minecraft: 1.21.1neoforge
Что нового
# Changelog
## v3.0.3 (2026-08-10)
- A `<scroll>` span is now a single unbreakable unit of layout. Multi-line scroll
content garbled into overlapping tiles because the effect measured its width
from the per-frame `x` progression, which restarts on every wrapped line, so it
sized the whole marquee from the first line alone. A scroll span no longer wraps
and reserves only its viewport width. Text written after `</scroll>` therefore
starts one viewport past the marquee rather than past the entire hidden string.
- New `[clamp]` attribute and `clampToScreen(boolean)` builder method. Screen
clamping stays on by default; turn it off for a message that is meant to sit
partly off screen. Clamping also no longer inverts on a message larger than the
window, which used to snap it to the wrong corner.
- The anvil rename limit now counts visible characters. Vanilla's 50 still applies,
but markup tags no longer count toward it, so `<rainbow>Excalibur</rainbow>` is
9 characters rather than 28. A 256-character raw ceiling keeps a name from being
padded with unlimited markup. On 1.20.1 and 1.21.1 the text field rejects an
over-long name as you type; on 26.1 and 26.2 the server declines the rename,
because those versions removed the text-field filter hook.
- **Removed** the `anvil.nameMaxLength` server config option. It is replaced by the
rule above and needs no setting. On 1.20.1 it never worked at all, because the
mixin targeted `setItemName` while the length constant lives in `validateName`.
- The continuous message effects `breathe`, `drift`, `float`, `grow`, `rock`,
`spin` and `vibrate` take three new timing params, so they can run in bursts
instead of looping forever: `every` (seconds between bursts, 0 for continuous),
`hold` (seconds a burst lasts) and `delay` (seconds before the first burst).
Each burst restarts the effect's own clock at zero, so a sine-driven effect
enters and leaves at rest rather than snapping mid-swing. Existing messages are
unaffected; `every` defaults to 0.
- `<item>` and `<entity>` now take hover and click from an enclosing `<hover>` or
`<click>` tag. The parser rebuilt icon spans from scratch and dropped everything
but the icon's own attributes, so wrapping an icon in `<click>` did nothing.
- New `tooltip` attribute on `<item>` and `<entity>`. `tooltip=true` shows the
game's own tooltip for that item or entity, built from the tag's `count` and
`nbt`; any other value is used as literal tooltip text.
- `<hover>` accepts `action=show_item` and `action=show_entity`, so ordinary text
can carry an item or entity tooltip too.
- The hover region of an inline icon now matches the sprite. It was the icon's
layout advance, which is deliberately 4px narrower than the 16px sprite so icons
tuck into surrounding text, leaving the right edge dead. Chat is now hit-tested
from the drawn sprite rather than the advance.
- Hover tooltips now work in mod GUIs, not just chat. Vanilla only hit-tests text
in the handful of screens that implement it, so interactive markup in FTB Quests
or any other custom UI had nothing to hook. Each interactive glyph's on-screen
rect is now recorded as it is drawn and tested against the cursor in any screen,
clipped to the active scissor so scrolled-out text is not hoverable. 1.20.1 and
1.21.1 only; 26.1 and 26.2 use a different text pipeline and are not covered yet.
- Fixed inline icons vanishing once they carried a hover or click event. Deriving
a style through `withHoverEvent`/`withClickEvent` dropped the icon's registry id,
so the tooltip appeared over empty space. This also restores icons combined with
`<type>` and `<obfuscate>`, which lost them the same way.
- Fixed the hover and click region of an inline icon. Icons draw 16px wide but rode
on a single space, so only about 4px responded to the cursor, and line wrapping
measured them the same way.
release
Ember's Text API 3.0.3 (Forge 1.20.1)
3.0.3+forge-1.20.110 авг. 2026 г.16,3 тыс.Minecraft: 1.20.1forge
Что нового
# Changelog
## v3.0.3 (2026-08-10)
- A `<scroll>` span is now a single unbreakable unit of layout. Multi-line scroll
content garbled into overlapping tiles because the effect measured its width
from the per-frame `x` progression, which restarts on every wrapped line, so it
sized the whole marquee from the first line alone. A scroll span no longer wraps
and reserves only its viewport width. Text written after `</scroll>` therefore
starts one viewport past the marquee rather than past the entire hidden string.
- New `[clamp]` attribute and `clampToScreen(boolean)` builder method. Screen
clamping stays on by default; turn it off for a message that is meant to sit
partly off screen. Clamping also no longer inverts on a message larger than the
window, which used to snap it to the wrong corner.
- The anvil rename limit now counts visible characters. Vanilla's 50 still applies,
but markup tags no longer count toward it, so `<rainbow>Excalibur</rainbow>` is
9 characters rather than 28. A 256-character raw ceiling keeps a name from being
padded with unlimited markup. On 1.20.1 and 1.21.1 the text field rejects an
over-long name as you type; on 26.1 and 26.2 the server declines the rename,
because those versions removed the text-field filter hook.
- **Removed** the `anvil.nameMaxLength` server config option. It is replaced by the
rule above and needs no setting. On 1.20.1 it never worked at all, because the
mixin targeted `setItemName` while the length constant lives in `validateName`.
- The continuous message effects `breathe`, `drift`, `float`, `grow`, `rock`,
`spin` and `vibrate` take three new timing params, so they can run in bursts
instead of looping forever: `every` (seconds between bursts, 0 for continuous),
`hold` (seconds a burst lasts) and `delay` (seconds before the first burst).
Each burst restarts the effect's own clock at zero, so a sine-driven effect
enters and leaves at rest rather than snapping mid-swing. Existing messages are
unaffected; `every` defaults to 0.
- `<item>` and `<entity>` now take hover and click from an enclosing `<hover>` or
`<click>` tag. The parser rebuilt icon spans from scratch and dropped everything
but the icon's own attributes, so wrapping an icon in `<click>` did nothing.
- New `tooltip` attribute on `<item>` and `<entity>`. `tooltip=true` shows the
game's own tooltip for that item or entity, built from the tag's `count` and
`nbt`; any other value is used as literal tooltip text.
- `<hover>` accepts `action=show_item` and `action=show_entity`, so ordinary text
can carry an item or entity tooltip too.
- The hover region of an inline icon now matches the sprite. It was the icon's
layout advance, which is deliberately 4px narrower than the 16px sprite so icons
tuck into surrounding text, leaving the right edge dead. Chat is now hit-tested
from the drawn sprite rather than the advance.
- Hover tooltips now work in mod GUIs, not just chat. Vanilla only hit-tests text
in the handful of screens that implement it, so interactive markup in FTB Quests
or any other custom UI had nothing to hook. Each interactive glyph's on-screen
rect is now recorded as it is drawn and tested against the cursor in any screen,
clipped to the active scissor so scrolled-out text is not hoverable. 1.20.1 and
1.21.1 only; 26.1 and 26.2 use a different text pipeline and are not covered yet.
- Fixed inline icons vanishing once they carried a hover or click event. Deriving
a style through `withHoverEvent`/`withClickEvent` dropped the icon's registry id,
so the tooltip appeared over empty space. This also restores icons combined with
`<type>` and `<obfuscate>`, which lost them the same way.
- Fixed the hover and click region of an inline icon. Icons draw 16px wide but rode
on a single space, so only about 4px responded to the cursor, and line wrapping
measured them the same way.
release
Ember's Text API 3.0.3 (Fabric 26.2)
3.0.3+fabric-26.210 авг. 2026 г.223Minecraft: 26.2fabric
Что нового
# Changelog
## v3.0.3 (2026-08-10)
- A `<scroll>` span is now a single unbreakable unit of layout. Multi-line scroll
content garbled into overlapping tiles because the effect measured its width
from the per-frame `x` progression, which restarts on every wrapped line, so it
sized the whole marquee from the first line alone. A scroll span no longer wraps
and reserves only its viewport width. Text written after `</scroll>` therefore
starts one viewport past the marquee rather than past the entire hidden string.
- New `[clamp]` attribute and `clampToScreen(boolean)` builder method. Screen
clamping stays on by default; turn it off for a message that is meant to sit
partly off screen. Clamping also no longer inverts on a message larger than the
window, which used to snap it to the wrong corner.
- The anvil rename limit now counts visible characters. Vanilla's 50 still applies,
but markup tags no longer count toward it, so `<rainbow>Excalibur</rainbow>` is
9 characters rather than 28. A 256-character raw ceiling keeps a name from being
padded with unlimited markup. On 1.20.1 and 1.21.1 the text field rejects an
over-long name as you type; on 26.1 and 26.2 the server declines the rename,
because those versions removed the text-field filter hook.
- **Removed** the `anvil.nameMaxLength` server config option. It is replaced by the
rule above and needs no setting. On 1.20.1 it never worked at all, because the
mixin targeted `setItemName` while the length constant lives in `validateName`.
- The continuous message effects `breathe`, `drift`, `float`, `grow`, `rock`,
`spin` and `vibrate` take three new timing params, so they can run in bursts
instead of looping forever: `every` (seconds between bursts, 0 for continuous),
`hold` (seconds a burst lasts) and `delay` (seconds before the first burst).
Each burst restarts the effect's own clock at zero, so a sine-driven effect
enters and leaves at rest rather than snapping mid-swing. Existing messages are
unaffected; `every` defaults to 0.
- `<item>` and `<entity>` now take hover and click from an enclosing `<hover>` or
`<click>` tag. The parser rebuilt icon spans from scratch and dropped everything
but the icon's own attributes, so wrapping an icon in `<click>` did nothing.
- New `tooltip` attribute on `<item>` and `<entity>`. `tooltip=true` shows the
game's own tooltip for that item or entity, built from the tag's `count` and
`nbt`; any other value is used as literal tooltip text.
- `<hover>` accepts `action=show_item` and `action=show_entity`, so ordinary text
can carry an item or entity tooltip too.
- The hover region of an inline icon now matches the sprite. It was the icon's
layout advance, which is deliberately 4px narrower than the 16px sprite so icons
tuck into surrounding text, leaving the right edge dead. Chat is now hit-tested
from the drawn sprite rather than the advance.
- Hover tooltips now work in mod GUIs, not just chat. Vanilla only hit-tests text
in the handful of screens that implement it, so interactive markup in FTB Quests
or any other custom UI had nothing to hook. Each interactive glyph's on-screen
rect is now recorded as it is drawn and tested against the cursor in any screen,
clipped to the active scissor so scrolled-out text is not hoverable. 1.20.1 and
1.21.1 only; 26.1 and 26.2 use a different text pipeline and are not covered yet.
- Fixed inline icons vanishing once they carried a hover or click event. Deriving
a style through `withHoverEvent`/`withClickEvent` dropped the icon's registry id,
so the tooltip appeared over empty space. This also restores icons combined with
`<type>` and `<obfuscate>`, which lost them the same way.
- Fixed the hover and click region of an inline icon. Icons draw 16px wide but rode
on a single space, so only about 4px responded to the cursor, and line wrapping
measured them the same way.
release
Ember's Text API 3.0.3 (Fabric 1.20.1)
3.0.3+fabric-1.20.110 авг. 2026 г.123Minecraft: 1.20.1fabric
Что нового
# Changelog
## v3.0.3 (2026-08-10)
- A `<scroll>` span is now a single unbreakable unit of layout. Multi-line scroll
content garbled into overlapping tiles because the effect measured its width
from the per-frame `x` progression, which restarts on every wrapped line, so it
sized the whole marquee from the first line alone. A scroll span no longer wraps
and reserves only its viewport width. Text written after `</scroll>` therefore
starts one viewport past the marquee rather than past the entire hidden string.
- New `[clamp]` attribute and `clampToScreen(boolean)` builder method. Screen
clamping stays on by default; turn it off for a message that is meant to sit
partly off screen. Clamping also no longer inverts on a message larger than the
window, which used to snap it to the wrong corner.
- The anvil rename limit now counts visible characters. Vanilla's 50 still applies,
but markup tags no longer count toward it, so `<rainbow>Excalibur</rainbow>` is
9 characters rather than 28. A 256-character raw ceiling keeps a name from being
padded with unlimited markup. On 1.20.1 and 1.21.1 the text field rejects an
over-long name as you type; on 26.1 and 26.2 the server declines the rename,
because those versions removed the text-field filter hook.
- **Removed** the `anvil.nameMaxLength` server config option. It is replaced by the
rule above and needs no setting. On 1.20.1 it never worked at all, because the
mixin targeted `setItemName` while the length constant lives in `validateName`.
- The continuous message effects `breathe`, `drift`, `float`, `grow`, `rock`,
`spin` and `vibrate` take three new timing params, so they can run in bursts
instead of looping forever: `every` (seconds between bursts, 0 for continuous),
`hold` (seconds a burst lasts) and `delay` (seconds before the first burst).
Each burst restarts the effect's own clock at zero, so a sine-driven effect
enters and leaves at rest rather than snapping mid-swing. Existing messages are
unaffected; `every` defaults to 0.
- `<item>` and `<entity>` now take hover and click from an enclosing `<hover>` or
`<click>` tag. The parser rebuilt icon spans from scratch and dropped everything
but the icon's own attributes, so wrapping an icon in `<click>` did nothing.
- New `tooltip` attribute on `<item>` and `<entity>`. `tooltip=true` shows the
game's own tooltip for that item or entity, built from the tag's `count` and
`nbt`; any other value is used as literal tooltip text.
- `<hover>` accepts `action=show_item` and `action=show_entity`, so ordinary text
can carry an item or entity tooltip too.
- The hover region of an inline icon now matches the sprite. It was the icon's
layout advance, which is deliberately 4px narrower than the 16px sprite so icons
tuck into surrounding text, leaving the right edge dead. Chat is now hit-tested
from the drawn sprite rather than the advance.
- Hover tooltips now work in mod GUIs, not just chat. Vanilla only hit-tests text
in the handful of screens that implement it, so interactive markup in FTB Quests
or any other custom UI had nothing to hook. Each interactive glyph's on-screen
rect is now recorded as it is drawn and tested against the cursor in any screen,
clipped to the active scissor so scrolled-out text is not hoverable. 1.20.1 and
1.21.1 only; 26.1 and 26.2 use a different text pipeline and are not covered yet.
- Fixed inline icons vanishing once they carried a hover or click event. Deriving
a style through `withHoverEvent`/`withClickEvent` dropped the icon's registry id,
so the tooltip appeared over empty space. This also restores icons combined with
`<type>` and `<obfuscate>`, which lost them the same way.
- Fixed the hover and click region of an inline icon. Icons draw 16px wide but rode
on a single space, so only about 4px responded to the cursor, and line wrapping
measured them the same way.
release
Ember's Text API 3.0.3 (Fabric 1.21.1)
3.0.3+fabric-1.21.110 авг. 2026 г.9,8 тыс.Minecraft: 1.21.1fabric
Что нового
# Changelog
## v3.0.3 (2026-08-10)
- A `<scroll>` span is now a single unbreakable unit of layout. Multi-line scroll
content garbled into overlapping tiles because the effect measured its width
from the per-frame `x` progression, which restarts on every wrapped line, so it
sized the whole marquee from the first line alone. A scroll span no longer wraps
and reserves only its viewport width. Text written after `</scroll>` therefore
starts one viewport past the marquee rather than past the entire hidden string.
- New `[clamp]` attribute and `clampToScreen(boolean)` builder method. Screen
clamping stays on by default; turn it off for a message that is meant to sit
partly off screen. Clamping also no longer inverts on a message larger than the
window, which used to snap it to the wrong corner.
- The anvil rename limit now counts visible characters. Vanilla's 50 still applies,
but markup tags no longer count toward it, so `<rainbow>Excalibur</rainbow>` is
9 characters rather than 28. A 256-character raw ceiling keeps a name from being
padded with unlimited markup. On 1.20.1 and 1.21.1 the text field rejects an
over-long name as you type; on 26.1 and 26.2 the server declines the rename,
because those versions removed the text-field filter hook.
- **Removed** the `anvil.nameMaxLength` server config option. It is replaced by the
rule above and needs no setting. On 1.20.1 it never worked at all, because the
mixin targeted `setItemName` while the length constant lives in `validateName`.
- The continuous message effects `breathe`, `drift`, `float`, `grow`, `rock`,
`spin` and `vibrate` take three new timing params, so they can run in bursts
instead of looping forever: `every` (seconds between bursts, 0 for continuous),
`hold` (seconds a burst lasts) and `delay` (seconds before the first burst).
Each burst restarts the effect's own clock at zero, so a sine-driven effect
enters and leaves at rest rather than snapping mid-swing. Existing messages are
unaffected; `every` defaults to 0.
- `<item>` and `<entity>` now take hover and click from an enclosing `<hover>` or
`<click>` tag. The parser rebuilt icon spans from scratch and dropped everything
but the icon's own attributes, so wrapping an icon in `<click>` did nothing.
- New `tooltip` attribute on `<item>` and `<entity>`. `tooltip=true` shows the
game's own tooltip for that item or entity, built from the tag's `count` and
`nbt`; any other value is used as literal tooltip text.
- `<hover>` accepts `action=show_item` and `action=show_entity`, so ordinary text
can carry an item or entity tooltip too.
- The hover region of an inline icon now matches the sprite. It was the icon's
layout advance, which is deliberately 4px narrower than the 16px sprite so icons
tuck into surrounding text, leaving the right edge dead. Chat is now hit-tested
from the drawn sprite rather than the advance.
- Hover tooltips now work in mod GUIs, not just chat. Vanilla only hit-tests text
in the handful of screens that implement it, so interactive markup in FTB Quests
or any other custom UI had nothing to hook. Each interactive glyph's on-screen
rect is now recorded as it is drawn and tested against the cursor in any screen,
clipped to the active scissor so scrolled-out text is not hoverable. 1.20.1 and
1.21.1 only; 26.1 and 26.2 use a different text pipeline and are not covered yet.
- Fixed inline icons vanishing once they carried a hover or click event. Deriving
a style through `withHoverEvent`/`withClickEvent` dropped the icon's registry id,
so the tooltip appeared over empty space. This also restores icons combined with
`<type>` and `<obfuscate>`, which lost them the same way.
- Fixed the hover and click region of an inline icon. Icons draw 16px wide but rode
on a single space, so only about 4px responded to the cursor, and line wrapping
measured them the same way.
release
Ember's Text API 3.0.2 (Fabric 1.20.1)
3.0.2+fabric-1.20.17 июл. 2026 г.161Minecraft: 1.20.1fabric
Что нового
# Changelog
## v3.0.2 — 2026-07-07
- The builder `effect(...)` method now recognizes message effects and message
attributes, not just per-glyph text effects. `.effect("rock")` or
`.effect("sound sound=...")` from KubeJS (or Java) silently did nothing
because the name was only looked up in the text-effect registry; it now routes
to the right registry like markup tags do.
- Text wrapping is on by default so long messages no longer run off screen.
Without an explicit width it wraps to about 90% of the screen, adjusted for
scale. The new `[wrap]` tag controls it: `[wrap false]` (or `[wrap off]`)
disables wrapping, `[wrap 200]` sets an explicit width. The builder gains
`wrap(boolean)` and `wrap(boolean, int)` alongside the existing `wrap(int)`.
- Wrapped and multi-line text now respects `align`. Each line is centered (or
right-aligned) within the message box instead of always starting at the left.
- `\n` in a command now starts a new line, e.g.
`/eta send @p 100 line one \n line two`.
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.2 (Forge 1.20.1)
3.0.2+forge-1.20.17 июл. 2026 г.1,7 тыс.Minecraft: 1.20.1forge
Что нового
# Changelog
## v3.0.2 — 2026-07-07
- The builder `effect(...)` method now recognizes message effects and message
attributes, not just per-glyph text effects. `.effect("rock")` or
`.effect("sound sound=...")` from KubeJS (or Java) silently did nothing
because the name was only looked up in the text-effect registry; it now routes
to the right registry like markup tags do.
- Text wrapping is on by default so long messages no longer run off screen.
Without an explicit width it wraps to about 90% of the screen, adjusted for
scale. The new `[wrap]` tag controls it: `[wrap false]` (or `[wrap off]`)
disables wrapping, `[wrap 200]` sets an explicit width. The builder gains
`wrap(boolean)` and `wrap(boolean, int)` alongside the existing `wrap(int)`.
- Wrapped and multi-line text now respects `align`. Each line is centered (or
right-aligned) within the message box instead of always starting at the left.
- `\n` in a command now starts a new line, e.g.
`/eta send @p 100 line one \n line two`.
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.2 (NeoForge 26.2)
3.0.2+neoforge-26.27 июл. 2026 г.132Minecraft: 26.2neoforge
Что нового
# Changelog
## v3.0.2 — 2026-07-07
- The builder `effect(...)` method now recognizes message effects and message
attributes, not just per-glyph text effects. `.effect("rock")` or
`.effect("sound sound=...")` from KubeJS (or Java) silently did nothing
because the name was only looked up in the text-effect registry; it now routes
to the right registry like markup tags do.
- Text wrapping is on by default so long messages no longer run off screen.
Without an explicit width it wraps to about 90% of the screen, adjusted for
scale. The new `[wrap]` tag controls it: `[wrap false]` (or `[wrap off]`)
disables wrapping, `[wrap 200]` sets an explicit width. The builder gains
`wrap(boolean)` and `wrap(boolean, int)` alongside the existing `wrap(int)`.
- Wrapped and multi-line text now respects `align`. Each line is centered (or
right-aligned) within the message box instead of always starting at the left.
- `\n` in a command now starts a new line, e.g.
`/eta send @p 100 line one \n line two`.
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.2 (NeoForge 1.21.1)
3.0.2+neoforge-1.21.17 июл. 2026 г.14,6 тыс.Minecraft: 1.21.1neoforge
Что нового
# Changelog
## v3.0.2 — 2026-07-07
- The builder `effect(...)` method now recognizes message effects and message
attributes, not just per-glyph text effects. `.effect("rock")` or
`.effect("sound sound=...")` from KubeJS (or Java) silently did nothing
because the name was only looked up in the text-effect registry; it now routes
to the right registry like markup tags do.
- Text wrapping is on by default so long messages no longer run off screen.
Without an explicit width it wraps to about 90% of the screen, adjusted for
scale. The new `[wrap]` tag controls it: `[wrap false]` (or `[wrap off]`)
disables wrapping, `[wrap 200]` sets an explicit width. The builder gains
`wrap(boolean)` and `wrap(boolean, int)` alongside the existing `wrap(int)`.
- Wrapped and multi-line text now respects `align`. Each line is centered (or
right-aligned) within the message box instead of always starting at the left.
- `\n` in a command now starts a new line, e.g.
`/eta send @p 100 line one \n line two`.
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.2 (NeoForge 26.1)
3.0.2+neoforge-26.17 июл. 2026 г.68Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
# Changelog
## v3.0.2 — 2026-07-07
- The builder `effect(...)` method now recognizes message effects and message
attributes, not just per-glyph text effects. `.effect("rock")` or
`.effect("sound sound=...")` from KubeJS (or Java) silently did nothing
because the name was only looked up in the text-effect registry; it now routes
to the right registry like markup tags do.
- Text wrapping is on by default so long messages no longer run off screen.
Without an explicit width it wraps to about 90% of the screen, adjusted for
scale. The new `[wrap]` tag controls it: `[wrap false]` (or `[wrap off]`)
disables wrapping, `[wrap 200]` sets an explicit width. The builder gains
`wrap(boolean)` and `wrap(boolean, int)` alongside the existing `wrap(int)`.
- Wrapped and multi-line text now respects `align`. Each line is centered (or
right-aligned) within the message box instead of always starting at the left.
- `\n` in a command now starts a new line, e.g.
`/eta send @p 100 line one \n line two`.
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.2 (Fabric 26.2)
3.0.2+fabric-26.27 июл. 2026 г.223Minecraft: 26.2fabric
Что нового
# Changelog
## v3.0.2 — 2026-07-07
- The builder `effect(...)` method now recognizes message effects and message
attributes, not just per-glyph text effects. `.effect("rock")` or
`.effect("sound sound=...")` from KubeJS (or Java) silently did nothing
because the name was only looked up in the text-effect registry; it now routes
to the right registry like markup tags do.
- Text wrapping is on by default so long messages no longer run off screen.
Without an explicit width it wraps to about 90% of the screen, adjusted for
scale. The new `[wrap]` tag controls it: `[wrap false]` (or `[wrap off]`)
disables wrapping, `[wrap 200]` sets an explicit width. The builder gains
`wrap(boolean)` and `wrap(boolean, int)` alongside the existing `wrap(int)`.
- Wrapped and multi-line text now respects `align`. Each line is centered (or
right-aligned) within the message box instead of always starting at the left.
- `\n` in a command now starts a new line, e.g.
`/eta send @p 100 line one \n line two`.
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.2 (Fabric 1.20.1)
3.0.2+fabric-1.20.17 июл. 2026 г.40Minecraft: 1.20.1fabric
Что нового
# Changelog
## v3.0.2 — 2026-07-07
- The builder `effect(...)` method now recognizes message effects and message
attributes, not just per-glyph text effects. `.effect("rock")` or
`.effect("sound sound=...")` from KubeJS (or Java) silently did nothing
because the name was only looked up in the text-effect registry; it now routes
to the right registry like markup tags do.
- Text wrapping is on by default so long messages no longer run off screen.
Without an explicit width it wraps to about 90% of the screen, adjusted for
scale. The new `[wrap]` tag controls it: `[wrap false]` (or `[wrap off]`)
disables wrapping, `[wrap 200]` sets an explicit width. The builder gains
`wrap(boolean)` and `wrap(boolean, int)` alongside the existing `wrap(int)`.
- Wrapped and multi-line text now respects `align`. Each line is centered (or
right-aligned) within the message box instead of always starting at the left.
- `\n` in a command now starts a new line, e.g.
`/eta send @p 100 line one \n line two`.
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.2 (Fabric 26.1)
3.0.2+fabric-26.17 июл. 2026 г.106Minecraft: 26.1, 26.1.1, 26.1.2fabric
Что нового
# Changelog
## v3.0.2 — 2026-07-07
- The builder `effect(...)` method now recognizes message effects and message
attributes, not just per-glyph text effects. `.effect("rock")` or
`.effect("sound sound=...")` from KubeJS (or Java) silently did nothing
because the name was only looked up in the text-effect registry; it now routes
to the right registry like markup tags do.
- Text wrapping is on by default so long messages no longer run off screen.
Without an explicit width it wraps to about 90% of the screen, adjusted for
scale. The new `[wrap]` tag controls it: `[wrap false]` (or `[wrap off]`)
disables wrapping, `[wrap 200]` sets an explicit width. The builder gains
`wrap(boolean)` and `wrap(boolean, int)` alongside the existing `wrap(int)`.
- Wrapped and multi-line text now respects `align`. Each line is centered (or
right-aligned) within the message box instead of always starting at the left.
- `\n` in a command now starts a new line, e.g.
`/eta send @p 100 line one \n line two`.
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.2 (Fabric 1.21.1)
3.0.2+fabric-1.21.17 июл. 2026 г.10,1 тыс.Minecraft: 1.21.1fabric
Что нового
# Changelog
## v3.0.2 — 2026-07-07
- The builder `effect(...)` method now recognizes message effects and message
attributes, not just per-glyph text effects. `.effect("rock")` or
`.effect("sound sound=...")` from KubeJS (or Java) silently did nothing
because the name was only looked up in the text-effect registry; it now routes
to the right registry like markup tags do.
- Text wrapping is on by default so long messages no longer run off screen.
Without an explicit width it wraps to about 90% of the screen, adjusted for
scale. The new `[wrap]` tag controls it: `[wrap false]` (or `[wrap off]`)
disables wrapping, `[wrap 200]` sets an explicit width. The builder gains
`wrap(boolean)` and `wrap(boolean, int)` alongside the existing `wrap(int)`.
- Wrapped and multi-line text now respects `align`. Each line is centered (or
right-aligned) within the message box instead of always starting at the left.
- `\n` in a command now starts a new line, e.g.
`/eta send @p 100 line one \n line two`.
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.1 (NeoForge 1.21.1)
3.0.1+neoforge-1.21.15 июл. 2026 г.370Minecraft: 1.21.1neoforge
Что нового
# Changelog
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.1 (NeoForge 26.1)
3.0.1+neoforge-26.15 июл. 2026 г.39Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
# Changelog
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.1 (NeoForge 26.2)
3.0.1+neoforge-26.25 июл. 2026 г.41Minecraft: 26.2neoforge
Что нового
# Changelog
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.1 (Forge 1.20.1)
3.0.1+forge-1.20.15 июл. 2026 г.250Minecraft: 1.20.1forge
Что нового
# Changelog
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.1 (Fabric 1.20.1)
3.0.1+fabric-1.20.15 июл. 2026 г.33Minecraft: 1.20.1fabric
Что нового
# Changelog
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.1 (Fabric 26.1)
3.0.1+fabric-26.15 июл. 2026 г.27Minecraft: 26.1, 26.1.1, 26.1.2fabric
Что нового
# Changelog
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.1 (Fabric 26.2)
3.0.1+fabric-26.25 июл. 2026 г.32Minecraft: 26.2fabric
Что нового
# Changelog
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.1 (Fabric 1.21.1)
3.0.1+fabric-1.21.15 июл. 2026 г.874Minecraft: 1.21.1fabric
Что нового
# Changelog
## v3.0.1 — 2026-07-04
- Fixed a dedicated-server crash when a command built an immersive message,
such as an FTB Quests command reward running `/eta queue`. `ImmersiveMessage`
carried its client-only rendering, so loading the class on a server threw
`NoClassDefFoundError: MultiBufferSource`. The rendering now lives in a
client-only holder, leaving the message data safe to load server-side. This
affected every loader and version; single-player was unaffected because the
client classes are present there.
- Unwrapped text now honors hard line breaks. Without `wrap` set, a `\n` in the
message rendered as a missing-glyph box instead of starting a new line; it now
breaks correctly whether or not wrapping is enabled.
release
Ember's Text API 3.0.0 (NeoForge 26.2)
3.0.0+neoforge-26.222 июн. 2026 г.78Minecraft: 26.2neoforge
Что нового
# Changelog
## v3.0.0 — 2026-06-21
- NeoForge and Fabric support for MC 26.1.x and 26.2, including the neon glow
and SDF text pipeline ported to 26.2's new bind-group render API. The FTB
Quests and Emojiful integrations are not present on 26.2.
- FTB Quests composer: an ETA button on the quest text editor opens a composer
with effect and preset pickers, a font picker, per-parameter controls, and a
live preview that writes the composed markup back into the editor. Available
on 1.20.1, 1.21.1, and 26.1.
- Effect parameters reworked for consistent naming with multiple accepted
aliases per parameter. Gradient and rainbow gained an angle; rainbow gained
length, saturation, and brightness; neon gained flicker controls.
- `<shadow>` is now independent of the host text's drop shadow, so it renders
even where the host draws without one (such as FTB Quests titles), and an
explicit shadow color is no longer dimmed.
- Twemoji coexistence: Twemoji's emoji render alongside ETA markup.
- Lang tag `args` now supports escaping commas with a backslash so a single
argument can contain commas: `<lang key='commands.give.success.single'
args='$9\,000'>` passes `$9,000` as one argument. A literal backslash is
written `\\`.
- Emojiful compat: text effects now apply to chat messages on Forge 1.20.1.
The render hook targeted the dev-mapped method name, which silently no-ops
against the SRG-named build that ships in production. The integration also
reads Emojiful's renderer state through accessor mixins instead of
reflection.
release
Ember's Text API 3.0.0 (NeoForge 26.1)
3.0.0+neoforge-26.122 июн. 2026 г.25Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
# Changelog
## v3.0.0 — 2026-06-21
- NeoForge and Fabric support for MC 26.1.x and 26.2, including the neon glow
and SDF text pipeline ported to 26.2's new bind-group render API. The FTB
Quests and Emojiful integrations are not present on 26.2.
- FTB Quests composer: an ETA button on the quest text editor opens a composer
with effect and preset pickers, a font picker, per-parameter controls, and a
live preview that writes the composed markup back into the editor. Available
on 1.20.1, 1.21.1, and 26.1.
- Effect parameters reworked for consistent naming with multiple accepted
aliases per parameter. Gradient and rainbow gained an angle; rainbow gained
length, saturation, and brightness; neon gained flicker controls.
- `<shadow>` is now independent of the host text's drop shadow, so it renders
even where the host draws without one (such as FTB Quests titles), and an
explicit shadow color is no longer dimmed.
- Twemoji coexistence: Twemoji's emoji render alongside ETA markup.
- Lang tag `args` now supports escaping commas with a backslash so a single
argument can contain commas: `<lang key='commands.give.success.single'
args='$9\,000'>` passes `$9,000` as one argument. A literal backslash is
written `\\`.
- Emojiful compat: text effects now apply to chat messages on Forge 1.20.1.
The render hook targeted the dev-mapped method name, which silently no-ops
against the SRG-named build that ships in production. The integration also
reads Emojiful's renderer state through accessor mixins instead of
reflection.
release
Ember's Text API 3.0.0 (NeoForge 1.21.1)
3.0.0+neoforge-1.21.122 июн. 2026 г.1,3 тыс.Minecraft: 1.21.1neoforge
Что нового
# Changelog
## v3.0.0 — 2026-06-21
- NeoForge and Fabric support for MC 26.1.x and 26.2, including the neon glow
and SDF text pipeline ported to 26.2's new bind-group render API. The FTB
Quests and Emojiful integrations are not present on 26.2.
- FTB Quests composer: an ETA button on the quest text editor opens a composer
with effect and preset pickers, a font picker, per-parameter controls, and a
live preview that writes the composed markup back into the editor. Available
on 1.20.1, 1.21.1, and 26.1.
- Effect parameters reworked for consistent naming with multiple accepted
aliases per parameter. Gradient and rainbow gained an angle; rainbow gained
length, saturation, and brightness; neon gained flicker controls.
- `<shadow>` is now independent of the host text's drop shadow, so it renders
even where the host draws without one (such as FTB Quests titles), and an
explicit shadow color is no longer dimmed.
- Twemoji coexistence: Twemoji's emoji render alongside ETA markup.
- Lang tag `args` now supports escaping commas with a backslash so a single
argument can contain commas: `<lang key='commands.give.success.single'
args='$9\,000'>` passes `$9,000` as one argument. A literal backslash is
written `\\`.
- Emojiful compat: text effects now apply to chat messages on Forge 1.20.1.
The render hook targeted the dev-mapped method name, which silently no-ops
against the SRG-named build that ships in production. The integration also
reads Emojiful's renderer state through accessor mixins instead of
reflection.
release
Ember's Text API 3.0.0 (Forge 1.20.1)
3.0.0+forge-1.20.122 июн. 2026 г.466Minecraft: 1.20.1forge
Что нового
# Changelog
## v3.0.0 — 2026-06-21
- NeoForge and Fabric support for MC 26.1.x and 26.2, including the neon glow
and SDF text pipeline ported to 26.2's new bind-group render API. The FTB
Quests and Emojiful integrations are not present on 26.2.
- FTB Quests composer: an ETA button on the quest text editor opens a composer
with effect and preset pickers, a font picker, per-parameter controls, and a
live preview that writes the composed markup back into the editor. Available
on 1.20.1, 1.21.1, and 26.1.
- Effect parameters reworked for consistent naming with multiple accepted
aliases per parameter. Gradient and rainbow gained an angle; rainbow gained
length, saturation, and brightness; neon gained flicker controls.
- `<shadow>` is now independent of the host text's drop shadow, so it renders
even where the host draws without one (such as FTB Quests titles), and an
explicit shadow color is no longer dimmed.
- Twemoji coexistence: Twemoji's emoji render alongside ETA markup.
- Lang tag `args` now supports escaping commas with a backslash so a single
argument can contain commas: `<lang key='commands.give.success.single'
args='$9\,000'>` passes `$9,000` as one argument. A literal backslash is
written `\\`.
- Emojiful compat: text effects now apply to chat messages on Forge 1.20.1.
The render hook targeted the dev-mapped method name, which silently no-ops
against the SRG-named build that ships in production. The integration also
reads Emojiful's renderer state through accessor mixins instead of
reflection.
release
Ember's Text API 3.0.0 (Fabric 26.2)
3.0.0+fabric-26.222 июн. 2026 г.159Minecraft: 26.2fabric
Что нового
# Changelog
## v3.0.0 — 2026-06-21
- NeoForge and Fabric support for MC 26.1.x and 26.2, including the neon glow
and SDF text pipeline ported to 26.2's new bind-group render API. The FTB
Quests and Emojiful integrations are not present on 26.2.
- FTB Quests composer: an ETA button on the quest text editor opens a composer
with effect and preset pickers, a font picker, per-parameter controls, and a
live preview that writes the composed markup back into the editor. Available
on 1.20.1, 1.21.1, and 26.1.
- Effect parameters reworked for consistent naming with multiple accepted
aliases per parameter. Gradient and rainbow gained an angle; rainbow gained
length, saturation, and brightness; neon gained flicker controls.
- `<shadow>` is now independent of the host text's drop shadow, so it renders
even where the host draws without one (such as FTB Quests titles), and an
explicit shadow color is no longer dimmed.
- Twemoji coexistence: Twemoji's emoji render alongside ETA markup.
- Lang tag `args` now supports escaping commas with a backslash so a single
argument can contain commas: `<lang key='commands.give.success.single'
args='$9\,000'>` passes `$9,000` as one argument. A literal backslash is
written `\\`.
- Emojiful compat: text effects now apply to chat messages on Forge 1.20.1.
The render hook targeted the dev-mapped method name, which silently no-ops
against the SRG-named build that ships in production. The integration also
reads Emojiful's renderer state through accessor mixins instead of
reflection.
release
Ember's Text API 3.0.0 (Fabric 26.1)
3.0.0+fabric-26.122 июн. 2026 г.64Minecraft: 26.1, 26.1.1, 26.1.2fabric
Что нового
# Changelog
## v3.0.0 — 2026-06-21
- NeoForge and Fabric support for MC 26.1.x and 26.2, including the neon glow
and SDF text pipeline ported to 26.2's new bind-group render API. The FTB
Quests and Emojiful integrations are not present on 26.2.
- FTB Quests composer: an ETA button on the quest text editor opens a composer
with effect and preset pickers, a font picker, per-parameter controls, and a
live preview that writes the composed markup back into the editor. Available
on 1.20.1, 1.21.1, and 26.1.
- Effect parameters reworked for consistent naming with multiple accepted
aliases per parameter. Gradient and rainbow gained an angle; rainbow gained
length, saturation, and brightness; neon gained flicker controls.
- `<shadow>` is now independent of the host text's drop shadow, so it renders
even where the host draws without one (such as FTB Quests titles), and an
explicit shadow color is no longer dimmed.
- Twemoji coexistence: Twemoji's emoji render alongside ETA markup.
- Lang tag `args` now supports escaping commas with a backslash so a single
argument can contain commas: `<lang key='commands.give.success.single'
args='$9\,000'>` passes `$9,000` as one argument. A literal backslash is
written `\\`.
- Emojiful compat: text effects now apply to chat messages on Forge 1.20.1.
The render hook targeted the dev-mapped method name, which silently no-ops
against the SRG-named build that ships in production. The integration also
reads Emojiful's renderer state through accessor mixins instead of
reflection.
release
Ember's Text API 3.0.0 (Fabric 1.21.1)
3.0.0+fabric-1.21.122 июн. 2026 г.2,8 тыс.Minecraft: 1.21.1fabric
Что нового
# Changelog
## v3.0.0 — 2026-06-21
- NeoForge and Fabric support for MC 26.1.x and 26.2, including the neon glow
and SDF text pipeline ported to 26.2's new bind-group render API. The FTB
Quests and Emojiful integrations are not present on 26.2.
- FTB Quests composer: an ETA button on the quest text editor opens a composer
with effect and preset pickers, a font picker, per-parameter controls, and a
live preview that writes the composed markup back into the editor. Available
on 1.20.1, 1.21.1, and 26.1.
- Effect parameters reworked for consistent naming with multiple accepted
aliases per parameter. Gradient and rainbow gained an angle; rainbow gained
length, saturation, and brightness; neon gained flicker controls.
- `<shadow>` is now independent of the host text's drop shadow, so it renders
even where the host draws without one (such as FTB Quests titles), and an
explicit shadow color is no longer dimmed.
- Twemoji coexistence: Twemoji's emoji render alongside ETA markup.
- Lang tag `args` now supports escaping commas with a backslash so a single
argument can contain commas: `<lang key='commands.give.success.single'
args='$9\,000'>` passes `$9,000` as one argument. A literal backslash is
written `\\`.
- Emojiful compat: text effects now apply to chat messages on Forge 1.20.1.
The render hook targeted the dev-mapped method name, which silently no-ops
against the SRG-named build that ships in production. The integration also
reads Emojiful's renderer state through accessor mixins instead of
reflection.
release
Ember's Text API 3.0.0 (Fabric 1.20.1)
3.0.0+fabric-1.20.122 июн. 2026 г.64Minecraft: 1.20.1fabric
Что нового
# Changelog
## v3.0.0 — 2026-06-21
- NeoForge and Fabric support for MC 26.1.x and 26.2, including the neon glow
and SDF text pipeline ported to 26.2's new bind-group render API. The FTB
Quests and Emojiful integrations are not present on 26.2.
- FTB Quests composer: an ETA button on the quest text editor opens a composer
with effect and preset pickers, a font picker, per-parameter controls, and a
live preview that writes the composed markup back into the editor. Available
on 1.20.1, 1.21.1, and 26.1.
- Effect parameters reworked for consistent naming with multiple accepted
aliases per parameter. Gradient and rainbow gained an angle; rainbow gained
length, saturation, and brightness; neon gained flicker controls.
- `<shadow>` is now independent of the host text's drop shadow, so it renders
even where the host draws without one (such as FTB Quests titles), and an
explicit shadow color is no longer dimmed.
- Twemoji coexistence: Twemoji's emoji render alongside ETA markup.
- Lang tag `args` now supports escaping commas with a backslash so a single
argument can contain commas: `<lang key='commands.give.success.single'
args='$9\,000'>` passes `$9,000` as one argument. A literal backslash is
written `\\`.
- Emojiful compat: text effects now apply to chat messages on Forge 1.20.1.
The render hook targeted the dev-mapped method name, which silently no-ops
against the SRG-named build that ships in production. The integration also
reads Emojiful's renderer state through accessor mixins instead of
reflection.
beta
Ember's Text API 3.0.0-beta.2 (NeoForge 26.1)
3.0.0-beta.2+neoforge-26.112 июн. 2026 г.49Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
# Changelog
## v3.0.0-beta.2 — 2026-06-11
### Neon glow
- New `glow` effect (alias `neon`) renders an SDF-based halo around glyphs:
`<glow>`, `<glow radius=4 intensity=1.5 color=#00ffcc>`,
`<glow softness=0 core=0.6>` for a sharp neon-tube look, `freq` for pulsing.
When no color is given the halo picks up each glyph's final color, so
`<glow><rainbow>` animates the halo with the text.
- Glow color resolves per glyph at emit time. Replaces `NeonEffect` — the
`neon` markup name still works and now maps to the new effect.
- Per-version render paths: core shaders on 1.21.1, the new render-pipeline
API on 26.1, and a bitmap-only runtime SDF path on 1.20.1 (no FreeType
required at runtime).
- Glow distance fields bake off the render thread with a per-frame budget;
the atlas uploads only changed slots. Drop shadows are suppressed on
glowing glyphs so halos don't double-darken.
### MSDF font pipeline
- Pre-baked MSDF glyphs now persist to disk on all versions — fonts skip the
bake cost on every launch after the first.
- SDF providers attach once per resource reload; fixed the glyph baseline on
1.20.1.
- Forge 1.20.1 embeds the FreeType natives in the `-all` jar and fails the
binding probe cleanly on servers without them.
### KubeJS integration (NeoForge 1.21.1)
- New `EmbersText` binding for scripts: send/queue immersive messages, manage
HUD elements, and style item names and tooltips.
- New `EmbersTextEvents.itemTooltip` client event for per-stack tooltip
styling from scripts.
### Version parity
- Item-name styling and the `EmbersTextFacade` entry point now ship on every
loader/version target, and the item-name mixin is correctly registered on
NeoForge 26.1.
- FTB Quests view tracking ported to 26.1.
- Emojiful compat (1.20.1/1.21.1): effect shadows are dimmed and glow emits
in the Emojiful render path. Not yet available on 26.1.
- Obfuscate reveal/hide order is now computed relative to the span start on
1.20.1/1.21.1, matching 26.1 — spans that start mid-text reveal correctly.
- Immersive overlay messages now attach span effect data (effect list,
typewriter track, obfuscate keys) to their component styles, so typewriter,
obfuscate reveal/random, scroll, and shadow animate in overlays the same way
they do in chat. The per-char render tier is gated against re-applying
style-carried effects (26.1 covers this with its existing render bypass).
### Performance
- Eliminated multiple per-frame allocation and draw-call hot spots in the message
renderer. Stress-test FPS at 50 concurrent messages on NeoForge 26.1 improved
from ~70 to ~1500+ against a ~2000 FPS baseline.
- `EffectApplicator.applyEffects` no longer recursively applies sibling-spawning
effects onto siblings they just created — those level-2 grandchildren never
render. New `Effect#spawnsSiblings()` opt-out lets sibling-spawning effects
skip the redundant pass.
- `ImmersiveMessage.buildComponentFromSpans` caches its output keyed on the
typewriter index snapshot.
- Per-codepoint glyph width and `FormattedCharSequence` now cached per
`(font, codepoint, bold)` on each message.
- Effects can opt out of per-char dispatch via `Effect#requiresPerChar()`.
`TypewriterEffect` opts out when `cursor=false` — its cropping is already
handled at the component layer.
- `GuiGraphics.drawManaged` wraps message rendering on 1.21.1/1.20.1 to collapse
per-text-call buffer flushes (not applicable on 26.1's queued render model).
- Background border drawing replaced per-pixel `fill` loops with single rotated
`fillGradient` calls per strip. Top/bottom borders use a 90° pose rotation so
vanilla's vertical gradient becomes a smooth GPU-interpolated horizontal one.
- `fillHorizontalGradient` (multi-stop background fill) uses the same rotation
trick — N-stop gradient renders as N-1 rotated calls per strip instead of one
fill per pixel.
### Background gradient extensions
- `[bg gradient=a,b,c,...]` markup now accepts any number of stops (previously
capped at 2).
- `[bg border=a,b,c,...]` markup adds N-stop border gradient support. Side
borders use the first and last stops so corners blend cleanly with the N-stop
top/bottom edges.
- New `ImmersiveMessage.borderGradient(ImmersiveColor... stops)` varargs API.
The existing 2-arg overload continues to work unchanged.
### Effect system unification
- Fade is now a `MessageEffect` under the hood. `fadeInTicks` / `fadeOutTicks` builders
construct and add `FadeInMessageEffect` / `FadeOutMessageEffect` to the message's
effect list. The parallel field-based fade state on `ImmersiveMessage` is gone.
- New effect names available in markup and `MessageEffectRegistry`: `fadein`, `fadeout`.
- `MessageEffect#target()` (default `EffectTarget.TEXT`) controls whether the effect's
pose transform scopes to text, background, or both.
- New `AlphaContributor` sub-interface lets effects contribute to a per-frame alpha
multiplier shared by text and background. `FadeInMessageEffect` and
`FadeOutMessageEffect` implement it.
### Slide effect background option
- `<slide>` now accepts a `target` param (`text`, `background`, `all`). Default is
`all`, which slides text and background together. The previous beta.1 behavior of
sliding text only matches `target=text`.
### Metadata
- Loader metadata now declares the EML licence (was incorrectly GPL-3.0) and
the licence text is embedded in every jar.
### Breaking changes from 3.0.0-beta.1
- `ImmersiveMessage` constructor, `builder`, `fromMarkup`, `fromSpans`, `getDuration`,
and `setDuration` now take/return `int` ticks instead of `float`. The internal field
remains `float` for partial-tick interpolation.
- `ImmersiveMessage.typewriter(float, boolean)`, `.typewriter(float)`,
`.typewriterCentered(float)`, and `.obfuscate(ObfuscateMode, float)` are removed.
Use `<type>` / `<obfuscate>` markup, or set typewriter/obfuscate at the span level
via `TextSpan.typewriter(float)` / `.typewriterCentered(float)` / `.obfuscate(...)`.
- `TextSpan.typewriter(float speed, boolean center)` is removed. Use
`TextSpan.typewriter(float speed)` or `TextSpan.typewriterCentered(float speed)`.
- `ImmersiveMessage` no longer exposes public `fadeInTicks` / `fadeOutTicks` /
`typewriter*` / `obfuscate*` fields. `fadeInTicks` / `fadeOutTicks` builders still
work and now construct effects; reflection-based consumers must read from
`getMessageEffects()`.
- NBT key `"Duration"` is now stored as `IntTag` (previously `FloatTag`). NBT saved by
`3.0.0-beta.1` will not load.
- NBT: legacy `fadeIn`, `fadeOut`, `Typewriter`, `TypewriterSpeed`, `TypewriterCenter`,
`ObfuscateMode`, `ObfuscateSpeed` keys are no longer read or written. Fade state
lives in the existing `MessageEffects` list (e.g. `"fadein t=20"`); typewriter and
obfuscate live on `TextSpan` or come from markup.
- S2C message wire format encodes duration as `VarInt` (previously `Float`), the
legacy fade/typewriter/obfuscate per-feature fields are gone from the payload, and
the payload gained a trailing `(boolean, VarInt, int[])` block for
`borderGradientStops`. The effects list is the sole carrier for fade.
`3.0.0-beta.1` clients/servers are incompatible.
- NBT gained an optional `BorderGradient` list. Saves without the key load
unchanged.
- Default `<slide>` behavior changed from text-only to text+background. Pass
`target=text` in markup, or construct `SlideMessageEffect` with that param, to
restore the old shape.
beta
Ember's Text API 3.0.0-beta.2 (NeoForge 1.21.1)
3.0.0-beta.2+neoforge-1.21.112 июн. 2026 г.460Minecraft: 1.21.1neoforge
Что нового
# Changelog
## v3.0.0-beta.2 — 2026-06-11
### Neon glow
- New `glow` effect (alias `neon`) renders an SDF-based halo around glyphs:
`<glow>`, `<glow radius=4 intensity=1.5 color=#00ffcc>`,
`<glow softness=0 core=0.6>` for a sharp neon-tube look, `freq` for pulsing.
When no color is given the halo picks up each glyph's final color, so
`<glow><rainbow>` animates the halo with the text.
- Glow color resolves per glyph at emit time. Replaces `NeonEffect` — the
`neon` markup name still works and now maps to the new effect.
- Per-version render paths: core shaders on 1.21.1, the new render-pipeline
API on 26.1, and a bitmap-only runtime SDF path on 1.20.1 (no FreeType
required at runtime).
- Glow distance fields bake off the render thread with a per-frame budget;
the atlas uploads only changed slots. Drop shadows are suppressed on
glowing glyphs so halos don't double-darken.
### MSDF font pipeline
- Pre-baked MSDF glyphs now persist to disk on all versions — fonts skip the
bake cost on every launch after the first.
- SDF providers attach once per resource reload; fixed the glyph baseline on
1.20.1.
- Forge 1.20.1 embeds the FreeType natives in the `-all` jar and fails the
binding probe cleanly on servers without them.
### KubeJS integration (NeoForge 1.21.1)
- New `EmbersText` binding for scripts: send/queue immersive messages, manage
HUD elements, and style item names and tooltips.
- New `EmbersTextEvents.itemTooltip` client event for per-stack tooltip
styling from scripts.
### Version parity
- Item-name styling and the `EmbersTextFacade` entry point now ship on every
loader/version target, and the item-name mixin is correctly registered on
NeoForge 26.1.
- FTB Quests view tracking ported to 26.1.
- Emojiful compat (1.20.1/1.21.1): effect shadows are dimmed and glow emits
in the Emojiful render path. Not yet available on 26.1.
- Obfuscate reveal/hide order is now computed relative to the span start on
1.20.1/1.21.1, matching 26.1 — spans that start mid-text reveal correctly.
- Immersive overlay messages now attach span effect data (effect list,
typewriter track, obfuscate keys) to their component styles, so typewriter,
obfuscate reveal/random, scroll, and shadow animate in overlays the same way
they do in chat. The per-char render tier is gated against re-applying
style-carried effects (26.1 covers this with its existing render bypass).
### Performance
- Eliminated multiple per-frame allocation and draw-call hot spots in the message
renderer. Stress-test FPS at 50 concurrent messages on NeoForge 26.1 improved
from ~70 to ~1500+ against a ~2000 FPS baseline.
- `EffectApplicator.applyEffects` no longer recursively applies sibling-spawning
effects onto siblings they just created — those level-2 grandchildren never
render. New `Effect#spawnsSiblings()` opt-out lets sibling-spawning effects
skip the redundant pass.
- `ImmersiveMessage.buildComponentFromSpans` caches its output keyed on the
typewriter index snapshot.
- Per-codepoint glyph width and `FormattedCharSequence` now cached per
`(font, codepoint, bold)` on each message.
- Effects can opt out of per-char dispatch via `Effect#requiresPerChar()`.
`TypewriterEffect` opts out when `cursor=false` — its cropping is already
handled at the component layer.
- `GuiGraphics.drawManaged` wraps message rendering on 1.21.1/1.20.1 to collapse
per-text-call buffer flushes (not applicable on 26.1's queued render model).
- Background border drawing replaced per-pixel `fill` loops with single rotated
`fillGradient` calls per strip. Top/bottom borders use a 90° pose rotation so
vanilla's vertical gradient becomes a smooth GPU-interpolated horizontal one.
- `fillHorizontalGradient` (multi-stop background fill) uses the same rotation
trick — N-stop gradient renders as N-1 rotated calls per strip instead of one
fill per pixel.
### Background gradient extensions
- `[bg gradient=a,b,c,...]` markup now accepts any number of stops (previously
capped at 2).
- `[bg border=a,b,c,...]` markup adds N-stop border gradient support. Side
borders use the first and last stops so corners blend cleanly with the N-stop
top/bottom edges.
- New `ImmersiveMessage.borderGradient(ImmersiveColor... stops)` varargs API.
The existing 2-arg overload continues to work unchanged.
### Effect system unification
- Fade is now a `MessageEffect` under the hood. `fadeInTicks` / `fadeOutTicks` builders
construct and add `FadeInMessageEffect` / `FadeOutMessageEffect` to the message's
effect list. The parallel field-based fade state on `ImmersiveMessage` is gone.
- New effect names available in markup and `MessageEffectRegistry`: `fadein`, `fadeout`.
- `MessageEffect#target()` (default `EffectTarget.TEXT`) controls whether the effect's
pose transform scopes to text, background, or both.
- New `AlphaContributor` sub-interface lets effects contribute to a per-frame alpha
multiplier shared by text and background. `FadeInMessageEffect` and
`FadeOutMessageEffect` implement it.
### Slide effect background option
- `<slide>` now accepts a `target` param (`text`, `background`, `all`). Default is
`all`, which slides text and background together. The previous beta.1 behavior of
sliding text only matches `target=text`.
### Metadata
- Loader metadata now declares the EML licence (was incorrectly GPL-3.0) and
the licence text is embedded in every jar.
### Breaking changes from 3.0.0-beta.1
- `ImmersiveMessage` constructor, `builder`, `fromMarkup`, `fromSpans`, `getDuration`,
and `setDuration` now take/return `int` ticks instead of `float`. The internal field
remains `float` for partial-tick interpolation.
- `ImmersiveMessage.typewriter(float, boolean)`, `.typewriter(float)`,
`.typewriterCentered(float)`, and `.obfuscate(ObfuscateMode, float)` are removed.
Use `<type>` / `<obfuscate>` markup, or set typewriter/obfuscate at the span level
via `TextSpan.typewriter(float)` / `.typewriterCentered(float)` / `.obfuscate(...)`.
- `TextSpan.typewriter(float speed, boolean center)` is removed. Use
`TextSpan.typewriter(float speed)` or `TextSpan.typewriterCentered(float speed)`.
- `ImmersiveMessage` no longer exposes public `fadeInTicks` / `fadeOutTicks` /
`typewriter*` / `obfuscate*` fields. `fadeInTicks` / `fadeOutTicks` builders still
work and now construct effects; reflection-based consumers must read from
`getMessageEffects()`.
- NBT key `"Duration"` is now stored as `IntTag` (previously `FloatTag`). NBT saved by
`3.0.0-beta.1` will not load.
- NBT: legacy `fadeIn`, `fadeOut`, `Typewriter`, `TypewriterSpeed`, `TypewriterCenter`,
`ObfuscateMode`, `ObfuscateSpeed` keys are no longer read or written. Fade state
lives in the existing `MessageEffects` list (e.g. `"fadein t=20"`); typewriter and
obfuscate live on `TextSpan` or come from markup.
- S2C message wire format encodes duration as `VarInt` (previously `Float`), the
legacy fade/typewriter/obfuscate per-feature fields are gone from the payload, and
the payload gained a trailing `(boolean, VarInt, int[])` block for
`borderGradientStops`. The effects list is the sole carrier for fade.
`3.0.0-beta.1` clients/servers are incompatible.
- NBT gained an optional `BorderGradient` list. Saves without the key load
unchanged.
- Default `<slide>` behavior changed from text-only to text+background. Pass
`target=text` in markup, or construct `SlideMessageEffect` with that param, to
restore the old shape.
beta
Ember's Text API 3.0.0-beta.2 (Forge 1.20.1)
3.0.0-beta.2+forge-1.20.112 июн. 2026 г.1,2 тыс.Minecraft: 1.20.1forge
Что нового
# Changelog
## v3.0.0-beta.2 — 2026-06-11
### Neon glow
- New `glow` effect (alias `neon`) renders an SDF-based halo around glyphs:
`<glow>`, `<glow radius=4 intensity=1.5 color=#00ffcc>`,
`<glow softness=0 core=0.6>` for a sharp neon-tube look, `freq` for pulsing.
When no color is given the halo picks up each glyph's final color, so
`<glow><rainbow>` animates the halo with the text.
- Glow color resolves per glyph at emit time. Replaces `NeonEffect` — the
`neon` markup name still works and now maps to the new effect.
- Per-version render paths: core shaders on 1.21.1, the new render-pipeline
API on 26.1, and a bitmap-only runtime SDF path on 1.20.1 (no FreeType
required at runtime).
- Glow distance fields bake off the render thread with a per-frame budget;
the atlas uploads only changed slots. Drop shadows are suppressed on
glowing glyphs so halos don't double-darken.
### MSDF font pipeline
- Pre-baked MSDF glyphs now persist to disk on all versions — fonts skip the
bake cost on every launch after the first.
- SDF providers attach once per resource reload; fixed the glyph baseline on
1.20.1.
- Forge 1.20.1 embeds the FreeType natives in the `-all` jar and fails the
binding probe cleanly on servers without them.
### KubeJS integration (NeoForge 1.21.1)
- New `EmbersText` binding for scripts: send/queue immersive messages, manage
HUD elements, and style item names and tooltips.
- New `EmbersTextEvents.itemTooltip` client event for per-stack tooltip
styling from scripts.
### Version parity
- Item-name styling and the `EmbersTextFacade` entry point now ship on every
loader/version target, and the item-name mixin is correctly registered on
NeoForge 26.1.
- FTB Quests view tracking ported to 26.1.
- Emojiful compat (1.20.1/1.21.1): effect shadows are dimmed and glow emits
in the Emojiful render path. Not yet available on 26.1.
- Obfuscate reveal/hide order is now computed relative to the span start on
1.20.1/1.21.1, matching 26.1 — spans that start mid-text reveal correctly.
- Immersive overlay messages now attach span effect data (effect list,
typewriter track, obfuscate keys) to their component styles, so typewriter,
obfuscate reveal/random, scroll, and shadow animate in overlays the same way
they do in chat. The per-char render tier is gated against re-applying
style-carried effects (26.1 covers this with its existing render bypass).
### Performance
- Eliminated multiple per-frame allocation and draw-call hot spots in the message
renderer. Stress-test FPS at 50 concurrent messages on NeoForge 26.1 improved
from ~70 to ~1500+ against a ~2000 FPS baseline.
- `EffectApplicator.applyEffects` no longer recursively applies sibling-spawning
effects onto siblings they just created — those level-2 grandchildren never
render. New `Effect#spawnsSiblings()` opt-out lets sibling-spawning effects
skip the redundant pass.
- `ImmersiveMessage.buildComponentFromSpans` caches its output keyed on the
typewriter index snapshot.
- Per-codepoint glyph width and `FormattedCharSequence` now cached per
`(font, codepoint, bold)` on each message.
- Effects can opt out of per-char dispatch via `Effect#requiresPerChar()`.
`TypewriterEffect` opts out when `cursor=false` — its cropping is already
handled at the component layer.
- `GuiGraphics.drawManaged` wraps message rendering on 1.21.1/1.20.1 to collapse
per-text-call buffer flushes (not applicable on 26.1's queued render model).
- Background border drawing replaced per-pixel `fill` loops with single rotated
`fillGradient` calls per strip. Top/bottom borders use a 90° pose rotation so
vanilla's vertical gradient becomes a smooth GPU-interpolated horizontal one.
- `fillHorizontalGradient` (multi-stop background fill) uses the same rotation
trick — N-stop gradient renders as N-1 rotated calls per strip instead of one
fill per pixel.
### Background gradient extensions
- `[bg gradient=a,b,c,...]` markup now accepts any number of stops (previously
capped at 2).
- `[bg border=a,b,c,...]` markup adds N-stop border gradient support. Side
borders use the first and last stops so corners blend cleanly with the N-stop
top/bottom edges.
- New `ImmersiveMessage.borderGradient(ImmersiveColor... stops)` varargs API.
The existing 2-arg overload continues to work unchanged.
### Effect system unification
- Fade is now a `MessageEffect` under the hood. `fadeInTicks` / `fadeOutTicks` builders
construct and add `FadeInMessageEffect` / `FadeOutMessageEffect` to the message's
effect list. The parallel field-based fade state on `ImmersiveMessage` is gone.
- New effect names available in markup and `MessageEffectRegistry`: `fadein`, `fadeout`.
- `MessageEffect#target()` (default `EffectTarget.TEXT`) controls whether the effect's
pose transform scopes to text, background, or both.
- New `AlphaContributor` sub-interface lets effects contribute to a per-frame alpha
multiplier shared by text and background. `FadeInMessageEffect` and
`FadeOutMessageEffect` implement it.
### Slide effect background option
- `<slide>` now accepts a `target` param (`text`, `background`, `all`). Default is
`all`, which slides text and background together. The previous beta.1 behavior of
sliding text only matches `target=text`.
### Metadata
- Loader metadata now declares the EML licence (was incorrectly GPL-3.0) and
the licence text is embedded in every jar.
### Breaking changes from 3.0.0-beta.1
- `ImmersiveMessage` constructor, `builder`, `fromMarkup`, `fromSpans`, `getDuration`,
and `setDuration` now take/return `int` ticks instead of `float`. The internal field
remains `float` for partial-tick interpolation.
- `ImmersiveMessage.typewriter(float, boolean)`, `.typewriter(float)`,
`.typewriterCentered(float)`, and `.obfuscate(ObfuscateMode, float)` are removed.
Use `<type>` / `<obfuscate>` markup, or set typewriter/obfuscate at the span level
via `TextSpan.typewriter(float)` / `.typewriterCentered(float)` / `.obfuscate(...)`.
- `TextSpan.typewriter(float speed, boolean center)` is removed. Use
`TextSpan.typewriter(float speed)` or `TextSpan.typewriterCentered(float speed)`.
- `ImmersiveMessage` no longer exposes public `fadeInTicks` / `fadeOutTicks` /
`typewriter*` / `obfuscate*` fields. `fadeInTicks` / `fadeOutTicks` builders still
work and now construct effects; reflection-based consumers must read from
`getMessageEffects()`.
- NBT key `"Duration"` is now stored as `IntTag` (previously `FloatTag`). NBT saved by
`3.0.0-beta.1` will not load.
- NBT: legacy `fadeIn`, `fadeOut`, `Typewriter`, `TypewriterSpeed`, `TypewriterCenter`,
`ObfuscateMode`, `ObfuscateSpeed` keys are no longer read or written. Fade state
lives in the existing `MessageEffects` list (e.g. `"fadein t=20"`); typewriter and
obfuscate live on `TextSpan` or come from markup.
- S2C message wire format encodes duration as `VarInt` (previously `Float`), the
legacy fade/typewriter/obfuscate per-feature fields are gone from the payload, and
the payload gained a trailing `(boolean, VarInt, int[])` block for
`borderGradientStops`. The effects list is the sole carrier for fade.
`3.0.0-beta.1` clients/servers are incompatible.
- NBT gained an optional `BorderGradient` list. Saves without the key load
unchanged.
- Default `<slide>` behavior changed from text-only to text+background. Pass
`target=text` in markup, or construct `SlideMessageEffect` with that param, to
restore the old shape.
beta
Ember's Text API 3.0.0-beta.2 (Fabric 26.1)
3.0.0-beta.2+fabric-26.112 июн. 2026 г.56Minecraft: 26.1, 26.1.1, 26.1.2fabric
Что нового
# Changelog
## v3.0.0-beta.2 — 2026-06-11
### Neon glow
- New `glow` effect (alias `neon`) renders an SDF-based halo around glyphs:
`<glow>`, `<glow radius=4 intensity=1.5 color=#00ffcc>`,
`<glow softness=0 core=0.6>` for a sharp neon-tube look, `freq` for pulsing.
When no color is given the halo picks up each glyph's final color, so
`<glow><rainbow>` animates the halo with the text.
- Glow color resolves per glyph at emit time. Replaces `NeonEffect` — the
`neon` markup name still works and now maps to the new effect.
- Per-version render paths: core shaders on 1.21.1, the new render-pipeline
API on 26.1, and a bitmap-only runtime SDF path on 1.20.1 (no FreeType
required at runtime).
- Glow distance fields bake off the render thread with a per-frame budget;
the atlas uploads only changed slots. Drop shadows are suppressed on
glowing glyphs so halos don't double-darken.
### MSDF font pipeline
- Pre-baked MSDF glyphs now persist to disk on all versions — fonts skip the
bake cost on every launch after the first.
- SDF providers attach once per resource reload; fixed the glyph baseline on
1.20.1.
- Forge 1.20.1 embeds the FreeType natives in the `-all` jar and fails the
binding probe cleanly on servers without them.
### KubeJS integration (NeoForge 1.21.1)
- New `EmbersText` binding for scripts: send/queue immersive messages, manage
HUD elements, and style item names and tooltips.
- New `EmbersTextEvents.itemTooltip` client event for per-stack tooltip
styling from scripts.
### Version parity
- Item-name styling and the `EmbersTextFacade` entry point now ship on every
loader/version target, and the item-name mixin is correctly registered on
NeoForge 26.1.
- FTB Quests view tracking ported to 26.1.
- Emojiful compat (1.20.1/1.21.1): effect shadows are dimmed and glow emits
in the Emojiful render path. Not yet available on 26.1.
- Obfuscate reveal/hide order is now computed relative to the span start on
1.20.1/1.21.1, matching 26.1 — spans that start mid-text reveal correctly.
- Immersive overlay messages now attach span effect data (effect list,
typewriter track, obfuscate keys) to their component styles, so typewriter,
obfuscate reveal/random, scroll, and shadow animate in overlays the same way
they do in chat. The per-char render tier is gated against re-applying
style-carried effects (26.1 covers this with its existing render bypass).
### Performance
- Eliminated multiple per-frame allocation and draw-call hot spots in the message
renderer. Stress-test FPS at 50 concurrent messages on NeoForge 26.1 improved
from ~70 to ~1500+ against a ~2000 FPS baseline.
- `EffectApplicator.applyEffects` no longer recursively applies sibling-spawning
effects onto siblings they just created — those level-2 grandchildren never
render. New `Effect#spawnsSiblings()` opt-out lets sibling-spawning effects
skip the redundant pass.
- `ImmersiveMessage.buildComponentFromSpans` caches its output keyed on the
typewriter index snapshot.
- Per-codepoint glyph width and `FormattedCharSequence` now cached per
`(font, codepoint, bold)` on each message.
- Effects can opt out of per-char dispatch via `Effect#requiresPerChar()`.
`TypewriterEffect` opts out when `cursor=false` — its cropping is already
handled at the component layer.
- `GuiGraphics.drawManaged` wraps message rendering on 1.21.1/1.20.1 to collapse
per-text-call buffer flushes (not applicable on 26.1's queued render model).
- Background border drawing replaced per-pixel `fill` loops with single rotated
`fillGradient` calls per strip. Top/bottom borders use a 90° pose rotation so
vanilla's vertical gradient becomes a smooth GPU-interpolated horizontal one.
- `fillHorizontalGradient` (multi-stop background fill) uses the same rotation
trick — N-stop gradient renders as N-1 rotated calls per strip instead of one
fill per pixel.
### Background gradient extensions
- `[bg gradient=a,b,c,...]` markup now accepts any number of stops (previously
capped at 2).
- `[bg border=a,b,c,...]` markup adds N-stop border gradient support. Side
borders use the first and last stops so corners blend cleanly with the N-stop
top/bottom edges.
- New `ImmersiveMessage.borderGradient(ImmersiveColor... stops)` varargs API.
The existing 2-arg overload continues to work unchanged.
### Effect system unification
- Fade is now a `MessageEffect` under the hood. `fadeInTicks` / `fadeOutTicks` builders
construct and add `FadeInMessageEffect` / `FadeOutMessageEffect` to the message's
effect list. The parallel field-based fade state on `ImmersiveMessage` is gone.
- New effect names available in markup and `MessageEffectRegistry`: `fadein`, `fadeout`.
- `MessageEffect#target()` (default `EffectTarget.TEXT`) controls whether the effect's
pose transform scopes to text, background, or both.
- New `AlphaContributor` sub-interface lets effects contribute to a per-frame alpha
multiplier shared by text and background. `FadeInMessageEffect` and
`FadeOutMessageEffect` implement it.
### Slide effect background option
- `<slide>` now accepts a `target` param (`text`, `background`, `all`). Default is
`all`, which slides text and background together. The previous beta.1 behavior of
sliding text only matches `target=text`.
### Metadata
- Loader metadata now declares the EML licence (was incorrectly GPL-3.0) and
the licence text is embedded in every jar.
### Breaking changes from 3.0.0-beta.1
- `ImmersiveMessage` constructor, `builder`, `fromMarkup`, `fromSpans`, `getDuration`,
and `setDuration` now take/return `int` ticks instead of `float`. The internal field
remains `float` for partial-tick interpolation.
- `ImmersiveMessage.typewriter(float, boolean)`, `.typewriter(float)`,
`.typewriterCentered(float)`, and `.obfuscate(ObfuscateMode, float)` are removed.
Use `<type>` / `<obfuscate>` markup, or set typewriter/obfuscate at the span level
via `TextSpan.typewriter(float)` / `.typewriterCentered(float)` / `.obfuscate(...)`.
- `TextSpan.typewriter(float speed, boolean center)` is removed. Use
`TextSpan.typewriter(float speed)` or `TextSpan.typewriterCentered(float speed)`.
- `ImmersiveMessage` no longer exposes public `fadeInTicks` / `fadeOutTicks` /
`typewriter*` / `obfuscate*` fields. `fadeInTicks` / `fadeOutTicks` builders still
work and now construct effects; reflection-based consumers must read from
`getMessageEffects()`.
- NBT key `"Duration"` is now stored as `IntTag` (previously `FloatTag`). NBT saved by
`3.0.0-beta.1` will not load.
- NBT: legacy `fadeIn`, `fadeOut`, `Typewriter`, `TypewriterSpeed`, `TypewriterCenter`,
`ObfuscateMode`, `ObfuscateSpeed` keys are no longer read or written. Fade state
lives in the existing `MessageEffects` list (e.g. `"fadein t=20"`); typewriter and
obfuscate live on `TextSpan` or come from markup.
- S2C message wire format encodes duration as `VarInt` (previously `Float`), the
legacy fade/typewriter/obfuscate per-feature fields are gone from the payload, and
the payload gained a trailing `(boolean, VarInt, int[])` block for
`borderGradientStops`. The effects list is the sole carrier for fade.
`3.0.0-beta.1` clients/servers are incompatible.
- NBT gained an optional `BorderGradient` list. Saves without the key load
unchanged.
- Default `<slide>` behavior changed from text-only to text+background. Pass
`target=text` in markup, or construct `SlideMessageEffect` with that param, to
restore the old shape.
beta
Ember's Text API 3.0.0-beta.2 (Fabric 1.21.1)
3.0.0-beta.2+fabric-1.21.112 июн. 2026 г.766Minecraft: 1.21.1fabric
Что нового
# Changelog
## v3.0.0-beta.2 — 2026-06-11
### Neon glow
- New `glow` effect (alias `neon`) renders an SDF-based halo around glyphs:
`<glow>`, `<glow radius=4 intensity=1.5 color=#00ffcc>`,
`<glow softness=0 core=0.6>` for a sharp neon-tube look, `freq` for pulsing.
When no color is given the halo picks up each glyph's final color, so
`<glow><rainbow>` animates the halo with the text.
- Glow color resolves per glyph at emit time. Replaces `NeonEffect` — the
`neon` markup name still works and now maps to the new effect.
- Per-version render paths: core shaders on 1.21.1, the new render-pipeline
API on 26.1, and a bitmap-only runtime SDF path on 1.20.1 (no FreeType
required at runtime).
- Glow distance fields bake off the render thread with a per-frame budget;
the atlas uploads only changed slots. Drop shadows are suppressed on
glowing glyphs so halos don't double-darken.
### MSDF font pipeline
- Pre-baked MSDF glyphs now persist to disk on all versions — fonts skip the
bake cost on every launch after the first.
- SDF providers attach once per resource reload; fixed the glyph baseline on
1.20.1.
- Forge 1.20.1 embeds the FreeType natives in the `-all` jar and fails the
binding probe cleanly on servers without them.
### KubeJS integration (NeoForge 1.21.1)
- New `EmbersText` binding for scripts: send/queue immersive messages, manage
HUD elements, and style item names and tooltips.
- New `EmbersTextEvents.itemTooltip` client event for per-stack tooltip
styling from scripts.
### Version parity
- Item-name styling and the `EmbersTextFacade` entry point now ship on every
loader/version target, and the item-name mixin is correctly registered on
NeoForge 26.1.
- FTB Quests view tracking ported to 26.1.
- Emojiful compat (1.20.1/1.21.1): effect shadows are dimmed and glow emits
in the Emojiful render path. Not yet available on 26.1.
- Obfuscate reveal/hide order is now computed relative to the span start on
1.20.1/1.21.1, matching 26.1 — spans that start mid-text reveal correctly.
- Immersive overlay messages now attach span effect data (effect list,
typewriter track, obfuscate keys) to their component styles, so typewriter,
obfuscate reveal/random, scroll, and shadow animate in overlays the same way
they do in chat. The per-char render tier is gated against re-applying
style-carried effects (26.1 covers this with its existing render bypass).
### Performance
- Eliminated multiple per-frame allocation and draw-call hot spots in the message
renderer. Stress-test FPS at 50 concurrent messages on NeoForge 26.1 improved
from ~70 to ~1500+ against a ~2000 FPS baseline.
- `EffectApplicator.applyEffects` no longer recursively applies sibling-spawning
effects onto siblings they just created — those level-2 grandchildren never
render. New `Effect#spawnsSiblings()` opt-out lets sibling-spawning effects
skip the redundant pass.
- `ImmersiveMessage.buildComponentFromSpans` caches its output keyed on the
typewriter index snapshot.
- Per-codepoint glyph width and `FormattedCharSequence` now cached per
`(font, codepoint, bold)` on each message.
- Effects can opt out of per-char dispatch via `Effect#requiresPerChar()`.
`TypewriterEffect` opts out when `cursor=false` — its cropping is already
handled at the component layer.
- `GuiGraphics.drawManaged` wraps message rendering on 1.21.1/1.20.1 to collapse
per-text-call buffer flushes (not applicable on 26.1's queued render model).
- Background border drawing replaced per-pixel `fill` loops with single rotated
`fillGradient` calls per strip. Top/bottom borders use a 90° pose rotation so
vanilla's vertical gradient becomes a smooth GPU-interpolated horizontal one.
- `fillHorizontalGradient` (multi-stop background fill) uses the same rotation
trick — N-stop gradient renders as N-1 rotated calls per strip instead of one
fill per pixel.
### Background gradient extensions
- `[bg gradient=a,b,c,...]` markup now accepts any number of stops (previously
capped at 2).
- `[bg border=a,b,c,...]` markup adds N-stop border gradient support. Side
borders use the first and last stops so corners blend cleanly with the N-stop
top/bottom edges.
- New `ImmersiveMessage.borderGradient(ImmersiveColor... stops)` varargs API.
The existing 2-arg overload continues to work unchanged.
### Effect system unification
- Fade is now a `MessageEffect` under the hood. `fadeInTicks` / `fadeOutTicks` builders
construct and add `FadeInMessageEffect` / `FadeOutMessageEffect` to the message's
effect list. The parallel field-based fade state on `ImmersiveMessage` is gone.
- New effect names available in markup and `MessageEffectRegistry`: `fadein`, `fadeout`.
- `MessageEffect#target()` (default `EffectTarget.TEXT`) controls whether the effect's
pose transform scopes to text, background, or both.
- New `AlphaContributor` sub-interface lets effects contribute to a per-frame alpha
multiplier shared by text and background. `FadeInMessageEffect` and
`FadeOutMessageEffect` implement it.
### Slide effect background option
- `<slide>` now accepts a `target` param (`text`, `background`, `all`). Default is
`all`, which slides text and background together. The previous beta.1 behavior of
sliding text only matches `target=text`.
### Metadata
- Loader metadata now declares the EML licence (was incorrectly GPL-3.0) and
the licence text is embedded in every jar.
### Breaking changes from 3.0.0-beta.1
- `ImmersiveMessage` constructor, `builder`, `fromMarkup`, `fromSpans`, `getDuration`,
and `setDuration` now take/return `int` ticks instead of `float`. The internal field
remains `float` for partial-tick interpolation.
- `ImmersiveMessage.typewriter(float, boolean)`, `.typewriter(float)`,
`.typewriterCentered(float)`, and `.obfuscate(ObfuscateMode, float)` are removed.
Use `<type>` / `<obfuscate>` markup, or set typewriter/obfuscate at the span level
via `TextSpan.typewriter(float)` / `.typewriterCentered(float)` / `.obfuscate(...)`.
- `TextSpan.typewriter(float speed, boolean center)` is removed. Use
`TextSpan.typewriter(float speed)` or `TextSpan.typewriterCentered(float speed)`.
- `ImmersiveMessage` no longer exposes public `fadeInTicks` / `fadeOutTicks` /
`typewriter*` / `obfuscate*` fields. `fadeInTicks` / `fadeOutTicks` builders still
work and now construct effects; reflection-based consumers must read from
`getMessageEffects()`.
- NBT key `"Duration"` is now stored as `IntTag` (previously `FloatTag`). NBT saved by
`3.0.0-beta.1` will not load.
- NBT: legacy `fadeIn`, `fadeOut`, `Typewriter`, `TypewriterSpeed`, `TypewriterCenter`,
`ObfuscateMode`, `ObfuscateSpeed` keys are no longer read or written. Fade state
lives in the existing `MessageEffects` list (e.g. `"fadein t=20"`); typewriter and
obfuscate live on `TextSpan` or come from markup.
- S2C message wire format encodes duration as `VarInt` (previously `Float`), the
legacy fade/typewriter/obfuscate per-feature fields are gone from the payload, and
the payload gained a trailing `(boolean, VarInt, int[])` block for
`borderGradientStops`. The effects list is the sole carrier for fade.
`3.0.0-beta.1` clients/servers are incompatible.
- NBT gained an optional `BorderGradient` list. Saves without the key load
unchanged.
- Default `<slide>` behavior changed from text-only to text+background. Pass
`target=text` in markup, or construct `SlideMessageEffect` with that param, to
restore the old shape.
beta
Ember's Text API 3.0.0-beta.2 (Fabric 1.20.1)
3.0.0-beta.2+fabric-1.20.112 июн. 2026 г.26Minecraft: 1.20.1fabric
Что нового
# Changelog
## v3.0.0-beta.2 — 2026-06-11
### Neon glow
- New `glow` effect (alias `neon`) renders an SDF-based halo around glyphs:
`<glow>`, `<glow radius=4 intensity=1.5 color=#00ffcc>`,
`<glow softness=0 core=0.6>` for a sharp neon-tube look, `freq` for pulsing.
When no color is given the halo picks up each glyph's final color, so
`<glow><rainbow>` animates the halo with the text.
- Glow color resolves per glyph at emit time. Replaces `NeonEffect` — the
`neon` markup name still works and now maps to the new effect.
- Per-version render paths: core shaders on 1.21.1, the new render-pipeline
API on 26.1, and a bitmap-only runtime SDF path on 1.20.1 (no FreeType
required at runtime).
- Glow distance fields bake off the render thread with a per-frame budget;
the atlas uploads only changed slots. Drop shadows are suppressed on
glowing glyphs so halos don't double-darken.
### MSDF font pipeline
- Pre-baked MSDF glyphs now persist to disk on all versions — fonts skip the
bake cost on every launch after the first.
- SDF providers attach once per resource reload; fixed the glyph baseline on
1.20.1.
- Forge 1.20.1 embeds the FreeType natives in the `-all` jar and fails the
binding probe cleanly on servers without them.
### KubeJS integration (NeoForge 1.21.1)
- New `EmbersText` binding for scripts: send/queue immersive messages, manage
HUD elements, and style item names and tooltips.
- New `EmbersTextEvents.itemTooltip` client event for per-stack tooltip
styling from scripts.
### Version parity
- Item-name styling and the `EmbersTextFacade` entry point now ship on every
loader/version target, and the item-name mixin is correctly registered on
NeoForge 26.1.
- FTB Quests view tracking ported to 26.1.
- Emojiful compat (1.20.1/1.21.1): effect shadows are dimmed and glow emits
in the Emojiful render path. Not yet available on 26.1.
- Obfuscate reveal/hide order is now computed relative to the span start on
1.20.1/1.21.1, matching 26.1 — spans that start mid-text reveal correctly.
- Immersive overlay messages now attach span effect data (effect list,
typewriter track, obfuscate keys) to their component styles, so typewriter,
obfuscate reveal/random, scroll, and shadow animate in overlays the same way
they do in chat. The per-char render tier is gated against re-applying
style-carried effects (26.1 covers this with its existing render bypass).
### Performance
- Eliminated multiple per-frame allocation and draw-call hot spots in the message
renderer. Stress-test FPS at 50 concurrent messages on NeoForge 26.1 improved
from ~70 to ~1500+ against a ~2000 FPS baseline.
- `EffectApplicator.applyEffects` no longer recursively applies sibling-spawning
effects onto siblings they just created — those level-2 grandchildren never
render. New `Effect#spawnsSiblings()` opt-out lets sibling-spawning effects
skip the redundant pass.
- `ImmersiveMessage.buildComponentFromSpans` caches its output keyed on the
typewriter index snapshot.
- Per-codepoint glyph width and `FormattedCharSequence` now cached per
`(font, codepoint, bold)` on each message.
- Effects can opt out of per-char dispatch via `Effect#requiresPerChar()`.
`TypewriterEffect` opts out when `cursor=false` — its cropping is already
handled at the component layer.
- `GuiGraphics.drawManaged` wraps message rendering on 1.21.1/1.20.1 to collapse
per-text-call buffer flushes (not applicable on 26.1's queued render model).
- Background border drawing replaced per-pixel `fill` loops with single rotated
`fillGradient` calls per strip. Top/bottom borders use a 90° pose rotation so
vanilla's vertical gradient becomes a smooth GPU-interpolated horizontal one.
- `fillHorizontalGradient` (multi-stop background fill) uses the same rotation
trick — N-stop gradient renders as N-1 rotated calls per strip instead of one
fill per pixel.
### Background gradient extensions
- `[bg gradient=a,b,c,...]` markup now accepts any number of stops (previously
capped at 2).
- `[bg border=a,b,c,...]` markup adds N-stop border gradient support. Side
borders use the first and last stops so corners blend cleanly with the N-stop
top/bottom edges.
- New `ImmersiveMessage.borderGradient(ImmersiveColor... stops)` varargs API.
The existing 2-arg overload continues to work unchanged.
### Effect system unification
- Fade is now a `MessageEffect` under the hood. `fadeInTicks` / `fadeOutTicks` builders
construct and add `FadeInMessageEffect` / `FadeOutMessageEffect` to the message's
effect list. The parallel field-based fade state on `ImmersiveMessage` is gone.
- New effect names available in markup and `MessageEffectRegistry`: `fadein`, `fadeout`.
- `MessageEffect#target()` (default `EffectTarget.TEXT`) controls whether the effect's
pose transform scopes to text, background, or both.
- New `AlphaContributor` sub-interface lets effects contribute to a per-frame alpha
multiplier shared by text and background. `FadeInMessageEffect` and
`FadeOutMessageEffect` implement it.
### Slide effect background option
- `<slide>` now accepts a `target` param (`text`, `background`, `all`). Default is
`all`, which slides text and background together. The previous beta.1 behavior of
sliding text only matches `target=text`.
### Metadata
- Loader metadata now declares the EML licence (was incorrectly GPL-3.0) and
the licence text is embedded in every jar.
### Breaking changes from 3.0.0-beta.1
- `ImmersiveMessage` constructor, `builder`, `fromMarkup`, `fromSpans`, `getDuration`,
and `setDuration` now take/return `int` ticks instead of `float`. The internal field
remains `float` for partial-tick interpolation.
- `ImmersiveMessage.typewriter(float, boolean)`, `.typewriter(float)`,
`.typewriterCentered(float)`, and `.obfuscate(ObfuscateMode, float)` are removed.
Use `<type>` / `<obfuscate>` markup, or set typewriter/obfuscate at the span level
via `TextSpan.typewriter(float)` / `.typewriterCentered(float)` / `.obfuscate(...)`.
- `TextSpan.typewriter(float speed, boolean center)` is removed. Use
`TextSpan.typewriter(float speed)` or `TextSpan.typewriterCentered(float speed)`.
- `ImmersiveMessage` no longer exposes public `fadeInTicks` / `fadeOutTicks` /
`typewriter*` / `obfuscate*` fields. `fadeInTicks` / `fadeOutTicks` builders still
work and now construct effects; reflection-based consumers must read from
`getMessageEffects()`.
- NBT key `"Duration"` is now stored as `IntTag` (previously `FloatTag`). NBT saved by
`3.0.0-beta.1` will not load.
- NBT: legacy `fadeIn`, `fadeOut`, `Typewriter`, `TypewriterSpeed`, `TypewriterCenter`,
`ObfuscateMode`, `ObfuscateSpeed` keys are no longer read or written. Fade state
lives in the existing `MessageEffects` list (e.g. `"fadein t=20"`); typewriter and
obfuscate live on `TextSpan` or come from markup.
- S2C message wire format encodes duration as `VarInt` (previously `Float`), the
legacy fade/typewriter/obfuscate per-feature fields are gone from the payload, and
the payload gained a trailing `(boolean, VarInt, int[])` block for
`borderGradientStops`. The effects list is the sole carrier for fade.
`3.0.0-beta.1` clients/servers are incompatible.
- NBT gained an optional `BorderGradient` list. Saves without the key load
unchanged.
- Default `<slide>` behavior changed from text-only to text+background. Pass
`target=text` in markup, or construct `SlideMessageEffect` with that param, to
restore the old shape.
beta
Ember's Text API 3.0.0-beta.1 (Forge 1.20.1)
3.0.0-beta.1+forge-1.20.123 мая 2026 г.2,5 тыс.Minecraft: 1.20.1forge
Что нового
# Changelog
## v3.0.0-beta.1 — 2026-05-21
### Changed
- Replaced the config system. Options are now defined by a single schema split
into two files: `emberstextapi-client.toml`/`.json` (per-client: which effects
render, performance) and `emberstextapi-server.toml`/`.json` (authoritative:
player markup permissions, message limits, anvil rename length). The old
`emberstextapi-common.toml`, `emberstextapi-client.toml` (old layout) and
`emberstextapi.json` are no longer read — settings must be re-applied in the
new files, which generate with defaults on first run.
- Player markup access is now permission-gated. `playerMarkup.mode` is `ALL`,
`PERMISSION` (nodes `emberstextapi.markup.use`, `.effect.<name>`,
`.category.<cat>`, `.bypass`, with an OP-level fallback), or `NONE`. Effects
can be allowed/denied per-effect or per-category for both the client render
gate and the server markup gate. LuckPerms and FTB Ranks back the permission
nodes automatically.
- Unified effect parameter naming across visual, message, and animation effects.
Every public param now has a canonical fully-spelled name and a short alias
(e.g., `amplitude`/`amp`, `frequency`/`freq`, `duration`/`dur`). Old ad-hoc
shorts (`a`/`f`/`w`, etc.) no longer work — see
`docs/superpowers/specs/2026-05-18-effect-parameter-refinement-design.md`
for the full rename table.
- Effects now declare params via `ParamSchema`; unknown params log a warning
instead of being silently ignored.
- `obfuscate`'s `speed` is renamed to `interval` (ms per step).
- `shatter`'s `speed` is renamed to `duration` (animation length in seconds).
- `matrix`'s `resolve` is renamed to `duration`.
- `vibrate`'s `intensity` is renamed to `amplitude`; `speed` to `frequency`.
- `breathe`'s `amount` is renamed to `amplitude`; `speed` to `frequency`.
- `circle`'s `a` is renamed to `radius` (the param was always a radius, not an
amplitude).
- `drift`'s `rx`/`ry` are renamed to `amplitudeX`/`amplitudeY`.
- `gradient`'s `span` is renamed to `length`; `speed` to `frequency`.
- `fade`'s `a` is renamed to `minAlpha`.
- `neon`'s `p`/`f` are renamed to `frequency`/`falloff`; `c` to `color`.
- `RainbowEffect.getName()` now returns `"rainbow"` (was `"rainb"`).
- `GradientEffect.getName()` now returns `"gradient"` (was `"grad"`).
- `TurbulenceEffect.getName()` now returns `"turbulence"` (was `"turb"`).
- `PendulumEffect.getName()` now returns `"pendulum"` (was `"pend"`).
- `typewriter`'s `cursor` param is now boolean-only; use `cursorChar` to set
the glyph. The `cursor=<char>` overload is dropped.
### Added
- Seven new immersive-message motion effects: `grow` (continuous scale
oscillation), `slam` (one-shot drop-in with damped bounces), `float`
(slow sinusoidal drift), `drift` (independent X/Y wander), `vibrate`
(high-frequency jitter), `spin` (full Z-axis rotation), and `slide`
(one-shot slide-in or slide-out from any screen edge). All compose with
the existing `rock`/`breathe` effects and with each other.
- `slide` accepts an `easing` param: `linear`, `easeInCubic`, `easeOutCubic`,
`easeInOutCubic`. Defaults match prior behavior (`easeOutCubic` for
`mode=in`, `easeInCubic` for `mode=out`).
- Three per-character message effects: `drip` (characters fall and trail
downward in staggered order), `shatter` (characters fragment outward at a
configurable trigger time), and `matrix` (characters scramble via random
glyph cycling then resolve in stagger order).
- `outline` span effect: renders a stroked outline around glyphs using a
second SDF draw pass with a configurable color (`c`) and width (`w`).
Requires an SDF font; logs a warning and skips the outline draw on vanilla
fonts.
- Per-character effect dispatch: `MessageEffect` implementations can opt in
via `perCharacter()` to receive an `applyToChar` call for each rendered
glyph, enabling effects that vary per character. Existing whole-message
effects are unaffected.
- `[sound ...]` message effect plays a Minecraft sound at a configurable time
offset (`at`), volume, and pitch. Built-in presets (`click`, `whoosh`,
`static`, `magic`, `pop`, `thud`, `shatter`) map to vanilla sound ids;
any resource location works as well. `drip`, `shatter`, `matrix`, and
`slam` each accept an inline `sound` param that fires on their respective
key moment (first drip, shatter trigger, matrix resolve, slam land).
- ETA markup inside `Component.translatable` string arguments now renders.
`<...>` tags in arguments passed to `translatable(key, args...)` are
parsed by the existing markup pipeline instead of being forwarded as
literal strings.
- `EffectRegistry.getSchema(name)` and `MessageEffectRegistry.getSchema(name)`
return the `ParamSchema` for an effect, enabling introspection and doc
tooling.
- The server syncs each player's effective markup policy on join; the client
caches it for accurate previews and feedback.
- `/emberstextapi reload` reloads config from disk and re-syncs policy to
online players; `/emberstextapi policy [player]` prints a player's resolved
markup policy.
- MSDF font rendering now works on MC 26.1 (NeoForge and Fabric); pipelines
are registered against the 26.1 RenderPipelines API.
beta
Ember's Text API 3.0.0-beta.1 (NeoForge 26.1)
3.0.0-beta.1+neoforge-26.123 мая 2026 г.83Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
# Changelog
## v3.0.0-beta.1 — 2026-05-21
### Changed
- Replaced the config system. Options are now defined by a single schema split
into two files: `emberstextapi-client.toml`/`.json` (per-client: which effects
render, performance) and `emberstextapi-server.toml`/`.json` (authoritative:
player markup permissions, message limits, anvil rename length). The old
`emberstextapi-common.toml`, `emberstextapi-client.toml` (old layout) and
`emberstextapi.json` are no longer read — settings must be re-applied in the
new files, which generate with defaults on first run.
- Player markup access is now permission-gated. `playerMarkup.mode` is `ALL`,
`PERMISSION` (nodes `emberstextapi.markup.use`, `.effect.<name>`,
`.category.<cat>`, `.bypass`, with an OP-level fallback), or `NONE`. Effects
can be allowed/denied per-effect or per-category for both the client render
gate and the server markup gate. LuckPerms and FTB Ranks back the permission
nodes automatically.
- Unified effect parameter naming across visual, message, and animation effects.
Every public param now has a canonical fully-spelled name and a short alias
(e.g., `amplitude`/`amp`, `frequency`/`freq`, `duration`/`dur`). Old ad-hoc
shorts (`a`/`f`/`w`, etc.) no longer work — see
`docs/superpowers/specs/2026-05-18-effect-parameter-refinement-design.md`
for the full rename table.
- Effects now declare params via `ParamSchema`; unknown params log a warning
instead of being silently ignored.
- `obfuscate`'s `speed` is renamed to `interval` (ms per step).
- `shatter`'s `speed` is renamed to `duration` (animation length in seconds).
- `matrix`'s `resolve` is renamed to `duration`.
- `vibrate`'s `intensity` is renamed to `amplitude`; `speed` to `frequency`.
- `breathe`'s `amount` is renamed to `amplitude`; `speed` to `frequency`.
- `circle`'s `a` is renamed to `radius` (the param was always a radius, not an
amplitude).
- `drift`'s `rx`/`ry` are renamed to `amplitudeX`/`amplitudeY`.
- `gradient`'s `span` is renamed to `length`; `speed` to `frequency`.
- `fade`'s `a` is renamed to `minAlpha`.
- `neon`'s `p`/`f` are renamed to `frequency`/`falloff`; `c` to `color`.
- `RainbowEffect.getName()` now returns `"rainbow"` (was `"rainb"`).
- `GradientEffect.getName()` now returns `"gradient"` (was `"grad"`).
- `TurbulenceEffect.getName()` now returns `"turbulence"` (was `"turb"`).
- `PendulumEffect.getName()` now returns `"pendulum"` (was `"pend"`).
- `typewriter`'s `cursor` param is now boolean-only; use `cursorChar` to set
the glyph. The `cursor=<char>` overload is dropped.
### Added
- Seven new immersive-message motion effects: `grow` (continuous scale
oscillation), `slam` (one-shot drop-in with damped bounces), `float`
(slow sinusoidal drift), `drift` (independent X/Y wander), `vibrate`
(high-frequency jitter), `spin` (full Z-axis rotation), and `slide`
(one-shot slide-in or slide-out from any screen edge). All compose with
the existing `rock`/`breathe` effects and with each other.
- `slide` accepts an `easing` param: `linear`, `easeInCubic`, `easeOutCubic`,
`easeInOutCubic`. Defaults match prior behavior (`easeOutCubic` for
`mode=in`, `easeInCubic` for `mode=out`).
- Three per-character message effects: `drip` (characters fall and trail
downward in staggered order), `shatter` (characters fragment outward at a
configurable trigger time), and `matrix` (characters scramble via random
glyph cycling then resolve in stagger order).
- `outline` span effect: renders a stroked outline around glyphs using a
second SDF draw pass with a configurable color (`c`) and width (`w`).
Requires an SDF font; logs a warning and skips the outline draw on vanilla
fonts.
- Per-character effect dispatch: `MessageEffect` implementations can opt in
via `perCharacter()` to receive an `applyToChar` call for each rendered
glyph, enabling effects that vary per character. Existing whole-message
effects are unaffected.
- `[sound ...]` message effect plays a Minecraft sound at a configurable time
offset (`at`), volume, and pitch. Built-in presets (`click`, `whoosh`,
`static`, `magic`, `pop`, `thud`, `shatter`) map to vanilla sound ids;
any resource location works as well. `drip`, `shatter`, `matrix`, and
`slam` each accept an inline `sound` param that fires on their respective
key moment (first drip, shatter trigger, matrix resolve, slam land).
- ETA markup inside `Component.translatable` string arguments now renders.
`<...>` tags in arguments passed to `translatable(key, args...)` are
parsed by the existing markup pipeline instead of being forwarded as
literal strings.
- `EffectRegistry.getSchema(name)` and `MessageEffectRegistry.getSchema(name)`
return the `ParamSchema` for an effect, enabling introspection and doc
tooling.
- The server syncs each player's effective markup policy on join; the client
caches it for accurate previews and feedback.
- `/emberstextapi reload` reloads config from disk and re-syncs policy to
online players; `/emberstextapi policy [player]` prints a player's resolved
markup policy.
- MSDF font rendering now works on MC 26.1 (NeoForge and Fabric); pipelines
are registered against the 26.1 RenderPipelines API.
beta
Ember's Text API 3.0.0-beta.1 (NeoForge 1.21.1)
3.0.0-beta.1+neoforge-1.21.123 мая 2026 г.1,2 тыс.Minecraft: 1.21.1neoforge
Что нового
# Changelog
## v3.0.0-beta.1 — 2026-05-21
### Changed
- Replaced the config system. Options are now defined by a single schema split
into two files: `emberstextapi-client.toml`/`.json` (per-client: which effects
render, performance) and `emberstextapi-server.toml`/`.json` (authoritative:
player markup permissions, message limits, anvil rename length). The old
`emberstextapi-common.toml`, `emberstextapi-client.toml` (old layout) and
`emberstextapi.json` are no longer read — settings must be re-applied in the
new files, which generate with defaults on first run.
- Player markup access is now permission-gated. `playerMarkup.mode` is `ALL`,
`PERMISSION` (nodes `emberstextapi.markup.use`, `.effect.<name>`,
`.category.<cat>`, `.bypass`, with an OP-level fallback), or `NONE`. Effects
can be allowed/denied per-effect or per-category for both the client render
gate and the server markup gate. LuckPerms and FTB Ranks back the permission
nodes automatically.
- Unified effect parameter naming across visual, message, and animation effects.
Every public param now has a canonical fully-spelled name and a short alias
(e.g., `amplitude`/`amp`, `frequency`/`freq`, `duration`/`dur`). Old ad-hoc
shorts (`a`/`f`/`w`, etc.) no longer work — see
`docs/superpowers/specs/2026-05-18-effect-parameter-refinement-design.md`
for the full rename table.
- Effects now declare params via `ParamSchema`; unknown params log a warning
instead of being silently ignored.
- `obfuscate`'s `speed` is renamed to `interval` (ms per step).
- `shatter`'s `speed` is renamed to `duration` (animation length in seconds).
- `matrix`'s `resolve` is renamed to `duration`.
- `vibrate`'s `intensity` is renamed to `amplitude`; `speed` to `frequency`.
- `breathe`'s `amount` is renamed to `amplitude`; `speed` to `frequency`.
- `circle`'s `a` is renamed to `radius` (the param was always a radius, not an
amplitude).
- `drift`'s `rx`/`ry` are renamed to `amplitudeX`/`amplitudeY`.
- `gradient`'s `span` is renamed to `length`; `speed` to `frequency`.
- `fade`'s `a` is renamed to `minAlpha`.
- `neon`'s `p`/`f` are renamed to `frequency`/`falloff`; `c` to `color`.
- `RainbowEffect.getName()` now returns `"rainbow"` (was `"rainb"`).
- `GradientEffect.getName()` now returns `"gradient"` (was `"grad"`).
- `TurbulenceEffect.getName()` now returns `"turbulence"` (was `"turb"`).
- `PendulumEffect.getName()` now returns `"pendulum"` (was `"pend"`).
- `typewriter`'s `cursor` param is now boolean-only; use `cursorChar` to set
the glyph. The `cursor=<char>` overload is dropped.
### Added
- Seven new immersive-message motion effects: `grow` (continuous scale
oscillation), `slam` (one-shot drop-in with damped bounces), `float`
(slow sinusoidal drift), `drift` (independent X/Y wander), `vibrate`
(high-frequency jitter), `spin` (full Z-axis rotation), and `slide`
(one-shot slide-in or slide-out from any screen edge). All compose with
the existing `rock`/`breathe` effects and with each other.
- `slide` accepts an `easing` param: `linear`, `easeInCubic`, `easeOutCubic`,
`easeInOutCubic`. Defaults match prior behavior (`easeOutCubic` for
`mode=in`, `easeInCubic` for `mode=out`).
- Three per-character message effects: `drip` (characters fall and trail
downward in staggered order), `shatter` (characters fragment outward at a
configurable trigger time), and `matrix` (characters scramble via random
glyph cycling then resolve in stagger order).
- `outline` span effect: renders a stroked outline around glyphs using a
second SDF draw pass with a configurable color (`c`) and width (`w`).
Requires an SDF font; logs a warning and skips the outline draw on vanilla
fonts.
- Per-character effect dispatch: `MessageEffect` implementations can opt in
via `perCharacter()` to receive an `applyToChar` call for each rendered
glyph, enabling effects that vary per character. Existing whole-message
effects are unaffected.
- `[sound ...]` message effect plays a Minecraft sound at a configurable time
offset (`at`), volume, and pitch. Built-in presets (`click`, `whoosh`,
`static`, `magic`, `pop`, `thud`, `shatter`) map to vanilla sound ids;
any resource location works as well. `drip`, `shatter`, `matrix`, and
`slam` each accept an inline `sound` param that fires on their respective
key moment (first drip, shatter trigger, matrix resolve, slam land).
- ETA markup inside `Component.translatable` string arguments now renders.
`<...>` tags in arguments passed to `translatable(key, args...)` are
parsed by the existing markup pipeline instead of being forwarded as
literal strings.
- `EffectRegistry.getSchema(name)` and `MessageEffectRegistry.getSchema(name)`
return the `ParamSchema` for an effect, enabling introspection and doc
tooling.
- The server syncs each player's effective markup policy on join; the client
caches it for accurate previews and feedback.
- `/emberstextapi reload` reloads config from disk and re-syncs policy to
online players; `/emberstextapi policy [player]` prints a player's resolved
markup policy.
- MSDF font rendering now works on MC 26.1 (NeoForge and Fabric); pipelines
are registered against the 26.1 RenderPipelines API.
beta
Ember's Text API 3.0.0-beta.1 (Fabric 26.1)
3.0.0-beta.1+fabric-26.123 мая 2026 г.103Minecraft: 26.1, 26.1.1, 26.1.2fabric
Что нового
# Changelog
## v3.0.0-beta.1 — 2026-05-21
### Changed
- Replaced the config system. Options are now defined by a single schema split
into two files: `emberstextapi-client.toml`/`.json` (per-client: which effects
render, performance) and `emberstextapi-server.toml`/`.json` (authoritative:
player markup permissions, message limits, anvil rename length). The old
`emberstextapi-common.toml`, `emberstextapi-client.toml` (old layout) and
`emberstextapi.json` are no longer read — settings must be re-applied in the
new files, which generate with defaults on first run.
- Player markup access is now permission-gated. `playerMarkup.mode` is `ALL`,
`PERMISSION` (nodes `emberstextapi.markup.use`, `.effect.<name>`,
`.category.<cat>`, `.bypass`, with an OP-level fallback), or `NONE`. Effects
can be allowed/denied per-effect or per-category for both the client render
gate and the server markup gate. LuckPerms and FTB Ranks back the permission
nodes automatically.
- Unified effect parameter naming across visual, message, and animation effects.
Every public param now has a canonical fully-spelled name and a short alias
(e.g., `amplitude`/`amp`, `frequency`/`freq`, `duration`/`dur`). Old ad-hoc
shorts (`a`/`f`/`w`, etc.) no longer work — see
`docs/superpowers/specs/2026-05-18-effect-parameter-refinement-design.md`
for the full rename table.
- Effects now declare params via `ParamSchema`; unknown params log a warning
instead of being silently ignored.
- `obfuscate`'s `speed` is renamed to `interval` (ms per step).
- `shatter`'s `speed` is renamed to `duration` (animation length in seconds).
- `matrix`'s `resolve` is renamed to `duration`.
- `vibrate`'s `intensity` is renamed to `amplitude`; `speed` to `frequency`.
- `breathe`'s `amount` is renamed to `amplitude`; `speed` to `frequency`.
- `circle`'s `a` is renamed to `radius` (the param was always a radius, not an
amplitude).
- `drift`'s `rx`/`ry` are renamed to `amplitudeX`/`amplitudeY`.
- `gradient`'s `span` is renamed to `length`; `speed` to `frequency`.
- `fade`'s `a` is renamed to `minAlpha`.
- `neon`'s `p`/`f` are renamed to `frequency`/`falloff`; `c` to `color`.
- `RainbowEffect.getName()` now returns `"rainbow"` (was `"rainb"`).
- `GradientEffect.getName()` now returns `"gradient"` (was `"grad"`).
- `TurbulenceEffect.getName()` now returns `"turbulence"` (was `"turb"`).
- `PendulumEffect.getName()` now returns `"pendulum"` (was `"pend"`).
- `typewriter`'s `cursor` param is now boolean-only; use `cursorChar` to set
the glyph. The `cursor=<char>` overload is dropped.
### Added
- Seven new immersive-message motion effects: `grow` (continuous scale
oscillation), `slam` (one-shot drop-in with damped bounces), `float`
(slow sinusoidal drift), `drift` (independent X/Y wander), `vibrate`
(high-frequency jitter), `spin` (full Z-axis rotation), and `slide`
(one-shot slide-in or slide-out from any screen edge). All compose with
the existing `rock`/`breathe` effects and with each other.
- `slide` accepts an `easing` param: `linear`, `easeInCubic`, `easeOutCubic`,
`easeInOutCubic`. Defaults match prior behavior (`easeOutCubic` for
`mode=in`, `easeInCubic` for `mode=out`).
- Three per-character message effects: `drip` (characters fall and trail
downward in staggered order), `shatter` (characters fragment outward at a
configurable trigger time), and `matrix` (characters scramble via random
glyph cycling then resolve in stagger order).
- `outline` span effect: renders a stroked outline around glyphs using a
second SDF draw pass with a configurable color (`c`) and width (`w`).
Requires an SDF font; logs a warning and skips the outline draw on vanilla
fonts.
- Per-character effect dispatch: `MessageEffect` implementations can opt in
via `perCharacter()` to receive an `applyToChar` call for each rendered
glyph, enabling effects that vary per character. Existing whole-message
effects are unaffected.
- `[sound ...]` message effect plays a Minecraft sound at a configurable time
offset (`at`), volume, and pitch. Built-in presets (`click`, `whoosh`,
`static`, `magic`, `pop`, `thud`, `shatter`) map to vanilla sound ids;
any resource location works as well. `drip`, `shatter`, `matrix`, and
`slam` each accept an inline `sound` param that fires on their respective
key moment (first drip, shatter trigger, matrix resolve, slam land).
- ETA markup inside `Component.translatable` string arguments now renders.
`<...>` tags in arguments passed to `translatable(key, args...)` are
parsed by the existing markup pipeline instead of being forwarded as
literal strings.
- `EffectRegistry.getSchema(name)` and `MessageEffectRegistry.getSchema(name)`
return the `ParamSchema` for an effect, enabling introspection and doc
tooling.
- The server syncs each player's effective markup policy on join; the client
caches it for accurate previews and feedback.
- `/emberstextapi reload` reloads config from disk and re-syncs policy to
online players; `/emberstextapi policy [player]` prints a player's resolved
markup policy.
- MSDF font rendering now works on MC 26.1 (NeoForge and Fabric); pipelines
are registered against the 26.1 RenderPipelines API.
beta
Ember's Text API 3.0.0-beta.1 (Fabric 1.21.1)
3.0.0-beta.1+fabric-1.21.123 мая 2026 г.2,9 тыс.Minecraft: 1.21.1fabric
Что нового
# Changelog
## v3.0.0-beta.1 — 2026-05-21
### Changed
- Replaced the config system. Options are now defined by a single schema split
into two files: `emberstextapi-client.toml`/`.json` (per-client: which effects
render, performance) and `emberstextapi-server.toml`/`.json` (authoritative:
player markup permissions, message limits, anvil rename length). The old
`emberstextapi-common.toml`, `emberstextapi-client.toml` (old layout) and
`emberstextapi.json` are no longer read — settings must be re-applied in the
new files, which generate with defaults on first run.
- Player markup access is now permission-gated. `playerMarkup.mode` is `ALL`,
`PERMISSION` (nodes `emberstextapi.markup.use`, `.effect.<name>`,
`.category.<cat>`, `.bypass`, with an OP-level fallback), or `NONE`. Effects
can be allowed/denied per-effect or per-category for both the client render
gate and the server markup gate. LuckPerms and FTB Ranks back the permission
nodes automatically.
- Unified effect parameter naming across visual, message, and animation effects.
Every public param now has a canonical fully-spelled name and a short alias
(e.g., `amplitude`/`amp`, `frequency`/`freq`, `duration`/`dur`). Old ad-hoc
shorts (`a`/`f`/`w`, etc.) no longer work — see
`docs/superpowers/specs/2026-05-18-effect-parameter-refinement-design.md`
for the full rename table.
- Effects now declare params via `ParamSchema`; unknown params log a warning
instead of being silently ignored.
- `obfuscate`'s `speed` is renamed to `interval` (ms per step).
- `shatter`'s `speed` is renamed to `duration` (animation length in seconds).
- `matrix`'s `resolve` is renamed to `duration`.
- `vibrate`'s `intensity` is renamed to `amplitude`; `speed` to `frequency`.
- `breathe`'s `amount` is renamed to `amplitude`; `speed` to `frequency`.
- `circle`'s `a` is renamed to `radius` (the param was always a radius, not an
amplitude).
- `drift`'s `rx`/`ry` are renamed to `amplitudeX`/`amplitudeY`.
- `gradient`'s `span` is renamed to `length`; `speed` to `frequency`.
- `fade`'s `a` is renamed to `minAlpha`.
- `neon`'s `p`/`f` are renamed to `frequency`/`falloff`; `c` to `color`.
- `RainbowEffect.getName()` now returns `"rainbow"` (was `"rainb"`).
- `GradientEffect.getName()` now returns `"gradient"` (was `"grad"`).
- `TurbulenceEffect.getName()` now returns `"turbulence"` (was `"turb"`).
- `PendulumEffect.getName()` now returns `"pendulum"` (was `"pend"`).
- `typewriter`'s `cursor` param is now boolean-only; use `cursorChar` to set
the glyph. The `cursor=<char>` overload is dropped.
### Added
- Seven new immersive-message motion effects: `grow` (continuous scale
oscillation), `slam` (one-shot drop-in with damped bounces), `float`
(slow sinusoidal drift), `drift` (independent X/Y wander), `vibrate`
(high-frequency jitter), `spin` (full Z-axis rotation), and `slide`
(one-shot slide-in or slide-out from any screen edge). All compose with
the existing `rock`/`breathe` effects and with each other.
- `slide` accepts an `easing` param: `linear`, `easeInCubic`, `easeOutCubic`,
`easeInOutCubic`. Defaults match prior behavior (`easeOutCubic` for
`mode=in`, `easeInCubic` for `mode=out`).
- Three per-character message effects: `drip` (characters fall and trail
downward in staggered order), `shatter` (characters fragment outward at a
configurable trigger time), and `matrix` (characters scramble via random
glyph cycling then resolve in stagger order).
- `outline` span effect: renders a stroked outline around glyphs using a
second SDF draw pass with a configurable color (`c`) and width (`w`).
Requires an SDF font; logs a warning and skips the outline draw on vanilla
fonts.
- Per-character effect dispatch: `MessageEffect` implementations can opt in
via `perCharacter()` to receive an `applyToChar` call for each rendered
glyph, enabling effects that vary per character. Existing whole-message
effects are unaffected.
- `[sound ...]` message effect plays a Minecraft sound at a configurable time
offset (`at`), volume, and pitch. Built-in presets (`click`, `whoosh`,
`static`, `magic`, `pop`, `thud`, `shatter`) map to vanilla sound ids;
any resource location works as well. `drip`, `shatter`, `matrix`, and
`slam` each accept an inline `sound` param that fires on their respective
key moment (first drip, shatter trigger, matrix resolve, slam land).
- ETA markup inside `Component.translatable` string arguments now renders.
`<...>` tags in arguments passed to `translatable(key, args...)` are
parsed by the existing markup pipeline instead of being forwarded as
literal strings.
- `EffectRegistry.getSchema(name)` and `MessageEffectRegistry.getSchema(name)`
return the `ParamSchema` for an effect, enabling introspection and doc
tooling.
- The server syncs each player's effective markup policy on join; the client
caches it for accurate previews and feedback.
- `/emberstextapi reload` reloads config from disk and re-syncs policy to
online players; `/emberstextapi policy [player]` prints a player's resolved
markup policy.
- MSDF font rendering now works on MC 26.1 (NeoForge and Fabric); pipelines
are registered against the 26.1 RenderPipelines API.
beta
Ember's Text API 3.0.0-beta.1 (Fabric 1.20.1)
3.0.0-beta.1+fabric-1.20.123 мая 2026 г.46Minecraft: 1.20.1fabric
Что нового
# Changelog
## v3.0.0-beta.1 — 2026-05-21
### Changed
- Replaced the config system. Options are now defined by a single schema split
into two files: `emberstextapi-client.toml`/`.json` (per-client: which effects
render, performance) and `emberstextapi-server.toml`/`.json` (authoritative:
player markup permissions, message limits, anvil rename length). The old
`emberstextapi-common.toml`, `emberstextapi-client.toml` (old layout) and
`emberstextapi.json` are no longer read — settings must be re-applied in the
new files, which generate with defaults on first run.
- Player markup access is now permission-gated. `playerMarkup.mode` is `ALL`,
`PERMISSION` (nodes `emberstextapi.markup.use`, `.effect.<name>`,
`.category.<cat>`, `.bypass`, with an OP-level fallback), or `NONE`. Effects
can be allowed/denied per-effect or per-category for both the client render
gate and the server markup gate. LuckPerms and FTB Ranks back the permission
nodes automatically.
- Unified effect parameter naming across visual, message, and animation effects.
Every public param now has a canonical fully-spelled name and a short alias
(e.g., `amplitude`/`amp`, `frequency`/`freq`, `duration`/`dur`). Old ad-hoc
shorts (`a`/`f`/`w`, etc.) no longer work — see
`docs/superpowers/specs/2026-05-18-effect-parameter-refinement-design.md`
for the full rename table.
- Effects now declare params via `ParamSchema`; unknown params log a warning
instead of being silently ignored.
- `obfuscate`'s `speed` is renamed to `interval` (ms per step).
- `shatter`'s `speed` is renamed to `duration` (animation length in seconds).
- `matrix`'s `resolve` is renamed to `duration`.
- `vibrate`'s `intensity` is renamed to `amplitude`; `speed` to `frequency`.
- `breathe`'s `amount` is renamed to `amplitude`; `speed` to `frequency`.
- `circle`'s `a` is renamed to `radius` (the param was always a radius, not an
amplitude).
- `drift`'s `rx`/`ry` are renamed to `amplitudeX`/`amplitudeY`.
- `gradient`'s `span` is renamed to `length`; `speed` to `frequency`.
- `fade`'s `a` is renamed to `minAlpha`.
- `neon`'s `p`/`f` are renamed to `frequency`/`falloff`; `c` to `color`.
- `RainbowEffect.getName()` now returns `"rainbow"` (was `"rainb"`).
- `GradientEffect.getName()` now returns `"gradient"` (was `"grad"`).
- `TurbulenceEffect.getName()` now returns `"turbulence"` (was `"turb"`).
- `PendulumEffect.getName()` now returns `"pendulum"` (was `"pend"`).
- `typewriter`'s `cursor` param is now boolean-only; use `cursorChar` to set
the glyph. The `cursor=<char>` overload is dropped.
### Added
- Seven new immersive-message motion effects: `grow` (continuous scale
oscillation), `slam` (one-shot drop-in with damped bounces), `float`
(slow sinusoidal drift), `drift` (independent X/Y wander), `vibrate`
(high-frequency jitter), `spin` (full Z-axis rotation), and `slide`
(one-shot slide-in or slide-out from any screen edge). All compose with
the existing `rock`/`breathe` effects and with each other.
- `slide` accepts an `easing` param: `linear`, `easeInCubic`, `easeOutCubic`,
`easeInOutCubic`. Defaults match prior behavior (`easeOutCubic` for
`mode=in`, `easeInCubic` for `mode=out`).
- Three per-character message effects: `drip` (characters fall and trail
downward in staggered order), `shatter` (characters fragment outward at a
configurable trigger time), and `matrix` (characters scramble via random
glyph cycling then resolve in stagger order).
- `outline` span effect: renders a stroked outline around glyphs using a
second SDF draw pass with a configurable color (`c`) and width (`w`).
Requires an SDF font; logs a warning and skips the outline draw on vanilla
fonts.
- Per-character effect dispatch: `MessageEffect` implementations can opt in
via `perCharacter()` to receive an `applyToChar` call for each rendered
glyph, enabling effects that vary per character. Existing whole-message
effects are unaffected.
- `[sound ...]` message effect plays a Minecraft sound at a configurable time
offset (`at`), volume, and pitch. Built-in presets (`click`, `whoosh`,
`static`, `magic`, `pop`, `thud`, `shatter`) map to vanilla sound ids;
any resource location works as well. `drip`, `shatter`, `matrix`, and
`slam` each accept an inline `sound` param that fires on their respective
key moment (first drip, shatter trigger, matrix resolve, slam land).
- ETA markup inside `Component.translatable` string arguments now renders.
`<...>` tags in arguments passed to `translatable(key, args...)` are
parsed by the existing markup pipeline instead of being forwarded as
literal strings.
- `EffectRegistry.getSchema(name)` and `MessageEffectRegistry.getSchema(name)`
return the `ParamSchema` for an effect, enabling introspection and doc
tooling.
- The server syncs each player's effective markup policy on join; the client
caches it for accurate previews and feedback.
- `/emberstextapi reload` reloads config from disk and re-syncs policy to
online players; `/emberstextapi policy [player]` prints a player's resolved
markup policy.
- MSDF font rendering now works on MC 26.1 (NeoForge and Fabric); pipelines
are registered against the 26.1 RenderPipelines API.
alpha
Ember's Text API 3.0.0-alpha.2 (Forge 1.20.1)
3.0.0-alpha.2+forge-1.20.112 мая 2026 г.199Minecraft: 1.20.1forge
Что нового
# Changelog
## v3.0.0-alpha.2 — 2026-05-12
### Added
- `<click>` and `<hover>` markup tags for interactive text. `<click>` accepts
`action=` (`open_url`, `run_command`, `suggest_command`, `copy_to_clipboard`)
and `value=`. `<hover>` accepts `action=` (`show_text`, `show_item`,
`show_entity`) and `value=`. Nested tags override parent click/hover values.
- `<lang:KEY>` markup tag resolves vanilla translation keys in each viewer's
client locale. Shorthand `<lang:item.minecraft.diamond>` or attribute form
`<lang key=KEY>` / `<lang key=KEY args=A,B,C>` for placeholder substitution.
Missing keys render literally; translation file content is not re-parsed for
ETA tags. Closes #2.
- `ImmersiveMessage.decode` re-parses `markupSource` on the client (1.20.1 and
1.21.1) to ensure server-issued messages resolve markup in the receiving
client's locale, matching the existing behavior on 26.1.
- Patchouli compatibility: `@Pseudo BookTextParserMixin` plus a
`PatchouliBypass` thread-local that suppresses ETA markup rewriting in
`LiteralContents`, `TranslatableContents`, and `StringSplitter` while
Patchouli is parsing book text.
### Fixed
- SDF glyph pre-baking no longer repeats on every `FontManager` reload
(initial load, F3+T, resource pack swap, datapack reload). Pre-baked MSDF
data is now held in a process-lifetime cache keyed by (font fingerprint,
SDF config), so reloads after the initial bake short-circuit the async pass.
- `SDFGlyphProvider.closed` is now `volatile`, so the background pre-bake
loop reliably observes provider close.
- `<click>` and `<hover>` participate in the mixin render-gate, so
click/hover-only spans no longer fall through to vanilla rendering on
1.20.1, 1.21.1, and 26.1.
- Lang-only markup (`<lang>` with no other tags) renders through the ETA
mixin pipeline instead of bypassing it.
- Immersive-message HUD layer no longer leaks `disableDepthTest` and
`enableBlend` into world rendering. Previously, on 1.20.1 and 1.21.1, the
layer wrapper toggled global GL state every frame without restoring it,
causing the skybox to disappear on Fast graphics and the hotbar background
to drop out on Fabulous. The wrapper now matches the 26.1 pattern: just
push/translate/render/pop. Render types and `BackgroundRenderer` already
set up their own blend state.
alpha
Ember's Text API 3.0.0-alpha.2 (NeoForge 1.21.1)
3.0.0-alpha.2+neoforge-1.21.112 мая 2026 г.1,1 тыс.Minecraft: 1.21.1neoforge
Что нового
# Changelog
## v3.0.0-alpha.2 — 2026-05-12
### Added
- `<click>` and `<hover>` markup tags for interactive text. `<click>` accepts
`action=` (`open_url`, `run_command`, `suggest_command`, `copy_to_clipboard`)
and `value=`. `<hover>` accepts `action=` (`show_text`, `show_item`,
`show_entity`) and `value=`. Nested tags override parent click/hover values.
- `<lang:KEY>` markup tag resolves vanilla translation keys in each viewer's
client locale. Shorthand `<lang:item.minecraft.diamond>` or attribute form
`<lang key=KEY>` / `<lang key=KEY args=A,B,C>` for placeholder substitution.
Missing keys render literally; translation file content is not re-parsed for
ETA tags. Closes #2.
- `ImmersiveMessage.decode` re-parses `markupSource` on the client (1.20.1 and
1.21.1) to ensure server-issued messages resolve markup in the receiving
client's locale, matching the existing behavior on 26.1.
- Patchouli compatibility: `@Pseudo BookTextParserMixin` plus a
`PatchouliBypass` thread-local that suppresses ETA markup rewriting in
`LiteralContents`, `TranslatableContents`, and `StringSplitter` while
Patchouli is parsing book text.
### Fixed
- SDF glyph pre-baking no longer repeats on every `FontManager` reload
(initial load, F3+T, resource pack swap, datapack reload). Pre-baked MSDF
data is now held in a process-lifetime cache keyed by (font fingerprint,
SDF config), so reloads after the initial bake short-circuit the async pass.
- `SDFGlyphProvider.closed` is now `volatile`, so the background pre-bake
loop reliably observes provider close.
- `<click>` and `<hover>` participate in the mixin render-gate, so
click/hover-only spans no longer fall through to vanilla rendering on
1.20.1, 1.21.1, and 26.1.
- Lang-only markup (`<lang>` with no other tags) renders through the ETA
mixin pipeline instead of bypassing it.
- Immersive-message HUD layer no longer leaks `disableDepthTest` and
`enableBlend` into world rendering. Previously, on 1.20.1 and 1.21.1, the
layer wrapper toggled global GL state every frame without restoring it,
causing the skybox to disappear on Fast graphics and the hotbar background
to drop out on Fabulous. The wrapper now matches the 26.1 pattern: just
push/translate/render/pop. Render types and `BackgroundRenderer` already
set up their own blend state.
alpha
Ember's Text API 3.0.0-alpha.2 (Fabric 1.21.1)
3.0.0-alpha.2+fabric-1.21.112 мая 2026 г.1,4 тыс.Minecraft: 1.21.1fabric
Что нового
# Changelog
## v3.0.0-alpha.2 — 2026-05-12
### Added
- `<click>` and `<hover>` markup tags for interactive text. `<click>` accepts
`action=` (`open_url`, `run_command`, `suggest_command`, `copy_to_clipboard`)
and `value=`. `<hover>` accepts `action=` (`show_text`, `show_item`,
`show_entity`) and `value=`. Nested tags override parent click/hover values.
- `<lang:KEY>` markup tag resolves vanilla translation keys in each viewer's
client locale. Shorthand `<lang:item.minecraft.diamond>` or attribute form
`<lang key=KEY>` / `<lang key=KEY args=A,B,C>` for placeholder substitution.
Missing keys render literally; translation file content is not re-parsed for
ETA tags. Closes #2.
- `ImmersiveMessage.decode` re-parses `markupSource` on the client (1.20.1 and
1.21.1) to ensure server-issued messages resolve markup in the receiving
client's locale, matching the existing behavior on 26.1.
- Patchouli compatibility: `@Pseudo BookTextParserMixin` plus a
`PatchouliBypass` thread-local that suppresses ETA markup rewriting in
`LiteralContents`, `TranslatableContents`, and `StringSplitter` while
Patchouli is parsing book text.
### Fixed
- SDF glyph pre-baking no longer repeats on every `FontManager` reload
(initial load, F3+T, resource pack swap, datapack reload). Pre-baked MSDF
data is now held in a process-lifetime cache keyed by (font fingerprint,
SDF config), so reloads after the initial bake short-circuit the async pass.
- `SDFGlyphProvider.closed` is now `volatile`, so the background pre-bake
loop reliably observes provider close.
- `<click>` and `<hover>` participate in the mixin render-gate, so
click/hover-only spans no longer fall through to vanilla rendering on
1.20.1, 1.21.1, and 26.1.
- Lang-only markup (`<lang>` with no other tags) renders through the ETA
mixin pipeline instead of bypassing it.
- Immersive-message HUD layer no longer leaks `disableDepthTest` and
`enableBlend` into world rendering. Previously, on 1.20.1 and 1.21.1, the
layer wrapper toggled global GL state every frame without restoring it,
causing the skybox to disappear on Fast graphics and the hotbar background
to drop out on Fabulous. The wrapper now matches the 26.1 pattern: just
push/translate/render/pop. Render types and `BackgroundRenderer` already
set up their own blend state.
alpha
Ember's Text API 3.0.0-alpha.2 (Fabric 26.1)
3.0.0-alpha.2+fabric-26.112 мая 2026 г.71Minecraft: 26.1, 26.1.1, 26.1.2fabric
Что нового
# Changelog
## v3.0.0-alpha.2 — 2026-05-12
### Added
- `<click>` and `<hover>` markup tags for interactive text. `<click>` accepts
`action=` (`open_url`, `run_command`, `suggest_command`, `copy_to_clipboard`)
and `value=`. `<hover>` accepts `action=` (`show_text`, `show_item`,
`show_entity`) and `value=`. Nested tags override parent click/hover values.
- `<lang:KEY>` markup tag resolves vanilla translation keys in each viewer's
client locale. Shorthand `<lang:item.minecraft.diamond>` or attribute form
`<lang key=KEY>` / `<lang key=KEY args=A,B,C>` for placeholder substitution.
Missing keys render literally; translation file content is not re-parsed for
ETA tags. Closes #2.
- `ImmersiveMessage.decode` re-parses `markupSource` on the client (1.20.1 and
1.21.1) to ensure server-issued messages resolve markup in the receiving
client's locale, matching the existing behavior on 26.1.
- Patchouli compatibility: `@Pseudo BookTextParserMixin` plus a
`PatchouliBypass` thread-local that suppresses ETA markup rewriting in
`LiteralContents`, `TranslatableContents`, and `StringSplitter` while
Patchouli is parsing book text.
### Fixed
- SDF glyph pre-baking no longer repeats on every `FontManager` reload
(initial load, F3+T, resource pack swap, datapack reload). Pre-baked MSDF
data is now held in a process-lifetime cache keyed by (font fingerprint,
SDF config), so reloads after the initial bake short-circuit the async pass.
- `SDFGlyphProvider.closed` is now `volatile`, so the background pre-bake
loop reliably observes provider close.
- `<click>` and `<hover>` participate in the mixin render-gate, so
click/hover-only spans no longer fall through to vanilla rendering on
1.20.1, 1.21.1, and 26.1.
- Lang-only markup (`<lang>` with no other tags) renders through the ETA
mixin pipeline instead of bypassing it.
- Immersive-message HUD layer no longer leaks `disableDepthTest` and
`enableBlend` into world rendering. Previously, on 1.20.1 and 1.21.1, the
layer wrapper toggled global GL state every frame without restoring it,
causing the skybox to disappear on Fast graphics and the hotbar background
to drop out on Fabulous. The wrapper now matches the 26.1 pattern: just
push/translate/render/pop. Render types and `BackgroundRenderer` already
set up their own blend state.
alpha
Ember's Text API 3.0.0-alpha.2 (Fabric 1.20.1)
3.0.0-alpha.2+fabric-1.20.112 мая 2026 г.41Minecraft: 1.20.1fabric
Что нового
# Changelog
## v3.0.0-alpha.2 — 2026-05-12
### Added
- `<click>` and `<hover>` markup tags for interactive text. `<click>` accepts
`action=` (`open_url`, `run_command`, `suggest_command`, `copy_to_clipboard`)
and `value=`. `<hover>` accepts `action=` (`show_text`, `show_item`,
`show_entity`) and `value=`. Nested tags override parent click/hover values.
- `<lang:KEY>` markup tag resolves vanilla translation keys in each viewer's
client locale. Shorthand `<lang:item.minecraft.diamond>` or attribute form
`<lang key=KEY>` / `<lang key=KEY args=A,B,C>` for placeholder substitution.
Missing keys render literally; translation file content is not re-parsed for
ETA tags. Closes #2.
- `ImmersiveMessage.decode` re-parses `markupSource` on the client (1.20.1 and
1.21.1) to ensure server-issued messages resolve markup in the receiving
client's locale, matching the existing behavior on 26.1.
- Patchouli compatibility: `@Pseudo BookTextParserMixin` plus a
`PatchouliBypass` thread-local that suppresses ETA markup rewriting in
`LiteralContents`, `TranslatableContents`, and `StringSplitter` while
Patchouli is parsing book text.
### Fixed
- SDF glyph pre-baking no longer repeats on every `FontManager` reload
(initial load, F3+T, resource pack swap, datapack reload). Pre-baked MSDF
data is now held in a process-lifetime cache keyed by (font fingerprint,
SDF config), so reloads after the initial bake short-circuit the async pass.
- `SDFGlyphProvider.closed` is now `volatile`, so the background pre-bake
loop reliably observes provider close.
- `<click>` and `<hover>` participate in the mixin render-gate, so
click/hover-only spans no longer fall through to vanilla rendering on
1.20.1, 1.21.1, and 26.1.
- Lang-only markup (`<lang>` with no other tags) renders through the ETA
mixin pipeline instead of bypassing it.
- Immersive-message HUD layer no longer leaks `disableDepthTest` and
`enableBlend` into world rendering. Previously, on 1.20.1 and 1.21.1, the
layer wrapper toggled global GL state every frame without restoring it,
causing the skybox to disappear on Fast graphics and the hotbar background
to drop out on Fabulous. The wrapper now matches the 26.1 pattern: just
push/translate/render/pop. Render types and `BackgroundRenderer` already
set up their own blend state.
alpha
Ember's Text API 3.0.0-alpha.2 (NeoForge 26.1)
3.0.0-alpha.2+neoforge-26.112 мая 2026 г.45Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
# Changelog
## v3.0.0-alpha.2 — 2026-05-12
### Added
- `<click>` and `<hover>` markup tags for interactive text. `<click>` accepts
`action=` (`open_url`, `run_command`, `suggest_command`, `copy_to_clipboard`)
and `value=`. `<hover>` accepts `action=` (`show_text`, `show_item`,
`show_entity`) and `value=`. Nested tags override parent click/hover values.
- `<lang:KEY>` markup tag resolves vanilla translation keys in each viewer's
client locale. Shorthand `<lang:item.minecraft.diamond>` or attribute form
`<lang key=KEY>` / `<lang key=KEY args=A,B,C>` for placeholder substitution.
Missing keys render literally; translation file content is not re-parsed for
ETA tags. Closes #2.
- `ImmersiveMessage.decode` re-parses `markupSource` on the client (1.20.1 and
1.21.1) to ensure server-issued messages resolve markup in the receiving
client's locale, matching the existing behavior on 26.1.
- Patchouli compatibility: `@Pseudo BookTextParserMixin` plus a
`PatchouliBypass` thread-local that suppresses ETA markup rewriting in
`LiteralContents`, `TranslatableContents`, and `StringSplitter` while
Patchouli is parsing book text.
### Fixed
- SDF glyph pre-baking no longer repeats on every `FontManager` reload
(initial load, F3+T, resource pack swap, datapack reload). Pre-baked MSDF
data is now held in a process-lifetime cache keyed by (font fingerprint,
SDF config), so reloads after the initial bake short-circuit the async pass.
- `SDFGlyphProvider.closed` is now `volatile`, so the background pre-bake
loop reliably observes provider close.
- `<click>` and `<hover>` participate in the mixin render-gate, so
click/hover-only spans no longer fall through to vanilla rendering on
1.20.1, 1.21.1, and 26.1.
- Lang-only markup (`<lang>` with no other tags) renders through the ETA
mixin pipeline instead of bypassing it.
- Immersive-message HUD layer no longer leaks `disableDepthTest` and
`enableBlend` into world rendering. Previously, on 1.20.1 and 1.21.1, the
layer wrapper toggled global GL state every frame without restoring it,
causing the skybox to disappear on Fast graphics and the hotbar background
to drop out on Fabulous. The wrapper now matches the 26.1 pattern: just
push/translate/render/pop. Render types and `BackgroundRenderer` already
set up their own blend state.
alpha
Ember's Text API 3.0.0-alpha.1 (NeoForge 1.21.1)
3.0.0-alpha.1+neoforge-1.21.17 мая 2026 г.365Minecraft: 1.21.1neoforge
Что нового
# Changelog
## v3.0.0-alpha.1 — 2026-05-07
First public alpha of v3. Multi-loader release across Fabric, NeoForge, and Forge
on MC 1.20.1, 1.21.1, and 26.1.
### Highlights
- New bracket-markup syntax (`[]`) for message-level styling, backed by a
registrable `MessageAttribute` system.
- New `MessageEffect` framework for animated message-level transforms — ships
with `rock` and `breathe`.
- Gradient, pulse, and rainbow effects rewritten with multi-stop palettes and
cleaner parameter names.
- Loader support extended to MC 26.1 (Fabric + NeoForge).
### Breaking
- Message-level markup tags moved from `<>` to `[]`. Removed: the angle-bracket
forms of `bg`/`background`, `bggradient`/`backgroundgradient`, `scale`,
`offset`, `anchor`, `align`, the global form of `shadow`, and the `in=/out=`
form of `fade`. Migrate to `[bg color=red]`, `[scale 2]`,
`[offset x=10 y=5]`, `[anchor TOP_CENTER]`, `[align LEFT]`, `[shadow]`,
`[fade in=20 out=10]`.
- Removed the `<shake type=wave|circle>` compatibility shim and the
`<charshake>` case. Use `<shake>`, `<wave>`, `<circle>` directly.
- Per-character forms `<shadow x= y= c=>` and `<fade a= f= w=>` are unchanged.
- `RainbowEffect` parameters renamed: `f` → `speed`, `w` → `phase`.
### Added
- `MessageAttribute` interface + `MessageAttributeRegistry` for registering
custom message-level attributes that apply to the whole message.
- Built-in attributes: `bg` (solid and gradient via `from`/`to`), `scale`,
`offset`, `anchor`, `align`, `shadow`, `fade`.
- `MessageEffect` framework + `MessageEffectRegistry` for animated whole-message
transforms. Ships with `rock` and `breathe`.
- NBT and `FriendlyByteBuf` round-trip for both `messageAttributes` and
`messageEffects` on `ImmersiveMessage`.
- `MarkupParser.parseFull` produces a separate `messageAttributes` list applied
directly to `ImmersiveMessage`; per-character spans no longer carry
message-level state.
- Positional shorthand for single-value tags: `[scale 2]`, `[anchor TOP_CENTER]`,
`<color red>`, `<font norse>`. Numeric positional args supported in bracket
tags.
- `ColorPalette` value type and `ColorParser.parseToRgbaFloats` (alpha-aware).
- `Palettes` parser for multi-stop color specs.
- Loader modules: `neoforge-26.1`, `fabric-26.1`.
### Changed
- `GradientEffect` rewritten: multi-stop palette, configurable angle, animates
by default with smooth pingpong cycling. `timeOffset` bounded to preserve
float precision.
- `PulseEffect` rewritten with an optional color-palette mode.
- `ColorEffect` accepts 8-digit hex (RGBA) and no longer guards on `isShadow`.
- Shadow inherits the wrapping effect's color on MC 1.20.1 and 1.21.1.
- Built-in presets updated to use the new `grad`/`pulse`/`rainbow` parameter
names.
- Effect-tag param parser strips surrounding quotes from values.
- License metadata corrected across all loader poms and `mods.toml` to
"Ember's Modding Licence v1.2" (was incorrectly reporting GPL-3.0).
- README support matrix and badges updated to include MC 26.1.
### Removed
- `TextSpan.globalXxx*` fields and their getters/setters (internal API).
- Empty `SoundEffect` enum stub. The real sound system is tracked in `TODO.md`
and will land in a later release.
### Fixed
- Bracket-only markup is now routed through `fromMarkup` in test commands.
- Bracket tag parser accepts numeric positional arguments.
- Invalid `bg` gradient colors emit a warn-level log instead of failing
silently.
- `emberstextapi:sdf` font providers are hidden from the vanilla `FontManager`
parser to silence boot-time warnings.
- Forge 1.20.1 mod constructor no longer takes the removed
`FMLJavaModLoadingContext` parameter.
- NeoForge 1.21.1 initializes effect registries on common setup so server-side
parsing sees them.
### Build
- `forge-1.20.1` moved to a standalone Gradle 8.8 build (ForgeGradle 6 cannot
run on Gradle 9). The root project delegates via `forge1201*` `Exec` tasks
(`forge1201Build`, `forge1201RunClient`, etc.).
- NeoForge `moddev` plugin standardized at `2.0.141` across `neoforge-1.21.1`
and `neoforge-26.1`.
- `fabric-1.20.1` and `fabric-1.21.1` stay on `fabric-loom-remap` (vanilla
`fabric-loom` rejects Mojang mappings in this multi-loader workspace);
documented inline.
- Publish workflow adds `forge-1.20.1` to the matrix (`*-all.jar` is the
distributable, with LWJGL FreeType embedded to avoid a JPMS resolution
failure on dedicated servers).
- `mc-publish` `version-type` is derived from the tag suffix
(`-alpha*` / `-beta*` / release).
- `v3.0.0-alpha.0` is reserved as a dry-run tag — its workflow run skips
Modrinth and CurseForge publishing while still updating Maven and creating a
GitHub Release.
alpha
Ember's Text API 3.0.0-alpha.1 (Forge 1.20.1)
3.0.0-alpha.1+forge-1.20.17 мая 2026 г.106Minecraft: 1.20.1forge
Что нового
# Changelog
## v3.0.0-alpha.1 — 2026-05-07
First public alpha of v3. Multi-loader release across Fabric, NeoForge, and Forge
on MC 1.20.1, 1.21.1, and 26.1.
### Highlights
- New bracket-markup syntax (`[]`) for message-level styling, backed by a
registrable `MessageAttribute` system.
- New `MessageEffect` framework for animated message-level transforms — ships
with `rock` and `breathe`.
- Gradient, pulse, and rainbow effects rewritten with multi-stop palettes and
cleaner parameter names.
- Loader support extended to MC 26.1 (Fabric + NeoForge).
### Breaking
- Message-level markup tags moved from `<>` to `[]`. Removed: the angle-bracket
forms of `bg`/`background`, `bggradient`/`backgroundgradient`, `scale`,
`offset`, `anchor`, `align`, the global form of `shadow`, and the `in=/out=`
form of `fade`. Migrate to `[bg color=red]`, `[scale 2]`,
`[offset x=10 y=5]`, `[anchor TOP_CENTER]`, `[align LEFT]`, `[shadow]`,
`[fade in=20 out=10]`.
- Removed the `<shake type=wave|circle>` compatibility shim and the
`<charshake>` case. Use `<shake>`, `<wave>`, `<circle>` directly.
- Per-character forms `<shadow x= y= c=>` and `<fade a= f= w=>` are unchanged.
- `RainbowEffect` parameters renamed: `f` → `speed`, `w` → `phase`.
### Added
- `MessageAttribute` interface + `MessageAttributeRegistry` for registering
custom message-level attributes that apply to the whole message.
- Built-in attributes: `bg` (solid and gradient via `from`/`to`), `scale`,
`offset`, `anchor`, `align`, `shadow`, `fade`.
- `MessageEffect` framework + `MessageEffectRegistry` for animated whole-message
transforms. Ships with `rock` and `breathe`.
- NBT and `FriendlyByteBuf` round-trip for both `messageAttributes` and
`messageEffects` on `ImmersiveMessage`.
- `MarkupParser.parseFull` produces a separate `messageAttributes` list applied
directly to `ImmersiveMessage`; per-character spans no longer carry
message-level state.
- Positional shorthand for single-value tags: `[scale 2]`, `[anchor TOP_CENTER]`,
`<color red>`, `<font norse>`. Numeric positional args supported in bracket
tags.
- `ColorPalette` value type and `ColorParser.parseToRgbaFloats` (alpha-aware).
- `Palettes` parser for multi-stop color specs.
- Loader modules: `neoforge-26.1`, `fabric-26.1`.
### Changed
- `GradientEffect` rewritten: multi-stop palette, configurable angle, animates
by default with smooth pingpong cycling. `timeOffset` bounded to preserve
float precision.
- `PulseEffect` rewritten with an optional color-palette mode.
- `ColorEffect` accepts 8-digit hex (RGBA) and no longer guards on `isShadow`.
- Shadow inherits the wrapping effect's color on MC 1.20.1 and 1.21.1.
- Built-in presets updated to use the new `grad`/`pulse`/`rainbow` parameter
names.
- Effect-tag param parser strips surrounding quotes from values.
- License metadata corrected across all loader poms and `mods.toml` to
"Ember's Modding Licence v1.2" (was incorrectly reporting GPL-3.0).
- README support matrix and badges updated to include MC 26.1.
### Removed
- `TextSpan.globalXxx*` fields and their getters/setters (internal API).
- Empty `SoundEffect` enum stub. The real sound system is tracked in `TODO.md`
and will land in a later release.
### Fixed
- Bracket-only markup is now routed through `fromMarkup` in test commands.
- Bracket tag parser accepts numeric positional arguments.
- Invalid `bg` gradient colors emit a warn-level log instead of failing
silently.
- `emberstextapi:sdf` font providers are hidden from the vanilla `FontManager`
parser to silence boot-time warnings.
- Forge 1.20.1 mod constructor no longer takes the removed
`FMLJavaModLoadingContext` parameter.
- NeoForge 1.21.1 initializes effect registries on common setup so server-side
parsing sees them.
### Build
- `forge-1.20.1` moved to a standalone Gradle 8.8 build (ForgeGradle 6 cannot
run on Gradle 9). The root project delegates via `forge1201*` `Exec` tasks
(`forge1201Build`, `forge1201RunClient`, etc.).
- NeoForge `moddev` plugin standardized at `2.0.141` across `neoforge-1.21.1`
and `neoforge-26.1`.
- `fabric-1.20.1` and `fabric-1.21.1` stay on `fabric-loom-remap` (vanilla
`fabric-loom` rejects Mojang mappings in this multi-loader workspace);
documented inline.
- Publish workflow adds `forge-1.20.1` to the matrix (`*-all.jar` is the
distributable, with LWJGL FreeType embedded to avoid a JPMS resolution
failure on dedicated servers).
- `mc-publish` `version-type` is derived from the tag suffix
(`-alpha*` / `-beta*` / release).
- `v3.0.0-alpha.0` is reserved as a dry-run tag — its workflow run skips
Modrinth and CurseForge publishing while still updating Maven and creating a
GitHub Release.
alpha
Ember's Text API 3.0.0-alpha.1 (Fabric 1.20.1)
3.0.0-alpha.1+fabric-1.20.17 мая 2026 г.53Minecraft: 1.20.1fabric
Что нового
# Changelog
## v3.0.0-alpha.1 — 2026-05-07
First public alpha of v3. Multi-loader release across Fabric, NeoForge, and Forge
on MC 1.20.1, 1.21.1, and 26.1.
### Highlights
- New bracket-markup syntax (`[]`) for message-level styling, backed by a
registrable `MessageAttribute` system.
- New `MessageEffect` framework for animated message-level transforms — ships
with `rock` and `breathe`.
- Gradient, pulse, and rainbow effects rewritten with multi-stop palettes and
cleaner parameter names.
- Loader support extended to MC 26.1 (Fabric + NeoForge).
### Breaking
- Message-level markup tags moved from `<>` to `[]`. Removed: the angle-bracket
forms of `bg`/`background`, `bggradient`/`backgroundgradient`, `scale`,
`offset`, `anchor`, `align`, the global form of `shadow`, and the `in=/out=`
form of `fade`. Migrate to `[bg color=red]`, `[scale 2]`,
`[offset x=10 y=5]`, `[anchor TOP_CENTER]`, `[align LEFT]`, `[shadow]`,
`[fade in=20 out=10]`.
- Removed the `<shake type=wave|circle>` compatibility shim and the
`<charshake>` case. Use `<shake>`, `<wave>`, `<circle>` directly.
- Per-character forms `<shadow x= y= c=>` and `<fade a= f= w=>` are unchanged.
- `RainbowEffect` parameters renamed: `f` → `speed`, `w` → `phase`.
### Added
- `MessageAttribute` interface + `MessageAttributeRegistry` for registering
custom message-level attributes that apply to the whole message.
- Built-in attributes: `bg` (solid and gradient via `from`/`to`), `scale`,
`offset`, `anchor`, `align`, `shadow`, `fade`.
- `MessageEffect` framework + `MessageEffectRegistry` for animated whole-message
transforms. Ships with `rock` and `breathe`.
- NBT and `FriendlyByteBuf` round-trip for both `messageAttributes` and
`messageEffects` on `ImmersiveMessage`.
- `MarkupParser.parseFull` produces a separate `messageAttributes` list applied
directly to `ImmersiveMessage`; per-character spans no longer carry
message-level state.
- Positional shorthand for single-value tags: `[scale 2]`, `[anchor TOP_CENTER]`,
`<color red>`, `<font norse>`. Numeric positional args supported in bracket
tags.
- `ColorPalette` value type and `ColorParser.parseToRgbaFloats` (alpha-aware).
- `Palettes` parser for multi-stop color specs.
- Loader modules: `neoforge-26.1`, `fabric-26.1`.
### Changed
- `GradientEffect` rewritten: multi-stop palette, configurable angle, animates
by default with smooth pingpong cycling. `timeOffset` bounded to preserve
float precision.
- `PulseEffect` rewritten with an optional color-palette mode.
- `ColorEffect` accepts 8-digit hex (RGBA) and no longer guards on `isShadow`.
- Shadow inherits the wrapping effect's color on MC 1.20.1 and 1.21.1.
- Built-in presets updated to use the new `grad`/`pulse`/`rainbow` parameter
names.
- Effect-tag param parser strips surrounding quotes from values.
- License metadata corrected across all loader poms and `mods.toml` to
"Ember's Modding Licence v1.2" (was incorrectly reporting GPL-3.0).
- README support matrix and badges updated to include MC 26.1.
### Removed
- `TextSpan.globalXxx*` fields and their getters/setters (internal API).
- Empty `SoundEffect` enum stub. The real sound system is tracked in `TODO.md`
and will land in a later release.
### Fixed
- Bracket-only markup is now routed through `fromMarkup` in test commands.
- Bracket tag parser accepts numeric positional arguments.
- Invalid `bg` gradient colors emit a warn-level log instead of failing
silently.
- `emberstextapi:sdf` font providers are hidden from the vanilla `FontManager`
parser to silence boot-time warnings.
- Forge 1.20.1 mod constructor no longer takes the removed
`FMLJavaModLoadingContext` parameter.
- NeoForge 1.21.1 initializes effect registries on common setup so server-side
parsing sees them.
### Build
- `forge-1.20.1` moved to a standalone Gradle 8.8 build (ForgeGradle 6 cannot
run on Gradle 9). The root project delegates via `forge1201*` `Exec` tasks
(`forge1201Build`, `forge1201RunClient`, etc.).
- NeoForge `moddev` plugin standardized at `2.0.141` across `neoforge-1.21.1`
and `neoforge-26.1`.
- `fabric-1.20.1` and `fabric-1.21.1` stay on `fabric-loom-remap` (vanilla
`fabric-loom` rejects Mojang mappings in this multi-loader workspace);
documented inline.
- Publish workflow adds `forge-1.20.1` to the matrix (`*-all.jar` is the
distributable, with LWJGL FreeType embedded to avoid a JPMS resolution
failure on dedicated servers).
- `mc-publish` `version-type` is derived from the tag suffix
(`-alpha*` / `-beta*` / release).
- `v3.0.0-alpha.0` is reserved as a dry-run tag — its workflow run skips
Modrinth and CurseForge publishing while still updating Maven and creating a
GitHub Release.
alpha
Ember's Text API 3.0.0-alpha.1 (NeoForge 26.1)
3.0.0-alpha.1+neoforge-26.17 мая 2026 г.31Minecraft: 26.1, 26.1.1, 26.1.2neoforge
Что нового
# Changelog
## v3.0.0-alpha.1 — 2026-05-07
First public alpha of v3. Multi-loader release across Fabric, NeoForge, and Forge
on MC 1.20.1, 1.21.1, and 26.1.
### Highlights
- New bracket-markup syntax (`[]`) for message-level styling, backed by a
registrable `MessageAttribute` system.
- New `MessageEffect` framework for animated message-level transforms — ships
with `rock` and `breathe`.
- Gradient, pulse, and rainbow effects rewritten with multi-stop palettes and
cleaner parameter names.
- Loader support extended to MC 26.1 (Fabric + NeoForge).
### Breaking
- Message-level markup tags moved from `<>` to `[]`. Removed: the angle-bracket
forms of `bg`/`background`, `bggradient`/`backgroundgradient`, `scale`,
`offset`, `anchor`, `align`, the global form of `shadow`, and the `in=/out=`
form of `fade`. Migrate to `[bg color=red]`, `[scale 2]`,
`[offset x=10 y=5]`, `[anchor TOP_CENTER]`, `[align LEFT]`, `[shadow]`,
`[fade in=20 out=10]`.
- Removed the `<shake type=wave|circle>` compatibility shim and the
`<charshake>` case. Use `<shake>`, `<wave>`, `<circle>` directly.
- Per-character forms `<shadow x= y= c=>` and `<fade a= f= w=>` are unchanged.
- `RainbowEffect` parameters renamed: `f` → `speed`, `w` → `phase`.
### Added
- `MessageAttribute` interface + `MessageAttributeRegistry` for registering
custom message-level attributes that apply to the whole message.
- Built-in attributes: `bg` (solid and gradient via `from`/`to`), `scale`,
`offset`, `anchor`, `align`, `shadow`, `fade`.
- `MessageEffect` framework + `MessageEffectRegistry` for animated whole-message
transforms. Ships with `rock` and `breathe`.
- NBT and `FriendlyByteBuf` round-trip for both `messageAttributes` and
`messageEffects` on `ImmersiveMessage`.
- `MarkupParser.parseFull` produces a separate `messageAttributes` list applied
directly to `ImmersiveMessage`; per-character spans no longer carry
message-level state.
- Positional shorthand for single-value tags: `[scale 2]`, `[anchor TOP_CENTER]`,
`<color red>`, `<font norse>`. Numeric positional args supported in bracket
tags.
- `ColorPalette` value type and `ColorParser.parseToRgbaFloats` (alpha-aware).
- `Palettes` parser for multi-stop color specs.
- Loader modules: `neoforge-26.1`, `fabric-26.1`.
### Changed
- `GradientEffect` rewritten: multi-stop palette, configurable angle, animates
by default with smooth pingpong cycling. `timeOffset` bounded to preserve
float precision.
- `PulseEffect` rewritten with an optional color-palette mode.
- `ColorEffect` accepts 8-digit hex (RGBA) and no longer guards on `isShadow`.
- Shadow inherits the wrapping effect's color on MC 1.20.1 and 1.21.1.
- Built-in presets updated to use the new `grad`/`pulse`/`rainbow` parameter
names.
- Effect-tag param parser strips surrounding quotes from values.
- License metadata corrected across all loader poms and `mods.toml` to
"Ember's Modding Licence v1.2" (was incorrectly reporting GPL-3.0).
- README support matrix and badges updated to include MC 26.1.
### Removed
- `TextSpan.globalXxx*` fields and their getters/setters (internal API).
- Empty `SoundEffect` enum stub. The real sound system is tracked in `TODO.md`
and will land in a later release.
### Fixed
- Bracket-only markup is now routed through `fromMarkup` in test commands.
- Bracket tag parser accepts numeric positional arguments.
- Invalid `bg` gradient colors emit a warn-level log instead of failing
silently.
- `emberstextapi:sdf` font providers are hidden from the vanilla `FontManager`
parser to silence boot-time warnings.
- Forge 1.20.1 mod constructor no longer takes the removed
`FMLJavaModLoadingContext` parameter.
- NeoForge 1.21.1 initializes effect registries on common setup so server-side
parsing sees them.
### Build
- `forge-1.20.1` moved to a standalone Gradle 8.8 build (ForgeGradle 6 cannot
run on Gradle 9). The root project delegates via `forge1201*` `Exec` tasks
(`forge1201Build`, `forge1201RunClient`, etc.).
- NeoForge `moddev` plugin standardized at `2.0.141` across `neoforge-1.21.1`
and `neoforge-26.1`.
- `fabric-1.20.1` and `fabric-1.21.1` stay on `fabric-loom-remap` (vanilla
`fabric-loom` rejects Mojang mappings in this multi-loader workspace);
documented inline.
- Publish workflow adds `forge-1.20.1` to the matrix (`*-all.jar` is the
distributable, with LWJGL FreeType embedded to avoid a JPMS resolution
failure on dedicated servers).
- `mc-publish` `version-type` is derived from the tag suffix
(`-alpha*` / `-beta*` / release).
- `v3.0.0-alpha.0` is reserved as a dry-run tag — its workflow run skips
Modrinth and CurseForge publishing while still updating Maven and creating a
GitHub Release.
alpha
Ember's Text API 3.0.0-alpha.1 (Fabric 1.21.1)
3.0.0-alpha.1+fabric-1.21.17 мая 2026 г.864Minecraft: 1.21.1fabric
Что нового
# Changelog
## v3.0.0-alpha.1 — 2026-05-07
First public alpha of v3. Multi-loader release across Fabric, NeoForge, and Forge
on MC 1.20.1, 1.21.1, and 26.1.
### Highlights
- New bracket-markup syntax (`[]`) for message-level styling, backed by a
registrable `MessageAttribute` system.
- New `MessageEffect` framework for animated message-level transforms — ships
with `rock` and `breathe`.
- Gradient, pulse, and rainbow effects rewritten with multi-stop palettes and
cleaner parameter names.
- Loader support extended to MC 26.1 (Fabric + NeoForge).
### Breaking
- Message-level markup tags moved from `<>` to `[]`. Removed: the angle-bracket
forms of `bg`/`background`, `bggradient`/`backgroundgradient`, `scale`,
`offset`, `anchor`, `align`, the global form of `shadow`, and the `in=/out=`
form of `fade`. Migrate to `[bg color=red]`, `[scale 2]`,
`[offset x=10 y=5]`, `[anchor TOP_CENTER]`, `[align LEFT]`, `[shadow]`,
`[fade in=20 out=10]`.
- Removed the `<shake type=wave|circle>` compatibility shim and the
`<charshake>` case. Use `<shake>`, `<wave>`, `<circle>` directly.
- Per-character forms `<shadow x= y= c=>` and `<fade a= f= w=>` are unchanged.
- `RainbowEffect` parameters renamed: `f` → `speed`, `w` → `phase`.
### Added
- `MessageAttribute` interface + `MessageAttributeRegistry` for registering
custom message-level attributes that apply to the whole message.
- Built-in attributes: `bg` (solid and gradient via `from`/`to`), `scale`,
`offset`, `anchor`, `align`, `shadow`, `fade`.
- `MessageEffect` framework + `MessageEffectRegistry` for animated whole-message
transforms. Ships with `rock` and `breathe`.
- NBT and `FriendlyByteBuf` round-trip for both `messageAttributes` and
`messageEffects` on `ImmersiveMessage`.
- `MarkupParser.parseFull` produces a separate `messageAttributes` list applied
directly to `ImmersiveMessage`; per-character spans no longer carry
message-level state.
- Positional shorthand for single-value tags: `[scale 2]`, `[anchor TOP_CENTER]`,
`<color red>`, `<font norse>`. Numeric positional args supported in bracket
tags.
- `ColorPalette` value type and `ColorParser.parseToRgbaFloats` (alpha-aware).
- `Palettes` parser for multi-stop color specs.
- Loader modules: `neoforge-26.1`, `fabric-26.1`.
### Changed
- `GradientEffect` rewritten: multi-stop palette, configurable angle, animates
by default with smooth pingpong cycling. `timeOffset` bounded to preserve
float precision.
- `PulseEffect` rewritten with an optional color-palette mode.
- `ColorEffect` accepts 8-digit hex (RGBA) and no longer guards on `isShadow`.
- Shadow inherits the wrapping effect's color on MC 1.20.1 and 1.21.1.
- Built-in presets updated to use the new `grad`/`pulse`/`rainbow` parameter
names.
- Effect-tag param parser strips surrounding quotes from values.
- License metadata corrected across all loader poms and `mods.toml` to
"Ember's Modding Licence v1.2" (was incorrectly reporting GPL-3.0).
- README support matrix and badges updated to include MC 26.1.
### Removed
- `TextSpan.globalXxx*` fields and their getters/setters (internal API).
- Empty `SoundEffect` enum stub. The real sound system is tracked in `TODO.md`
and will land in a later release.
### Fixed
- Bracket-only markup is now routed through `fromMarkup` in test commands.
- Bracket tag parser accepts numeric positional arguments.
- Invalid `bg` gradient colors emit a warn-level log instead of failing
silently.
- `emberstextapi:sdf` font providers are hidden from the vanilla `FontManager`
parser to silence boot-time warnings.
- Forge 1.20.1 mod constructor no longer takes the removed
`FMLJavaModLoadingContext` parameter.
- NeoForge 1.21.1 initializes effect registries on common setup so server-side
parsing sees them.
### Build
- `forge-1.20.1` moved to a standalone Gradle 8.8 build (ForgeGradle 6 cannot
run on Gradle 9). The root project delegates via `forge1201*` `Exec` tasks
(`forge1201Build`, `forge1201RunClient`, etc.).
- NeoForge `moddev` plugin standardized at `2.0.141` across `neoforge-1.21.1`
and `neoforge-26.1`.
- `fabric-1.20.1` and `fabric-1.21.1` stay on `fabric-loom-remap` (vanilla
`fabric-loom` rejects Mojang mappings in this multi-loader workspace);
documented inline.
- Publish workflow adds `forge-1.20.1` to the matrix (`*-all.jar` is the
distributable, with LWJGL FreeType embedded to avoid a JPMS resolution
failure on dedicated servers).
- `mc-publish` `version-type` is derived from the tag suffix
(`-alpha*` / `-beta*` / release).
- `v3.0.0-alpha.0` is reserved as a dry-run tag — its workflow run skips
Modrinth and CurseForge publishing while still updating Maven and creating a
GitHub Release.
alpha
Ember's Text API 3.0.0-alpha.1 (Fabric 26.1)
3.0.0-alpha.1+fabric-26.17 мая 2026 г.43Minecraft: 26.1, 26.1.1, 26.1.2fabric
Что нового
# Changelog
## v3.0.0-alpha.1 — 2026-05-07
First public alpha of v3. Multi-loader release across Fabric, NeoForge, and Forge
on MC 1.20.1, 1.21.1, and 26.1.
### Highlights
- New bracket-markup syntax (`[]`) for message-level styling, backed by a
registrable `MessageAttribute` system.
- New `MessageEffect` framework for animated message-level transforms — ships
with `rock` and `breathe`.
- Gradient, pulse, and rainbow effects rewritten with multi-stop palettes and
cleaner parameter names.
- Loader support extended to MC 26.1 (Fabric + NeoForge).
### Breaking
- Message-level markup tags moved from `<>` to `[]`. Removed: the angle-bracket
forms of `bg`/`background`, `bggradient`/`backgroundgradient`, `scale`,
`offset`, `anchor`, `align`, the global form of `shadow`, and the `in=/out=`
form of `fade`. Migrate to `[bg color=red]`, `[scale 2]`,
`[offset x=10 y=5]`, `[anchor TOP_CENTER]`, `[align LEFT]`, `[shadow]`,
`[fade in=20 out=10]`.
- Removed the `<shake type=wave|circle>` compatibility shim and the
`<charshake>` case. Use `<shake>`, `<wave>`, `<circle>` directly.
- Per-character forms `<shadow x= y= c=>` and `<fade a= f= w=>` are unchanged.
- `RainbowEffect` parameters renamed: `f` → `speed`, `w` → `phase`.
### Added
- `MessageAttribute` interface + `MessageAttributeRegistry` for registering
custom message-level attributes that apply to the whole message.
- Built-in attributes: `bg` (solid and gradient via `from`/`to`), `scale`,
`offset`, `anchor`, `align`, `shadow`, `fade`.
- `MessageEffect` framework + `MessageEffectRegistry` for animated whole-message
transforms. Ships with `rock` and `breathe`.
- NBT and `FriendlyByteBuf` round-trip for both `messageAttributes` and
`messageEffects` on `ImmersiveMessage`.
- `MarkupParser.parseFull` produces a separate `messageAttributes` list applied
directly to `ImmersiveMessage`; per-character spans no longer carry
message-level state.
- Positional shorthand for single-value tags: `[scale 2]`, `[anchor TOP_CENTER]`,
`<color red>`, `<font norse>`. Numeric positional args supported in bracket
tags.
- `ColorPalette` value type and `ColorParser.parseToRgbaFloats` (alpha-aware).
- `Palettes` parser for multi-stop color specs.
- Loader modules: `neoforge-26.1`, `fabric-26.1`.
### Changed
- `GradientEffect` rewritten: multi-stop palette, configurable angle, animates
by default with smooth pingpong cycling. `timeOffset` bounded to preserve
float precision.
- `PulseEffect` rewritten with an optional color-palette mode.
- `ColorEffect` accepts 8-digit hex (RGBA) and no longer guards on `isShadow`.
- Shadow inherits the wrapping effect's color on MC 1.20.1 and 1.21.1.
- Built-in presets updated to use the new `grad`/`pulse`/`rainbow` parameter
names.
- Effect-tag param parser strips surrounding quotes from values.
- License metadata corrected across all loader poms and `mods.toml` to
"Ember's Modding Licence v1.2" (was incorrectly reporting GPL-3.0).
- README support matrix and badges updated to include MC 26.1.
### Removed
- `TextSpan.globalXxx*` fields and their getters/setters (internal API).
- Empty `SoundEffect` enum stub. The real sound system is tracked in `TODO.md`
and will land in a later release.
### Fixed
- Bracket-only markup is now routed through `fromMarkup` in test commands.
- Bracket tag parser accepts numeric positional arguments.
- Invalid `bg` gradient colors emit a warn-level log instead of failing
silently.
- `emberstextapi:sdf` font providers are hidden from the vanilla `FontManager`
parser to silence boot-time warnings.
- Forge 1.20.1 mod constructor no longer takes the removed
`FMLJavaModLoadingContext` parameter.
- NeoForge 1.21.1 initializes effect registries on common setup so server-side
parsing sees them.
### Build
- `forge-1.20.1` moved to a standalone Gradle 8.8 build (ForgeGradle 6 cannot
run on Gradle 9). The root project delegates via `forge1201*` `Exec` tasks
(`forge1201Build`, `forge1201RunClient`, etc.).
- NeoForge `moddev` plugin standardized at `2.0.141` across `neoforge-1.21.1`
and `neoforge-26.1`.
- `fabric-1.20.1` and `fabric-1.21.1` stay on `fabric-loom-remap` (vanilla
`fabric-loom` rejects Mojang mappings in this multi-loader workspace);
documented inline.
- Publish workflow adds `forge-1.20.1` to the matrix (`*-all.jar` is the
distributable, with LWJGL FreeType embedded to avoid a JPMS resolution
failure on dedicated servers).
- `mc-publish` `version-type` is derived from the tag suffix
(`-alpha*` / `-beta*` / release).
- `v3.0.0-alpha.0` is reserved as a dry-run tag — its workflow run skips
Modrinth and CurseForge publishing while still updating Maven and creating a
GitHub Release.
release
Ember's Text API 2.9.4 (Forge 1.20.1)
2.9.4+forge-1.20.129 мар. 2026 г.196,1 тыс.Minecraft: 1.20.1forge
Что нового
Fixed underscore not working in presets
release
Ember's Text API 2.9.4 (Fabric 1.21.1)
2.9.4+fabric-1.21.129 мар. 2026 г.16,2 тыс.Minecraft: 1.21.1fabric
Что нового
Fixed underscore not working in presets
release
Ember's Text API 2.9.4 (NeoForge 1.21.1)
2.9.4+neoforge-1.21.129 мар. 2026 г.6,6 тыс.Minecraft: 1.21.1neoforge
Что нового
Fixed underscore not working in presets
release
Ember's Text API 2.9.4 (Fabric 1.20.1)
2.9.4+fabric-1.20.129 мар. 2026 г.908Minecraft: 1.20.1fabric
Что нового
Fixed underscore not working in presets
release
Ember's Text API 2.9.3 (Fabric 1.20.1)
2.9.3+fabric-1.20.128 мар. 2026 г.35Minecraft: 1.20.1fabric
Что нового
### Fixed
- Preset system now loads correctly. Presets were not being loaded from resource files due to `PresetLoader.loadAll()` never being called during resource reload. Preset tags like `<legendary>`, `<epic>`, `<spooky>`, etc. now work as expected.
### Added
- 5 new built-in presets:
- `<arcane>` - Neon + Turbulence, purple, Cinzel font
- `<chaotic>` - Rainbow + Glitch + Bounce, bold
- `<divine>` - Neon + Wave + Pulse, bold gold, Almendra font
- `<frozen>` - Gradient + Pendulum + Neon, italic, Cardo font
- `<infernal>` - Gradient + Shake + Neon, bold, Norse font
release
Ember's Text API 2.9.3 (Forge 1.20.1)
2.9.3+forge-1.20.128 мар. 2026 г.47Minecraft: 1.20.1forge
Что нового
### Fixed
- Preset system now loads correctly. Presets were not being loaded from resource files due to `PresetLoader.loadAll()` never being called during resource reload. Preset tags like `<legendary>`, `<epic>`, `<spooky>`, etc. now work as expected.
### Added
- 5 new built-in presets:
- `<arcane>` - Neon + Turbulence, purple, Cinzel font
- `<chaotic>` - Rainbow + Glitch + Bounce, bold
- `<divine>` - Neon + Wave + Pulse, bold gold, Almendra font
- `<frozen>` - Gradient + Pendulum + Neon, italic, Cardo font
- `<infernal>` - Gradient + Shake + Neon, bold, Norse font
release
Ember's Text API 2.9.3 (Fabric 1.21.1)
2.9.3+fabric-1.21.128 мар. 2026 г.146Minecraft: 1.21.1fabric
Что нового
### Fixed
- Preset system now loads correctly. Presets were not being loaded from resource files due to `PresetLoader.loadAll()` never being called during resource reload. Preset tags like `<legendary>`, `<epic>`, `<spooky>`, etc. now work as expected.
### Added
- 5 new built-in presets:
- `<arcane>` - Neon + Turbulence, purple, Cinzel font
- `<chaotic>` - Rainbow + Glitch + Bounce, bold
- `<divine>` - Neon + Wave + Pulse, bold gold, Almendra font
- `<frozen>` - Gradient + Pendulum + Neon, italic, Cardo font
- `<infernal>` - Gradient + Shake + Neon, bold, Norse font
release
Ember's Text API 2.9.3 (NeoForge 1.21.1)
2.9.3+neoforge-1.21.128 мар. 2026 г.57Minecraft: 1.21.1neoforge
Что нового
### Fixed
- Preset system now loads correctly. Presets were not being loaded from resource files due to `PresetLoader.loadAll()` never being called during resource reload. Preset tags like `<legendary>`, `<epic>`, `<spooky>`, etc. now work as expected.
### Added
- 5 new built-in presets:
- `<arcane>` - Neon + Turbulence, purple, Cinzel font
- `<chaotic>` - Rainbow + Glitch + Bounce, bold
- `<divine>` - Neon + Wave + Pulse, bold gold, Almendra font
- `<frozen>` - Gradient + Pendulum + Neon, italic, Cardo font
- `<infernal>` - Gradient + Shake + Neon, bold, Norse font
release
Ember's Text API 2.9.2 (Forge 1.20.1)
2.9.2+forge-1.20.128 мар. 2026 г.43Minecraft: 1.20.1forge
Что нового
https://github.com/TysonTheEmber/EmbersTextAPI/issues/32 Fixed
release
Ember's Text API 2.9.2 (Fabric 1.21.1)
2.9.2+fabric-1.21.128 мар. 2026 г.139Minecraft: 1.21.1fabric
Что нового
https://github.com/TysonTheEmber/EmbersTextAPI/issues/32 Fixed
release
Ember's Text API 2.9.2 (Fabric 1.20.1)
2.9.2+fabric-1.20.128 мар. 2026 г.19Minecraft: 1.20.1fabric
Что нового
https://github.com/TysonTheEmber/EmbersTextAPI/issues/32 Fixed
release
Ember's Text API 2.9.2 (NeoForge 1.21.1)
2.9.2+neoforge-1.21.128 мар. 2026 г.41Minecraft: 1.21.1neoforge
Что нового
https://github.com/TysonTheEmber/EmbersTextAPI/issues/32 Fixed
release
Ember's Text API 2.9.1 (NeoForge 1.21.1)
2.9.1+neoforge-1.21.125 мар. 2026 г.198Minecraft: 1.21.1neoforge
Что нового
Fixed Server Crash
release
Ember's Text API 2.9.1 (Fabric 1.20.1)
2.9.1+fabric-1.20.125 мар. 2026 г.25Minecraft: 1.20.1fabric
Что нового
Fixed Server Crash
release
Ember's Text API 2.9.1 (Forge 1.20.1)
2.9.1+forge-1.20.125 мар. 2026 г.89Minecraft: 1.20.1forge
Что нового
Fixed Server Crash
release
Ember's Text API 2.9.0 (Fabric 1.20.1)
2.9.0+fabric-1.20.122 мар. 2026 г.55Minecraft: 1.20.1fabric
Что нового
## 2.9.0
### Added
- **MSDF font rendering** — Complete rewrite of the SDF font rendering pipeline from single-channel EDT (Euclidean Distance Transform) to Multi-Channel Signed Distance Fields (MSDF). Eliminates stray pixel artifacts and rounded corners that plagued the old approach. Key improvements:
- **Analytical Bézier distance computation** — Distance to glyph edges is computed directly from vector outlines using Newton-Raphson refinement on quadratic and cubic Bézier curves, replacing the old bitmap→EDT approximation pipeline.
- **Multi-channel encoding** — Distance information is encoded in three color channels (RGB) with edge coloring, enabling the shader to reconstruct sharp corners that monochrome SDF fundamentally cannot represent.
- **Cross-product sign determination** — Inside/outside is determined by the cross product of the curve tangent at the closest point, eliminating winding-number ray casting errors.
- **Pseudo-distance** — Uses perpendicular distance to the tangent line at the closest point instead of true Euclidean distance, preventing "bleeding" around segment endpoints.
- **Error correction** — Post-generation pass detects and corrects false-color artifacts at edge intersection points.
- **Degenerate segment filtering** — Tiny segments produced by bold fonts at stroke junctions are filtered out during outline extraction.
- **New bundled MSDF fonts** — Almendra, Almendra Bold, Cardo, Cardo Bold, Cinzel, Cinzel Bold, Norse, Norse Bold (in addition to existing Metamorphous).
- **Font alias system** — `FontAliasRegistry` maps short names to full ResourceLocations, so markup can use `<font name=cinzel>` instead of `<font id=emberstextapi:cinzel>`. All bundled fonts have aliases registered at mod init.
- **New MSDF configuration options** in font JSON:
- `px_range` (default 8.0) — Pixel range controlling anti-aliasing width. Replaces the deprecated `spread` parameter.
- `angle_threshold` (default 3.0 radians) — Corner detection threshold for edge coloring. Lower values detect more corners for sharper reproduction.
- **Configurable anvil rename length** — New `anvilNameMaxLength` config option (default 50) allows servers to increase the character limit when renaming items in an anvil. Three mixins (`AnvilMenuMixin`, `AnvilRenameMixin`, `AnvilScreenMixin`) patch the vanilla hardcoded limit.
- **Server-side message limits** — `ServerMessageLimiter` enforces configurable limits on messages sent to clients: `maxServerMessageDuration`, `maxServerActiveMessages`, `maxQueueSize`, and `allowedEffects`.
- **Reduce motion support** — New `reduceMotion` config option disables motion-based effects (wave, shake, bounce, etc.) for accessibility. `isEffectDisabled()` now checks both the explicit disable list and the reduce-motion flag.
- **SDF debug texture dump** — Launch with `-Deta.sdf.debug=true` to dump each MSDF glyph texture as an RGB PNG to `debug-sdf/` in the game directory.
- **Emojiful compatibility layer** — ETA effects now work alongside Emojiful's emoji rendering. Regular characters get full effects while emoji sprites render normally through Emojiful's pipeline.
- **`EffectApplicator` utility class** — Shared effect-application logic extracted from `StringRenderOutputMixin`.
### Fixed
- **SDF text fringe on MC 1.20.1** — Fixed a visible anti-aliasing halo around MSDF-rendered text on all 1.20.1 loaders. MC 1.20.1's blit-to-screen reads framebuffer alpha, so semi-transparent SDF edge fragments caused a fringe artifact. Fixed by defining alpha-preserving blend state (`srcalpha=0, dstalpha=1`) in the shader JSON, which is applied inside `ShaderInstance.apply()` immediately before the draw call.
### Changed
- **Fragment shaders rewritten** for MSDF — `rendertype_eta_sdf_text.fsh` and `rendertype_eta_sdf_text_see_through.fsh` now sample all three RGB channels and take the median for distance reconstruction, with `fwidth`-based screen-space anti-aliasing and alpha squaring for edge sharpening.
- **Font JSON files updated** — All bundled font definitions now use `px_range` and `angle_threshold` instead of the deprecated `spread` field. Old `spread` values are still accepted for backward compatibility (`px_range = spread × 2`).
- Emojiful is no longer declared as incompatible. The previous hard block has been replaced with automatic compatibility mode detection.
### Removed
- **`SDFGenerator.java`** — Old single-channel SDF generator using bitmap→EDT pipeline. Replaced by `MSDFGenerator.java`.
- **Bitmap rendering path** in `FreeTypeManager` — `renderGlyphSDF()`, `computeSDFFromBitmap()`, and all EDT code removed. Only outline extraction via `FT_Outline_Decompose` remains.
- **`FT_Set_Pixel_Sizes` and `FT_Render_Glyph`** from `NativeFreeType` (1.20.1) — No longer needed since bitmap rendering was eliminated.
### Internal
- New class `MSDFGenerator` — Analytical distance computation engine with 3-channel MSDF texture generation, error correction, and pseudo-distance support.
- New class `EdgeColoring` — Chlumsky's simple edge coloring heuristic with corner detection and CYAN/MAGENTA/YELLOW color cycling.
- `SDFConfig` record extended with `pxRange` and `angleThreshold` fields, backward-compatible constructor mapping `spread → pxRange`.
- `SDFGlyphInfo.bake()` rewired to: extract outline → edge color → generate MSDF → upload 3-channel data.
- `SDFSheetGlyphInfo.upload()` now writes independent R, G, B channels to the RGBA atlas instead of duplicating a monochrome value.
- MC 1.20.1 SDF shader JSONs now include a `blend` section with alpha-preserving factors; `SDFRenderTypes.java` uses standard `TRANSLUCENT_TRANSPARENCY` on both versions.
- New SDF pipeline mixins: `FontManagerMixin`, `FontSetMixin` (1.21.1), `FontTextureMixin`, `GlyphRenderTypesMixin`, `BakedGlyphAccessor`.
- 40 unit tests across 3 test classes: `MSDFGeneratorTest` (20), `EdgeColoringTest` (13), `MSDFGenerationTest` (7).
- Added `@Pseudo` mixin `EmojiCharacterRendererMixin` for Emojiful compatibility with `require = 0` for graceful absence.
- Refactored `StringRenderOutputMixin` to delegate effect building, application, and character rendering to `EffectApplicator`.
release
Ember's Text API 2.9.0 (NeoForge 1.21.1)
2.9.0+neoforge-1.21.122 мар. 2026 г.445Minecraft: 1.21.1neoforge
Что нового
## 2.9.0
### Added
- **MSDF font rendering** — Complete rewrite of the SDF font rendering pipeline from single-channel EDT (Euclidean Distance Transform) to Multi-Channel Signed Distance Fields (MSDF). Eliminates stray pixel artifacts and rounded corners that plagued the old approach. Key improvements:
- **Analytical Bézier distance computation** — Distance to glyph edges is computed directly from vector outlines using Newton-Raphson refinement on quadratic and cubic Bézier curves, replacing the old bitmap→EDT approximation pipeline.
- **Multi-channel encoding** — Distance information is encoded in three color channels (RGB) with edge coloring, enabling the shader to reconstruct sharp corners that monochrome SDF fundamentally cannot represent.
- **Cross-product sign determination** — Inside/outside is determined by the cross product of the curve tangent at the closest point, eliminating winding-number ray casting errors.
- **Pseudo-distance** — Uses perpendicular distance to the tangent line at the closest point instead of true Euclidean distance, preventing "bleeding" around segment endpoints.
- **Error correction** — Post-generation pass detects and corrects false-color artifacts at edge intersection points.
- **Degenerate segment filtering** — Tiny segments produced by bold fonts at stroke junctions are filtered out during outline extraction.
- **New bundled MSDF fonts** — Almendra, Almendra Bold, Cardo, Cardo Bold, Cinzel, Cinzel Bold, Norse, Norse Bold (in addition to existing Metamorphous).
- **Font alias system** — `FontAliasRegistry` maps short names to full ResourceLocations, so markup can use `<font name=cinzel>` instead of `<font id=emberstextapi:cinzel>`. All bundled fonts have aliases registered at mod init.
- **New MSDF configuration options** in font JSON:
- `px_range` (default 8.0) — Pixel range controlling anti-aliasing width. Replaces the deprecated `spread` parameter.
- `angle_threshold` (default 3.0 radians) — Corner detection threshold for edge coloring. Lower values detect more corners for sharper reproduction.
- **Configurable anvil rename length** — New `anvilNameMaxLength` config option (default 50) allows servers to increase the character limit when renaming items in an anvil. Three mixins (`AnvilMenuMixin`, `AnvilRenameMixin`, `AnvilScreenMixin`) patch the vanilla hardcoded limit.
- **Server-side message limits** — `ServerMessageLimiter` enforces configurable limits on messages sent to clients: `maxServerMessageDuration`, `maxServerActiveMessages`, `maxQueueSize`, and `allowedEffects`.
- **Reduce motion support** — New `reduceMotion` config option disables motion-based effects (wave, shake, bounce, etc.) for accessibility. `isEffectDisabled()` now checks both the explicit disable list and the reduce-motion flag.
- **SDF debug texture dump** — Launch with `-Deta.sdf.debug=true` to dump each MSDF glyph texture as an RGB PNG to `debug-sdf/` in the game directory.
- **Emojiful compatibility layer** — ETA effects now work alongside Emojiful's emoji rendering. Regular characters get full effects while emoji sprites render normally through Emojiful's pipeline.
- **`EffectApplicator` utility class** — Shared effect-application logic extracted from `StringRenderOutputMixin`.
### Fixed
- **SDF text fringe on MC 1.20.1** — Fixed a visible anti-aliasing halo around MSDF-rendered text on all 1.20.1 loaders. MC 1.20.1's blit-to-screen reads framebuffer alpha, so semi-transparent SDF edge fragments caused a fringe artifact. Fixed by defining alpha-preserving blend state (`srcalpha=0, dstalpha=1`) in the shader JSON, which is applied inside `ShaderInstance.apply()` immediately before the draw call.
### Changed
- **Fragment shaders rewritten** for MSDF — `rendertype_eta_sdf_text.fsh` and `rendertype_eta_sdf_text_see_through.fsh` now sample all three RGB channels and take the median for distance reconstruction, with `fwidth`-based screen-space anti-aliasing and alpha squaring for edge sharpening.
- **Font JSON files updated** — All bundled font definitions now use `px_range` and `angle_threshold` instead of the deprecated `spread` field. Old `spread` values are still accepted for backward compatibility (`px_range = spread × 2`).
- Emojiful is no longer declared as incompatible. The previous hard block has been replaced with automatic compatibility mode detection.
### Removed
- **`SDFGenerator.java`** — Old single-channel SDF generator using bitmap→EDT pipeline. Replaced by `MSDFGenerator.java`.
- **Bitmap rendering path** in `FreeTypeManager` — `renderGlyphSDF()`, `computeSDFFromBitmap()`, and all EDT code removed. Only outline extraction via `FT_Outline_Decompose` remains.
- **`FT_Set_Pixel_Sizes` and `FT_Render_Glyph`** from `NativeFreeType` (1.20.1) — No longer needed since bitmap rendering was eliminated.
### Internal
- New class `MSDFGenerator` — Analytical distance computation engine with 3-channel MSDF texture generation, error correction, and pseudo-distance support.
- New class `EdgeColoring` — Chlumsky's simple edge coloring heuristic with corner detection and CYAN/MAGENTA/YELLOW color cycling.
- `SDFConfig` record extended with `pxRange` and `angleThreshold` fields, backward-compatible constructor mapping `spread → pxRange`.
- `SDFGlyphInfo.bake()` rewired to: extract outline → edge color → generate MSDF → upload 3-channel data.
- `SDFSheetGlyphInfo.upload()` now writes independent R, G, B channels to the RGBA atlas instead of duplicating a monochrome value.
- MC 1.20.1 SDF shader JSONs now include a `blend` section with alpha-preserving factors; `SDFRenderTypes.java` uses standard `TRANSLUCENT_TRANSPARENCY` on both versions.
- New SDF pipeline mixins: `FontManagerMixin`, `FontSetMixin` (1.21.1), `FontTextureMixin`, `GlyphRenderTypesMixin`, `BakedGlyphAccessor`.
- 40 unit tests across 3 test classes: `MSDFGeneratorTest` (20), `EdgeColoringTest` (13), `MSDFGenerationTest` (7).
- Added `@Pseudo` mixin `EmojiCharacterRendererMixin` for Emojiful compatibility with `require = 0` for graceful absence.
- Refactored `StringRenderOutputMixin` to delegate effect building, application, and character rendering to `EffectApplicator`.
release
Ember's Text API 2.9.0 (Fabric 1.21.1)
2.9.0+fabric-1.21.122 мар. 2026 г.1,4 тыс.Minecraft: 1.21.1fabric
Что нового
## 2.9.0
### Added
- **MSDF font rendering** — Complete rewrite of the SDF font rendering pipeline from single-channel EDT (Euclidean Distance Transform) to Multi-Channel Signed Distance Fields (MSDF). Eliminates stray pixel artifacts and rounded corners that plagued the old approach. Key improvements:
- **Analytical Bézier distance computation** — Distance to glyph edges is computed directly from vector outlines using Newton-Raphson refinement on quadratic and cubic Bézier curves, replacing the old bitmap→EDT approximation pipeline.
- **Multi-channel encoding** — Distance information is encoded in three color channels (RGB) with edge coloring, enabling the shader to reconstruct sharp corners that monochrome SDF fundamentally cannot represent.
- **Cross-product sign determination** — Inside/outside is determined by the cross product of the curve tangent at the closest point, eliminating winding-number ray casting errors.
- **Pseudo-distance** — Uses perpendicular distance to the tangent line at the closest point instead of true Euclidean distance, preventing "bleeding" around segment endpoints.
- **Error correction** — Post-generation pass detects and corrects false-color artifacts at edge intersection points.
- **Degenerate segment filtering** — Tiny segments produced by bold fonts at stroke junctions are filtered out during outline extraction.
- **New bundled MSDF fonts** — Almendra, Almendra Bold, Cardo, Cardo Bold, Cinzel, Cinzel Bold, Norse, Norse Bold (in addition to existing Metamorphous).
- **Font alias system** — `FontAliasRegistry` maps short names to full ResourceLocations, so markup can use `<font name=cinzel>` instead of `<font id=emberstextapi:cinzel>`. All bundled fonts have aliases registered at mod init.
- **New MSDF configuration options** in font JSON:
- `px_range` (default 8.0) — Pixel range controlling anti-aliasing width. Replaces the deprecated `spread` parameter.
- `angle_threshold` (default 3.0 radians) — Corner detection threshold for edge coloring. Lower values detect more corners for sharper reproduction.
- **Configurable anvil rename length** — New `anvilNameMaxLength` config option (default 50) allows servers to increase the character limit when renaming items in an anvil. Three mixins (`AnvilMenuMixin`, `AnvilRenameMixin`, `AnvilScreenMixin`) patch the vanilla hardcoded limit.
- **Server-side message limits** — `ServerMessageLimiter` enforces configurable limits on messages sent to clients: `maxServerMessageDuration`, `maxServerActiveMessages`, `maxQueueSize`, and `allowedEffects`.
- **Reduce motion support** — New `reduceMotion` config option disables motion-based effects (wave, shake, bounce, etc.) for accessibility. `isEffectDisabled()` now checks both the explicit disable list and the reduce-motion flag.
- **SDF debug texture dump** — Launch with `-Deta.sdf.debug=true` to dump each MSDF glyph texture as an RGB PNG to `debug-sdf/` in the game directory.
- **Emojiful compatibility layer** — ETA effects now work alongside Emojiful's emoji rendering. Regular characters get full effects while emoji sprites render normally through Emojiful's pipeline.
- **`EffectApplicator` utility class** — Shared effect-application logic extracted from `StringRenderOutputMixin`.
### Fixed
- **SDF text fringe on MC 1.20.1** — Fixed a visible anti-aliasing halo around MSDF-rendered text on all 1.20.1 loaders. MC 1.20.1's blit-to-screen reads framebuffer alpha, so semi-transparent SDF edge fragments caused a fringe artifact. Fixed by defining alpha-preserving blend state (`srcalpha=0, dstalpha=1`) in the shader JSON, which is applied inside `ShaderInstance.apply()` immediately before the draw call.
### Changed
- **Fragment shaders rewritten** for MSDF — `rendertype_eta_sdf_text.fsh` and `rendertype_eta_sdf_text_see_through.fsh` now sample all three RGB channels and take the median for distance reconstruction, with `fwidth`-based screen-space anti-aliasing and alpha squaring for edge sharpening.
- **Font JSON files updated** — All bundled font definitions now use `px_range` and `angle_threshold` instead of the deprecated `spread` field. Old `spread` values are still accepted for backward compatibility (`px_range = spread × 2`).
- Emojiful is no longer declared as incompatible. The previous hard block has been replaced with automatic compatibility mode detection.
### Removed
- **`SDFGenerator.java`** — Old single-channel SDF generator using bitmap→EDT pipeline. Replaced by `MSDFGenerator.java`.
- **Bitmap rendering path** in `FreeTypeManager` — `renderGlyphSDF()`, `computeSDFFromBitmap()`, and all EDT code removed. Only outline extraction via `FT_Outline_Decompose` remains.
- **`FT_Set_Pixel_Sizes` and `FT_Render_Glyph`** from `NativeFreeType` (1.20.1) — No longer needed since bitmap rendering was eliminated.
### Internal
- New class `MSDFGenerator` — Analytical distance computation engine with 3-channel MSDF texture generation, error correction, and pseudo-distance support.
- New class `EdgeColoring` — Chlumsky's simple edge coloring heuristic with corner detection and CYAN/MAGENTA/YELLOW color cycling.
- `SDFConfig` record extended with `pxRange` and `angleThreshold` fields, backward-compatible constructor mapping `spread → pxRange`.
- `SDFGlyphInfo.bake()` rewired to: extract outline → edge color → generate MSDF → upload 3-channel data.
- `SDFSheetGlyphInfo.upload()` now writes independent R, G, B channels to the RGBA atlas instead of duplicating a monochrome value.
- MC 1.20.1 SDF shader JSONs now include a `blend` section with alpha-preserving factors; `SDFRenderTypes.java` uses standard `TRANSLUCENT_TRANSPARENCY` on both versions.
- New SDF pipeline mixins: `FontManagerMixin`, `FontSetMixin` (1.21.1), `FontTextureMixin`, `GlyphRenderTypesMixin`, `BakedGlyphAccessor`.
- 40 unit tests across 3 test classes: `MSDFGeneratorTest` (20), `EdgeColoringTest` (13), `MSDFGenerationTest` (7).
- Added `@Pseudo` mixin `EmojiCharacterRendererMixin` for Emojiful compatibility with `require = 0` for graceful absence.
- Refactored `StringRenderOutputMixin` to delegate effect building, application, and character rendering to `EffectApplicator`.
release
Ember's Text API 2.9.0 (Forge 1.20.1)
2.9.0+forge-1.20.122 мар. 2026 г.167Minecraft: 1.20.1forge
Что нового
## 2.9.0
### Added
- **MSDF font rendering** — Complete rewrite of the SDF font rendering pipeline from single-channel EDT (Euclidean Distance Transform) to Multi-Channel Signed Distance Fields (MSDF). Eliminates stray pixel artifacts and rounded corners that plagued the old approach. Key improvements:
- **Analytical Bézier distance computation** — Distance to glyph edges is computed directly from vector outlines using Newton-Raphson refinement on quadratic and cubic Bézier curves, replacing the old bitmap→EDT approximation pipeline.
- **Multi-channel encoding** — Distance information is encoded in three color channels (RGB) with edge coloring, enabling the shader to reconstruct sharp corners that monochrome SDF fundamentally cannot represent.
- **Cross-product sign determination** — Inside/outside is determined by the cross product of the curve tangent at the closest point, eliminating winding-number ray casting errors.
- **Pseudo-distance** — Uses perpendicular distance to the tangent line at the closest point instead of true Euclidean distance, preventing "bleeding" around segment endpoints.
- **Error correction** — Post-generation pass detects and corrects false-color artifacts at edge intersection points.
- **Degenerate segment filtering** — Tiny segments produced by bold fonts at stroke junctions are filtered out during outline extraction.
- **New bundled MSDF fonts** — Almendra, Almendra Bold, Cardo, Cardo Bold, Cinzel, Cinzel Bold, Norse, Norse Bold (in addition to existing Metamorphous).
- **Font alias system** — `FontAliasRegistry` maps short names to full ResourceLocations, so markup can use `<font name=cinzel>` instead of `<font id=emberstextapi:cinzel>`. All bundled fonts have aliases registered at mod init.
- **New MSDF configuration options** in font JSON:
- `px_range` (default 8.0) — Pixel range controlling anti-aliasing width. Replaces the deprecated `spread` parameter.
- `angle_threshold` (default 3.0 radians) — Corner detection threshold for edge coloring. Lower values detect more corners for sharper reproduction.
- **Configurable anvil rename length** — New `anvilNameMaxLength` config option (default 50) allows servers to increase the character limit when renaming items in an anvil. Three mixins (`AnvilMenuMixin`, `AnvilRenameMixin`, `AnvilScreenMixin`) patch the vanilla hardcoded limit.
- **Server-side message limits** — `ServerMessageLimiter` enforces configurable limits on messages sent to clients: `maxServerMessageDuration`, `maxServerActiveMessages`, `maxQueueSize`, and `allowedEffects`.
- **Reduce motion support** — New `reduceMotion` config option disables motion-based effects (wave, shake, bounce, etc.) for accessibility. `isEffectDisabled()` now checks both the explicit disable list and the reduce-motion flag.
- **SDF debug texture dump** — Launch with `-Deta.sdf.debug=true` to dump each MSDF glyph texture as an RGB PNG to `debug-sdf/` in the game directory.
- **Emojiful compatibility layer** — ETA effects now work alongside Emojiful's emoji rendering. Regular characters get full effects while emoji sprites render normally through Emojiful's pipeline.
- **`EffectApplicator` utility class** — Shared effect-application logic extracted from `StringRenderOutputMixin`.
### Fixed
- **SDF text fringe on MC 1.20.1** — Fixed a visible anti-aliasing halo around MSDF-rendered text on all 1.20.1 loaders. MC 1.20.1's blit-to-screen reads framebuffer alpha, so semi-transparent SDF edge fragments caused a fringe artifact. Fixed by defining alpha-preserving blend state (`srcalpha=0, dstalpha=1`) in the shader JSON, which is applied inside `ShaderInstance.apply()` immediately before the draw call.
### Changed
- **Fragment shaders rewritten** for MSDF — `rendertype_eta_sdf_text.fsh` and `rendertype_eta_sdf_text_see_through.fsh` now sample all three RGB channels and take the median for distance reconstruction, with `fwidth`-based screen-space anti-aliasing and alpha squaring for edge sharpening.
- **Font JSON files updated** — All bundled font definitions now use `px_range` and `angle_threshold` instead of the deprecated `spread` field. Old `spread` values are still accepted for backward compatibility (`px_range = spread × 2`).
- Emojiful is no longer declared as incompatible. The previous hard block has been replaced with automatic compatibility mode detection.
### Removed
- **`SDFGenerator.java`** — Old single-channel SDF generator using bitmap→EDT pipeline. Replaced by `MSDFGenerator.java`.
- **Bitmap rendering path** in `FreeTypeManager` — `renderGlyphSDF()`, `computeSDFFromBitmap()`, and all EDT code removed. Only outline extraction via `FT_Outline_Decompose` remains.
- **`FT_Set_Pixel_Sizes` and `FT_Render_Glyph`** from `NativeFreeType` (1.20.1) — No longer needed since bitmap rendering was eliminated.
### Internal
- New class `MSDFGenerator` — Analytical distance computation engine with 3-channel MSDF texture generation, error correction, and pseudo-distance support.
- New class `EdgeColoring` — Chlumsky's simple edge coloring heuristic with corner detection and CYAN/MAGENTA/YELLOW color cycling.
- `SDFConfig` record extended with `pxRange` and `angleThreshold` fields, backward-compatible constructor mapping `spread → pxRange`.
- `SDFGlyphInfo.bake()` rewired to: extract outline → edge color → generate MSDF → upload 3-channel data.
- `SDFSheetGlyphInfo.upload()` now writes independent R, G, B channels to the RGBA atlas instead of duplicating a monochrome value.
- MC 1.20.1 SDF shader JSONs now include a `blend` section with alpha-preserving factors; `SDFRenderTypes.java` uses standard `TRANSLUCENT_TRANSPARENCY` on both versions.
- New SDF pipeline mixins: `FontManagerMixin`, `FontSetMixin` (1.21.1), `FontTextureMixin`, `GlyphRenderTypesMixin`, `BakedGlyphAccessor`.
- 40 unit tests across 3 test classes: `MSDFGeneratorTest` (20), `EdgeColoringTest` (13), `MSDFGenerationTest` (7).
- Added `@Pseudo` mixin `EmojiCharacterRendererMixin` for Emojiful compatibility with `require = 0` for graceful absence.
- Refactored `StringRenderOutputMixin` to delegate effect building, application, and character rendering to `EffectApplicator`.
release
Ember's Text API 2.8.2 (Fabric 1.21.1)
2.8.2+fabric-1.21.115 мар. 2026 г.1,4 тыс.Minecraft: 1.21.1fabric
Что нового
### Added
- **Emojiful compatibility layer** — ETA effects now work alongside Emojiful's emoji rendering. Regular characters get full effects (rainbow, wave, shake, etc.) while emoji sprites render normally through Emojiful's pipeline. Supported on all loaders and versions (Forge 1.20.1 with Emojiful 4.x, NeoForge 1.21.1 with Emojiful 5.x, Fabric).
- **`EffectApplicator` utility class** — Shared effect-application logic extracted from `StringRenderOutputMixin`, used by both the vanilla rendering path and the Emojiful compatibility mixin.
### Changed
- Emojiful is no longer declared as incompatible. The previous hard block has been replaced with automatic compatibility mode detection.
### Internal
- Added `@Pseudo` mixin `EmojiCharacterRendererMixin` targeting both `EmojiFontHelper$EmojiCharacterRenderer` (NeoForge/Emojiful 5.x) and `EmojiFontRenderer$EmojiCharacterRenderer` (Forge/Emojiful 4.x) with `require = 0` for graceful absence.
- Refactored `StringRenderOutputMixin` to delegate effect building, application, and character rendering to `EffectApplicator`.
release
Ember's Text API 2.8.2 (Fabric 1.20.1)
2.8.2+fabric-1.20.115 мар. 2026 г.24Minecraft: 1.20.1fabric
Что нового
### Added
- **Emojiful compatibility layer** — ETA effects now work alongside Emojiful's emoji rendering. Regular characters get full effects (rainbow, wave, shake, etc.) while emoji sprites render normally through Emojiful's pipeline. Supported on all loaders and versions (Forge 1.20.1 with Emojiful 4.x, NeoForge 1.21.1 with Emojiful 5.x, Fabric).
- **`EffectApplicator` utility class** — Shared effect-application logic extracted from `StringRenderOutputMixin`, used by both the vanilla rendering path and the Emojiful compatibility mixin.
### Changed
- Emojiful is no longer declared as incompatible. The previous hard block has been replaced with automatic compatibility mode detection.
### Internal
- Added `@Pseudo` mixin `EmojiCharacterRendererMixin` targeting both `EmojiFontHelper$EmojiCharacterRenderer` (NeoForge/Emojiful 5.x) and `EmojiFontRenderer$EmojiCharacterRenderer` (Forge/Emojiful 4.x) with `require = 0` for graceful absence.
- Refactored `StringRenderOutputMixin` to delegate effect building, application, and character rendering to `EffectApplicator`.
release
Ember's Text API 2.8.2 (Forge 1.20.1)
2.8.2+forge-1.20.115 мар. 2026 г.39,5 тыс.Minecraft: 1.20.1forge
Что нового
### Added
- **Emojiful compatibility layer** — ETA effects now work alongside Emojiful's emoji rendering. Regular characters get full effects (rainbow, wave, shake, etc.) while emoji sprites render normally through Emojiful's pipeline. Supported on all loaders and versions (Forge 1.20.1 with Emojiful 4.x, NeoForge 1.21.1 with Emojiful 5.x, Fabric).
- **`EffectApplicator` utility class** — Shared effect-application logic extracted from `StringRenderOutputMixin`, used by both the vanilla rendering path and the Emojiful compatibility mixin.
### Changed
- Emojiful is no longer declared as incompatible. The previous hard block has been replaced with automatic compatibility mode detection.
### Internal
- Added `@Pseudo` mixin `EmojiCharacterRendererMixin` targeting both `EmojiFontHelper$EmojiCharacterRenderer` (NeoForge/Emojiful 5.x) and `EmojiFontRenderer$EmojiCharacterRenderer` (Forge/Emojiful 4.x) with `require = 0` for graceful absence.
- Refactored `StringRenderOutputMixin` to delegate effect building, application, and character rendering to `EffectApplicator`.
release
Ember's Text API 2.8.2 (NeoForge 1.21.1)
2.8.2+neoforge-1.21.115 мар. 2026 г.272Minecraft: 1.21.1neoforge
Что нового
### Added
- **Emojiful compatibility layer** — ETA effects now work alongside Emojiful's emoji rendering. Regular characters get full effects (rainbow, wave, shake, etc.) while emoji sprites render normally through Emojiful's pipeline. Supported on all loaders and versions (Forge 1.20.1 with Emojiful 4.x, NeoForge 1.21.1 with Emojiful 5.x, Fabric).
- **`EffectApplicator` utility class** — Shared effect-application logic extracted from `StringRenderOutputMixin`, used by both the vanilla rendering path and the Emojiful compatibility mixin.
### Changed
- Emojiful is no longer declared as incompatible. The previous hard block has been replaced with automatic compatibility mode detection.
### Internal
- Added `@Pseudo` mixin `EmojiCharacterRendererMixin` targeting both `EmojiFontHelper$EmojiCharacterRenderer` (NeoForge/Emojiful 5.x) and `EmojiFontRenderer$EmojiCharacterRenderer` (Forge/Emojiful 4.x) with `require = 0` for graceful absence.
- Refactored `StringRenderOutputMixin` to delegate effect building, application, and character rendering to `EffectApplicator`.
release
Ember's Text API 2.8.1 (Fabric 1.21.1)
2.8.1+fabric-1.21.114 мар. 2026 г.511Minecraft: 1.21.1fabric
Что нового
### Removed
- **`TextSpan.gradient()`** — 3 overloads removed. Use `span.effect("grad from=X to=Y")` or `<grad>` markup instead.
- **`TextSpan.shake()`** — 3 overloads removed. Use `span.effect("shake a=X")` or `<shake>` markup instead.
- **`TextSpan.charShake()`** — 3 overloads removed. Same replacement as above.
- **`ImmersiveMessage.shake()`** and **`ImmersiveMessage.charShake()`** — Use `<shake>` markup instead.
- **`ImmersiveMessage.gradient()`** — Use `<grad from=X to=Y>` markup instead.
- **`TypewriterConfig`** — Global defaults (20ms/char, always enabled) are now fixed constants in `TypewriterEffect`.
- **`ShakeType`** enum — No longer needed; effects system handles all shake types via `ShakeEffect`, `WaveEffect`, `CircleEffect`.
- **`EffectUtil.lerp()`** — Use `ColorMath.lerp()` directly.
- **`EffectUtil.hsvToRgb()`** — Use `ColorMath.hsvToRgbPacked()` directly.
- **`TooltipPacket.register()`** (Forge 1.20.1) — Was a no-op stub.
### Changed
- `TypewriterTrack` and `TypewriterTracks` moved from `net.tysontheember.emberstextapi.typewriter` to `net.tysontheember.emberstextapi.immersivemessages.effects.animation`. These are internal classes; most mod developers will not be affected.
### Internal
- Removed `ShakeCalculator` and `GradientCalculator` utility classes (only supported removed APIs).
- Removed all `[DIAG]` diagnostic logging from mixins and `ImmersiveMessage`.
- Cleaned up orphaned commented-out code in `MarkupParser` and `PlayerJoinEventHandler`.
release
Ember's Text API 2.8.1 (Forge 1.20.1)
2.8.1+forge-1.20.114 мар. 2026 г.40Minecraft: 1.20.1forge
Что нового
### Removed
- **`TextSpan.gradient()`** — 3 overloads removed. Use `span.effect("grad from=X to=Y")` or `<grad>` markup instead.
- **`TextSpan.shake()`** — 3 overloads removed. Use `span.effect("shake a=X")` or `<shake>` markup instead.
- **`TextSpan.charShake()`** — 3 overloads removed. Same replacement as above.
- **`ImmersiveMessage.shake()`** and **`ImmersiveMessage.charShake()`** — Use `<shake>` markup instead.
- **`ImmersiveMessage.gradient()`** — Use `<grad from=X to=Y>` markup instead.
- **`TypewriterConfig`** — Global defaults (20ms/char, always enabled) are now fixed constants in `TypewriterEffect`.
- **`ShakeType`** enum — No longer needed; effects system handles all shake types via `ShakeEffect`, `WaveEffect`, `CircleEffect`.
- **`EffectUtil.lerp()`** — Use `ColorMath.lerp()` directly.
- **`EffectUtil.hsvToRgb()`** — Use `ColorMath.hsvToRgbPacked()` directly.
- **`TooltipPacket.register()`** (Forge 1.20.1) — Was a no-op stub.
### Changed
- `TypewriterTrack` and `TypewriterTracks` moved from `net.tysontheember.emberstextapi.typewriter` to `net.tysontheember.emberstextapi.immersivemessages.effects.animation`. These are internal classes; most mod developers will not be affected.
### Internal
- Removed `ShakeCalculator` and `GradientCalculator` utility classes (only supported removed APIs).
- Removed all `[DIAG]` diagnostic logging from mixins and `ImmersiveMessage`.
- Cleaned up orphaned commented-out code in `MarkupParser` and `PlayerJoinEventHandler`.
release
Ember's Text API 2.8.1 (Fabric 1.20.1)
2.8.1+fabric-1.20.114 мар. 2026 г.14Minecraft: 1.20.1fabric
Что нового
### Removed
- **`TextSpan.gradient()`** — 3 overloads removed. Use `span.effect("grad from=X to=Y")` or `<grad>` markup instead.
- **`TextSpan.shake()`** — 3 overloads removed. Use `span.effect("shake a=X")` or `<shake>` markup instead.
- **`TextSpan.charShake()`** — 3 overloads removed. Same replacement as above.
- **`ImmersiveMessage.shake()`** and **`ImmersiveMessage.charShake()`** — Use `<shake>` markup instead.
- **`ImmersiveMessage.gradient()`** — Use `<grad from=X to=Y>` markup instead.
- **`TypewriterConfig`** — Global defaults (20ms/char, always enabled) are now fixed constants in `TypewriterEffect`.
- **`ShakeType`** enum — No longer needed; effects system handles all shake types via `ShakeEffect`, `WaveEffect`, `CircleEffect`.
- **`EffectUtil.lerp()`** — Use `ColorMath.lerp()` directly.
- **`EffectUtil.hsvToRgb()`** — Use `ColorMath.hsvToRgbPacked()` directly.
- **`TooltipPacket.register()`** (Forge 1.20.1) — Was a no-op stub.
### Changed
- `TypewriterTrack` and `TypewriterTracks` moved from `net.tysontheember.emberstextapi.typewriter` to `net.tysontheember.emberstextapi.immersivemessages.effects.animation`. These are internal classes; most mod developers will not be affected.
### Internal
- Removed `ShakeCalculator` and `GradientCalculator` utility classes (only supported removed APIs).
- Removed all `[DIAG]` diagnostic logging from mixins and `ImmersiveMessage`.
- Cleaned up orphaned commented-out code in `MarkupParser` and `PlayerJoinEventHandler`.
release
Ember's Text API 2.8.1 (NeoForge 1.21.1)
2.8.1+neoforge-1.21.114 мар. 2026 г.187Minecraft: 1.21.1neoforge
Что нового
### Removed
- **`TextSpan.gradient()`** — 3 overloads removed. Use `span.effect("grad from=X to=Y")` or `<grad>` markup instead.
- **`TextSpan.shake()`** — 3 overloads removed. Use `span.effect("shake a=X")` or `<shake>` markup instead.
- **`TextSpan.charShake()`** — 3 overloads removed. Same replacement as above.
- **`ImmersiveMessage.shake()`** and **`ImmersiveMessage.charShake()`** — Use `<shake>` markup instead.
- **`ImmersiveMessage.gradient()`** — Use `<grad from=X to=Y>` markup instead.
- **`TypewriterConfig`** — Global defaults (20ms/char, always enabled) are now fixed constants in `TypewriterEffect`.
- **`ShakeType`** enum — No longer needed; effects system handles all shake types via `ShakeEffect`, `WaveEffect`, `CircleEffect`.
- **`EffectUtil.lerp()`** — Use `ColorMath.lerp()` directly.
- **`EffectUtil.hsvToRgb()`** — Use `ColorMath.hsvToRgbPacked()` directly.
- **`TooltipPacket.register()`** (Forge 1.20.1) — Was a no-op stub.
### Changed
- `TypewriterTrack` and `TypewriterTracks` moved from `net.tysontheember.emberstextapi.typewriter` to `net.tysontheember.emberstextapi.immersivemessages.effects.animation`. These are internal classes; most mod developers will not be affected.
### Internal
- Removed `ShakeCalculator` and `GradientCalculator` utility classes (only supported removed APIs).
- Removed all `[DIAG]` diagnostic logging from mixins and `ImmersiveMessage`.
- Cleaned up orphaned commented-out code in `MarkupParser` and `PlayerJoinEventHandler`.
release
Ember's Text API 2.8.0 (Fabric 1.21.1)
2.8.0+fabric-1.21.111 мар. 2026 г.1,1 тыс.Minecraft: 1.21.1fabric
Что нового
Added NBT support for inline item and entity displays via the nbt attribute
release
Ember's Text API 2.8.0 (Forge 1.20.1)
2.8.0+forge-1.20.111 мар. 2026 г.38Minecraft: 1.20.1forge
Что нового
Added NBT support for inline item and entity displays via the nbt attribute
release
Ember's Text API 2.8.0 (NeoForge 1.21.1)
2.8.0+neoforge-1.21.111 мар. 2026 г.177Minecraft: 1.21.1neoforge
Что нового
Added NBT support for inline item and entity displays via the nbt attribute
release
Ember's Text API 2.8.0 (Fabric 1.20.1)
2.8.0+fabric-1.20.111 мар. 2026 г.23Minecraft: 1.20.1fabric
Что нового
Added NBT support for inline item and entity displays via the nbt attribute
release
Ember's Text API 2.7.1 (Fabric 1.21.1)
2.7.1+fabric-1.21.110 мар. 2026 г.48Minecraft: 1.21.1fabric
Что нового
Fixed Translateable not being parsed
release
Ember's Text API 2.7.1 (Fabric 1.20.1)
2.7.1+fabric-1.20.110 мар. 2026 г.18Minecraft: 1.20.1fabric
Что нового
Fixed Translateable not being parsed
release
Ember's Text API 2.7.1 (Forge 1.20.1)
2.7.1+forge-1.20.110 мар. 2026 г.14Minecraft: 1.20.1forge
Что нового
Fixed Translateable not being parsed
release
Ember's Text API 2.7.1 (NeoForge 1.21.1)
2.7.1+neoforge-1.21.110 мар. 2026 г.24Minecraft: 1.21.1neoforge
Что нового
Fixed Translateable not being parsed
release
Ember's Text API 2.7.0 (Forge 1.20.1)
2.7.0+forge-1.20.124 февр. 2026 г.2,7 тыс.Minecraft: 1.20.1forge
Что нового
## v2.7.0
### Config System Expansion
- Added **`immersiveMessagesEnabled`** (client) — Master toggle for immersive messages. When disabled, all immersive messages are silently ignored on the client.
- Added **`disabledEffects`** (client) — List of effect names to disable globally (e.g. `["glitch", "shake"]`). Disabled effects render as plain text.
- Added **`markupPermissionMode`** (server) — Controls which players can use markup tags in chat: `NONE` (default, no restrictions), `WHITELIST`, or `BLACKLIST`.
- Added **`markupPlayerList`** (server) — Player UUIDs for the markup whitelist/blacklist.
- Added **`maxMessageDuration`** (client) — Cap on immersive message duration in ticks. `0` = unlimited.
- Added **`maxActiveMessages`** (client) — Cap on simultaneous on-screen messages. `0` = unlimited.
### Config File Layout
- **Forge / NeoForge:** Config is now split into two files:
- `emberstextapi-common.toml` — Server-side options (welcome message, markup permissions)
- `emberstextapi-client.toml` — Client-side options (immersive messages toggle, disabled effects, limits)
- **Fabric:** All options in a single `emberstextapi.json` file (unchanged location).
### Chat Markup Stripping
- Server operators can now restrict which players use markup tags like `<rainbow>` in chat via the `markupPermissionMode` and `markupPlayerList` config options.
- When a player is not allowed to use markup, all tags are silently stripped from their chat messages, leaving plain text.
### Internal
- Added `NoOpEffect` class — a no-op effect used as a silent replacement for disabled effects.
- Added `MarkupStripper` utility — shared regex-based markup tag stripping used by all chat event handlers.
- Added `ChatMarkupHandler` (Forge/NeoForge) and `FabricChatMarkupHandler` (Fabric) for server-side chat filtering.
- `ClientMessageManager.open()` now enforces `immersiveMessagesEnabled` and `maxActiveMessages` client-side.
- Added `ClientMessageManager.getActiveMessageCount()`.
## Color
- Color effect now accepts `value` as an alternative to `col` (e.g. `<color value=FF0000>`)
- `<color value=HEX>` now routes through the effect system, making it stackable with other effects
release
Ember's Text API 2.7.0 (NeoForge 1.21.1)
2.7.0+neoforge-1.21.124 февр. 2026 г.985Minecraft: 1.21.1neoforge
Что нового
## v2.7.0
### Config System Expansion
- Added **`immersiveMessagesEnabled`** (client) — Master toggle for immersive messages. When disabled, all immersive messages are silently ignored on the client.
- Added **`disabledEffects`** (client) — List of effect names to disable globally (e.g. `["glitch", "shake"]`). Disabled effects render as plain text.
- Added **`markupPermissionMode`** (server) — Controls which players can use markup tags in chat: `NONE` (default, no restrictions), `WHITELIST`, or `BLACKLIST`.
- Added **`markupPlayerList`** (server) — Player UUIDs for the markup whitelist/blacklist.
- Added **`maxMessageDuration`** (client) — Cap on immersive message duration in ticks. `0` = unlimited.
- Added **`maxActiveMessages`** (client) — Cap on simultaneous on-screen messages. `0` = unlimited.
### Config File Layout
- **Forge / NeoForge:** Config is now split into two files:
- `emberstextapi-common.toml` — Server-side options (welcome message, markup permissions)
- `emberstextapi-client.toml` — Client-side options (immersive messages toggle, disabled effects, limits)
- **Fabric:** All options in a single `emberstextapi.json` file (unchanged location).
### Chat Markup Stripping
- Server operators can now restrict which players use markup tags like `<rainbow>` in chat via the `markupPermissionMode` and `markupPlayerList` config options.
- When a player is not allowed to use markup, all tags are silently stripped from their chat messages, leaving plain text.
### Internal
- Added `NoOpEffect` class — a no-op effect used as a silent replacement for disabled effects.
- Added `MarkupStripper` utility — shared regex-based markup tag stripping used by all chat event handlers.
- Added `ChatMarkupHandler` (Forge/NeoForge) and `FabricChatMarkupHandler` (Fabric) for server-side chat filtering.
- `ClientMessageManager.open()` now enforces `immersiveMessagesEnabled` and `maxActiveMessages` client-side.
- Added `ClientMessageManager.getActiveMessageCount()`.
## Color
- Color effect now accepts `value` as an alternative to `col` (e.g. `<color value=FF0000>`)
- `<color value=HEX>` now routes through the effect system, making it stackable with other effects
release
Ember's Text API 2.7.0 (Fabric 1.20.1)
2.7.0+fabric-1.20.124 февр. 2026 г.48Minecraft: 1.20.1fabric
Что нового
## v2.7.0
### Config System Expansion
- Added **`immersiveMessagesEnabled`** (client) — Master toggle for immersive messages. When disabled, all immersive messages are silently ignored on the client.
- Added **`disabledEffects`** (client) — List of effect names to disable globally (e.g. `["glitch", "shake"]`). Disabled effects render as plain text.
- Added **`markupPermissionMode`** (server) — Controls which players can use markup tags in chat: `NONE` (default, no restrictions), `WHITELIST`, or `BLACKLIST`.
- Added **`markupPlayerList`** (server) — Player UUIDs for the markup whitelist/blacklist.
- Added **`maxMessageDuration`** (client) — Cap on immersive message duration in ticks. `0` = unlimited.
- Added **`maxActiveMessages`** (client) — Cap on simultaneous on-screen messages. `0` = unlimited.
### Config File Layout
- **Forge / NeoForge:** Config is now split into two files:
- `emberstextapi-common.toml` — Server-side options (welcome message, markup permissions)
- `emberstextapi-client.toml` — Client-side options (immersive messages toggle, disabled effects, limits)
- **Fabric:** All options in a single `emberstextapi.json` file (unchanged location).
### Chat Markup Stripping
- Server operators can now restrict which players use markup tags like `<rainbow>` in chat via the `markupPermissionMode` and `markupPlayerList` config options.
- When a player is not allowed to use markup, all tags are silently stripped from their chat messages, leaving plain text.
### Internal
- Added `NoOpEffect` class — a no-op effect used as a silent replacement for disabled effects.
- Added `MarkupStripper` utility — shared regex-based markup tag stripping used by all chat event handlers.
- Added `ChatMarkupHandler` (Forge/NeoForge) and `FabricChatMarkupHandler` (Fabric) for server-side chat filtering.
- `ClientMessageManager.open()` now enforces `immersiveMessagesEnabled` and `maxActiveMessages` client-side.
- Added `ClientMessageManager.getActiveMessageCount()`.
## Color
- Color effect now accepts `value` as an alternative to `col` (e.g. `<color value=FF0000>`)
- `<color value=HEX>` now routes through the effect system, making it stackable with other effects
release
Ember's Text API 2.7.0 (Fabric 1.21.1)
2.7.0+fabric-1.21.124 февр. 2026 г.4,2 тыс.Minecraft: 1.21.1fabric
Что нового
## v2.7.0
### Config System Expansion
- Added **`immersiveMessagesEnabled`** (client) — Master toggle for immersive messages. When disabled, all immersive messages are silently ignored on the client.
- Added **`disabledEffects`** (client) — List of effect names to disable globally (e.g. `["glitch", "shake"]`). Disabled effects render as plain text.
- Added **`markupPermissionMode`** (server) — Controls which players can use markup tags in chat: `NONE` (default, no restrictions), `WHITELIST`, or `BLACKLIST`.
- Added **`markupPlayerList`** (server) — Player UUIDs for the markup whitelist/blacklist.
- Added **`maxMessageDuration`** (client) — Cap on immersive message duration in ticks. `0` = unlimited.
- Added **`maxActiveMessages`** (client) — Cap on simultaneous on-screen messages. `0` = unlimited.
### Config File Layout
- **Forge / NeoForge:** Config is now split into two files:
- `emberstextapi-common.toml` — Server-side options (welcome message, markup permissions)
- `emberstextapi-client.toml` — Client-side options (immersive messages toggle, disabled effects, limits)
- **Fabric:** All options in a single `emberstextapi.json` file (unchanged location).
### Chat Markup Stripping
- Server operators can now restrict which players use markup tags like `<rainbow>` in chat via the `markupPermissionMode` and `markupPlayerList` config options.
- When a player is not allowed to use markup, all tags are silently stripped from their chat messages, leaving plain text.
### Internal
- Added `NoOpEffect` class — a no-op effect used as a silent replacement for disabled effects.
- Added `MarkupStripper` utility — shared regex-based markup tag stripping used by all chat event handlers.
- Added `ChatMarkupHandler` (Forge/NeoForge) and `FabricChatMarkupHandler` (Fabric) for server-side chat filtering.
- `ClientMessageManager.open()` now enforces `immersiveMessagesEnabled` and `maxActiveMessages` client-side.
- Added `ClientMessageManager.getActiveMessageCount()`.
## Color
- Color effect now accepts `value` as an alternative to `col` (e.g. `<color value=FF0000>`)
- `<color value=HEX>` now routes through the effect system, making it stackable with other effects
release
Ember's Text API 2.6.1 (Forge 1.20.1)
2.6.1+forge-1.20.122 февр. 2026 г.82Minecraft: 1.20.1forge
Что нового
* Restricted `/eta test`, `/eta send`, `/eta queue`, `/eta clearqueue`, `/eta stopqueue`, and `/eta closeall` to operators (permission level 2)
* `/eta`, `/eta help`, `/eta welcome`, and `/eta welcome enable` are now accessible to all players ged `/eta clearqueue <player>` (no channel) to only clear pending steps, letting current messages finish (consistent with the per-channel behavior)
release
Ember's Text API 2.6.1 (Fabric 1.21.1)
2.6.1+fabric-1.21.122 февр. 2026 г.16,9 тыс.Minecraft: 1.21.1fabric
Что нового
* Restricted `/eta test`, `/eta send`, `/eta queue`, `/eta clearqueue`, `/eta stopqueue`, and `/eta closeall` to operators (permission level 2)
* `/eta`, `/eta help`, `/eta welcome`, and `/eta welcome enable` are now accessible to all players ged `/eta clearqueue <player>` (no channel) to only clear pending steps, letting current messages finish (consistent with the per-channel behavior)
release
Ember's Text API 2.6.1 (Fabric 1.20.1)
2.6.1+fabric-1.20.122 февр. 2026 г.16Minecraft: 1.20.1fabric
Что нового
* Restricted `/eta test`, `/eta send`, `/eta queue`, `/eta clearqueue`, `/eta stopqueue`, and `/eta closeall` to operators (permission level 2)
* `/eta`, `/eta help`, `/eta welcome`, and `/eta welcome enable` are now accessible to all players ged `/eta clearqueue <player>` (no channel) to only clear pending steps, letting current messages finish (consistent with the per-channel behavior)
release
Ember's Text API 2.6.1 (NeoForge 1.21.1)
2.6.1+neoforge-1.21.122 февр. 2026 г.130Minecraft: 1.21.1neoforge
Что нового
* Restricted `/eta test`, `/eta send`, `/eta queue`, `/eta clearqueue`, `/eta stopqueue`, and `/eta closeall` to operators (permission level 2)
* `/eta`, `/eta help`, `/eta welcome`, and `/eta welcome enable` are now accessible to all players ged `/eta clearqueue <player>` (no channel) to only clear pending steps, letting current messages finish (consistent with the per-channel behavior)
release
Ember's Text API 2.6.0 (Forge 1.20.1)
2.6.0+forge-1.20.121 февр. 2026 г.35Minecraft: 1.20.1forge
Что нового
* Added `/eta stopqueue <player> [channel]` — like clearqueue but also immediately closes the currently-displaying message(s) for that channel
* Added `/eta closeall <player>` — closes all messages on screen and clears all queues immediately
* Changed `/eta clearqueue <player>` (no channel) to only clear pending steps, letting current messages finish (consistent with the per-channel behavior)
release
Ember's Text API 2.6.0 (Fabric 1.21.1)
2.6.0+fabric-1.21.121 февр. 2026 г.37Minecraft: 1.21.1fabric
Что нового
* Added `/eta stopqueue <player> [channel]` — like clearqueue but also immediately closes the currently-displaying message(s) for that channel
* Added `/eta closeall <player>` — closes all messages on screen and clears all queues immediately
* Changed `/eta clearqueue <player>` (no channel) to only clear pending steps, letting current messages finish (consistent with the per-channel behavior)
release
Ember's Text API 2.6.0 (NeoForge 1.21.1)
2.6.0+neoforge-1.21.121 февр. 2026 г.31Minecraft: 1.21.1neoforge
Что нового
* Added `/eta stopqueue <player> [channel]` — like clearqueue but also immediately closes the currently-displaying message(s) for that channel
* Added `/eta closeall <player>` — closes all messages on screen and clears all queues immediately
* Changed `/eta clearqueue <player>` (no channel) to only clear pending steps, letting current messages finish (consistent with the per-channel behavior)
release
Ember's Text API 2.6.0 (Fabric 1.20.1)
2.6.0+fabric-1.20.121 февр. 2026 г.28Minecraft: 1.20.1fabric
Что нового
* Added `/eta stopqueue <player> [channel]` — like clearqueue but also immediately closes the currently-displaying message(s) for that channel
* Added `/eta closeall <player>` — closes all messages on screen and clears all queues immediately
* Changed `/eta clearqueue <player>` (no channel) to only clear pending steps, letting current messages finish (consistent with the per-channel behavior)
release
Ember's Text API 2.5.0 (Forge 1.20.1)
2.5.0+forge-1.20.121 февр. 2026 г.113Minecraft: 1.20.1forge
Что нового
* Fixed https://github.com/TysonTheEmber/EmbersTextAPI/issues/30
* Added <color> effect(don't know why it didn't already exist)
* Added my own maven https://maven.tysontheember.dev
* Fixed some inconsistencies
* Rebuilt the docs
* Fixed some other small stuff
* Fixed permissions allowing anyone to use /eta
release
Ember's Text API 2.5.0 (Fabric 1.21.1)
2.5.0+fabric-1.21.121 февр. 2026 г.53 тыс.Minecraft: 1.21.1fabric
Что нового
* Fixed https://github.com/TysonTheEmber/EmbersTextAPI/issues/30
* Added <color> effect(don't know why it didn't already exist)
* Added my own maven https://maven.tysontheember.dev
* Fixed some inconsistencies
* Rebuilt the docs
* Fixed some other small stuff
* Fixed permissions allowing anyone to use /eta
release
Ember's Text API 2.5.0 (Fabric 1.20.1)
2.5.0+fabric-1.20.121 февр. 2026 г.35Minecraft: 1.20.1fabric
Что нового
* Fixed https://github.com/TysonTheEmber/EmbersTextAPI/issues/30
* Added <color> effect(don't know why it didn't already exist)
* Added my own maven https://maven.tysontheember.dev
* Fixed some inconsistencies
* Rebuilt the docs
* Fixed some other small stuff
* Fixed permissions allowing anyone to use /eta
release
Ember's Text API 2.5.0 (NeoForge 1.21.1)
2.5.0+neoforge-1.21.121 февр. 2026 г.6,7 тыс.Minecraft: 1.21.1neoforge
Что нового
* Fixed https://github.com/TysonTheEmber/EmbersTextAPI/issues/30
* Added <color> effect(don't know why it didn't already exist)
* Added my own maven https://maven.tysontheember.dev
* Fixed some inconsistencies
* Rebuilt the docs
* Fixed some other small stuff
* Fixed permissions allowing anyone to use /eta
release
Ember's Text API 2.4.0 (Fabric 1.20.1)
2.4.0+fabric-1.20.119 февр. 2026 г.20Minecraft: 1.20.1fabric
Что нового
Set align to center by default
Set test immersive messages to queue
Revamped the tests(/eta test 1-33)
Made /eta test effect immersive use the new queue system
Fixed @a not working in eta commands
Fixed chat transparency issues with immersive messages
Fixed/Improved fade transition
release
Ember's Text API 2.4.0 (Forge 1.20.1)
2.4.0+forge-1.20.119 февр. 2026 г.73Minecraft: 1.20.1forge
Что нового
Set align to center by default
Set test immersive messages to queue
Revamped the tests(/eta test 1-33)
Made /eta test effect immersive use the new queue system
Fixed @a not working in eta commands
Fixed chat transparency issues with immersive messages
Fixed/Improved fade transition
release
Ember's Text API 2.4.0 (Fabric 1.21.1)
2.4.0+fabric-1.21.119 февр. 2026 г.33Minecraft: 1.21.1fabric
Что нового
Set align to center by default
Set test immersive messages to queue
Revamped the tests(/eta test 1-33)
Made /eta test effect immersive use the new queue system
Fixed @a not working in eta commands
Fixed chat transparency issues with immersive messages
Fixed/Improved fade transition
release
Ember's Text API 2.4.0 (NeoForge 1.21.1)
2.4.0+neoforge-1.21.119 февр. 2026 г.14Minecraft: 1.21.1neoforge
Что нового
Set align to center by default
Set test immersive messages to queue
Revamped the tests(/eta test 1-33)
Made /eta test effect immersive use the new queue system
Fixed @a not working in eta commands
Fixed chat transparency issues with immersive messages
Fixed/Improved fade transition
release
Ember's Text API 2.3.0 (Fabric 1.20.1)
2.3.0+fabric-1.20.118 февр. 2026 г.32Minecraft: 1.20.1fabric
Что нового
Added queues and stuff https://tysontheember.dev/embers-text-api/general/feature-overview/#message-queues
release
Ember's Text API 2.3.0 (NeoForge 1.21.1)
2.3.0+neoforge-1.21.118 февр. 2026 г.20Minecraft: 1.21.1neoforge
Что нового
Added queues and stuff https://tysontheember.dev/embers-text-api/general/feature-overview/#message-queues
release
Ember's Text API 2.3.0 (Forge 1.20.1)
2.3.0+forge-1.20.118 февр. 2026 г.29,2 тыс.Minecraft: 1.20.1forge
Что нового
Added queues and stuff https://tysontheember.dev/embers-text-api/general/feature-overview/#message-queues
release
Ember's Text API 2.3.0 (Fabric 1.21.1)
2.3.0+fabric-1.21.118 февр. 2026 г.22Minecraft: 1.21.1fabric
Что нового
Added queues and stuff https://tysontheember.dev/embers-text-api/general/feature-overview/#message-queues
release
Ember's Text API 2.2.0 (Forge 1.20.1)
2.2.0+forge-1.20.117 февр. 2026 г.26Minecraft: 1.20.1forge
Что нового
Rewrote and fixed anchoring and alignment of immersive messages
release
Ember's Text API 2.2.0 (Fabric 1.21.1)
2.2.0+fabric-1.21.117 февр. 2026 г.29Minecraft: 1.21.1fabric
Что нового
Rewrote and fixed anchoring and alignment of immersive messages
release
Ember's Text API 2.2.0 (Fabric 1.20.1)
2.2.0+fabric-1.20.117 февр. 2026 г.16Minecraft: 1.20.1fabric
Что нового
Rewrote and fixed anchoring and alignment of immersive messages
release
Ember's Text API 2.2.0 (NeoForge 1.21.1)
2.2.0+neoforge-1.21.117 февр. 2026 г.18Minecraft: 1.21.1neoforge
Что нового
Rewrote and fixed anchoring and alignment of immersive messages
release
Ember's Text API 2.1.0 (Fabric 1.21.1)
2.1.0+fabric-1.21.117 февр. 2026 г.54Minecraft: 1.21.1fabric
Что нового
Moved to multiloader and added support for fabric 1.20.1 and neoforge/fabric 1.21.1
release
Ember's Text API 2.1.0 (Fabric 1.20.1)
2.1.0+fabric-1.20.117 февр. 2026 г.30Minecraft: 1.20.1fabric
Что нового
Moved to multiloader and added support for fabric 1.20.1 and neoforge/fabric 1.21.1
release
Ember's Text API 2.1.0 (NeoForge 1.21.1)
2.1.0+neoforge-1.21.117 февр. 2026 г.32Minecraft: 1.21.1neoforge
Что нового
Moved to multiloader and added support for fabric 1.20.1 and neoforge/fabric 1.21.1
release
Ember's Text API 2.1.0 (Forge 1.20.1)
2.1.0+forge-1.20.117 февр. 2026 г.30Minecraft: 1.20.1forge
Что нового
Moved to multiloader and added support for fabric 1.20.1 and neoforge/fabric 1.21.1