@attribute [Route(Routes.ASSISTANT_VISUAL_BRIEFING)] @using AIStudio.Assistants.SlideBuilder @using AIStudio.Tools.Media @using AIStudio.Tools.Rust @inherits MSGComponentBase
@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") @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.") @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) { } } @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) { } @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)) { }
} }