feat(style): put the chat log on the same floor as the settings

The motes were too subtle to register, so: seventy instead of twenty-four, wider
radius range, and each one is a soft halo with a brighter core rather than a
flat disc. At this size a single filled circle reads as a speck of dirt on the
screen; the ring around it is what makes it look lit.

The backdrop moves into its own component and the chat log gets it too. Two
windows in one plugin looking like two separate products was half the reason the
settings window read as untouched -- the chat had been reworked in v1.10.0 and
the settings had not, and no amount of work inside one window closes that gap.

No accent wash over the message list. It works on a settings pane, where the top
of the surface is a heading; over a chat log the oldest visible messages would
sit in a tinted band and read as highlighted.

Registered transient rather than singleton, so two surfaces on screen own
separate mote sets instead of sharing one drift pattern -- which would be
visible the moment a popout sits next to the main window.

MainWindow's constructor changed, so this needs the DI smoke pass.
This commit is contained in:
2026-08-18 17:55:44 +02:00
parent 76416afe3a
commit 8ebed6846d
5 changed files with 103 additions and 46 deletions
+14 -3
View File
@@ -31,6 +31,7 @@ internal sealed class MainWindow : Window, IFocusableChatWindow
private readonly Components.StatusBar _status;
private readonly Lender<PayloadHandler> _handlerLender;
private readonly ChannelPopoutPool _pool;
private readonly Ui.StyleEngine.SurfaceBackdrop _backdrop;
private Tab? _activeTab;
@@ -53,7 +54,8 @@ internal sealed class MainWindow : Window, IFocusableChatWindow
Components.InputBar input,
Components.StatusBar status,
Lender<PayloadHandler> handlerLender,
ChannelPopoutPool pool
ChannelPopoutPool pool,
Ui.StyleEngine.SurfaceBackdrop backdrop
)
: base($"{Plugin.PluginName}###hellion-main")
{
@@ -65,6 +67,7 @@ internal sealed class MainWindow : Window, IFocusableChatWindow
_status = status;
_handlerLender = handlerLender;
_pool = pool;
_backdrop = backdrop;
Size = new Vector2(DefaultWidth, DefaultHeight);
SizeCondition = ImGuiCond.FirstUseEver;
@@ -380,8 +383,16 @@ internal sealed class MainWindow : Window, IFocusableChatWindow
)
)
{
if (messages.Success && _activeTab is not null)
_messages.Draw(_activeTab);
if (messages.Success)
{
// No accent wash here. It works on a settings pane, where the
// top of the surface is a heading; over a chat log the first
// messages would sit in a tinted band and read as highlighted.
_backdrop.Draw(accentWashHeight: 0f);
if (_activeTab is not null)
_messages.Draw(_activeTab);
}
}
// Inside-mode inline render: measure first so PreviewHeight is fresh