@attribute [Route(Routes.ASSISTANT_VISUAL_BRIEFING)] @using AIStudio.Assistants.SlideBuilder @using AIStudio.Tools.Media @using AIStudio.Tools.Rust @inherits MSGComponentBase @* 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") @TA("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) { @TA("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.") @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 provider row ends in a field followed by one compact icon button, the same way the profile row below it does. *@ @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) { @TA("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)) { }
} }