tg-bot-ts/data/updates/v0.7/update.json

85 lines
No EOL
2.4 KiB
JSON

{
"version": "v0.7",
"date": "2026-06-09",
"title": "UI Layout System",
"layout": "default",
"sections": [
{
"type": "new",
"label": "New Features",
"emoji": "✨",
"items": [
{
"text": "Poll layout system — multiple display styles, switchable via `/tg-config poll set-layout`",
"emojiKey": null
},
{
"text": "`default` layout — standard vertical nation fields",
"emojiKey": null
},
{
"text": "`side-by-side` layout — nations displayed inline, auto-stacks when >5 players per nation",
"emojiKey": null
},
{
"text": "Layout persists across bot restarts",
"emojiKey": null
}
]
},
{
"type": "improvement",
"label": "Improvements",
"emoji": "⚡",
"items": [
{
"text": "Voting Yes and No now run in parallel — faster poll embed updates",
"emojiKey": null
},
{
"text": "Autocomplete filtered by nation for Bringer set command",
"emojiKey": null
},
{
"text": "Character class now carries full name and emoji — `Force Blader`, `Wizard`, etc.",
"emojiKey": null
}
]
},
{
"type": "technical",
"label": "Under the Hood",
"emoji": "🔩",
"items": [
{
"text": "`BaseLayout` — shared functions inherited by all layouts, override only what differs",
"emojiKey": null
},
{
"text": "Layout auto-discovery — drop a file in `layouts/` and it registers automatically",
"emojiKey": null
},
{
"text": "`Character` type now carries `ownerKey` and full `CharacterClass` object",
"emojiKey": null
},
{
"text": "`SerializableCharacter` — clean JSON serialization boundary, runtime uses rich types",
"emojiKey": null
},
{
"text": "`Nation` converted to string enum — serializes cleanly, exhaustiveness checked by TypeScript",
"emojiKey": null
}
]
}
],
"examples": [
{
"caption": "side-by-side layout — nations displayed inline",
"type": "poll",
"layout": "side-by-side",
"file": "examples/poll-side-by-side.json"
}
]
}