From 41d788fc9bb7dbfdfb29c426fc075d7eeb021dd2 Mon Sep 17 00:00:00 2001 From: Thorsten Sommer Date: Thu, 10 Sep 2026 17:46:27 +0200 Subject: [PATCH] Fixed the visual briefing scrolling and raise it to beta (#954) --- .../VisualBriefingAssistant.razor | 625 +++++++++--------- .../VisualBriefingAssistant.razor.css | 7 - .../MindWork AI Studio.csproj | 26 + .../DataModel/PreviewVisibilityExtensions.cs | 2 +- .../wwwroot/changelog/v26.9.1.md | 2 + 5 files changed, 344 insertions(+), 318 deletions(-) diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor index f0e8f378..a72d7815 100644 --- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor +++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor @@ -6,334 +6,339 @@ -
- + @* The assistant does not inherit AssistantBase, so it sets up the inner scrolling itself, the + way the log viewer does. A plain div is enough here: unlike AssistantBase, this assistant + deliberately has no area-wide drop zone, because its two zones have to be aimed at. *@ +
+ @T("Visual Briefings") - - @foreach (var project in this.projects) - { - - - @this.ProjectDisplayName(project) - @project.ModifiedAtUtc.ToLocalTime().ToString("g") - @if (!project.IsAvailable) - { - @this.ProjectStatusName(project.Status) - } - @if (project.IsAvailable && this.IsGenerating(project.BriefingId)) - { - - } - @if (project.IsAvailable) - { - - } - - - } - - - - @T("New briefing") - @T("Import") - - - - -
- @if (this.selectedProject is not null && !this.selectedProject.IsAvailable) - { - - - @this.ProjectDisplayName(this.selectedProject) - - @this.ProjectRecoveryMessage(this.selectedProject.Status) - - @T("AI Studio has left the project files unchanged. A future update may make this visual briefing accessible again.") - - @T("Project ID"): @this.selectedProject.BriefingId.ToString("D") - + + + @foreach (var project in this.projects) + { + + + @this.ProjectDisplayName(project) + @project.ModifiedAtUtc.ToLocalTime().ToString("g") + @if (!project.IsAvailable) + { + @this.ProjectStatusName(project.Status) + } + @if (project.IsAvailable && this.IsGenerating(project.BriefingId)) + { + + } + @if (project.IsAvailable) + { + + } - - @T("If you need help, report the problem and include the project ID.") - @T("Report a problem?") - - - @T("Open project folder") - @T("Delete") - - - - } - else if (this.selectedBriefing is null) - { - - @T("Create or import a visual briefing to begin.") - - } - else - { - - - @this.editor.Name - - @T("Rename") - @T("Delete") - - + + } + - - - - + + @T("New briefing") + @T("Import") + + + + +
+ @if (this.selectedProject is not null && !this.selectedProject.IsAvailable) + { + + + @this.ProjectDisplayName(this.selectedProject) + + @this.ProjectRecoveryMessage(this.selectedProject.Status) + + @T("AI Studio has left the project files unchanged. A future update may make this visual briefing accessible again.") + + @T("Project ID"): @this.selectedProject.BriefingId.ToString("D") + + + + @T("If you need help, report the problem and include the project ID.") + @T("Report a problem?") + + + @T("Open project folder") + @T("Delete") + + + + } + else if (this.selectedBriefing is null) + { + + @T("Create or import a visual briefing to begin.") + + } + else + { + + + @this.editor.Name + + @T("Rename") + @T("Delete") + + + + + + + + + + + + + + + + + + + + + @T("Source material") + @T("Documents, spreadsheets, images, audio, and video are considered as source context.") + @* No default target on purpose: with two zones side by side, the + user has to aim at the one they mean. *@ + + - - + + + @T("Visual assets") + @T("PNG, JPEG, and WebP assets are analyzed and must appear visibly in the briefing.") + + - - - - - - - - @T("Source material") - @T("Documents, spreadsheets, images, audio, and video are considered as source context.") - @* No default target on purpose: with two zones side by side, the - user has to aim at the one they mean. *@ - - - - - - @T("Visual assets") - @T("PNG, JPEG, and WebP assets are analyzed and must appear visibly in the briefing.") - - - - - - @if (this.selectedBriefing.Sources.Count > 0) - { - - - @T("Linked sources") - @T("Refresh status") - - - - @T("File") - @T("Kind") - @T("Status") - @T("Actions") - - - @Path.GetFileName(context.Path) - @context.Kind - - @this.SourceStatusName(context.Status) - - - - - - @if (context.IsMedia && context.Status is VisualBriefingSourceStatus.TRANSCRIPT_OUTDATED) - { - - + @if (this.selectedBriefing.Sources.Count > 0) + { + + + @T("Linked sources") + @T("Refresh status") + + + + @T("File") + @T("Kind") + @T("Status") + @T("Actions") + + + @Path.GetFileName(context.Path) + @context.Kind + + @this.SourceStatusName(context.Status) + + + + - } - - - - - - + @if (context.IsMedia && context.Status is VisualBriefingSourceStatus.TRANSCRIPT_OUTDATED) + { + + + + } + + + + + + + + } + + + @T("Briefing settings") + @* + The confidence belongs to the provider chosen right next to it, so both share one row. + It uses the icon trigger, like the chat does, so this row ends the same way the profile + row below it does: a field followed by one compact icon button. + Do not add a margin to that button to "correct" its height: a dense outlined select with + a label carries margin-top 8px and margin-bottom 4px of its own, so centring the boxes + already lands within a few pixels of the visible frame, and any added margin makes it + worse. Baseline alignment does not work here either, because the wrapper below takes + its baseline from its last line box, which sits under the input. + *@ + + @* ProviderSelection marks its select as flex-grow-0, and that utility is declared + !important, so StretchItems cannot widen it. The width has to come from here. *@ +
+ +
+ @if (this.SettingsManager.ConfigurationData.Confidence.ShowProviderConfidence) + { + + } +
+ + + + + + + + @T("Show source references") + @T("Optimize large visual assets")
+ + + @if (this.selectedBriefing.Versions.Count == 0) + { + @T("Create briefing") + } + else + { + + + @T("Change design") + + + + + @T("Update content") + + + + + @T("Rebuild briefing") + + + + + @T("Recompile briefing") + + + } + @if (this.CurrentBuildSession?.IsActive == true) + { + + @(this.IsCurrentBuildCanceling ? T("Stopping build...") : T("Stop build")) + + } + +
+ + + + @if (this.latestBuild is not null) + { + } - - @T("Briefing settings") - @* - The confidence belongs to the provider chosen right next to it, so both share one row. - It uses the icon trigger, like the chat does, so this row ends the same way the profile - row below it does: a field followed by one compact icon button. - Do not add a margin to that button to "correct" its height: a dense outlined select with - a label carries margin-top 8px and margin-bottom 4px of its own, so centring the boxes - already lands within a few pixels of the visible frame, and any added margin makes it - worse. Baseline alignment does not work here either, because the wrapper below takes - its baseline from its last line box, which sits under the input. - *@ - - @* ProviderSelection marks its select as flex-grow-0, and that utility is declared - !important, so StretchItems cannot widen it. The width has to come from here. *@ -
- + @if (this.reusableContentBuildId is { } reusableBuildId) + { + + + @T("The updated content no longer fits the current presentation. You can continue as a rebuild without another content model call.") + + @T("Continue as rebuild") + + + + } + + @if (this.lastBuildDiagnostics is not null) + { + + @T("Copy technical details") + + } + + @if (this.selectedBriefing.Versions.Count > 0) + { + + + + + + @foreach (var version in this.selectedBriefing.Versions.OrderByDescending(version => version.VersionNumber)) + { + @($"v{version.VersionNumber} · {version.EditMode} · {version.CreatedAtUtc.ToLocalTime():g}") + } + + + + + + @* MudToggleItem has no Icon parameter; the icon has to be set for both states. *@ + + + + + @T("Export") + + +
+ @if (!string.IsNullOrWhiteSpace(this.previewUrl)) + { + + }
- @if (this.SettingsManager.ConfigurationData.Confidence.ShowProviderConfidence) - { - - } - - - - - - - - - @T("Show source references") - @T("Optimize large visual assets") -
- - - @if (this.selectedBriefing.Versions.Count == 0) - { - @T("Create briefing") - } - else - { - - - @T("Change design") - - - - - @T("Update content") - - - - - @T("Rebuild briefing") - - - - - @T("Recompile briefing") - - - } - @if (this.CurrentBuildSession?.IsActive == true) - { - - @(this.IsCurrentBuildCanceling ? T("Stopping build...") : T("Stop build")) - - } - - - - - - @if (this.latestBuild is not null) - { - + + } } - - @if (this.reusableContentBuildId is { } reusableBuildId) - { - - - @T("The updated content no longer fits the current presentation. You can continue as a rebuild without another content model call.") - - @T("Continue as rebuild") - - - - } - - @if (this.lastBuildDiagnostics is not null) - { - - @T("Copy technical details") - - } - - @if (this.selectedBriefing.Versions.Count > 0) - { - - - - - - @foreach (var version in this.selectedBriefing.Versions.OrderByDescending(version => version.VersionNumber)) - { - @($"v{version.VersionNumber} · {version.EditMode} · {version.CreatedAtUtc.ToLocalTime():g}") - } - - - - - - @* MudToggleItem has no Icon parameter; the icon has to be set for both states. *@ - - - - - @T("Export") - - -
- @if (!string.IsNullOrWhiteSpace(this.previewUrl)) - { - - } -
-
- } - } -
+
+
\ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.css b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.css index 3f54c16f..4b231297 100644 --- a/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.css +++ b/app/MindWork AI Studio/Assistants/VisualBriefing/VisualBriefingAssistant.razor.css @@ -1,10 +1,3 @@ -.visual-briefing-shell { - height: 100%; - min-height: 0; - overflow-x: hidden; - overflow-y: auto; -} - .visual-briefing-main { min-width: 0; padding-bottom: 1rem; diff --git a/app/MindWork AI Studio/MindWork AI Studio.csproj b/app/MindWork AI Studio/MindWork AI Studio.csproj index b37f5caf..7f339cd4 100644 --- a/app/MindWork AI Studio/MindWork AI Studio.csproj +++ b/app/MindWork AI Studio/MindWork AI Studio.csproj @@ -137,4 +137,30 @@ + + + + $(IntermediateOutputPath)scopedcss\bundle\$(AssemblyName).styles.css + + + + + + + + + + diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs index 27f2531f..e9fd8fba 100644 --- a/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs +++ b/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs @@ -14,6 +14,7 @@ public static class PreviewVisibilityExtensions features.Add(PreviewFeatures.PRE_DOCUMENT_ANALYSIS_2025); features.Add(PreviewFeatures.PRE_META_ASSISTANT_V1); features.Add(PreviewFeatures.PRE_RAG_2024); + features.Add(PreviewFeatures.PRE_VISUAL_BRIEFING_ASSISTANT_2026); } if (visibility >= PreviewVisibility.ALPHA) @@ -22,7 +23,6 @@ public static class PreviewVisibilityExtensions if (visibility >= PreviewVisibility.PROTOTYPE) { - features.Add(PreviewFeatures.PRE_VISUAL_BRIEFING_ASSISTANT_2026); } if (visibility >= PreviewVisibility.EXPERIMENTAL) diff --git a/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md b/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md index cd9f0778..b7dbf465 100644 --- a/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md +++ b/app/MindWork AI Studio/wwwroot/changelog/v26.9.1.md @@ -16,3 +16,5 @@ - Improved loading web content in the assistants: it now uses the same reader as the Read Web Page tool, which extracts the main content of a page more reliably and skips navigation and boilerplate. Pages from your own network, including local servers, keep working as before. When a page cannot be read, AI Studio now says why instead of leaving the field empty. - Changed how provider trust and provider confidence work together. Marking a provider as trustworthy in a configuration no longer also satisfies a required confidence level: one says who runs the provider, the other how confidential it is. Organizations raise a provider's level in their own confidence scheme instead. This applies beyond local data sources, for example, when a model reads a page from your intranet. - Fixed a dropped file being processed several times, e.g., after the computer woke up from sleep. +- Fixed the Visual Briefing Assistant (in preview) not scrolling, which put everything below the window edge out of reach and made the assistant unusable. The briefing preview is now shown at its intended size inside its frame, and switching between the desktop, tablet, and mobile view changes its width as it should. +- Upgraded the Visual Briefing Assistant (in preview) from the prototype to the beta state. The assistant is now completely implemented and is undergoing a deeper testing phase in preparation for release. To try it, open the app settings, allow preview features down to beta, and then enable the Visual Briefing Assistant there.