## BitLogger Update Changes version 0.4.0 ### Feature - feat: add `ColorMode = Never | Auto | Always` for text formatter color control - feat: add ANSI level, target, timestamp, and field rendering to `format_text(...)` - feat: add `color_mode` to `TextFormatter` and `TextFormatterConfig` - feat: support `text_formatter.color_mode` in JSON config parsing and serialization - feat: add inline style markup support in message text for ANSI text formatter output - feat: support named color tags like `...`, style tags like `...`, and hex tags like `<#ff0000>...` / `...` - feat: keep JSON formatter output unchanged and limit inline style parsing to text message rendering only - feat: add `TextStyle`, `StyleTagRegistry`, `style_tag_registry()`, and `default_style_tag_registry()` for reusable inline style tags - feat: add formatter-local `style_tags`, global style tag registry helpers, builtin-tag override support, and alias reuse via `define_alias(...)` - feat: support minimal `sink.text_formatter.style_tags` JSON config parsing and serialization for custom formatter tag styles - feat: add `StyleMarkupMode = Disabled | Builtin | Full` plus formatter helpers so callers can explicitly disable style parsing or allow builtin-only parsing - feat: support `sink.text_formatter.style_markup` in JSON config parsing and serialization - feat: add builtin semantic style tags such as `accent`, `info`, `success`, `warning`, `danger`, and `muted` - feat: add independent `target_style_markup` and `fields_style_markup` controls for `TextFormatter` and `TextFormatterConfig` - feat: support named closing tags like `` alongside the existing short close `` - feat: add `ColorSupport = Basic | TrueColor` and support `sink.text_formatter.color_support` so hex / RGB styles can downgrade to basic ANSI colors ### Test - test: cover ANSI text formatter rendering in `Always` mode - test: cover `Auto` mode fallback behavior when `NO_COLOR` is present - test: cover config parsing and serialization for `color_mode` - test: cover named inline color tags in ANSI mode - test: cover plain mode tag stripping, nested tags, hex tags, and unknown-tag fallback behavior - test: cover custom tags, builtin-tag override, formatter-vs-global priority, global registry fallback, and alias reuse - test: cover formatter `style_tags` JSON parsing, config roundtrip, JSON helper export, and config-driven styled formatter rendering - test: cover disabled markup mode, builtin-only mode, and config-driven `style_markup` behavior - test: cover builtin semantic tag rendering and confirm user overrides still take precedence - test: cover target and field markup rendering, plus config roundtrip for the new formatter markup scopes - test: cover named closing tags, mixed short/named closing, and unmatched named-close fallback behavior - test: cover basic color-support downgrade for hex foreground/background rendering in runtime and config paths ### Example - docs: add `color_mode` usage examples to formatter documentation - docs: add runtime and JSON `style_tags` examples, and document current JSON schema scope - docs: add runtime and JSON examples for toggling style markup parsing ### Notes - `Auto` currently uses a conservative rule: if `NO_COLOR` exists, ANSI is disabled; otherwise ANSI is enabled - inline style markup supports both short close `` and named closing tags like `` - unknown or invalid inline tags currently fall back to plain text and do not raise formatter errors - formatter-local tag lookup currently takes precedence over global tag lookup, and global lookup takes precedence over builtin tags - JSON config currently supports concrete style objects only; alias-style declarations remain runtime-only - users can now decide whether custom style parsing is enabled through runtime formatter APIs or `sink.text_formatter.style_markup` - `fields_style_markup` currently styles field values only and intentionally leaves field keys raw - `basic` color support currently keeps ANSI styling but downgrades hex / RGB colors to the nearest basic ANSI color family