* Color-code install preview: red for errors, yellow for warnings, green for ready
Add preview_markup opt-in field to MenuItem with automatic Rich markup
escaping for all existing previews. Show missing configs and bootloader
errors in red, network warning in yellow, "Ready to install" in green.
Move network warning from confirmation dialog to install preview so it
is visible earlier.
* Fix Rich markup parsing error on JSON preview strings
Text.from_markup() replaces Label(markup=True) to avoid MarkupError
on strings containing ["
* Replace raw Rich markup with PreviewResult dataclass for typed preview levels
* Add missing translatable strings to base.pot
* Move get_install_warnings() from ConfigurationOutput to GlobalMenu
The method is only used by GlobalMenu._prev_install_invalid_config(),
so it belongs there rather than on the serialization class.
* Move level-to-style mapping into MsgLevelType.style() method
Replace the module-level _LEVEL_STYLE dict in components.py with a
style() method on the MsgLevelType enum, following the project
convention of encapsulating type-bound logic on the type itself.
* Change PreviewResult to hold a list of message-level pairs
PreviewResult.messages is now list[tuple[str, MsgLevelType]], allowing
a single result to carry multiple sections with different levels.
The preview_action signature drops list[PreviewResult] since the
dataclass itself handles multiple sections. Existing str-returning
previews still work and will be converted in follow-up PRs.
* Make MsgLevelType.style() return a typed MsgLevelStyle enum
Replace the bare style strings returned by style() with a MsgLevelStyle
StrEnum so the values are type-checked. Being a StrEnum, the members stay
plain strings and pass straight into Text.append(style=...), so no call
sites change.